.gitignore
New file @@ -0,0 +1,3 @@ # Editor directories and files .idea .vscode README.md
@@ -1,4 +1,9 @@ <!-- * @Descripttion: * @version: * @Author: song * @Date: 2020-10-23 14:02:27 * @LastEditors: song * @LastEditTime: 2020-10-23 14:11:17 --> ## map3d config.json
New file @@ -0,0 +1,409 @@ { "theme": { "name": "FoldableTheme", "styles": [ "default", "red", "purple", "blue", "green", "cyan", "black", "yellow" ], "version": "2.10" }, "modeUrl": "http://www.sw797.com:801/gzsw3D/v2/data/mx/", "cesiumToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI2ODUxMWQxMC1lNzZjLTRhZjktYmZiMS1lNWFmYWJkZWIwOTEiLCJpZCI6MTQxNzMsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1NjQ5Njg5NzV9.ojKhhmjl8L0EtxsZC14LZgmXn5VVS0CRBCYuRK_DdIo", "authorizedCrossOriginDomains": [], "title": "水文水生态综合信息管理平台", "subtitle": "", "keepAppState": true, "logo": "images/app-logo.png", "geometryService": "https://utility.arcgisonline.com/arcgis/rest/services/Geometry/GeometryServer", "links": [ { "label": "", "url": "" } ], "widgetOnScreen": { "widgets": [ { "uri": "themes/FoldableTheme/widgets/HeaderController/Widget", "position": { "left": 0, "top": 0, "right": 0, "height": 70, "relativeTo": "browser" } }, { "uri": "widgets/CommonBase/Widget" }, { "uri": "widgets/SubmergenceAnalysis/Widget", "position": { "right": "calc(50% - 335px)", "bottom": 25, "width": "650px", "height": "50px", "relativeTo": "map" } }, { "name": "站网详情", "uri": "widgets/HydroNetWorkDetails/Widget", "position": { "right": 0, "top": "calc(50% - 35px)", "width": "34px", "height": "70px", "relativeTo": "map", "z-index": 55 } }, { "name": "聚合图层", "uri": "widgets/Cluster/Widget", "position": { "left": 0, "bottom": 90, "top": 45, "width": "100px", "height": "auto", "relativeTo": "map" } } ], "groups": [], "panel": { "uri": "jimu/OnScreenWidgetPanel", "position": { "relativeTo": "map" } } }, "map": { "3D": true, "2D": false, "position": { "left": 0, "top": 0, "right": 0, "bottom": 0 }, "basemaps": [ { "label": "行政区划", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/jctczt/MapServer", "layers": "0", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "河流水系", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/jctczt/MapServer", "layers": "1", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "铁路公路", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/jctczt/MapServer", "layers": "2", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "高速公路", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/jctczt/MapServer", "layers": "3", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false } ], "swzwLayers": [ { "label": "水文站", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/swzwzt/MapServer", "layers": "0", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "水位站", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/swzwzt/MapServer", "layers": "1", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "雨量站", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/swzwzt/MapServer", "layers": "2", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "水质站", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/swzwzt/MapServer", "layers": "3", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "中小河流站", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/swzwzt/MapServer", "layers": "4", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "水库水位站", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/jctczt/MapServer", "layers": "2", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false } ], "shLayers": [ { "label": "山洪隐患点", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/shskzt/MapServer", "layers": "0", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "大型水库", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/shskzt/MapServer", "layers": "1", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "中型水库", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/shskzt/MapServer", "layers": "2", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "小型水库", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/shskzt/MapServer", "layers": "3", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false } ], "djyLayers": [ { "label": "东江源区水系图", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/djysx/MapServer", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "水文监测基本站网", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/djyswjcjbzw/MapServer", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "专项分析研究实验站网", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/djyztfxsyzw/MapServer", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false }, { "label": "遥测站点", "url": "http://171.35.109.175:18080/arcgis/rest/services/GZSW/djyyczw/MapServer", "type": "arcgis", "icon": "images/basemaps/tiandituimage.png", "show": false } ], "imageryProviderViewModels": [ { "name": "天地图影像", "tooltip": "天地图全球影像地图服务(国家测绘局)", "iconUrl": "images/basemaps/tiandituimage.png", "layers": [ { "label": "天地图影像", "type": "wmts", "url": "http://t0.tianditu.gov.cn/img_w/wmts?tk=e9533f5acb2ac470b07f406a4d24b4f0", "layer": "img", "style": "default", "format": "tiles", "tileMatrixSetID": "w", "maximumLevel": 17 }, { "label": "天地图影像标注", "type": "wmts", "url": "http://t0.tianditu.gov.cn/cia_w/wmts?tk=e9533f5acb2ac470b07f406a4d24b4f0", "layer": "cia", "style": "default", "format": "tiles", "tileMatrixSetID": "w", "maximumLevel": 17 } ] }, { "name": "赣州电子地图", "tooltip": "赣州电子地图", "iconUrl": "images/basemaps/tianditushiliang.png", "layers": [ { "label": "赣州电子地图", "type": "wmts", "url": "http://sw797.com:6080/arcgis/rest/services/GZHS/MapServer/WMTS", "layer": "GZHS", "style": "default", "format": "image/jpgpng", "tileMatrixSetID": "default028mm", "maximumLevel": 17 } ] }, { "name": "天地图矢量", "tooltip": "天地图矢量", "iconUrl": "images/basemaps/tianditushiliang.png", "layers": [ { "label": "天地图矢量", "type": "wmts", "url": "http://t0.tianditu.gov.cn/vec_w/wmts?tk=e9533f5acb2ac470b07f406a4d24b4f0", "layer": "vec", "style": "default", "format": "tiles", "tileMatrixSetID": "w", "maximumLevel": 17 }, { "label": "天地图矢量标注", "type": "wmts", "url": "http://t0.tianditu.gov.cn/cva_w/wmts?tk=e9533f5acb2ac470b07f406a4d24b4f0", "layer": "cva", "style": "default", "format": "tiles", "tileMatrixSetID": "w", "maximumLevel": 17 } ] }, { "name": "离线影像", "tooltip": "赣州市离线影像", "iconUrl": "images/basemaps/gzyx.png", "layers": [ { "label": "赣州市离线影像", "type": "url", "url": "http://www.sw797.com:801/gzsw3D/v2/data/wp/{z}/{x}/{y}.png" } ] } ], "terrainProviderViewModels": [ { "name": "无地形", "tooltip": "WGS84标准球体", "iconUrl": "images/basemaps/TerrainEllipsoid.png", "url": "" }, { "name": "赣州地形", "tooltip": "由 普适科技 提供的赣州地形", "iconUrl": "images/basemaps/TerrainSTK.png", "url": "http://www.sw797.com:801/gzsw3D/v2/data/gzdx" } ], "mapOptions": { "positionInfo": { "xmin": 112.898549, "ymin": 27.559419, "xmax": 118.062123, "ymax": 24.256186 }, "animation": false, "baseLayerPicker": true, "fullscreenButton": false, "geocoder": false, "homeButton": false, "infoBox": false, "sceneModePicker": false, "selectionIndicator": false, "timeline": false, "navigationHelpButton": true, "scene3DOnly": true, "navigationInstructionsInitiallyVisible": false, "terrainExaggeration": 1, "showRenderLoopErrors": false, "enableCompass": true, "enableZoomControls": false, "enableDistanceLegend": false, "enableCompassOuterRing": true } }, "widgetPool": { "panel": { "uri": "themes/FoldableTheme/panels/FoldablePanel/Panel", "position": { "top": 45, "left": 5, "bottom": 5, "zIndex": 5, "relativeTo": "map" } }, "widgets": [ ], "groups": [] }, "loadingPage": { "backgroundColor": "#508dca", "backgroundImage": { "visible": false }, "loadingGif": { "visible": true, "uri": "jimu.js/loading/images/predefined_loading_1.gif", "width": 58, "height": 29 } }, "wabVersion": "2.11", "isTemplateApp": true, "isWebTier": false, "httpProxy": { "useProxy": true, "alwaysUseProxy": false, "url": "", "rules": [] }, "logoLink": "" } corelib/common/layer/CommonPointLayer3D.js
New file @@ -0,0 +1,165 @@ define(['dojo/_base/lang', 'dojo/_base/array', "dojo/_base/declare", 'dojo/topic', 'jimu/dijit/Popup', './GeologicalDisasterPanel' ], function (lang, array, declare, topic, Popup, GeologicalDisasterPanel ) { return declare("practice.cesium.layers.CommonPointLayer3D", [], { // 三维点图层 id:null, map: null, showName: "name",//title显示字段 idField: "id", firstLoad: true, billboards: null, labels: null, currentVis: true, labelVis: false, constructor: function (option) { this.id = option.id; this.map = option.map; this.billboards = null; this.labels = null; }, destroy: function () { for (var i = 0, max = this.labels.length; i < max; i++) { var item = this.labels[i]; this.map.entities.remove(item); } for (var i = 0, max = this.billboards.length; i < max; i++) { var item = this.billboards[i]; this.map.entities.remove(item); } this.labels = null; this.billboards = null; this.inherited(arguments); }, getData: function (list) { //判断下 if (!lang.isArray(list)) { var ls = list.data; this.filterData = list.filterData; list = ls; } if (this.firstLoad) { this.labels = []; this.billboards = []; this.moveHandler(); this.firstLoad = false; } else { //循环删除 for(var i=0;i<this.billboards.length;i++){ this.map.entities.remove(this.billboards[i]); this.map.entities.remove(this.labels[i]); } this.labels = []; this.billboards = []; } this.datas = {}; for (var i = 0; i < list.length; i++) { var lgtd = list[i].lgtd; var lttd = list[i].lttd; var label = this.map.entities.add({ position : Cesium.Cartesian3.fromDegrees(lgtd, lttd, 100), label : { text: list[i][this.showName], font: '15px sans-serif', // Cesium.Color.fromBytes(), 创建使用红色绿色蓝色和Alpha值指定的新颜色范围是0到255,内部将他们转换为0.0到1.0 fillColor: Cesium.Color.fromBytes(255, 255, 255), outlineColor : Cesium.Color.fromBytes(23, 198, 255), outlineWidth : 2, style : Cesium.LabelStyle.FILL_AND_OUTLINE, horizontalOrigin: Cesium.HorizontalOrigin.TOP, verticalOrigin :Cesium.VerticalOrigin.BOTTOM , heightReference : Cesium.HeightReference.CLAMP_TO_GROUND, pixelOffset: new Cesium.Cartesian2(0, 14), pixelOffsetScaleByDistance: new Cesium.NearFarScalar(1.5e2, 3.0, 1.5e7, 0.5), disableDepthTestDistance: Number.POSITIVE_INFINITY } }); this.labels.push(label); var bill = this.map.entities.add({ id: this.id+list[i][this.idField], position : Cesium.Cartesian3.fromDegrees(lgtd, lttd, 100), billboard : { image : "./images/quan_j.png", color: Cesium.Color.fromBytes(23, 198, 255), pixelOffset: new Cesium.Cartesian2(0, 0), heightReference : Cesium.HeightReference.CLAMP_TO_GROUND, disableDepthTestDistance: Number.POSITIVE_INFINITY } }); this.billboards.push(bill); this.datas[list[i][this.idField]] = list[i]; } this.setVis(this.currentVis); }, setVisible: function (vis) {//设置可见不可见 if (this.billboards) { var len = this.billboards.length; for (var i = 0; i < len; ++i) { var b = this.billboards[i]; b.show = vis; } var len = this.labels.length; for (var i = 0; i < len; ++i) { var b = this.labels[i]; b.show = vis; } } }, moveHandler: function () { var handler = new Cesium.ScreenSpaceEventHandler(this.map.scene.canvas); handler.setInputAction(lang.hitch(this, this.clickHandler), Cesium.ScreenSpaceEventType.LEFT_CLICK); }, clickHandler: function (movement) { var pickedObjects = this.map.scene.drillPick(movement.position); if (Cesium.defined(pickedObjects)) { for (var i = 0; i < pickedObjects.length; ++i) { var obj = pickedObjects[i].id; var id = obj.id.split(this.id)[1]; if (this.datas.hasOwnProperty(id)) { this.openWindow(this.datas[id]); break; } } } }, openWindow: function (item) { //点击测站的弹出框的内容,面板,单独的widget 可传参数 // layer-ui 的弹出框 parent.layer.open({ type: 2, title: item.name, shadeClose: true, shade: false, maxmin: true, //开启最大化最小化按钮 area: ['100%', '92.5%'], offset: '70px', content: item.url, id: "quanJing" }); }, setVis: function (vis) { this.currentVis = vis; this.setVisible(vis); } }); }); corelib/common/layer/GeologicalDisasterPanel.html
New file @@ -0,0 +1,34 @@ <div class="form-body form-inline" style="width:100%; height: 300px;"> <div style="width:100%; height: 300px;"> <div style="width:100%;float:left"> <div class="form-group" style="width:100%; height: 30px;"> <label class="col-md-3 control-label" style="font-weight:normal;float:left;" data-dojo-attach-point="shangchuanren" >上传人:</label> <div class="col-md-9" style="font-weight:normal;float:left;" > <span data-dojo-attach-point="creator" >--</span> </div> </div> <div class="form-group" style="width:100%; height: 30px;"> <label class="col-md-3 control-label" style="font-weight:normal;float:left;" data-dojo-attach-point="mingcheng" >名称:</label> <div class="col-md-9" style="font-weight:normal;float:left;" > <span data-dojo-attach-point="name" >--</span> </div> </div> <div class="form-group" style="width:100%; height: 30px;"> <label class="col-md-3 control-label" style="font-weight:normal;float:left;" data-dojo-attach-point="weizhi">位置描述:</label> <div class="col-md-9" style="font-weight:normal;float:left;"> <span data-dojo-attach-point="location" >--</span> </div> </div> <div class="form-group" style="width:100%; height: 160px;"> <label class="col-md-3 control-label" style="font-weight:normal;" data-dojo-attach-point="miaoshu">描述:</label> <div class="col-md-9"> <div data-dojo-attach-point="nt" style="height: 130px;overflow-y: auto;" >--</div> </div> </div> </div> </div> </div> corelib/common/layer/GeologicalDisasterPanel.js
New file @@ -0,0 +1,37 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/_base/html', "dojo/topic", 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', "dojo/text!./GeologicalDisasterPanel.html" ], function ( declare, lang, html, topic, _WidgetBase, _TemplatedMixin, template ) { return declare('GeologicalDisasterPanel',[_WidgetBase, _TemplatedMixin], { templateString: template, width:270, constructor: function (args) { declare.safeMixin(this, args); }, postCreate: function () { this.inherited(arguments); this.name.innerHTML = this.data.name||"--"; this.location.innerHTML = this.data.location||"--"; this.creator.innerHTML = this.data.creator||"--"; this.nt.innerHTML = this.data.nt||"--"; } }); }); corelib/common/popup/css/style.css
New file @@ -0,0 +1,782 @@ * { padding: 0; margin: 0 } html, body { height: auto; width: 100%; overflow: hidden; } body { font-family: "Microsoft YaHei"; font-size: 12px; } ul, ol, li, dl, dd, dt { list-style-type: none; } select, input, img, select, button { vertical-align: middle; font-size: 12px; } a { text-decoration: none; color: #323232 } a:hover { color: #0262AB; } a:hover, a:link { text-decoration: none; } input { outline: none } input[type=button] { cursor: pointer; } h1, h2, h3, h4, h5, h6 { font-size: 100%; font-weight: normal; } .river-course { width: 100%; height: 100%; } .river-top { width: 100%; height: 50px; background: rgb(187, 195, 200); } .river-menu, .rain-menu, .reser-menu { width: 100%; height: 35px; } .river-menu ul li, .rain-menu ul li, .reser-menu ul li { min-width: 50px; padding: 0 15px; height: 35px; float: left; margin-top: 15px; line-height: 35px; color: #fff; cursor: pointer; margin-left: 5px; font-size: 14px; } .river-menu ul li:hover, .rain-menu ul li:hover, .reser-menu ul li:hover { background: #539af6; } .river-menu ul li.on, .rain-menu ul li.on, .reser-menu ul li.on { background: #fff; color: rgb(187, 195, 200); } .river-box { width: 100%; height: 420px; } .rain-box{ width: 100%; height: 420px; } .reser-box{ width: 100%; height: 420px; } .river-course .river-box .river-fou { position: relative; width: 100%; height: 100%; } .river-course .river-box .river-fou .river-fou-box { position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; width: 700px; height: 380px; } .river-course .river-box .river-fou .river-fou-box ul { position: absolute; top: 40px; left: 44px; width: 666px; height: 220px; } .river-course .reser-box .river-fou .river-fou-box { position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; width: 700px; height: 380px; } .river-course .reser-box .river-fou .river-fou-box ul { position: absolute; top: 40px; left: 44px; width: 666px; height: 220px; } .river-course .rain-box .river-fou .river-fou-box { position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; width: 700px; height: 380px; } .river-course .rain-box .river-fou .river-fou-box ul { position: absolute; top: 40px; left: 44px; width: 666px; height: 220px; } .river-one, .river-two, .river-thr, .river-fou { width: 100%; height: 100%; } .river-box-top { height: 45px; width: 100%; } .river-pei { width: 53%; height: 87%; float: left; } .river-tab { width: 46%; height: 360px; float: left; } .river-fou-box { width: 100%; } .river-fou-box ul li { width: 48%; float: left; margin-left: 1%; height: 30px; line-height: 30px; margin-top: 14px; } .river-fou-box ul li span { width: 80px; height: 30px; text-align: right; display: inline-block; float: left; } .river-fou-box ul li div { width: 150px; height: 30px; border: 1px solid #d0d0d0; float: left; padding-left: 10px; } .river-fou-box ul li div.on { border: 1px solid #3892d4; } .table-thead { width: 100%; font-size: 12px; background-color: #f0eded; border: 1px solid #CFCFCF; border-collapse: collapse; border-spacing: 0px; } .table-thead tr th { text-align: left; border-right: 1px solid #CFCFCF; color: #404040; } .table-thead tr th:last-child, .table-thead tr th:nth-last-child(2) { border-right: 0; } .table-thead tr th div { padding-left: 3px; } .table-thead tr, .table-tbody tr { height: 35px; } .table-tbody { width: 100%; font-size: 12px; background-color: #FFF; border-left: 1px solid #CFCFCF; border-collapse: collapse; border-spacing: 0px; } .table-tbody tr { border-bottom: 1px solid #CFCFCF; } .table-tbody tr:last-child { border-bottom: 0; } .table-tbody tr td { border-right: 1px solid #CFCFCF; } .table-tbody tr td:first-child { text-align: center; } .table-tbody tr td div { text-align: center; padding-left: 3px; } .river-thead tr th{ text-align: center; } .river-thead tr th:nth-child(1) div { width: 28px; } .river-thead tr th:nth-child(2) div { width: 108px; } .river-thead tr th:nth-child(3) div { width: 80px; } .river-thead tr th:nth-child(4) div { width: 41px; } .river-thead tr th:nth-child(5) div { width: 68px; } .river-thead tr th:nth-child(6) { width: 14px; } .river-thead tr th:nth-child(6) div { width: 14px; } .river-tbody tr td:nth-child(1) div { width: 28px; } .river-tbody tr td:nth-child(2) div { width: 108px; } .river-tbody tr td:nth-child(3) div { width: 80px; } .river-tbody tr td:nth-child(4) div { width: 41px; } .river-tbody tr td:nth-child(5) div { width: 68px; } .comTbody { width: 100%; display: inline-block; max-height: 90%; overflow-y: scroll; border-bottom: 1px solid #CFCFCF; } /*降雨*/ .rain-pei { width: 53%; height: 87%; float: left; } .rain-tab { width: 46%; height: 360px; float: left; } .rain-thead tr th{ text-align: center; } .rain-thead tr th:nth-child(1) div { width: 34px; } .rain-thead tr th:nth-child(2) div { width: 110px; } .rain-thead tr th:nth-child(3) div { width: 80px; } .rain-thead tr th:nth-child(4) div { width: 14px; } .rain-thead tr th:nth-child(4){ width: 17px; } .rain-tbody tr td:nth-child(1) div { width: 34px; } .rain-tbody tr td:nth-child(2) div { width: 110px; } .rain-tbody tr td:nth-child(3) div { width: 82px; } .rain-thead-box tr th { text-align: center; } .rain-thead-box tr th:nth-child(1) div { width: 45px; } .rain-thead-box tr th:nth-child(2) div { width: 150px; } .rain-thead-box tr th:nth-child(3) div { width: 68px; } .rain-thead-box tr th:nth-child(4) div { width: 68px; } .rain-thead-box tr th:nth-child(5) div { width: 68px; } .rain-thead-box tr th:nth-child(6) div { width: 68px; } .rain-thead-box tr th:nth-child(7) div { width: 68px; } .rain-thead-box tr th:nth-child(8) div { width: 68px; } .rain-thead-box tr th:nth-child(9) div { width: 68px; } .rain-thead-box tr th:nth-child(10) div { width: 67px; } .rain-thead-box tr th:nth-child(11) div { width: 17px; } .rain-thead-box tr th:nth-child(11) { width: 17px; } .rain-tbody-box tr td:nth-child(1) div { width: 45px; } .rain-tbody-box tr td:nth-child(2) div { width: 150px; } .rain-tbody-box tr td:nth-child(3) div { width: 68px; } .rain-tbody-box tr td:nth-child(4) div { width: 68px; } .rain-tbody-box tr td:nth-child(5) div { width: 68px; } .rain-tbody-box tr td:nth-child(6) div { width: 68px; } .rain-tbody-box tr td:nth-child(7) div { width: 68px; } .rain-tbody-box tr td:nth-child(8) div { width: 68px; } .rain-tbody-box tr td:nth-child(9) div { width: 68px; } .rain-tbody-box tr td:nth-child(10) div { width: 67px; } .rser-thead tr th { text-align: center; } .rser-thead tr th:nth-child(1) div { width: 35px; } .rser-thead tr th:nth-child(2) div { width: 90px; } .rser-thead tr th:nth-child(3) div { width: 51px; } .rser-thead tr th:nth-child(4) div { width: 14px; } .rser-thead tr th:nth-child(4){ width: 17px; } .rser-tbody tr td:nth-child(1) div { width: 35px; } .rser-tbody tr td:nth-child(2) div { width: 90px; } .rser-tbody tr td:nth-child(3) div { width: 51px; } .rese-pei { width: 585px; height: 360px; float: left; } .rese-tab { width: 200px; height: 360px; float: left; } /* 模拟下拉框 */ .hide { display: none; } .select { width: 200px; position: relative; margin: 10px 0 0 10px; float: left; } .selectsd { position: relative; margin: 10px 10px 0 0px; float: left; } .select .input_in input { width: 188px; height: 28px; line-height: 28px; border: 1px solid #d0d0d0; cursor: pointer; padding-left: 10px; color: #6d6d6d; background: url("../img/sel.png") no-repeat 175px; } .selectsd .input_insd input { width: 50px; height: 28px; line-height: 28px; border: 1px solid #d0d0d0; cursor: pointer; padding-left: 10px; color: #6d6d6d; background: url("../img/sel.png") no-repeat 40px; } .select .city { position: absolute; top: 30px; left: 0; z-index: 10; } .select .city ul { width: 198px; border: 1px solid #d6d6d6; border-top: none; } .select .city ul li { padding-left: 10px; width: 188px; height: 28px; line-height: 28px; cursor: pointer; background: #fff; color: #404040; } .select .city ul li:hover { background: #539af6; color: #fff; } .selectsd .city { position: absolute; top: 30px; left: 0; z-index: 10; } .selectsd .city ul { width: 60px; border: 1px solid #d6d6d6; border-top: none; } .selectsd .city ul li { padding-left: 10px; width: 50px; height: 28px; line-height: 28px; cursor: pointer; background: #fff; color: #404040; } .selectsd .city ul li:hover { background: #539af6; color: #fff; } /** 日历代码 **/ .river-data { float: left; margin-top: 10px; } .datainp { width: 145px; height: 30px; border: 1px solid #d0d0d0; padding-left: 5px; margin-left: 10px; margin-right: 10px; color: #6d6d6d; } .wicon { background: url("../img/data.png") no-repeat 120px; } .time-icon { background: url("../img/sel.png") no-repeat 128px; } .river-btn { width: 50px; height: 30px; border: 1px solid #d0d0d0; background: #f6f6f6; margin-top: 10px; color: #6d6d6d; float: left; } .loc-btn { width: 80px; height: 30px; border: 1px solid #d0d0d0; background: #f6f6f6; margin-top: 10px; margin-left: 10px; color: #6d6d6d; float: left; } .none { display: none; } .load-box-list { display: block; overflow-y: auto; width: 100%; background-color: #fff; position: absolute; top: 0; } .load-box-list .rote-load { position: absolute; top: 36%; left: 50%; transform: translate(-50%, -50%); width: 60px; height: 80px; } .load-box-list .rote-load img { position: absolute; top: 0; left: 0; width: 100%; height: 60px; animation: rote 3s linear infinite; } @keyframes rote { 0% { transform: rotate(0deg); } 25% { transform: rotate(90deg); } 50% { transform: rotate(180deg); } 75% { transform: rotate(270deg); } 100% { transform: rotate(360deg); } } .load-box-list .rote-load span { margin: 0 !important; position: absolute; left: 0; bottom: 0; width: 100%; height: 20px; line-height: 20px !important; text-align: center; } .load-box-list { /*margin-left: 1%;*/ height: auto; max-height: 91.5%; overflow-y: auto; background-color: #fff; position: absolute; bottom: 0px; top: 95px; } corelib/common/popup/img/close.png
corelib/common/popup/img/data.png
corelib/common/popup/img/rote.jpg
corelib/common/popup/img/sel.png
corelib/common/popup/js/end.js
New file @@ -0,0 +1,13 @@ $(function () { laydate.render({ elem: '#timeend' //指定元素 ,type: 'datetime' }); laydate.render({ elem: '#inpend' //指定元素 ,type: 'datetime' }); laydate.render({ elem: '#inpend_zr' //指定元素 }); }) corelib/common/popup/js/rain.js
New file @@ -0,0 +1,586 @@ $(function () { $('.close').click(function () { window.parent.$('#infoWindow_pup').hide(); window.parent.$('#infoWindow_pup').attr('src', ''); }); $('.input_in input').val('快速查询'); var d = new Date(); var str = d.getFullYear()+"-"+(d.getMonth()+1 < 10 ? '0'+(d.getMonth()+1) : d.getMonth()+1)+"-"+(d.getDate() < 10 ? '0'+d.getDate() : d.getDate())+" " +(d.getHours()+1 <10 ? '0'+(d.getHours()+1):(d.getHours()+1))+":00:00"; var str_zr = d.getFullYear()+"-"+(d.getMonth()+1 < 10 ? '0'+(d.getMonth()+1) : d.getMonth()+1)+"-"+d.getDate(); var qz =new Date(getDate(Date.parse(new Date()) - 86400000 *2)); var qzstr = qz.getFullYear()+"-"+(qz.getMonth()+1 < 10 ? '0'+(qz.getMonth()+1) : qz.getMonth()+1)+"-"+(qz.getDate() < 10 ? '0'+qz.getDate() : qz.getDate())+" 00:00:00"; var qzstr_zr = qz.getFullYear()+"-"+(qz.getMonth()+1 < 10 ? '0'+(qz.getMonth()+1) : qz.getMonth()+1)+"-"+qz.getDate(); var startTime = qzstr; var endTime = str; var rainstartTime = qzstr_zr; var rainendTime = str_zr; var code = GetQueryString("id"); var sdData = "1"; $('#inpstart_zr').val(qzstr_zr); $('#inpend_zr').val(str_zr); $('#timestart').val(qzstr); $('#timeend').val(str); $('.input_in input').click(function () { // $('#riverSel').show(); $('#RainSel').toggle(); $('#dailyRiverSel').toggle(); }) $('.input_insd input').click(function () { $('#RainSd').toggle(); }) function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } setTimeout(function () { $('.load-box-list').show(); rainShowPie(startTime, endTime,sdData); }, 200); //时段雨量 $('#rainBtnOne').click(function () { recharts(); $('.load-box-list').show(); $('.input_in input').val('快速查询'); rainShowPie(startTime, endTime,sdData); $('#RainSel').hide(); $('#dailyRiverSel').hide(); }); //逐日雨量 $('#rainBtnTwo').click(function () { recharts_z(); $('.load-box-list').show(); $('.input_in input').val('快速查询'); dailyRainShowPie(rainstartTime, rainendTime); $('#RainSel').hide(); $('#dailyRiverSel').hide(); }); //特征雨量 $('#rainBtnThr').click(function () { $('.input_in input').val('快速查询'); featuresShowInfo(); $('#RainSel').hide(); $('#dailyRiverSel').hide(); }); //基础信息 $('#rainBtnFou').click(function () { $('.input_in input').val('快速查询'); rainBasicShowInfo(); $('#RainSel').hide(); $('#dailyRiverSel').hide(); }); function recharts_z(){ var width = $(window).width()*0.53; var height =($(window).height()-50)-80; var chartPie = document.getElementById('dailyPei'); var myChartPie = echarts.init(chartPie); var resize = { width:width, height:height } myChartPie.resize(resize); } function recharts(){ var width = $(window).width()*0.53; var height =($(window).height()-50)-80; // 获取ID var chartPie = document.getElementById('rainPei'); var myChartPie = echarts.init(chartPie); var resize = { width:width, height:height } myChartPie.resize(resize); } window.onresize = function () { var width = $(window).width()*0.53; var height =($(window).height()-50)-80; $(".rain-tab").height(height); // 获取ID var chartPie_1 = document.getElementById('rainPei'); var chartPie_2 = document.getElementById('dailyPei'); // echarts初始化 var myChartPie_1 = echarts.init(chartPie_1); var myChartPie_2 = echarts.init(chartPie_2); var resize = { width:width, height:height } myChartPie_1.resize(resize); myChartPie_2.resize(resize); }; //时段选择 $('#RainSd ul li').click(function () { $('#RainSd').hide(); var checkTime = $(this).attr('data'); if (checkTime == '1') { sdData = "1"; $('.input_insd input').val('1'); } else if (checkTime == '2') { sdData = "2"; $('.input_insd input').val('2'); } else if (checkTime == '3') { sdData = "3"; $('.input_insd input').val('3'); } else if (checkTime == '6') { sdData = "6"; $('.input_insd input').val('6'); } }); //时段雨量------时间查询 $('#riverBtn').click(function () { $('.load-box-list').show(); $('.input_in input').val('快速查询'); startTime = $("#timestart").val(); endTime = $("#timeend").val(); rainShowPie(startTime, endTime,sdData); }); //时段雨量-----快速查询 $('#RainSel ul li').click(function () { $('.load-box-list').show(); $('#RainSel').hide(); var checkTime = $(this).attr('data'); var curr = new Date(); var currDataD = curr.getFullYear(); var currDataM = curr.getMonth() + 1; var currDataR = curr.getDate(); var currDataH = curr.getHours(); // 结束时间 var currAllTime = currDataD + '-' + currDataM + '-' + currDataR + ' ' + (currDataH+1) + ':00:00'; var data = ''; var dataD = ''; var dataM = ''; var dataR = ''; var dataH = ''; var dataDd = ''; var allDataTime = ''; if (checkTime == '2') { data = new Date(new Date() - 2 * 60 * 60 * 1000); $('.input_in input').val('最近2小时'); } else if (checkTime == '12') { data = new Date(new Date() - 12 * 60 * 60 * 1000); $('.input_in input').val('最近12小时'); } else if (checkTime == '24') { data = new Date(new Date() - 24 * 60 * 60 * 1000); $('.input_in input').val('最近24小时'); } else if (checkTime == '36') { data = new Date(new Date() - 36 * 60 * 60 * 1000); $('.input_in input').val('最近36小时'); } else if (checkTime == '72') { data = new Date(new Date() - 72 * 60 * 60 * 1000); $('.input_in input').val('最近72小时'); } dataD = data.getFullYear(); dataM = data.getMonth() + 1; dataR = data.getDate(); dataH = data.getHours(); dataDd = data.getMinutes(); // 开始时间 allDataTime = dataD + '-' + dataM + '-' + dataR + ' ' + (dataH+1) + ':00:00'; $('#timestart').val(allDataTime); $('#timeend').val(currAllTime); rainShowPie(allDataTime, currAllTime,sdData); }); function getDate(timestamp) { let d = new Date(timestamp);// 时间戳为10位需*1000,时间戳为13位的话不需乘1000 let yyyy = d.getFullYear() + '-'; let MM = (d.getMonth()+1 < 10 ? '0'+(d.getMonth()+1) : d.getMonth()+1) + '-'; let dd = d.getDate() + ' '; let HH = d.getHours() + ':'; let mm = d.getMinutes() + ':'; let ss = d.getSeconds(); return yyyy + MM + dd + HH + mm + ss; } function rainShowPie(startTime, endTime,sd) { $.ajax({ url: "http://www.sw797.com:82/blade-ycreal/pptnr/selectDayStation", type: 'post', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { 'code': code, 'dateBegin': startTime, 'dateEnd': endTime, 'sd':sd, }, success: function (result) { var q = ''; var w = ''; var dataName = []; var dataZ = []; var contant = ''; for (var i = 0; i < result.data.length; i++) { var time = result.data[i].tm; var timesub = time.substr(5, 11); dataName.push(timesub); dataZ.push(result.data[i].DRP); if (result.data[i].DRP == null) { q = ''; } else { q = result.data[i].DRP; } contant += '<tr>' + '<td><div>' + (i + 1) + '</div></td>' + '<td><div>' + timesub + '</div></td>' + '<td><div>' + q + '</div></td>' + '</tr>'; } $('#rainTable').html(contant); var option = { title: { text: '时段降雨过程', left: 'center' }, tooltip: { trigger: 'axis' }, legend: { bottom: '0px', left: 'center', data: ['雨量'] }, xAxis: [{ type: 'category', splitLine: { show: false }, data: dataName, inverse:true, boundaryGap: false, axisLine: { onZero: false, lineStyle: { color: "#000" } }, }], grid: { left: '3%', right: '4%', bottom: '8%', containLabel: true }, yAxis: [{ type: 'value', name: '降雨量(mm)', axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true }, }], series: [{ name: '雨量', type: 'bar', data: dataZ }] }; var chartPie = document.getElementById('rainPei'); var myChartPie = echarts.init(chartPie); myChartPie.setOption(option, true); $('.load-box-list').hide(); } }); } //逐日雨量------时间查询 $('#dailyRainBtn').click(function () { $('.load-box-list').show(); $('.input_in input').val('快速查询'); rainstartTime = $("#inpstart_zr").val(); rainendTime = $("#inpend_zr").val(); dailyRainShowPie(rainstartTime, rainendTime); }); $('#dailyRiverSel ul li').click(function () { $('.load-box-list').show(); $('#dailyRiverSel').hide(); var checkTime = $(this).attr('data'); var curr = new Date(); var currDataD = curr.getFullYear(); // 获取完整的年份 4位数 var currDataM = curr.getMonth() + 1; // 获取当前月份,0是1月,所以+1 var currDataR = curr.getDate(); // 获取当前日,1-31日 var currDataH = curr.getHours(); // 获取当前小时数0-23 // 结束时间 var currAllTime = currDataD + '-' + currDataM + '-' + currDataR; var data = ''; var dataD = ''; var dataM = ''; var dataR = ''; var dataH = ''; var allDataTime = ''; if (checkTime == '3') { data = new Date(new Date() - 24 * 60 * 60 * 1000 * 3); $('.input_in input').val('近3天'); } else if (checkTime == '7') { data = new Date(new Date() - 24 * 60 * 60 * 1000 * 7); $('.input_in input').val('近7天'); }else if (checkTime == '15') { data = new Date(new Date() - 24 * 60 * 60 * 1000 * 15); $('.input_in input').val('近15天'); } dataD = data.getFullYear(); dataM = data.getMonth() + 1; dataR = data.getDate(); dataH = data.getHours(); // 开始时间 allDataTime = dataD + '-' + dataM + '-' + dataR; $('#inpstart_zr').val(allDataTime); $('#inpend_zr').val(currAllTime); dailyRainShowPie(allDataTime, currAllTime); }); function dailyRainShowPie(rainstartTime, rainendTime) { if (rainstartTime == '' && rainendTime == '') { var Nowdate = new Date(); var MonthFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth(), 1); M = Number(MonthFirstDay.getMonth()) + 1 rainstartTime = MonthFirstDay.getFullYear() + "-" + M + "-" + MonthFirstDay.getDate(); var MonthNextFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth() + 1, 1); var MonthLastDay = new Date(MonthNextFirstDay - 86400000); M = Number(MonthLastDay.getMonth()) + 1 rainendTime = MonthLastDay.getFullYear() + "-" + M + "-" + MonthLastDay.getDate(); } $.ajax({ url: "http://www.sw797.com:82/blade-ycreal/pptnr/selectStation", type: 'post', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { 'code': code, 'dateBegin': rainstartTime, 'dateEnd': rainendTime }, success: function (result) { var q = ''; var w = ''; var dataName = []; var dataZ = []; var contant = ''; for (var i = 0; i < result.data.length; i++) { var time = result.data[i].tm; var timesub = time.substr(5, 11); dataName.push(timesub); if (result.data[i].DRP == -1) { q = 0; } else { q = result.data[i].DRP; } dataZ.push(q); contant += '<tr>' + '<td><div>' + (i + 1) + '</div></td>' + '<td><div>' + timesub + '</div></td>' + '<td><div>' + q + '</div></td>' + '</tr>'; } $('#dailyRainTable').html(contant); var option = { title: { text: '逐日雨量', left: 'center' }, tooltip: { trigger: 'axis' }, legend: { bottom: '0px', left: 'center', data: ['雨量'] }, xAxis: [{ type: 'category', splitLine: { show: false }, data: dataName, inverse:true, boundaryGap: true, axisLine: { onZero: false, lineStyle: { color: "#000" } }, }], grid: { left: '3%', right: '4%', bottom: '8%', containLabel: true }, yAxis: [{ type: 'value', name: '降雨量(mm)', axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true }, }], series: [{ name: '雨量', type: 'bar', barWidth: 30, // 柱图宽度 barMaxWidth: 30, // 最大宽度 data: dataZ }] }; var chartPie = document.getElementById('dailyPei'); var myChartPie = echarts.init(chartPie); myChartPie.setOption(option, true); $('.load-box-list').hide(); } }); } //特征雨量---查询 function featuresShowInfo() { $.ajax({ url: "http://www.sw797.com:82/blade-ycreal/pptnr/selectPptnTz", type: 'post', async: false, dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { 'code': code }, success: function (result) { var contant = ''; var time = result.data[0].time; var timesub = time.substr(5, 11); contant = '<tr>' + '<td><div>1</div></td>' + '<td><div>' + timesub + '</div></td>' + '<td><div>' + result.data[0].drp1 + '</div></td>' + '<td><div>' + result.data[0].drp2 + '</div></td>' + '<td><div>' + result.data[0].drp3 + '</div></td>' + '<td><div>' + result.data[0].drp6 + '</div></td>' + '<td><div>' + result.data[0].drp12 + '</div></td>' + '<td><div>' + result.data[0].drp24 + '</div></td>' + '<td><div>' + result.data[0].drp48 + '</div></td>' + '<td><div>' + result.data[0].drp72 + '</div></td>' + '</tr>'; $('#rainTbodyBox').html(contant); } }); } //基础信息---查询 function rainBasicShowInfo() { $.ajax({ url: "http://www.sw797.com:82/blade-ycreal/stbprpb/selectInfo", type: 'post', async: false, dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { 'code': code }, success: function (result) { var html = '<li>' + '<span>测站编码:</span>' + '<div>' + code + '</div>' + '</li>' + '<li>' + '<span>测站名称:</span>' + '<div>' + result.data[0].stnm + '</div>' + '</li>' + '<li>' + '<span>测站类别:</span>' + '<div>' + result.data[0].sttp + '</div>' + '</li>' + '<li>' + '<span>报讯等级:</span>' + '<div>' + result.data[0].frgrd + '</div>' + '</li>' + '<li>' + '<span>基面名称:</span>' + '<div>' + result.data[0].atcunit + '</div>' + '</li>' + '<li>' + '<span>管理单位:</span>' + '<div>' + result.data[0].locality + '</div>' + '</li>' + '<li>' + '<span>所在县:</span>' + '<div>' + result.data[0].addvcd5 + '</div>' + '</li>' + '<li>' + '<span>流域名称:</span>' + '<div>' + result.data[0].bsnm + '</div>' + '</li>' + '<li>' + '<span>水系:</span>' + '<div>' + result.data[0].hnnm + '</div>' + '</li>' + '<li>' + '<span>河名:</span>' + '<div>' + result.data[0].rvnm + '</div>' + '</li>'; $('#rainInfo').html(html); } }); } $('.rain-menu ul li').click(function () { $(this).addClass('on').siblings().removeClass('on'); $('.rain-box .river-con').eq($(this).index()).show().siblings().hide(); }); }); corelib/common/popup/js/river.js
New file @@ -0,0 +1,754 @@ $(function () { // div 下面的快速查询 $('.input_in input').val('快速查询'); // var code = '62304700'; // 截取 url 地址参数code的值 var code = GetQueryString("id"); var d = new Date(); var str = d.getFullYear() + "-" + (d.getMonth() + 1 < 10 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1) + "-" + (d.getDate() < 10 ? '0' + d.getDate() : d.getDate()) + " " + (d.getHours() + 1 < 10 ? '0' + (d.getHours() + 1) : (d.getHours() + 1)) + ":00:00"; var str_zr = d.getFullYear() + "-" + (d.getMonth() + 1 < 10 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1) + "-" + d.getDate(); var qz = new Date(getDate(Date.parse(new Date()) - 86400000 * 5)); var qzstr = qz.getFullYear() + "-" + (qz.getMonth() + 1 < 10 ? '0' + (qz.getMonth() + 1) : qz.getMonth() + 1) + "-" + (qz.getDate() < 10 ? '0' + qz.getDate() : qz.getDate()) + " 00:00:00"; var qzstr_zr = qz.getFullYear() + "-" + (qz.getMonth() + 1 < 10 ? '0' + (qz.getMonth() + 1) : qz.getMonth() + 1) + "-" + qz.getDate(); // 4个控制时间 $('#inpstart_zr').val(qzstr_zr); $('#inpend_zr').val(str_zr); $('#timestart').val(qzstr); $('#timeend').val(str); // 开始时间 var startTime = qzstr; // 结束时间 var endTime = str; // 八时开始 var eightstartTime = qzstr_zr; var eightendTime = str_zr; var option_sw = {}; var option_bs = {}; //水位过程 $('#riverBtnOne').click(function () { recharts(); $('.load-box-list').show(); $('.input_in input').val('快速查询'); showPie(startTime, endTime); $('#riverSel').hide(); $('#eightRiverSel').hide(); }); function recharts() { var width = $(window).width() * 0.53; var height = ($(window).height() - 50) - 80; // 获取ID var chartPie = document.getElementById('riverPei'); var myChartPie = echarts.init(chartPie); var resize = { width: width, height: height } myChartPie.resize(resize); } //八时水位 $('#riverBtnTwo').click(function () { recharts_z(); $('.load-box-list').show(); $('.input_in input').val('快速查询'); eightShowPie(eightstartTime, eightendTime); $('#riverSel').hide(); $('#eightRiverSel').hide(); }); function recharts_z() { var width = $(window).width() * 0.53; var height = ($(window).height() - 50) - 80; $("#eigthRiverWeater").empty(); $("#eigthRiverWeater").removeAttr("_echarts_instance_").empty(); var chartPie = document.getElementById('eigthRiverWeater'); var myChartPie = echarts.init(chartPie); var resize = { width: width, height: height } myChartPie.resize(resize); } window.onresize = function () { var width = $(window).width() * 0.53; var height = ($(window).height() - 50) - 80; $(".river-tab").height(height); // 获取ID var chartPie_1 = document.getElementById('riverPei'); var chartPie_2 = document.getElementById('eigthRiverWeater'); // echarts初始化 var myChartPie_1 = echarts.init(chartPie_1); var myChartPie_2 = echarts.init(chartPie_2); var resize = { width: width, height: height } myChartPie_1.resize(resize); myChartPie_2.resize(resize); }; //预报水情信息 $('#riverBtnOne').click(function () { $('.input_in input').val('快速查询'); }); //基础信息 $('#riverBtnFou').click(function () { $('.input_in input').val('快速查询'); $('#riverSel').hide(); $('#eightRiverSel').hide(); basicShowInfo(); }); function getDate(timestamp) { let d = new Date(timestamp);// 时间戳为10位需*1000,时间戳为13位的话不需乘1000 let yyyy = d.getFullYear() + '-'; let MM = (d.getMonth() + 1 < 10 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1) + '-'; let dd = (d.getDate() < 10 ? '0' + d.getDate() : d.getDate()) + ' '; let HH = d.getHours() + ':'; let mm = d.getMinutes() + ':'; let ss = d.getSeconds(); return yyyy + MM + dd + HH + mm + ss; } function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } setTimeout(function () { $('.load-box-list').show(); showPie(startTime, endTime); }, 200); $('.input_in input').click(function () { $('#riverSel').toggle(); $('#eightRiverSel').toggle(); }) //水位过程-----快速查询 $('#riverSel ul li').click(function () { $('.load-box-list').show(); $('#riverSel').hide(); var checkTime = $(this).attr('data'); var curr = new Date(); var currDataD = curr.getFullYear(); // 获取完整的年份 4位数 var currDataM = curr.getMonth() + 1; // 获取当前月份,0是1月,所以+1 var currDataR = curr.getDate(); // 获取当前日,1-31日 var currDataH = curr.getHours(); // 获取当前小时数0-23 // 结束时间 var currAllTime = currDataD + '-' + currDataM + '-' + currDataR + ' ' + (currDataH + 1) + ':00:00'; var data = ''; var dataD = ''; var dataM = ''; var dataR = ''; var dataH = ''; var allDataTime = ''; if (checkTime == '12') { data = new Date(new Date() - 12 * 60 * 60 * 1000); $('.input_in input').val('最近12小时'); } else if (checkTime == '24') { data = new Date(new Date() - 24 * 60 * 60 * 1000); $('.input_in input').val('最近24小时'); } else if (checkTime == '36') { data = new Date(new Date() - 36 * 60 * 60 * 1000); $('.input_in input').val('最近36小时'); } else if (checkTime == '72') { data = new Date(new Date() - 72 * 60 * 60 * 1000); $('.input_in input').val('最近72小时'); } dataD = data.getFullYear(); dataM = data.getMonth() + 1; dataR = data.getDate(); dataH = data.getHours(); // 开始时间 allDataTime = dataD + '-' + dataM + '-' + dataR + ' ' + (dataH + 1) + ':00:00'; $('#timestart').val(allDataTime); $('#timeend').val(currAllTime); showPie(allDataTime, currAllTime); }); //水位过程------时间查询 $('#riverBtn').click(function () { $('.load-box-list').show(); $('.input_in input').val('快速查询'); // 开始时间获取 startTime = $("#timestart").val(); // 结束时间获取 endTime = $("#timeend").val(); // 调用方法,传参数, 开始 于 结束 showPie(startTime, endTime); }); // 时间查询方法 function showPie(startTime, endTime) { // 接受参数,发送ajax请求 $.ajax({ url: "http://www.sw797.com:82/blade-ycreal/riverr/selectStation", type: 'post', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { 'code': code, 'dateBegin': startTime, 'dateEnd': endTime }, success: function (result) { var result = result.data; var maxY = result.maxWater; var yadd = 0; yadd = Math.ceil(parseFloat(result.wrz).toFixed(2) - maxY); if (isNaN(yadd)) { yadd = 0; } var minY = result.minWater; var intervalY; var difference = (maxY + yadd) - minY; if (difference / 15 < 0.1) { intervalY = 0.1; } else if (difference / 15 < 0.2) { intervalY = 0.2; } else if (difference / 15 < 0.4) { intervalY = 0.4; } else if (difference) { intervalY = 0.5; } var maxQY = result.maxQ; var minQY = result.minQ; // 回调函数,接受数据 var q = ''; var dataName = []; var dataL = []; var dataZ = []; var contant = ''; for (var i = 0; i < result.data.length; i++) { var time = result.data[i].tm; var timesub = time.substr(5, 11); var timetab = time.substr(5, 11); var wptn_val = result.data[i].wptn; if (wptn_val == '4') { var wptn = '↓'; var color1 = 0; var color2 = 128; var color3 = 0; } else if (wptn_val == '5') { var wptn = '↑'; var color1 = 255; var color2 = 0; var color3 = 0; } else if (wptn_val == '6') { var wptn = '-'; var color1 = 0; var color2 = 0; var color3 = 255; } dataName.push(timesub); dataZ.push(result.data[i].z); if (result.data[i].q == null || result.data[i].q == -1) { q = '/'; } else { q = result.data[i].q; } dataL.push(q); contant += '<tr>' + '<td><div>' + (i + 1) + '</div></td>' + '<td><div>' + timetab + '</div></td>' + '<td><div>' + result.data[i].z + '</div></td>' + "<td><div style='text-align:center'><span style='color: rgb(" + color1 + ", " + color2 + ", " + color3 + ")'>" + wptn + "</span></div></td>" + '<td><div>' + q + '</div></td>' + '</tr>'; } $('#riverTable').html(contant); // echarts 需要 option_sw = { title: { text: '实时水情', left: 'center', top: '15px' }, tooltip: { trigger: 'axis' }, legend: { bottom: '0px', left: 'center', data: ['水位', '流量'] }, xAxis: [{ type: 'category', splitLine: { show: false }, data: dataName, inverse: true, boundaryGap: false, axisLine: { onZero: false, lineStyle: { color: "#000" } }, }], grid: { left: '3%', right: '4%', bottom: '8%', containLabel: true }, }; if (dataL[0] != "/") { option_sw.series = [{ name: '水位', type: 'line', data: dataZ, markLine : { //添加警戒线 symbol:"none", //去掉警戒线最后面的箭头 name:"警戒线", silent:true, label:{ position:"middle", //将警示值放在哪个位置,三个值“start”,"middle","end" 开始 中点 结束 color:"red", fontSize:14 }, data : [{ silent:true, //鼠标悬停事件 true没有,false有 lineStyle:{ //警戒线的样式 ,虚实 颜色 type:"solid", color:"red" }, name: '警戒线', yAxis: result.wrz }] } }, { name: '流量', type: 'line', data: dataL, yAxisIndex: 1, } ]; option_sw.yAxis = [{ type: 'value', name: '水位(m)', min: minY, max: maxY + yadd, tickInterval: intervalY, // 固定间隔 axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true }, axisLabel: { formatter: function (value) { return value.toFixed(2); } }, }, { type: 'value', name: '流量(m³/s)', min: minQY, max: maxQY, axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true } } ]; } else { option_sw.series = [{ name: '水位', type: 'line', data: dataZ, markLine : { //添加警戒线 symbol:"none", //去掉警戒线最后面的箭头 name:"警戒线", silent:true, label:{ position:"middle", //将警示值放在哪个位置,三个值“start”,"middle","end" 开始 中点 结束 color:"red", fontSize:14 }, data : [{ silent:true, //鼠标悬停事件 true没有,false有 lineStyle:{ //警戒线的样式 ,虚实 颜色 type:"solid", color:"red" }, name: '警戒线', yAxis: result.wrz }] } } ]; option_sw.yAxis = [{ type: 'value', name: '水位(m)', min: minY, max: maxY + yadd, tickInterval: intervalY, // 固定间隔 axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true }, axisLabel: { formatter: function (value) { return value.toFixed(2); } }, } ]; } // 获取ID var chartPie = document.getElementById('riverPei'); // echarts初始化 var myChartPie = echarts.init(chartPie); myChartPie.setOption(option_sw, true); $('.load-box-list').hide(); } }); } //八时水位------时间查询 $('#eigthRiverBtn').click(function () { $('.load-box-list').show(); $('.input_in input').val('快速查询'); eightstartTime = $("#inpstart_zr").val(); eightendTime = $("#inpend_zr").val(); eightShowPie(eightstartTime, eightendTime); }); //八时水位------快速查询 $('#eightRiverSel ul li').click(function () { $('.load-box-list').show(); $('#eightRiverSel').hide(); var checkTime = $(this).attr('data'); var eightstartTime = ''; var eightendTime = ''; var Nowdate = new Date(); var MonthFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth(), 1); if (checkTime == '本月') { $('.input_in input').val('本月'); M = Number(MonthFirstDay.getMonth()) + 1 eightstartTime = MonthFirstDay.getFullYear() + "-" + M + "-" + MonthFirstDay.getDate(); var MonthNextFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth() + 1, 1); var MonthLastDay = new Date(MonthNextFirstDay - 86400000); M = Number(MonthLastDay.getMonth()) + 1 eightendTime = MonthLastDay.getFullYear() + "-" + M + "-" + MonthLastDay.getDate(); } else if (checkTime == '上月') { $('.input_in input').val('上月'); M = Number(MonthFirstDay.getMonth()) eightstartTime = MonthFirstDay.getFullYear() + "-" + M + "-" + MonthFirstDay.getDate(); var MonthNextFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth(), 1); var MonthLastDay = new Date(MonthNextFirstDay - 86400000); M = Number(MonthLastDay.getMonth() + 1) eightendTime = MonthLastDay.getFullYear() + "-" + M + "-" + MonthLastDay.getDate(); } // 时间回填 $('#inpstart_zr').val(eightstartTime); $('#inpend_zr').val(eightendTime); eightShowPie(eightstartTime, eightendTime); }); function eightShowPie(eightstartTime, eightendTime) { if (eightstartTime == '' && eightendTime == '') { var Nowdate = new Date(); var MonthFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth(), 1); M = Number(MonthFirstDay.getMonth()) + 1 eightstartTime = MonthFirstDay.getFullYear() + "-" + M + "-" + MonthFirstDay.getDate(); var MonthNextFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth() + 1, 1); var MonthLastDay = new Date(MonthNextFirstDay - 86400000); M = Number(MonthLastDay.getMonth()) + 1 eightendTime = MonthLastDay.getFullYear() + "-" + M + "-" + MonthLastDay.getDate(); } $.ajax({ url: "http://www.sw797.com:82/blade-ycreal/riverr/selectDayList", type: 'post', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { 'code': code, 'dateBegin': eightstartTime + " 00:00:00", 'dateEnd': eightendTime + " 23:59:59" }, success: function (result) { var q = ''; var dataName = []; var dataZ = []; var dataL = []; var contant = ''; for (var i = 0; i < result.data.length; i++) { var time = result.data[i].tm; var timesub = time.substr(5, 11); var timetab = time.substr(5, 11); dataName.push(timesub); var wptn_val = result.data[i].wptn; if (wptn_val == '4') { var wptn = '↓'; var color1 = 0; var color2 = 128; var color3 = 0; } else if (wptn_val == '5') { var wptn = '↑'; var color1 = 255; var color2 = 0; var color3 = 0; } else if (wptn_val == '6') { var wptn = '-'; var color1 = 0; var color2 = 0; var color3 = 255; } dataZ.push(result.data[i].z); if (result.data[i].q == null || result.data[i].q == -1) { q = '/'; } else { q = result.data[i].q; } dataL.push(q); contant += '<tr>' + '<td><div>' + (i + 1) + '</div></td>' + '<td><div>' + timetab + '</div></td>' + '<td><div>' + result.data[i].z + '</div></td>' + "<td><div style='text-align:center'><span style='color: rgb(" + color1 + ", " + color2 + ", " + color3 + ")'>" + wptn + "</span></div></td>" + '<td><div>' + q + '</div></td>' + '</tr>'; } $('#eigthRiverTable').html(contant); // echarts 数据需要 option_bs = { title: { text: '逐日八时', left: 'center', top: '15px' }, tooltip: { trigger: 'axis' }, legend: { bottom: '0px', left: 'center', data: ['水位', '流量'] }, xAxis: [{ type: 'category', splitLine: { show: false }, data: dataName, boundaryGap: false, inverse: true, axisLine: { onZero: false, lineStyle: { color: "#000" } }, }], grid: { left: '3%', right: '4%', bottom: '8%', containLabel: true } }; if (dataL[0] != "/") { option_bs.series = [{ name: '水位', type: 'line', data: dataZ, }, { name: '流量', type: 'line', data: dataL, yAxisIndex: 1, } ]; option_bs.yAxis = [{ type: 'value', name: '水位(m)', scale: true, axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true }, }, { type: 'value', name: '流量(m³/s)', scale: true, axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true }, } ]; } else { option_bs.series = [{ name: '水位', type: 'line', data: dataZ } ]; option_bs.yAxis = [{ type: 'value', name: '水位(m)', scale: true, axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true }, } ]; } var chartPie = document.getElementById('eigthRiverWeater'); var myChartPie = echarts.init(chartPie); myChartPie.setOption(option_bs, true); $('.load-box-list').hide(); } }); } //基础信息---查询 function basicShowInfo() { $.ajax({ url: "http://www.sw797.com:82/blade-ycreal/stbprpb/selectInfo", type: 'post', async: false, dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { 'code': code }, success: function (result) { var html = '<li>' + '<span>测站编码:</span>' + '<div>' + code + '</div>' + '</li>' + '<li>' + '<span>测站名称:</span>' + '<div>' + result.data[0].stnm + '</div>' + '</li>' + '<li>' + '<span>测站类别:</span>' + '<div>' + result.data[0].sttp + '</div>' + '</li>' + '<li>' + '<span>报讯等级:</span>' + '<div>' + result.data[0].frgrd + '</div>' + '</li>' + '<li>' + '<span>基面名称:</span>' + '<div>' + result.data[0].atcunit + '</div>' + '</li>' + '<li>' + '<span>管理单位:</span>' + '<div>' + result.data[0].locality + '</div>' + '</li>' + '<li>' + '<span>所在县:</span>' + '<div>' + result.data[0].addvcd5 + '</div>' + '</li>' + '<li>' + '<span>流域名称:</span>' + '<div>' + result.data[0].bsnm + '</div>' + '</li>' + '<li>' + '<span>水系:</span>' + '<div>' + result.data[0].hnnm + '</div>' + '</li>' + '<li>' + '<span>河名:</span>' + '<div>' + result.data[0].rvnm + '</div>' + '</li>'; $('#riverInfo').html(html); } }); } $('.river-menu ul li').click(function () { $(this).addClass('on').siblings().removeClass('on'); $('.river-box .river-con').eq($(this).index()).show().siblings().hide(); }); $("#loc_smx").click(function () { //注意:parent 是 JS 自带的全局对象,可用于操作父页面 var index = parent.layer.getFrameIndex("Location"); //获取窗口索引 window.parent.$('#loc_openWin').click(); parent.layer.close(index); }); }); corelib/common/popup/js/start.js
New file @@ -0,0 +1,13 @@ $(function () { laydate.render({ elem: '#timestart', //指定元素 type: 'datetime' }); laydate.render({ elem: '#inpstart' //指定元素 ,type: 'datetime' }); laydate.render({ elem: '#inpstart_zr' //指定元素 }); }) corelib/common/popup/js/weather.js
New file @@ -0,0 +1,610 @@ $(function () { $('.close').click(function () { window.parent.$('#infoWindow_pup').hide(); window.parent.$('#infoWindow_pup').attr('src', ''); }); $('.input_in input').val('快速查询'); var code = GetQueryString("id"); var d = new Date(); var str = d.getFullYear() + "-" + (d.getMonth() + 1 < 10 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1) + "-" + (d.getDate() < 10 ? '0' + d.getDate() : d.getDate()) + " " + (d.getHours() + 1 < 10 ? '0' + (d.getHours() + 1) : (d.getHours() + 1)) + ":00:00"; var str_zr = d.getFullYear() + "-" + (d.getMonth() + 1 < 10 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1) + "-" + d.getDate(); var qz = new Date(getDate(Date.parse(new Date()) - 86400000 * 5)); var qzstr = qz.getFullYear() + "-" + (qz.getMonth() + 1 < 10 ? '0' + (qz.getMonth() + 1) : qz.getMonth() + 1) + "-" + (qz.getDate() < 10 ? '0' + qz.getDate() : qz.getDate()) + " 00:00:00"; var qzstr_zr = qz.getFullYear() + "-" + (qz.getMonth() + 1 < 10 ? '0' + (qz.getMonth() + 1) : qz.getMonth() + 1) + "-" + qz.getDate(); // 4个控制时间 $('#inpstart_zr').val(qzstr_zr); $('#inpend_zr').val(str_zr); $('#timestart').val(qzstr); $('#timeend').val(str); var startTime = qzstr; var endTime = str; var rainstartTime = qzstr_zr; var rainendTime = str_zr; function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } function getDate(timestamp) { let d = new Date(timestamp);// 时间戳为10位需*1000,时间戳为13位的话不需乘1000 let yyyy = d.getFullYear() + '-'; let MM = (d.getMonth() + 1 < 10 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1) + '-'; let dd = d.getDate() + ' '; let HH = d.getHours() + ':'; let mm = d.getMinutes() + ':'; let ss = d.getSeconds(); return yyyy + MM + dd + HH + mm + ss; } setTimeout(function () { $('.load-box-list').show(); reseShowPie(startTime, endTime); }, 200); $('.input_in input').click(function () { // $('#riverSel').show(); $('#restSel').toggle(); $('#restRiverSelBox').toggle(); }) //水位过程 $('#reseBtnOne').click(function () { $('.load-box-list').show(); $('#restSel').hide(); $('#restRiverSelBox').hide(); $('.input_in input').val('快速查询'); reseShowPie(startTime, endTime); $('#restSel').hide(); $('#restRiverSelBox').hide(); }); //八时水位 $('#reseBtnTwo').click(function () { $('.load-box-list').show(); $('.input_in input').val('快速查询'); dailyReseShowPie(rainstartTime, rainendTime); $('#restSel').hide(); $('#restRiverSelBox').hide(); }); function recharts_z() { var width = $(window).width() * 0.53; var height = ($(window).height() - 50) - 80; var chartPie = document.getElementById('rserWeaterPie'); var myChartPie = echarts.init(chartPie); var resize = { width: width, height: height } myChartPie.resize(resize); } function recharts() { var width = $(window).width() * 0.53; var height = ($(window).height() - 50) - 80; // 获取ID var chartPie = document.getElementById('resePei'); var myChartPie = echarts.init(chartPie); var resize = { width: width, height: height } myChartPie.resize(resize); } window.onresize = function () { var width = $(window).width() * 0.53; var height = ($(window).height() - 50) - 80; $(".river-tab").height(height); // 获取ID var chartPie_1 = document.getElementById('resePei'); var chartPie_2 = document.getElementById('rserWeaterPie'); // echarts初始化 var myChartPie_1 = echarts.init(chartPie_1); var myChartPie_2 = echarts.init(chartPie_2); var resize = { width: width, height: height } myChartPie_1.resize(resize); myChartPie_2.resize(resize); }; //基础信息 $('#reseBtnThr').click(function () { $('.input_in input').val('快速查询'); reseBasicShowInfo(); $('#restSel').hide(); $('#restRiverSelBox').hide(); }); $('#restSel ul li').click(function () { $('.load-box-list').show(); $('#restSel').hide(); var checkTime = $(this).attr('data'); var curr = new Date(); var currDataD = curr.getFullYear(); var currDataM = curr.getMonth() + 1; var currDataR = curr.getDate(); var currDataH = curr.getHours(); var currDataDd = curr.getMinutes(); // 获取分钟数 var currAllTime = currDataD + '-' + currDataM + '-' + currDataR + ' ' + (currDataH + 1) + ':00:00'; var data = ''; var dataD = ''; var dataM = ''; var dataR = ''; var dataH = ''; var dataDd = ''; var allDataTime = ''; if (checkTime == '12') { data = new Date(new Date() - 12 * 60 * 60 * 1000); $('.input_in input').val('最近12小时'); } else if (checkTime == '24') { data = new Date(new Date() - 24 * 60 * 60 * 1000); $('.input_in input').val('最近24小时'); } else if (checkTime == '36') { data = new Date(new Date() - 36 * 60 * 60 * 1000); $('.input_in input').val('最近36小时'); } else if (checkTime == '72') { data = new Date(new Date() - 72 * 60 * 60 * 1000); $('.input_in input').val('最近72小时'); } dataD = data.getFullYear(); dataM = data.getMonth() + 1; dataR = data.getDate(); dataH = data.getHours(); dataDd = data.getMinutes(); allDataTime = dataD + '-' + dataM + '-' + dataR + ' ' + (dataH + 1) + ':00:00'; $('#timestart').val(allDataTime); $('#timeend').val(currAllTime); reseShowPie(allDataTime, currAllTime); }); //水位过程------时间查询 $('#restRiverBtn').click(function () { $('.load-box-list').show(); $('.input_in input').val('快速查询'); startTime = $("#timestart").val(); endTime = $("#timeend").val(); reseShowPie(startTime, endTime); }); function reseShowPie(startTime, endTime) { $.ajax({ url: "http://www.sw797.com:82/blade-ycreal/rsvrr/selectRsvrList", type: 'post', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { 'code': code, 'dateBegin': startTime, 'dateEnd': endTime }, success: function (result) { var result = result.data; var maxY = result.maxWater; var yadd = 0; yadd = Math.ceil(parseFloat(result.wrz).toFixed(2) - maxY); if (isNaN(yadd)) { yadd = 0; } var minY = result.minWater; var intervalY; var difference = (maxY + yadd) - minY; if (difference / 15 < 0.1) { intervalY = 0.1; } else if (difference / 15 < 0.2) { intervalY = 0.2; } else if (difference / 15 < 0.4) { intervalY = 0.4; } else if (difference) { intervalY = 0.5; } var maxQY = result.maxQ; var minQY = result.minQ; var q = ''; var dataName = []; var dataZ = []; var dataL = []; var dataX = []; var contant = ''; for (var i = 0; i < result.data.length; i++) { var time = result.data[i].tm; var timesub = time.substr(5, 11); var wptn_val = result.data[i].rwptn; if (wptn_val == '4') { var wptn = '↓'; var color1 = 0; var color2 = 128; var color3 = 0; } else if (wptn_val == '5') { var wptn = '↑'; var color1 = 255; var color2 = 0; var color3 = 0; } else if (wptn_val == '6' || !wptn_val) { var wptn = '-'; var color1 = 0; var color2 = 0; var color3 = 255; } if (result.data[i].w == -1) { result.data[i].w = 0; } dataName.push(timesub); dataZ.push(result.data[i].rz); dataL.push(result.data[i].w); dataX.push(result.data[i].fsltdz); contant += '<tr>' + '<td><div>' + (i + 1) + '</div></td>' + '<td><div>' + timesub + '</div></td>' + '<td><div>' + result.data[i].rz + '</div></td>' + "<td><div style='text-align:center'><span style='color: rgb(" + color1 + ", " + color2 + ", " + color3 + ")'>" + wptn + "</span></div></td>" + '<td><div>' + result.data[i].w + '</div></td>' + '</tr>'; } $('#reseTable').html(contant); var option = { title: { text: '实时水情', left: 'center', top: '15px' }, tooltip: { trigger: 'axis' }, legend: { bottom: '0px', left: 'center', data: ['水位', '蓄水量'] }, xAxis: [{ type: 'category', splitLine: { show: false }, data: dataName, inverse: true, boundaryGap: false, axisLine: { onZero: false, lineStyle: { color: "#000" } }, }], grid: { left: '3%', right: '4%', bottom: '8%', containLabel: true }, yAxis: [{ type: 'value', scale: true, name: '水位(m)', min: minY, max: maxY + yadd, tickInterval: intervalY, // 固定间隔 axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true }, axisLabel: { formatter: function (value) { return value.toFixed(2); } }, }, { type: 'value', scale: true, name: '蓄水量(m³)', min: minQY, max: maxQY, axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true }, } ], series: [{ name: '水位', type: 'line', data: dataZ, markLine: { //添加警戒线 symbol: "none", //去掉警戒线最后面的箭头 name: "警戒线", silent: true, label: { position: "middle", //将警示值放在哪个位置,三个值“start”,"middle","end" 开始 中点 结束 color: "red", fontSize: 14 }, data: [{ silent: true, //鼠标悬停事件 true没有,false有 lineStyle: { //警戒线的样式 ,虚实 颜色 type: "solid", color: "red" }, name: '警戒线', yAxis: result.wrz }] } }, { name: '蓄水量', type: 'line', data: dataL, yAxisIndex: 1, } ] }; var chartPie = document.getElementById('resePei'); var myChartPie = echarts.init(chartPie); myChartPie.setOption(option, true); $('.load-box-list').hide(); } }); } //八时水位------时间查询 $('#restriverBtn_bs').click(function () { $('.load-box-list').show(); $('.input_in input').val('快速查询'); eightstartTime = $("#inpstart_zr").val(); eightendTime = $("#inpend_zr").val(); dailyReseShowPie(eightstartTime, eightendTime); }); //八时水位------快速查询 $('#restRiverSelBox ul li').click(function () { $('.load-box-list').show(); $('#restRiverSelBox').hide(); var checkTime = $(this).attr('data'); var eightstartTime = ''; var eightendTime = ''; var Nowdate = new Date(); var MonthFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth(), 1); if (checkTime == '本月') { $('.input_in input').val('本月'); M = Number(MonthFirstDay.getMonth()) + 1 eightstartTime = MonthFirstDay.getFullYear() + "-" + M + "-" + MonthFirstDay.getDate(); var MonthNextFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth() + 1, 1); var MonthLastDay = new Date(MonthNextFirstDay - 86400000); M = Number(MonthLastDay.getMonth()) + 1 eightendTime = MonthLastDay.getFullYear() + "-" + M + "-" + MonthLastDay.getDate(); } else if (checkTime == '上月') { $('.input_in input').val('上月'); M = Number(MonthFirstDay.getMonth()) eightstartTime = MonthFirstDay.getFullYear() + "-" + M + "-" + MonthFirstDay.getDate(); var MonthNextFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth(), 1); var MonthLastDay = new Date(MonthNextFirstDay - 86400000); M = Number(MonthLastDay.getMonth() + 1) eightendTime = MonthLastDay.getFullYear() + "-" + M + "-" + MonthLastDay.getDate(); } // 时间回填 $('#inpstart_zr').val(eightstartTime); $('#inpend_zr').val(eightendTime); dailyReseShowPie(eightstartTime, eightendTime); }); function dailyReseShowPie(reseStartTime, reseEndTime) { if (reseStartTime == '' && reseStartTime == '') { var Nowdate = new Date(); var MonthFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth(), 1); M = Number(MonthFirstDay.getMonth()) + 1 reseStartTime = MonthFirstDay.getFullYear() + "-" + M + "-" + MonthFirstDay.getDate(); var MonthNextFirstDay = new Date(Nowdate.getFullYear(), Nowdate.getMonth() + 1, 1); var MonthLastDay = new Date(MonthNextFirstDay - 86400000); M = Number(MonthLastDay.getMonth()) + 1 reseEndTime = MonthLastDay.getFullYear() + "-" + M + "-" + MonthLastDay.getDate(); } $.ajax({ url: "http://www.sw797.com:82/blade-ycreal/rsvrr/selectRsvrDayList", type: 'post', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { 'code': code, 'dateBegin': reseStartTime + " 00:00:00", 'dateEnd': reseEndTime + " 23:59:59" }, success: function (result) { var q = ''; var dataName = []; var dataZ = []; var dataL = []; var dataX = []; var contant = ''; for (var i = 0; i < result.data.length; i++) { var time = result.data[i].tm; var timesub = time.substr(5, 11); dataName.push(timesub); dataZ.push(result.data[i].rz); dataL.push(result.data[i].w); dataX.push(result.data[i].fsltdz); contant += '<tr>' + '<td><div>' + (i + 1) + '</div></td>' + '<td><div>' + timesub + '</div></td>' + '<td><div>' + result.data[i].rz + '</div></td>' + '</tr>'; } $('#reseTableBox').html(contant); var option = { title: { text: '逐日八时', left: 'center', top: '15px' }, tooltip: { trigger: 'axis' }, legend: { bottom: '0px', left: 'center', data: ['水位', '蓄水量'] }, xAxis: [{ type: 'category', splitLine: { show: false }, data: dataName, inverse: true, boundaryGap: false, axisLine: { onZero: false, lineStyle: { color: "#000" } }, }], grid: { left: '3%', right: '4%', bottom: '8%', containLabel: true }, yAxis: [{ type: 'value', scale: true, name: '水位(m)', axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true }, }, { type: 'value', scale: true, name: '水位(m)', axisLine: { lineStyle: { color: '#000', } }, splitLine: { show: true }, } ], series: [{ name: '水位', type: 'line', data: dataZ }, { name: '蓄水量', type: 'line', data: dataL, yAxisIndex: 1, } ] }; var chartPie = document.getElementById('rserWeaterPie'); var myChartPie = echarts.init(chartPie); myChartPie.setOption(option, true); $('.load-box-list').hide(); } }); } //基础信息---查询 function reseBasicShowInfo() { $.ajax({ url: "http://www.sw797.com:82/blade-ycreal/stbprpb/selectInfo", type: 'post', async: false, dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { 'code': code }, success: function (result) { var html = '<li>' + '<span>测站编码:</span>' + '<div>' + code + '</div>' + '</li>' + '<li>' + '<span>测站名称:</span>' + '<div>' + result.data[0].stnm + '</div>' + '</li>' + '<li>' + '<span>测站类别:</span>' + '<div>' + result.data[0].sttp + '</div>' + '</li>' + '<li>' + '<span>报讯等级:</span>' + '<div>' + result.data[0].frgrd + '</div>' + '</li>' + '<li>' + '<span>基面名称:</span>' + '<div>' + result.data[0].atcunit + '</div>' + '</li>' + '<li>' + '<span>管理单位:</span>' + '<div>' + result.data[0].locality + '</div>' + '</li>' + '<li>' + '<span>所在县:</span>' + '<div>' + result.data[0].addvcd5 + '</div>' + '</li>' + '<li>' + '<span>流域名称:</span>' + '<div>' + result.data[0].bsnm + '</div>' + '</li>' + '<li>' + '<span>水系:</span>' + '<div>' + result.data[0].hnnm + '</div>' + '</li>' + '<li>' + '<span>河名:</span>' + '<div>' + result.data[0].rvnm + '</div>' + '</li>'; $('#reseInfo').html(html); } }); } $('.reser-menu ul li').click(function () { $(this).addClass('on').siblings().removeClass('on'); $('.reser-box .river-con').eq($(this).index()).show().siblings().hide(); }); }); corelib/common/popup/rain.html
New file @@ -0,0 +1,169 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>降雨</title> <link rel="stylesheet" href="./css/style.css"> </head> <body> <div class="river-course"> <div class="river-top"> <div class="rain-menu"> <ul> <li class="on" id="rainBtnOne">时段雨量</li> <li id="rainBtnTwo">逐日雨量</li> <li id="rainBtnThr">特征雨量</li> <li id="rainBtnFou">基础信息</li> </ul> </div> </div> <div class="rain-box"> <!-- 时段雨量 --> <div class="river-one river-con"> <div class="river-box-top"> <div class="river-data"> <input type="text" class="datainp time-icon" id="timestart" placeholder="开始日期"><span>至</span> <input type="text" class="datainp time-icon" id="timeend" placeholder="结束日期"> </div> <div class="selectsd"> <div class="input_insd"> <input type="text" value="时段" readonly="readonly"/> </div> <div class="city hide" id="RainSd"> <ul> <li data="1">1</li> <li data="2">2</li> <li data="3">3</li> <li data="6">6</li> </ul> </div> </div> <input type="button" value="查询" class="river-btn" id="riverBtn"/> <div class="select"> <div class="input_in"> <input type="text" value="快速查询" readonly="readonly"/> </div> <div class="city hide" id="RainSel"> <ul> <li data="2">最近2小时</li> <li data="12">最近12小时</li> <li data="24">最近24小时</li> <li data="36">最近36小时</li> <li data="72">最近72小时</li> </ul> </div> </div> </div> <div class="rain-pei" id="rainPei"></div> <div class="rain-tab"> <table class="table-thead rain-thead"> <thead> <tr> <th><div>序号</div></th> <th><div>时间</div></th> <th><div>雨量(mm)</div></th> <th><div></div></th> </tr> </thead> </table> <div class="comTbody"> <table class="table-tbody rain-tbody" style="border-top: 0;"> <tbody id="rainTable"> </tbody> </table> </div> </div> </div> <!-- 逐日雨量 --> <div class="river-two none river-con"> <div class="river-box-top"> <div class="river-data"> <input class="datainp time-icon" id="inpstart_zr" type="text" placeholder="开始日期" value="" readonly ><span>至</span><input class="datainp time-icon" id="inpend_zr" type="text" placeholder="结束日期" readonly> </div> <input type="button" value="查询" class="river-btn" id="dailyRainBtn"/> <div class="select"> <div class="input_in"> <input type="text" value="快速查询" readonly="readonly"/> </div> <div class="city hide" id="dailyRiverSel"> <ul> <li data="3">近3天</li> <li data="7">近7天</li> <li data="15">近15天</li> </ul> </div> </div> </div> <div class="rain-pei" id="dailyPei"></div> <div class="rain-tab"> <table class="table-thead rain-thead"> <thead> <tr> <th><div>序号</div></th> <th><div>时间</div></th> <th><div>雨量(mm)</div></th> <th><div></div></th> </tr> </thead> </table> <div class="comTbody"> <table class="table-tbody rain-tbody" style="border-top: 0;"> <tbody id="dailyRainTable"> </tbody> </table> </div> </div> </div> <!-- 特征雨量 --> <div class="river-thr none river-con"> <table class="table-thead rain-thead-box"> <thead> <tr> <th><div>序号</div></th> <th><div>年份/时间</div></th> <th><div>1小时</div></th> <th><div>2小时</div></th> <th><div>3小时</div></th> <th><div>6小时</div></th> <th><div>12小时</div></th> <th><div>24小时</div></th> <th><div>48小时</div></th> <th><div>72小时</div></th> <th><div></div></th> </tr> </thead> </table> <div class="comTbody"> <table class="table-tbody rain-tbody-box" style="border-top: 0;"> <tbody id="rainTbodyBox"> </tbody> </table> </div> </div> <!-- 基础信息 --> <div class="river-fou river-con none"> <div class="river-fou-box"> <ul id="rainInfo"> </ul> </div> </div> <div class="load-box-list"> <div class="rote-load"> <img src="./img/rote.jpg" alt=""> <span>正在加载</span> </div> </div> </div> </div> <script src="../../../libs/jquery/jquery-3.3.1.min.js"></script> <script src="../../../libs/echarts/v4/echarts.min.js"></script> <script src="../../../libs/laydate/laydate.js"></script> <script src="./js/rain.js"></script> <script src="./js/start.js"></script> <script src="./js/end.js"></script> </body> </html> corelib/common/popup/river.html
New file @@ -0,0 +1,141 @@ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>河道站</title> <link rel="stylesheet" href="./css/style.css"> <link rel="stylesheet" href=""> </head> <body> <div class="river-course"> <div class="river-top"> <div class="river-menu"> <ul> <li class="on" id="riverBtnOne">水位过程</li> <li id="riverBtnTwo">八时水位</li> <li id="riverBtnFou">基础信息</li> </ul> </div> </div> <div class="river-box"> <!-- 水位过程 --> <div class="river-one river-con"> <div class="river-box-top"> <div class="river-data"> <input type="text" class="datainp time-icon" id="timestart" placeholder="开始日期"> <span>至</span> <input type="text" class="datainp time-icon" id="timeend" placeholder="结束日期"> </div> <input type="button" value="查询" class="river-btn" id="riverBtn"/> <input type="button" value="1" style="display: none" class="river-btn" id="REecharts"/> <div class="select"> <div class="input_in"> <input type="text" value="快速查询" readonly="readonly"/> </div> <div class="city hide" id="riverSel"> <ul> <li data="12">最近12小时</li> <li data="24">最近24小时</li> <li data="36">最近36小时</li> <li data="72">最近72小时</li> </ul> </div> </div> <input type="button" value="水面线查询" style="display: none" class="loc-btn" id="loc_smx"/> </div> <div class="river-pei" id="riverPei"></div> <div class="river-tab"> <table class="table-thead river-thead"> <thead> <tr> <th><div>序号</div></th> <th><div>时间</div></th> <th><div>水位(m)</div></th> <th><div>水势</div></th> <th><div>流量(m³/s)</div></th> <th><div></div></th> </tr> </thead> </table> <div class="comTbody"> <table class="table-tbody river-tbody" style="border-top: 0;"> <tbody id="riverTable"> </tbody> </table> </div> </div> </div> <!-- 八时水位 --> <div class="river-two river-con none"> <div class="river-box-top"> <div class="river-data"> <input class="datainp time-icon" id="inpstart_zr" type="text" placeholder="开始日期" readonly ><span>至</span><input class="datainp time-icon" id="inpend_zr" type="text" placeholder="结束日期" readonly> </div> <input type="button" value="查询" class="river-btn" id="eigthRiverBtn"/> <div class="select"> <div class="input_in"> <input type="text" value="快速查询" readonly="readonly"/> </div> <div class="city hide" id="eightRiverSel"> <ul> <li data="本月">本月</li> <li data="上月">上月</li> </ul> </div> </div> </div> <div class="river-pei" id="eigthRiverWeater"></div> <div class="river-tab"> <table class="table-thead river-thead"> <thead> <tr> <th><div>序号</div></th> <th><div>时间</div></th> <th><div>水位(m)</div></th> <th><div>水势</div></th> <th><div>流量(m³/s)</div></th> <th><div></div></th> </tr> </thead> </table> <div class="comTbody"> <table class="table-tbody river-tbody" style="border-top: 0;"> <tbody id="eigthRiverTable"> </tbody> </table> </div> </div> </div> <!--<!– 预报水情信息 –> <div class="river-thr river-con none"></div>--> <!-- 基础信息 --> <div class="river-fou river-con none"> <div class="river-fou-box"> <ul id="riverInfo"> </ul> </div> </div> <div class="load-box-list"> <div class="rote-load"> <img src="./img/rote.jpg" alt=""> <span>正在加载</span> </div> </div> </div> </div> <script src="../../../libs/jquery/jquery-3.3.1.min.js"></script> <script src="../../../libs/echarts/v4/echarts.min.js"></script> <script src="../../../libs/laydate/laydate.js"></script> <script src="./js/river.js"></script> <script src="./js/start.js"></script> <script src="./js/end.js"></script> </body> </html> corelib/common/popup/weather.html
New file @@ -0,0 +1,131 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>水库</title> <link rel="stylesheet" href="./css/style.css"> </head> <body> <div class="river-course"> <div class="river-top"> <div class="reser-menu"> <ul> <li class="on" id="reseBtnOne">水位过程</li> <li id="reseBtnTwo">八时水位</li> <li id="reseBtnThr">基础信息</li> </ul> </div> </div> <div class="reser-box"> <!-- 水位过程 --> <div class="river-one river-con"> <div class="river-box-top"> <div class="river-data"> <input type="text" class="datainp time-icon" id="timestart" placeholder="开始日期"><span>至</span> <input type="text" class="datainp time-icon" id="timeend" placeholder="结束日期"> </div> <input type="button" value="查询" class="river-btn" id="restRiverBtn"/> <div class="select"> <div class="input_in"> <input type="text" value="快速查询" readonly="readonly"/> </div> <div class="city hide" id="restSel"> <ul> <li data="12">最近12小时</li> <li data="24">最近24小时</li> <li data="36">最近36小时</li> <li data="72">最近72小时</li> </ul> </div> </div> </div> <div class="river-pei" id="resePei"></div> <div class="river-tab"> <table class="table-thead river-thead"> <thead> <tr> <th><div>序号</div></th> <th><div>时间</div></th> <th><div>水位(m)</div></th> <th><div>水势</div></th> <th><div>蓄水量(m³)</div></th> <th><div></div></th> </tr> </thead> </table> <div class="comTbody"> <table class="table-tbody river-tbody" style="border-top: 0;"> <tbody id="reseTable"> </tbody> </table> </div> </div> </div> <!-- 八时水位 --> <div class="river-two river-con none"> <div class="river-box-top"> <div class="river-data"> <input class="datainp time-icon" id="inpstart_zr" type="text" placeholder="开始日期" value="" readonly ><span>至</span><input class="datainp time-icon" id="inpend_zr" type="text" placeholder="结束日期" readonly> </div> <input type="button" value="查询" class="river-btn" id="restriverBtn_bs"/> <div class="select"> <div class="input_in"> <input type="text" value="快速查询" readonly="readonly"/> </div> <div class="city hide" id="restRiverSelBox"> <ul> <li data="本月">本月</li> <li data="上月">上月</li> </ul> </div> </div> </div> <div class="river-pei" id="rserWeaterPie"></div> <div class="river-tab"> <table class="table-thead rser-thead"> <thead> <tr> <th><div>序号</div></th> <th><div>时间</div></th> <th><div>水位(m³)</div></th> <th><div></div></th> </tr> </thead> </table> <div class="comTbody"> <table class="table-tbody rser-tbody" style="border-top: 0;"> <tbody id="reseTableBox"> </tbody> </table> </div> </div> </div> <!-- 基础信息 --> <div class="river-fou river-con none"> <div class="river-fou-box"> <ul id="reseInfo"> </ul> </div> </div> <div class="load-box-list"> <div class="rote-load"> <img src="./img/rote.jpg" alt=""> <span>正在加载</span> </div> </div> </div> </div> <script src="../../../libs/jquery/jquery-3.3.1.min.js"></script> <script src="../../../libs/echarts/v4/echarts.min.js"></script> <script src="../../../libs/laydate/laydate.js"></script> <script src="./js/weather.js"></script> <script src="./js/start.js"></script> <script src="./js/end.js"></script> </body> </html> corelib/common/toolbar/DrawHelper/DrawHelper.css
New file @@ -0,0 +1,99 @@ .twipsy { display: block; position: absolute; visibility: visible; max-width: 200px; min-width: 100px; padding: 5px; font-size: 11px; z-index: 1000; opacity: 0.8; -khtml-opacity: 0.8; -moz-opacity: 0.8; filter: alpha(opacity=80); } .twipsy.left .twipsy-arrow { top: 50%; right: 0; margin-top: -5px; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 5px solid #000000; } .twipsy.right .twipsy-arrow { top: 50%; left: 0; margin-top: -5px; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-right: 5px solid #000000; } .twipsy-inner { padding: 3px 8px; background-color: #000000; color: white; text-align: center; max-width: 200px; text-decoration: none; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .twipsy-arrow { position: absolute; width: 0; height: 0; } /* css rules for the draw helper components */ .toolbar { margin: 0px; padding: 0px; background: white; /*float:right;*/ } .toolbar > .button { margin: 5px; padding: 5px; border: 1px solid #eee; cursor: pointer; } .toolbar > .button:hover { background: #eee; } /* css rules for the infowindow */ .infoWindow { position: absolute; min-width: 100px; max-width: 300px; } .infoWindow #frame { padding: 10px; border: 1px solid black; background: white; } .infoWindow #close { float: right; margin: 5px 2px; font-size: small; color: gray; cursor: pointer; } .infoWindow #arrow { position: absolute; bottom: -8px; left: 50%; margin-left: -10px; border-right: 10px solid transparent; border-left: 10px solid transparent; border-top: 10px solid white; } corelib/common/toolbar/DrawHelper/DrawHelper.html
New file @@ -0,0 +1,180 @@ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> <title>Tools-03DrawHelper</title> <link href="Tools-03DrawHelper.css" rel="stylesheet" type="text/css" /> <script src="../Cesium/Cesium.js"></script> <script src="./Tools-03DrawHelper.js"></script> <style> @import url(../Cesium/Widgets/widgets.css); /* @import url(../Cesium/Widgets/cesium-navigation.css); */ #cesiumContainer { position: absolute; top: 0px; left: 0; height: 100%; width: 100%; margin: 0; overflow: hidden; padding: 0; font-family: sans-serif; } #toolbar { position: absolute; top: 0px; left: 0; display: inline; margin: 10px; padding: 0px; background: white; } #logging { position: absolute; bottom: 0px; right: 0; display: inline; margin: 10px; padding: 10px; background: white; } body { padding: 0; margin: 0; overflow: hidden; } </style> </head> <body onload="start()"> <div id="cesiumContainer"></div> <div id="toolbar"> </div> <div id="logging"> </div> <script> function start() { var esri = new Cesium.WebMapTileServiceImageryProvider({ url: 'http://t0.tianditu.com/img_w/wmts?', layer: 'img', style: 'default', format: 'tiles', tileMatrixSetID: 'w', credit: new Cesium.Credit('天地图全球影像服务'), maximumLevel: 18 }); var terrainProvider = new Cesium.CesiumTerrainProvider({ url: '../../OtherDemo/sampledata/terrain/beijing30m/' }); // create the almighty cesium widget var cesiumWidget = new Cesium.CesiumWidget('cesiumContainer', { imageryProvider: esri, scene3DOnly: true }); var scene = cesiumWidget.scene; scene.globe.depthTestAgainstTerrain = true;//地形遮挡 // add terrain elevation // var cesiumTerrainProviderHeightmaps = new Cesium.CesiumTerrainProvider({ // url : 'https://cesiumjs.org/tilesets/terrain/smallterrain', // credit : 'Terrain data courtesy Analytical Graphics, Inc.' // }); // // scene.terrainProvider = terrainProvider; // start the draw helper to enable shape creation and editing var drawHelper = new DrawHelper(cesiumWidget); var toolbar = drawHelper.addToolbar(document.getElementById("toolbar"), { buttons: ['marker', 'polyline', 'polygon', 'circle', 'extent'] }); toolbar.addListener('markerCreated', function (event) { loggingMessage('Marker created at ' + event.position.toString()); // create one common billboard collection for all billboards var b = new Cesium.BillboardCollection(); scene.primitives.add(b); var billboard = b.add({ show: true, position: event.position, pixelOffset: new Cesium.Cartesian2(0, 0), eyeOffset: new Cesium.Cartesian3(0.0, 0.0, 0.0), horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.CENTER, scale: 1.0, image: './sampledata/images/DrawHelper/glyphicons_242_google_maps.png', color: new Cesium.Color(1.0, 1.0, 1.0, 1.0) }); billboard.setEditable(); }); toolbar.addListener('polylineCreated', function (event) { loggingMessage('Polyline created with ' + event.positions.length + ' points'); var polyline = new DrawHelper.PolylinePrimitive({ positions: event.positions, width: 5, geodesic: true }); scene.primitives.add(polyline); polyline.setEditable(); polyline.addListener('onEdited', function (event) { loggingMessage('Polyline edited, ' + event.positions.length + ' points'); }); }); toolbar.addListener('polygonCreated', function (event) { loggingMessage('Polygon created with ' + event.positions.length + ' points'); var polygon = new DrawHelper.PolygonPrimitive({ positions: event.positions, material: Cesium.Material.fromType('Checkerboard')//内置材质 }); scene.primitives.add(polygon); polygon.setEditable(); polygon.addListener('onEdited', function (event) { loggingMessage('Polygon edited, ' + event.positions.length + ' points'); }); }); toolbar.addListener('circleCreated', function (event) { loggingMessage('Circle created: center is ' + event.center.toString() + ' and radius is ' + event.radius.toFixed(1) + ' meters'); var circle = new DrawHelper.CirclePrimitive({ center: event.center, radius: event.radius, material: Cesium.Material.fromType(Cesium.Material.RimLightingType) }); scene.primitives.add(circle); circle.setEditable(); circle.addListener('onEdited', function (event) { loggingMessage('Circle edited: radius is ' + event.radius.toFixed(1) + ' meters'); }); }); toolbar.addListener('extentCreated', function (event) { var extent = event.extent; loggingMessage('Extent created (N: ' + extent.north.toFixed(3) + ', E: ' + extent.east.toFixed(3) + ', S: ' + extent.south.toFixed(3) + ', W: ' + extent.west.toFixed(3) + ')'); var extentPrimitive = new DrawHelper.ExtentPrimitive({ extent: extent, material: Cesium.Material.fromType(Cesium.Material.StripeType) }); scene.primitives.add(extentPrimitive); extentPrimitive.setEditable(); extentPrimitive.addListener('onEdited', function (event) { loggingMessage('Extent edited: extent is (N: ' + event.extent.north.toFixed(3) + ', E: ' + event.extent.east.toFixed(3) + ', S: ' + event.extent.south.toFixed(3) + ', W: ' + event.extent.west.toFixed(3) + ')'); }); }); var logging = document.getElementById('logging'); function loggingMessage(message) { logging.innerHTML = message; } } </script> </body> </html> corelib/common/toolbar/DrawHelper/DrawHelper.js
New file @@ -0,0 +1,1884 @@ /** * Created by thomas on 9/01/14. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * (c) www.geocento.com * www.metaaps.com * */ var DrawHelper = ( function() { // static variables var ellipsoid = Cesium.Ellipsoid.WGS84; /** * _构造函数 * @param cesiumWidget * @private */ function _(cesiumWidget) { this._scene = cesiumWidget.scene; this._tooltip = createTooltip(cesiumWidget.container); this._surfaces = []; this.initialiseHandlers(); this.enhancePrimitives(); } _.prototype.initialiseHandlers = function() { var scene = this._scene; var _self = this; // scene events var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas); function callPrimitiveCallback(name, position) { if(_self._handlersMuted == true) return; var pickedObject = scene.pick(position); if(pickedObject && pickedObject.primitive && pickedObject.primitive[name]) { pickedObject.primitive[name](position); } } handler.setInputAction( function (movement) { callPrimitiveCallback('leftClick', movement.position); }, Cesium.ScreenSpaceEventType.LEFT_CLICK); handler.setInputAction( function (movement) { callPrimitiveCallback('leftDoubleClick', movement.position); }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); var mouseOutObject; handler.setInputAction( function (movement) { if(_self._handlersMuted == true) return; var pickedObject = scene.pick(movement.endPosition); if(mouseOutObject && (!pickedObject || mouseOutObject != pickedObject.primitive)) { !(mouseOutObject.isDestroyed && mouseOutObject.isDestroyed()) && mouseOutObject.mouseOut(movement.endPosition); mouseOutObject = null; } if(pickedObject && pickedObject.primitive) { pickedObject = pickedObject.primitive; if(pickedObject.mouseOut) { mouseOutObject = pickedObject; } if(pickedObject.mouseMove) { pickedObject.mouseMove(movement.endPosition); } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); handler.setInputAction( function (movement) { callPrimitiveCallback('leftUp', movement.position); }, Cesium.ScreenSpaceEventType.LEFT_UP); handler.setInputAction( function (movement) { callPrimitiveCallback('leftDown', movement.position); }, Cesium.ScreenSpaceEventType.LEFT_DOWN); } _.prototype.setListener = function(primitive, type, callback) { primitive[type] = callback; } _.prototype.muteHandlers = function(muted) { this._handlersMuted = muted; } // register event handling for an editable shape // shape should implement setEditMode and setHighlighted _.prototype.registerEditableShape = function(surface) { var _self = this; // handlers for interactions // highlight polygon when mouse is entering setListener(surface, 'mouseMove', function(position) { surface.setHighlighted(true); if(!surface._editMode) { _self._tooltip.showAt(position, "Click to edit this shape"); } }); // hide the highlighting when mouse is leaving the polygon setListener(surface, 'mouseOut', function(position) { surface.setHighlighted(false); _self._tooltip.setVisible(false); }); setListener(surface, 'leftClick', function(position) { surface.setEditMode(true); }); } _.prototype.startDrawing = function(cleanUp) { // undo any current edit of shapes this.disableAllEditMode(); // check for cleanUp first if(this.editCleanUp) { this.editCleanUp(); } this.editCleanUp = cleanUp; this.muteHandlers(true); } _.prototype.stopDrawing = function() { // check for cleanUp first if(this.editCleanUp) { this.editCleanUp(); this.editCleanUp = null; } this.muteHandlers(false); } // make sure only one shape is highlighted at a time _.prototype.disableAllHighlights = function() { this.setHighlighted(undefined); } _.prototype.setHighlighted = function(surface) { if(this._highlightedSurface && !this._highlightedSurface.isDestroyed() && this._highlightedSurface != surface) { this._highlightedSurface.setHighlighted(false); } this._highlightedSurface = surface; } _.prototype.disableAllEditMode = function() { this.setEdited(undefined); } _.prototype.setEdited = function(surface) { if(this._editedSurface && !this._editedSurface.isDestroyed()) { this._editedSurface.setEditMode(false); } this._editedSurface = surface; } var material = Cesium.Material.fromType(Cesium.Material.ColorType); material.uniforms.color = new Cesium.Color(1.0, 1.0, 0.0, 0.5); var defaultShapeOptions = { ellipsoid: Cesium.Ellipsoid.WGS84, textureRotationAngle: 0.0, height: 0.0, asynchronous: true, show: true, debugShowBoundingVolume: false } var defaultSurfaceOptions = copyOptions(defaultShapeOptions, { appearance: new Cesium.EllipsoidSurfaceAppearance({ aboveGround : false }), material : material, granularity: Math.PI / 180.0 }); var defaultPolygonOptions = copyOptions(defaultShapeOptions, {}); var defaultExtentOptions = copyOptions(defaultShapeOptions, {}); var defaultCircleOptions = copyOptions(defaultShapeOptions, {}); var defaultEllipseOptions = copyOptions(defaultSurfaceOptions, {rotation: 0}); var defaultPolylineOptions = copyOptions(defaultShapeOptions, { width: 5, geodesic: true, granularity: 10000, appearance: new Cesium.PolylineMaterialAppearance({ aboveGround : false }), material : material }); // Cesium.Polygon.prototype.setStrokeStyle = setStrokeStyle; // // Cesium.Polygon.prototype.drawOutline = drawOutline; // var ChangeablePrimitive = (function() { function _() { } _.prototype.initialiseOptions = function(options) { fillOptions(this, options); this._ellipsoid = undefined; this._granularity = undefined; this._height = undefined; this._textureRotationAngle = undefined; this._id = undefined; // set the flags to initiate a first drawing this._createPrimitive = true; this._primitive = undefined; this._outlinePolygon = undefined; } _.prototype.setAttribute = function(name, value) { this[name] = value; this._createPrimitive = true; }; _.prototype.getAttribute = function(name) { return this[name]; }; /** * @private */ _.prototype.update = function(context, frameState, commandList) { if (!Cesium.defined(this.ellipsoid)) { throw new Cesium.DeveloperError('this.ellipsoid must be defined.'); } if (!Cesium.defined(this.appearance)) { throw new Cesium.DeveloperError('this.material must be defined.'); } if (this.granularity < 0.0) { throw new Cesium.DeveloperError('this.granularity and scene2D/scene3D overrides must be greater than zero.'); } if (!this.show) { return; } if (!this._createPrimitive && (!Cesium.defined(this._primitive))) { // No positions/hierarchy to draw return; } if (this._createPrimitive || (this._ellipsoid !== this.ellipsoid) || (this._granularity !== this.granularity) || (this._height !== this.height) || (this._textureRotationAngle !== this.textureRotationAngle) || (this._id !== this.id)) { var geometry = this.getGeometry(); if(!geometry) { return; } this._createPrimitive = false; this._ellipsoid = this.ellipsoid; this._granularity = this.granularity; this._height = this.height; this._textureRotationAngle = this.textureRotationAngle; this._id = this.id; this._primitive = this._primitive && this._primitive.destroy(); this._primitive = new Cesium.Primitive({ geometryInstances : new Cesium.GeometryInstance({ geometry : geometry, id : this.id, pickPrimitive : this }), appearance : this.appearance, asynchronous : this.asynchronous }); this._outlinePolygon = this._outlinePolygon && this._outlinePolygon.destroy(); if(this.strokeColor && this.getOutlineGeometry) { // create the highlighting frame this._outlinePolygon = new Cesium.Primitive({ geometryInstances : new Cesium.GeometryInstance({ geometry : this.getOutlineGeometry(), attributes : { color : Cesium.ColorGeometryInstanceAttribute.fromColor(this.strokeColor) } }), appearance : new Cesium.PerInstanceColorAppearance({ flat : true, renderState : { depthTest : { enabled : true }, lineWidth :Math.min(this.strokeWidth, 4.0)// Math.min(this.strokeWidth || 4.0, context._aliasedLineWidthRange[1]) } }) }); } } var primitive = this._primitive; primitive.appearance.material = this.material; primitive.debugShowBoundingVolume = this.debugShowBoundingVolume; primitive.update(context, frameState, commandList); this._outlinePolygon && this._outlinePolygon.update(context, frameState, commandList); }; _.prototype.isDestroyed = function() { return false; }; _.prototype.destroy = function() { this._primitive = this._primitive && this._primitive.destroy(); return Cesium.destroyObject(this); }; _.prototype.setStrokeStyle = function(strokeColor, strokeWidth) { if(!this.strokeColor || !this.strokeColor.equals(strokeColor) || this.strokeWidth != strokeWidth) { this._createPrimitive = true; this.strokeColor = strokeColor; this.strokeWidth = strokeWidth; } } return _; })(); _.ExtentPrimitive = (function() { function _(options) { if(!Cesium.defined(options.extent)) { throw new Cesium.DeveloperError('Extent is required'); } options = copyOptions(options, defaultSurfaceOptions); this.initialiseOptions(options); this.setExtent(options.extent); } _.prototype = new ChangeablePrimitive(); _.prototype.setExtent = function(extent) { this.setAttribute('extent', extent); }; _.prototype.getExtent = function() { return this.getAttribute('extent'); }; _.prototype.getGeometry = function() { if (!Cesium.defined(this.extent)) { return; } return new Cesium.RectangleGeometry({ rectangle : this.extent, height : this.height, vertexFormat : Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT, stRotation : this.textureRotationAngle, ellipsoid : this.ellipsoid, granularity : this.granularity }); }; _.prototype.getOutlineGeometry = function() { return new Cesium.RectangleOutlineGeometry({ rectangle: this.extent }); } return _; })(); //多边形 _.PolygonPrimitive = (function() { function _(options) { options = copyOptions(options, defaultSurfaceOptions); this.initialiseOptions(options); this.isPolygon = true; } _.prototype = new ChangeablePrimitive(); _.prototype.setPositions = function(positions) { this.setAttribute('positions', positions); }; _.prototype.getPositions = function() { return this.getAttribute('positions'); }; _.prototype.getGeometry = function() { if (!Cesium.defined(this.positions) || this.positions.length < 3) { return; } return Cesium.PolygonGeometry.fromPositions({ positions : this.positions, height : this.height, vertexFormat : Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT, stRotation : this.textureRotationAngle, ellipsoid : this.ellipsoid, granularity : this.granularity }); }; _.prototype.getOutlineGeometry = function() { return Cesium.PolygonOutlineGeometry.fromPositions({ positions : this.getPositions() }); } return _; })(); //圆 _.CirclePrimitive = (function() { function _(options) { if(!(Cesium.defined(options.center) && Cesium.defined(options.radius))) { throw new Cesium.DeveloperError('Center and radius are required'); } options = copyOptions(options, defaultSurfaceOptions); this.initialiseOptions(options); this.setRadius(options.radius); } _.prototype = new ChangeablePrimitive(); _.prototype.setCenter = function(center) { this.setAttribute('center', center); }; _.prototype.setRadius = function(radius) { this.setAttribute('radius', Math.max(0.1, radius)); }; _.prototype.getCenter = function() { return this.getAttribute('center'); }; _.prototype.getRadius = function() { return this.getAttribute('radius'); }; _.prototype.getGeometry = function() { if (!(Cesium.defined(this.center) && Cesium.defined(this.radius))) { return; } return new Cesium.CircleGeometry({ center : this.center, radius : this.radius, height : this.height, vertexFormat : Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT, stRotation : this.textureRotationAngle, ellipsoid : this.ellipsoid, granularity : this.granularity }); }; _.prototype.getOutlineGeometry = function() { return new Cesium.CircleOutlineGeometry({ center: this.getCenter(), radius: this.getRadius() }); } return _; })(); //椭圆 _.EllipsePrimitive = (function() { function _(options) { if(!(Cesium.defined(options.center) && Cesium.defined(options.semiMajorAxis) && Cesium.defined(options.semiMinorAxis))) { throw new Cesium.DeveloperError('Center and semi major and semi minor axis are required'); } options = copyOptions(options, defaultEllipseOptions); this.initialiseOptions(options); } _.prototype = new ChangeablePrimitive(); _.prototype.setCenter = function(center) { this.setAttribute('center', center); }; _.prototype.setSemiMajorAxis = function(semiMajorAxis) { if(semiMajorAxis < this.getSemiMinorAxis()) return; this.setAttribute('semiMajorAxis', semiMajorAxis); }; _.prototype.setSemiMinorAxis = function(semiMinorAxis) { if(semiMinorAxis > this.getSemiMajorAxis()) return; this.setAttribute('semiMinorAxis', semiMinorAxis); }; _.prototype.setRotation = function(rotation) { return this.setAttribute('rotation', rotation); }; _.prototype.getCenter = function() { return this.getAttribute('center'); }; _.prototype.getSemiMajorAxis = function() { return this.getAttribute('semiMajorAxis'); }; _.prototype.getSemiMinorAxis = function() { return this.getAttribute('semiMinorAxis'); }; _.prototype.getRotation = function() { return this.getAttribute('rotation'); }; _.prototype.getGeometry = function() { if(!(Cesium.defined(this.center) && Cesium.defined(this.semiMajorAxis) && Cesium.defined(this.semiMinorAxis))) { return; } return new Cesium.EllipseGeometry({ ellipsoid : this.ellipsoid, center : this.center, semiMajorAxis : this.semiMajorAxis, semiMinorAxis : this.semiMinorAxis, rotation : this.rotation, height : this.height, vertexFormat : Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT, stRotation : this.textureRotationAngle, ellipsoid : this.ellipsoid, granularity : this.granularity }); }; _.prototype.getOutlineGeometry = function() { return new Cesium.EllipseOutlineGeometry({ center: this.getCenter(), semiMajorAxis: this.getSemiMajorAxis(), semiMinorAxis: this.getSemiMinorAxis(), rotation: this.getRotation() }); } return _; })(); //折线 _.PolylinePrimitive = (function() { function _(options) { options = copyOptions(options, defaultPolylineOptions); this.initialiseOptions(options); } _.prototype = new ChangeablePrimitive(); _.prototype.setPositions = function(positions) { this.setAttribute('positions', positions); }; _.prototype.setWidth = function(width) { this.setAttribute('width', width); }; _.prototype.setGeodesic = function(geodesic) { this.setAttribute('geodesic', geodesic); }; _.prototype.getPositions = function() { return this.getAttribute('positions'); }; _.prototype.getWidth = function() { return this.getAttribute('width'); }; _.prototype.getGeodesic = function(geodesic) { return this.getAttribute('geodesic'); }; _.prototype.getGeometry = function() { if (!Cesium.defined(this.positions) || this.positions.length < 2) { return; } return new Cesium.PolylineGeometry({ positions: this.positions, height : this.height, width: this.width < 1 ? 1 : this.width, vertexFormat : Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT, ellipsoid : this.ellipsoid }); } return _; })(); var defaultBillboard = { iconUrl: "./images/DrawHelper/dragIcon.png", shiftX: 0, shiftY: 0 } var dragBillboard = { iconUrl: "./images/DrawHelper/dragIcon.png", shiftX: 0, shiftY: 0 } var dragHalfBillboard = { iconUrl: "./images/DrawHelper/dragIconLight.png", shiftX: 0, shiftY: 0 } _.prototype.createBillboardGroup = function(points, options, callbacks) { var markers = new _.BillboardGroup(this, options); markers.addBillboards(points, callbacks); return markers; } _.BillboardGroup = function(drawHelper, options) { this._drawHelper = drawHelper; this._scene = drawHelper._scene; this._options = copyOptions(options, defaultBillboard); // create one common billboard collection for all billboards var b = new Cesium.BillboardCollection(); this._scene.primitives.add(b); this._billboards = b; // keep an ordered list of billboards this._orderedBillboards = []; } _.BillboardGroup.prototype.createBillboard = function(position, callbacks) { var billboard = this._billboards.add({ show : true, position : position, pixelOffset : new Cesium.Cartesian2(this._options.shiftX, this._options.shiftY), eyeOffset : new Cesium.Cartesian3(0.0, 0.0, 0.0), horizontalOrigin : Cesium.HorizontalOrigin.CENTER, verticalOrigin : Cesium.VerticalOrigin.CENTER, scale : 1.0, image: this._options.iconUrl, color : new Cesium.Color(1.0, 1.0, 1.0, 1.0) }); // if editable if(callbacks) { var _self = this; var screenSpaceCameraController = this._scene.screenSpaceCameraController; function enableRotation(enable) { screenSpaceCameraController.enableRotate = enable; } function getIndex() { // find index for (var i = 0, I = _self._orderedBillboards.length; i < I && _self._orderedBillboards[i] != billboard; ++i); return i; } if(callbacks.dragHandlers) { var _self = this; setListener(billboard, 'leftDown', function(position) { // TODO - start the drag handlers here // create handlers for mouseOut and leftUp for the billboard and a mouseMove function onDrag(position) { billboard.position = position; // find index for (var i = 0, I = _self._orderedBillboards.length; i < I && _self._orderedBillboards[i] != billboard; ++i); callbacks.dragHandlers.onDrag && callbacks.dragHandlers.onDrag(getIndex(), position); } function onDragEnd(position) { handler.destroy(); enableRotation(true); callbacks.dragHandlers.onDragEnd && callbacks.dragHandlers.onDragEnd(getIndex(), position); } var handler = new Cesium.ScreenSpaceEventHandler(_self._scene.canvas); handler.setInputAction(function(movement) { var cartesian = _self._scene.camera.pickEllipsoid(movement.endPosition, ellipsoid); if (cartesian) { onDrag(cartesian); } else { onDragEnd(cartesian); } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); handler.setInputAction(function(movement) { onDragEnd(_self._scene.camera.pickEllipsoid(movement.position, ellipsoid)); }, Cesium.ScreenSpaceEventType.LEFT_UP); enableRotation(false); callbacks.dragHandlers.onDragStart && callbacks.dragHandlers.onDragStart(getIndex(), _self._scene.camera.pickEllipsoid(position, ellipsoid)); }); } if(callbacks.onDoubleClick) { setListener(billboard, 'leftDoubleClick', function(position) { callbacks.onDoubleClick(getIndex()); }); } if(callbacks.onClick) { setListener(billboard, 'leftClick', function(position) { callbacks.onClick(getIndex()); }); } if(callbacks.tooltip) { setListener(billboard, 'mouseMove', function(position) { _self._drawHelper._tooltip.showAt(position, callbacks.tooltip()); }); setListener(billboard, 'mouseOut', function(position) { _self._drawHelper._tooltip.setVisible(false); }); } } return billboard; } _.BillboardGroup.prototype.insertBillboard = function(index, position, callbacks) { this._orderedBillboards.splice(index, 0, this.createBillboard(position, callbacks)); } _.BillboardGroup.prototype.addBillboard = function(position, callbacks) { this._orderedBillboards.push(this.createBillboard(position, callbacks)); } _.BillboardGroup.prototype.addBillboards = function(positions, callbacks) { var index = 0; for(; index < positions.length; index++) { this.addBillboard(positions[index], callbacks); } } _.BillboardGroup.prototype.updateBillboardsPositions = function(positions) { var index = 0; for(; index < positions.length; index++) { this.getBillboard(index).position = positions[index]; } } _.BillboardGroup.prototype.countBillboards = function() { return this._orderedBillboards.length; } _.BillboardGroup.prototype.getBillboard = function(index) { return this._orderedBillboards[index]; } _.BillboardGroup.prototype.removeBillboard = function(index) { this._billboards.remove(this.getBillboard(index)); this._orderedBillboards.splice(index, 1); } _.BillboardGroup.prototype.remove = function() { this._billboards = this._billboards && this._billboards.removeAll() && this._billboards.destroy(); } _.BillboardGroup.prototype.setOnTop = function() { this._scene.primitives.raiseToTop(this._billboards); } _.prototype.startDrawingMarker = function(options) { var options = copyOptions(options, defaultBillboard); this.startDrawing( function() { markers.remove(); mouseHandler.destroy(); tooltip.setVisible(false); } ); var _self = this; var scene = this._scene; var primitives = scene.primitives; var tooltip = this._tooltip; var markers = new _.BillboardGroup(this, options); var mouseHandler = new Cesium.ScreenSpaceEventHandler(scene.canvas); // Now wait for start mouseHandler.setInputAction(function(movement) { if(movement.position != null) { var cartesian = scene.camera.pickEllipsoid(movement.position, ellipsoid); if (cartesian) { markers.addBillboard(cartesian); _self.stopDrawing(); options.callback(cartesian); } } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); mouseHandler.setInputAction(function(movement) { var position = movement.endPosition; if(position != null) { var cartesian = scene.camera.pickEllipsoid(position, ellipsoid); if (cartesian) { tooltip.showAt(position, "<p>Click to add your marker. Position is: </p>" + getDisplayLatLngString(ellipsoid.cartesianToCartographic(cartesian))); } else { tooltip.showAt(position, "<p>Click on the globe to add your marker.</p>"); } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); } _.prototype.startDrawingPolygon = function(options) { var options = copyOptions(options, defaultSurfaceOptions); this.startDrawingPolyshape(true, options); } _.prototype.startDrawingPolyline = function(options) { var options = copyOptions(options, defaultPolylineOptions); this.startDrawingPolyshape(false, options); } _.prototype.startDrawingPolyshape = function(isPolygon, options) { this.startDrawing( function() { primitives.remove(poly); markers.remove(); mouseHandler.destroy(); tooltip.setVisible(false); } ); var _self = this; var scene = this._scene; var primitives = scene.primitives; var tooltip = this._tooltip; var minPoints = isPolygon ? 3 : 2; var poly; if(isPolygon) { poly = new DrawHelper.PolygonPrimitive(options); } else { poly = new DrawHelper.PolylinePrimitive(options); } poly.asynchronous = false; primitives.add(poly); var positions = []; var markers = new _.BillboardGroup(this, defaultBillboard); var mouseHandler = new Cesium.ScreenSpaceEventHandler(scene.canvas); // Now wait for start mouseHandler.setInputAction(function(movement) { if(movement.position != null) { var cartesian = scene.camera.pickEllipsoid(movement.position, ellipsoid); if (cartesian) { // first click if(positions.length == 0) { positions.push(cartesian.clone()); markers.addBillboard(positions[0]); } if(positions.length >= minPoints) { poly.positions = positions; poly._createPrimitive = true; } // add new point to polygon // this one will move with the mouse positions.push(cartesian); // add marker at the new position markers.addBillboard(cartesian); } } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); mouseHandler.setInputAction(function(movement) { var position = movement.endPosition; if(position != null) { if(positions.length == 0) { tooltip.showAt(position, "<p>Click to add first point</p>"); } else { var cartesian = scene.camera.pickEllipsoid(position, ellipsoid); if (cartesian) { positions.pop(); // make sure it is slightly different cartesian.y += (1 + Math.random()); positions.push(cartesian); if(positions.length >= minPoints) { poly.positions = positions; poly._createPrimitive = true; } // update marker markers.getBillboard(positions.length - 1).position = cartesian; // show tooltip tooltip.showAt(position, "<p>Click to add new point (" + positions.length + ")</p>" + (positions.length > minPoints ? "<p>Double click to finish drawing</p>" : "")); } } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); mouseHandler.setInputAction(function(movement) { var position = movement.position; if(position != null) { if(positions.length < minPoints + 2) { return; } else { var cartesian = scene.camera.pickEllipsoid(position, ellipsoid); if (cartesian) { _self.stopDrawing(); if(typeof options.callback == 'function') { // remove overlapping ones var index = positions.length - 1; options.callback(positions); } } } } }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); } function getExtentCorners(value) { return ellipsoid.cartographicArrayToCartesianArray([Cesium.Rectangle.northwest(value), Cesium.Rectangle.northeast(value), Cesium.Rectangle.southeast(value), Cesium.Rectangle.southwest(value)]); } _.prototype.startDrawingExtent = function(options) { var options = copyOptions(options, defaultSurfaceOptions); this.startDrawing( function() { if(extent != null) { primitives.remove(extent); } markers.remove(); mouseHandler.destroy(); tooltip.setVisible(false); } ); var _self = this; var scene = this._scene; var primitives = this._scene.primitives; var tooltip = this._tooltip; var firstPoint = null; var extent = null; var markers = null; var mouseHandler = new Cesium.ScreenSpaceEventHandler(scene.canvas); function updateExtent(value) { if(extent == null) { extent = new Cesium.RectangleGeometry();//RectangleGeometry RectanglePrimitive(新版本移除改用RectangleGeometry) extent.asynchronous = false; primitives.add(extent); } extent.rectangle = value; // update the markers var corners = getExtentCorners(value); // create if they do not yet exist if(markers == null) { markers = new _.BillboardGroup(_self, defaultBillboard); markers.addBillboards(corners); } else { markers.updateBillboardsPositions(corners); } } // Now wait for start mouseHandler.setInputAction(function(movement) { if(movement.position != null) { var cartesian = scene.camera.pickEllipsoid(movement.position, ellipsoid); if (cartesian) { if(extent == null) { // create the rectangle firstPoint = ellipsoid.cartesianToCartographic(cartesian); var value = getExtent(firstPoint, firstPoint); updateExtent(value); } else { _self.stopDrawing(); if(typeof options.callback == 'function') { options.callback(getExtent(firstPoint, ellipsoid.cartesianToCartographic(cartesian))); } } } } }, Cesium.ScreenSpaceEventType.LEFT_DOWN); mouseHandler.setInputAction(function(movement) { var position = movement.endPosition; if(position != null) { if(extent == null) { tooltip.showAt(position, "<p>Click to start drawing rectangle</p>"); } else { var cartesian = scene.camera.pickEllipsoid(position, ellipsoid); if (cartesian) { var value = getExtent(firstPoint, ellipsoid.cartesianToCartographic(cartesian)); updateExtent(value); tooltip.showAt(position, "<p>Drag to change rectangle extent</p><p>Click again to finish drawing</p>"); } } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); } _.prototype.startDrawingCircle = function(options) { var options = copyOptions(options, defaultSurfaceOptions); this.startDrawing( function cleanUp() { if(circle != null) { primitives.remove(circle); } markers.remove(); mouseHandler.destroy(); tooltip.setVisible(false); } ); var _self = this; var scene = this._scene; var primitives = this._scene.primitives; var tooltip = this._tooltip; var circle = null; var markers = null; var mouseHandler = new Cesium.ScreenSpaceEventHandler(scene.canvas); // Now wait for start mouseHandler.setInputAction(function(movement) { if(movement.position != null) { var cartesian = scene.camera.pickEllipsoid(movement.position, ellipsoid); if (cartesian) { if(circle == null) { // create the circle circle = new _.CirclePrimitive({ center: cartesian, radius: 0, asynchronous: false, material : options.material }); primitives.add(circle); markers = new _.BillboardGroup(_self, defaultBillboard); markers.addBillboards([cartesian]); } else { if(typeof options.callback == 'function') { options.callback(circle.getCenter(), circle.getRadius()); } _self.stopDrawing(); } } } }, Cesium.ScreenSpaceEventType.LEFT_DOWN); mouseHandler.setInputAction(function(movement) { var position = movement.endPosition; if(position != null) { if(circle == null) { tooltip.showAt(position, "<p>Click to start drawing the circle</p>"); } else { var cartesian = scene.camera.pickEllipsoid(position, ellipsoid); if (cartesian) { circle.setRadius(Cesium.Cartesian3.distance(circle.getCenter(), cartesian)); markers.updateBillboardsPositions(cartesian); tooltip.showAt(position, "<p>Move mouse to change circle radius</p><p>Click again to finish drawing</p>"); } } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); } _.prototype.enhancePrimitives = function() { var drawHelper = this; Cesium.Billboard.prototype.setEditable = function() { if(this._editable) { return; } this._editable = true; var billboard = this; var _self = this; function enableRotation(enable) { drawHelper._scene.screenSpaceCameraController.enableRotate = enable; } setListener(billboard, 'leftDown', function(position) { // TODO - start the drag handlers here // create handlers for mouseOut and leftUp for the billboard and a mouseMove function onDrag(position) { billboard.position = position; _self.executeListeners({name: 'drag', positions: position}); } function onDragEnd(position) { handler.destroy(); enableRotation(true); _self.executeListeners({name: 'dragEnd', positions: position}); } var handler = new Cesium.ScreenSpaceEventHandler(drawHelper._scene.canvas); handler.setInputAction(function(movement) { var cartesian = drawHelper._scene.camera.pickEllipsoid(movement.endPosition, ellipsoid); if (cartesian) { onDrag(cartesian); } else { onDragEnd(cartesian); } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); handler.setInputAction(function(movement) { onDragEnd(drawHelper._scene.camera.pickEllipsoid(movement.position, ellipsoid)); }, Cesium.ScreenSpaceEventType.LEFT_UP); enableRotation(false); }); enhanceWithListeners(billboard); } function setHighlighted(highlighted) { var scene = drawHelper._scene; // if no change // if already highlighted, the outline polygon will be available if(this._highlighted && this._highlighted == highlighted) { return; } // disable if already in edit mode if(this._editMode === true) { return; } this._highlighted = highlighted; // highlight by creating an outline polygon matching the polygon points if(highlighted) { // make sure all other shapes are not highlighted drawHelper.setHighlighted(this); this._strokeColor = this.strokeColor; this.setStrokeStyle(Cesium.Color.fromCssColorString('white'), this.strokeWidth); } else { if(this._strokeColor) { this.setStrokeStyle(this._strokeColor, this.strokeWidth); } else { this.setStrokeStyle(undefined, undefined); } } } function setEditMode(editMode) { // if no change if(this._editMode == editMode) { return; } // make sure all other shapes are not in edit mode before starting the editing of this shape drawHelper.disableAllHighlights(); // display markers if(editMode) { drawHelper.setEdited(this); var scene = drawHelper._scene; var _self = this; // create the markers and handlers for the editing if(this._markers == null) { var markers = new _.BillboardGroup(drawHelper, dragBillboard); var editMarkers = new _.BillboardGroup(drawHelper, dragHalfBillboard); // function for updating the edit markers around a certain point function updateHalfMarkers(index, positions) { // update the half markers before and after the index var editIndex = index - 1 < 0 ? positions.length - 1 : index - 1; if(editIndex < editMarkers.countBillboards()) { editMarkers.getBillboard(editIndex).position = calculateHalfMarkerPosition(editIndex); } editIndex = index; if(editIndex < editMarkers.countBillboards()) { editMarkers.getBillboard(editIndex).position = calculateHalfMarkerPosition(editIndex); } } function onEdited() { _self.executeListeners({name: 'onEdited', positions: _self.positions}); } var handleMarkerChanges = { dragHandlers: { onDrag: function(index, position) { _self.positions[index] = position; updateHalfMarkers(index, _self.positions); _self._createPrimitive = true; }, onDragEnd: function(index, position) { _self._createPrimitive = true; onEdited(); } }, onDoubleClick: function(index) { if(_self.positions.length < 4) { return; } // remove the point and the corresponding markers _self.positions.splice(index, 1); _self._createPrimitive = true; markers.removeBillboard(index); editMarkers.removeBillboard(index); updateHalfMarkers(index, _self.positions); onEdited(); }, tooltip: function() { if(_self.positions.length > 3) { return "Double click to remove this point"; } } }; // add billboards and keep an ordered list of them for the polygon edges markers.addBillboards(_self.positions, handleMarkerChanges); this._markers = markers; function calculateHalfMarkerPosition(index) { var positions = _self.positions; return ellipsoid.cartographicToCartesian( new Cesium.EllipsoidGeodesic(ellipsoid.cartesianToCartographic(positions[index]), ellipsoid.cartesianToCartographic(positions[index < positions.length - 1 ? index + 1 : 0])). interpolateUsingFraction(0.5) ); } var halfPositions = []; var index = 0; var length = _self.positions.length + (this.isPolygon ? 0 : -1); for(; index < length; index++) { halfPositions.push(calculateHalfMarkerPosition(index)); } var handleEditMarkerChanges = { dragHandlers: { onDragStart: function(index, position) { // add a new position to the polygon but not a new marker yet this.index = index + 1; _self.positions.splice(this.index, 0, position); _self._createPrimitive = true; }, onDrag: function(index, position) { _self.positions[this.index] = position; _self._createPrimitive = true; }, onDragEnd: function(index, position) { // create new sets of makers for editing markers.insertBillboard(this.index, position, handleMarkerChanges); editMarkers.getBillboard(this.index - 1).position = calculateHalfMarkerPosition(this.index - 1); editMarkers.insertBillboard(this.index, calculateHalfMarkerPosition(this.index), handleEditMarkerChanges); _self._createPrimitive = true; onEdited(); } }, tooltip: function() { return "Drag to create a new point"; } }; editMarkers.addBillboards(halfPositions, handleEditMarkerChanges); this._editMarkers = editMarkers; // add a handler for clicking in the globe this._globeClickhandler = new Cesium.ScreenSpaceEventHandler(scene.canvas); this._globeClickhandler.setInputAction( function (movement) { var pickedObject = scene.pick(movement.position); if(!(pickedObject && pickedObject.primitive)) { _self.setEditMode(false); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); // set on top of the polygon markers.setOnTop(); editMarkers.setOnTop(); } this._editMode = true; } else { if(this._markers != null) { this._markers.remove(); this._editMarkers.remove(); this._markers = null; this._editMarkers = null; this._globeClickhandler.destroy(); } this._editMode = false; } } DrawHelper.PolylinePrimitive.prototype.setEditable = function() { if(this.setEditMode) { return; } var polyline = this; polyline.isPolygon = false; polyline.asynchronous = false; drawHelper.registerEditableShape(polyline); polyline.setEditMode = setEditMode; var originalWidth = this.width; polyline.setHighlighted = function(highlighted) { // disable if already in edit mode if(this._editMode === true) { return; } if(highlighted) { drawHelper.setHighlighted(this); this.setWidth(originalWidth * 2); } else { this.setWidth(originalWidth); } } polyline.getExtent = function() { return Cesium.Extent.fromCartographicArray(ellipsoid.cartesianArrayToCartographicArray(this.positions)); } enhanceWithListeners(polyline); polyline.setEditMode(false); } DrawHelper.PolygonPrimitive.prototype.setEditable = function() { var polygon = this; polygon.asynchronous = false; var scene = drawHelper._scene; drawHelper.registerEditableShape(polygon); polygon.setEditMode = setEditMode; polygon.setHighlighted = setHighlighted; enhanceWithListeners(polygon); polygon.setEditMode(false); } DrawHelper.ExtentPrimitive.prototype.setEditable = function() { if(this.setEditMode) { return; } var extent = this; var scene = drawHelper._scene; drawHelper.registerEditableShape(extent); extent.asynchronous = false; extent.setEditMode = function(editMode) { // if no change if(this._editMode == editMode) { return; } drawHelper.disableAllHighlights(); // display markers if(editMode) { // make sure all other shapes are not in edit mode before starting the editing of this shape drawHelper.setEdited(this); // create the markers and handlers for the editing if(this._markers == null) { var markers = new _.BillboardGroup(drawHelper, dragBillboard); function onEdited() { extent.executeListeners({name: 'onEdited', extent: extent.extent}); } var handleMarkerChanges = { dragHandlers: { onDrag: function(index, position) { var corner = markers.getBillboard((index + 2) % 4).position; extent.setExtent(getExtent(ellipsoid.cartesianToCartographic(corner), ellipsoid.cartesianToCartographic(position))); markers.updateBillboardsPositions(getExtentCorners(extent.extent)); }, onDragEnd: function(index, position) { onEdited(); } }, tooltip: function() { return "Drag to change the corners of this extent"; } }; markers.addBillboards(getExtentCorners(extent.extent), handleMarkerChanges); this._markers = markers; // add a handler for clicking in the globe this._globeClickhandler = new Cesium.ScreenSpaceEventHandler(scene.canvas); this._globeClickhandler.setInputAction( function (movement) { var pickedObject = scene.pick(movement.position); // disable edit if pickedobject is different or not an object if(!(pickedObject && !pickedObject.isDestroyed() && pickedObject.primitive)) { extent.setEditMode(false); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); // set on top of the polygon markers.setOnTop(); } this._editMode = true; } else { if(this._markers != null) { this._markers.remove(); this._markers = null; this._globeClickhandler.destroy(); } this._editMode = false; } } extent.setHighlighted = setHighlighted; enhanceWithListeners(extent); extent.setEditMode(false); } _.EllipsePrimitive.prototype.setEditable = function() { if(this.setEditMode) { return; } var ellipse = this; var scene = drawHelper._scene; ellipse.asynchronous = false; drawHelper.registerEditableShape(ellipse); ellipse.setEditMode = function(editMode) { // if no change if(this._editMode == editMode) { return; } drawHelper.disableAllHighlights(); // display markers if(editMode) { // make sure all other shapes are not in edit mode before starting the editing of this shape drawHelper.setEdited(this); var _self = this; // create the markers and handlers for the editing if(this._markers == null) { var markers = new _.BillboardGroup(drawHelper, dragBillboard); function getMarkerPositions() { return Cesium.Shapes.computeEllipseBoundary(ellipsoid, ellipse.getCenter(), ellipse.getSemiMajorAxis(), ellipse.getSemiMinorAxis(), ellipse.getRotation() + Math.PI / 2, Math.PI / 2.0).splice(0, 4); } function onEdited() { ellipse.executeListeners({name: 'onEdited', center: ellipse.getCenter(), semiMajorAxis: ellipse.getSemiMajorAxis(), semiMinorAxis: ellipse.getSemiMinorAxis(), rotation: 0}); } var handleMarkerChanges = { dragHandlers: { onDrag: function(index, position) { var distance = Cesium.Cartesian3.distance(ellipse.getCenter(), position); if(index%2 == 0) { ellipse.setSemiMajorAxis(distance); } else { ellipse.setSemiMinorAxis(distance); } markers.updateBillboardsPositions(getMarkerPositions()); }, onDragEnd: function(index, position) { onEdited(); } }, tooltip: function() { return "Drag to change the excentricity and radius"; } }; markers.addBillboards(getMarkerPositions(), handleMarkerChanges); this._markers = markers; // add a handler for clicking in the globe this._globeClickhandler = new Cesium.ScreenSpaceEventHandler(scene.canvas); this._globeClickhandler.setInputAction( function (movement) { var pickedObject = scene.pick(movement.position); if(!(pickedObject && pickedObject.primitive)) { _self.setEditMode(false); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); // set on top of the polygon markers.setOnTop(); } this._editMode = true; } else { if(this._markers != null) { this._markers.remove(); this._markers = null; this._globeClickhandler.destroy(); } this._editMode = false; } } ellipse.setHighlighted = setHighlighted; enhanceWithListeners(ellipse); ellipse.setEditMode(false); } _.CirclePrimitive.prototype.getCircleCartesianCoordinates = function (granularity) { var geometry = Cesium.CircleOutlineGeometry.createGeometry(new Cesium.CircleOutlineGeometry({ellipsoid: ellipsoid, center: this.getCenter(), radius: this.getRadius(), granularity: granularity})); var count = 0, value, values = []; for(; count < geometry.attributes.position.values.length; count+=3) { value = geometry.attributes.position.values; values.push(new Cesium.Cartesian3(value[count], value[count + 1], value[count + 2])); } return values; }; _.CirclePrimitive.prototype.setEditable = function() { if(this.setEditMode) { return; } var circle = this; var scene = drawHelper._scene; circle.asynchronous = false; drawHelper.registerEditableShape(circle); circle.setEditMode = function(editMode) { // if no change if(this._editMode == editMode) { return; } drawHelper.disableAllHighlights(); // display markers if(editMode) { // make sure all other shapes are not in edit mode before starting the editing of this shape drawHelper.setEdited(this); var _self = this; // create the markers and handlers for the editing if(this._markers == null) { var markers = new _.BillboardGroup(drawHelper, dragBillboard); function getMarkerPositions() { return _self.getCircleCartesianCoordinates(Cesium.Math.PI_OVER_TWO); } function onEdited() { circle.executeListeners({name: 'onEdited', center: circle.getCenter(), radius: circle.getRadius()}); } var handleMarkerChanges = { dragHandlers: { onDrag: function(index, position) { circle.setRadius(Cesium.Cartesian3.distance(circle.getCenter(), position)); markers.updateBillboardsPositions(getMarkerPositions()); }, onDragEnd: function(index, position) { onEdited(); } }, tooltip: function() { return "Drag to change the radius"; } }; markers.addBillboards(getMarkerPositions(), handleMarkerChanges); this._markers = markers; // add a handler for clicking in the globe this._globeClickhandler = new Cesium.ScreenSpaceEventHandler(scene.canvas); this._globeClickhandler.setInputAction( function (movement) { var pickedObject = scene.pick(movement.position); if(!(pickedObject && pickedObject.primitive)) { _self.setEditMode(false); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); // set on top of the polygon markers.setOnTop(); } this._editMode = true; } else { if(this._markers != null) { this._markers.remove(); this._markers = null; this._globeClickhandler.destroy(); } this._editMode = false; } } circle.setHighlighted = setHighlighted; enhanceWithListeners(circle); circle.setEditMode(false); } } _.DrawHelperWidget = (function() { // constructor function _(drawHelper, options) { // container must be specified if(!(Cesium.defined(options.container))) { throw new Cesium.DeveloperError('Container is required'); } var drawOptions = { markerIcon: "./images/DrawHelper/glyphicons_242_google_maps.png", polylineIcon: "./images/DrawHelper/glyphicons_097_vector_path_line.png", polygonIcon: "./images/DrawHelper/glyphicons_096_vector_path_polygon.png", circleIcon: "./images/DrawHelper/glyphicons_095_vector_path_circle.png", extentIcon: "./images/DrawHelper/glyphicons_094_vector_path_square.png", clearIcon: "./images/DrawHelper/glyphicons_067_cleaning.png", polylineDrawingOptions: defaultPolylineOptions, polygonDrawingOptions: defaultPolygonOptions, extentDrawingOptions: defaultExtentOptions, circleDrawingOptions: defaultCircleOptions }; fillOptions(options, drawOptions); var _self = this; var toolbar = document.createElement('DIV'); toolbar.className = "toolbar"; options.container.appendChild(toolbar); function addIcon(id, url, title, callback) { var div = document.createElement('DIV'); div.className = 'button'; div.title = title; toolbar.appendChild(div); div.onclick = callback; var span = document.createElement('SPAN'); div.appendChild(span); var image = document.createElement('IMG'); image.src = url; span.appendChild(image); return div; } var scene = drawHelper._scene; addIcon('marker', options.markerIcon, 'Click to start drawing a 2D marker', function() { drawHelper.startDrawingMarker({ callback: function(position) { _self.executeListeners({name: 'markerCreated', position: position}); } }); }) addIcon('polyline', options.polylineIcon, 'Click to start drawing a 2D polyline', function() { drawHelper.startDrawingPolyline({ callback: function(positions) { _self.executeListeners({name: 'polylineCreated', positions: positions}); } }); }) addIcon('polygon', options.polygonIcon, 'Click to start drawing a 2D polygon', function() { drawHelper.startDrawingPolygon({ callback: function(positions) { _self.executeListeners({name: 'polygonCreated', positions: positions}); } }); }) addIcon('extent', options.extentIcon, 'Click to start drawing an Extent', function() { drawHelper.startDrawingExtent({ callback: function(extent) { _self.executeListeners({name: 'extentCreated', extent: extent}); } }); }) addIcon('circle', options.circleIcon, 'Click to start drawing a Circle', function() { drawHelper.startDrawingCircle({ callback: function(center, radius) { _self.executeListeners({name: 'circleCreated', center: center, radius: radius}); } }); }) // add a clear button at the end // add a divider first var div = document.createElement('DIV'); div.className = 'divider'; toolbar.appendChild(div); addIcon('clear', options.clearIcon, 'Remove all primitives', function() { scene.primitives.removeAll(); }); enhanceWithListeners(this); } return _; })(); _.prototype.addToolbar = function(container, options) { options = copyOptions(options, {container: container}); return new _.DrawHelperWidget(this, options); } function getExtent(mn, mx) { var e = new Cesium.Rectangle(); // Re-order so west < east and south < north e.west = Math.min(mn.longitude, mx.longitude); e.east = Math.max(mn.longitude, mx.longitude); e.south = Math.min(mn.latitude, mx.latitude); e.north = Math.max(mn.latitude, mx.latitude); // Check for approx equal (shouldn't require abs due to re-order) var epsilon = Cesium.Math.EPSILON7; if ((e.east - e.west) < epsilon) { e.east += epsilon * 2.0; } if ((e.north - e.south) < epsilon) { e.north += epsilon * 2.0; } return e; }; /** * 提示框 * @param frameDiv * @returns {tooltip} */ function createTooltip(frameDiv) { var tooltip = function(frameDiv) { var div = document.createElement('DIV'); div.className = "twipsy right";//类名 var arrow = document.createElement('DIV'); arrow.className = "twipsy-arrow"; div.appendChild(arrow); var title = document.createElement('DIV'); title.className = "twipsy-inner"; div.appendChild(title); this._div = div; this._title = title; // add to frame div and display coordinates frameDiv.appendChild(div); } tooltip.prototype.setVisible = function(visible) { this._div.style.display = visible ? 'block' : 'none'; } tooltip.prototype.showAt = function(position, message) { if(position && message) { this.setVisible(true); this._title.innerHTML = message; this._div.style.left = position.x + 10 + "px"; this._div.style.top = (position.y - this._div.clientHeight / 2) + "px"; } } return new tooltip(frameDiv); } function getDisplayLatLngString(cartographic, precision) { return cartographic.longitude.toFixed(precision || 3) + ", " + cartographic.latitude.toFixed(precision || 3); } function clone(from, to) { if (from == null || typeof from != "object") return from; if (from.constructor != Object && from.constructor != Array) return from; if (from.constructor == Date || from.constructor == RegExp || from.constructor == Function || from.constructor == String || from.constructor == Number || from.constructor == Boolean) return new from.constructor(from); to = to || new from.constructor(); for (var name in from) { to[name] = typeof to[name] == "undefined" ? clone(from[name], null) : to[name]; } return to; } function fillOptions(options, defaultOptions) { options = options || {}; var option; for(option in defaultOptions) { if(options[option] === undefined) { options[option] = clone(defaultOptions[option]); } } } // shallow copy function copyOptions(options, defaultOptions) { var newOptions = clone(options), option; for(option in defaultOptions) { if(newOptions[option] === undefined) { newOptions[option] = clone(defaultOptions[option]); } } return newOptions; } function setListener(primitive, type, callback) { primitive[type] = callback; } function enhanceWithListeners(element) { element._listeners = {}; element.addListener = function(name, callback) { this._listeners[name] = (this._listeners[name] || []); this._listeners[name].push(callback); return this._listeners[name].length; } element.executeListeners = function(event, defaultCallback) { if(this._listeners[event.name] && this._listeners[event.name].length > 0) { var index = 0; for(;index < this._listeners[event.name].length; index++) { this._listeners[event.name][index](event); } } else { if(defaultCallback) { defaultCallback(event); } } } } return _; } )(); corelib/dgrid/CONTRIBUTING.md
New file @@ -0,0 +1,240 @@ _Do you have a contribution? We welcome contributions, but please ensure that you read the following information before issuing a pull request. Also refer back to this document as a checklist before issuing your pull request. This will save time for everyone._ # Before You Start ## Understanding the Basics If you don't understand what a *pull request* is, or how to submit one, please refer to the [documentation][github-docs] provided by GitHub. ## Search GitHub issues first; create an issue if necessary Is there already an issue that addresses your concern? Do a bit of searching in our [issue tracker][] to see if you can find something similar. If not, please create a new issue before submitting a pull request unless the change is truly trivial, e.g. typo fixes. Please note that support questions should not be reported as issues; they should be asked on the [dojo-interest mailing list][] or #dojo on irc.freenode.net where they may catch more of the community's attention. Web interfaces are available from the [Dojo Toolkit Community page][]. ## Discuss Non-Trivial Contributions with the Committers If your desired contribution is more than a non-trivial fix, you should discuss it on the mailing list or IRC first to ensure you are on the right track. In the case of changesets for new features, this will also provide an opportunity for early feedback to gauge the committers' interest in incorporating your changes. ## Contributor License Agreement We require all contributions beyond minor typo corrections to be covered under the Dojo Foundation's [Contributor License Agreement][cla]. This can be done electronically, and essentially ensures that you are making it clear that your contributions are your contributions, you have the legal right to contribute, and you are transferring the copyright of your works to the Dojo Foundation. If the GitHub user ID you are submitting your pull request from differs from the Dojo Community ID or e-mail address which you have signed your CLA under, you should specifically note what you have your CLA filed under (and for CCLA that you are listed under your company's authorised contributors). # Submitting a Pull Request The following are the general steps you should follow in creating a pull request. Subsequent pull requests only need to follow step 3 and beyond: 1. Fork the repository on GitHub 2. Clone the forked repository to your machine 3. Create a feature branch in your local repository 4. Make your changes and commit them to your local repository 5. Rebase and push your commits to your GitHub remote fork/repository 6. Issue a Pull Request to the official repository 7. Your Pull Request is reviewed by a committer and merged into the repository *Note*: While there are other ways to accomplish the steps using other tools, the examples here will assume the most actions will be performed via the `git` command line. ## 1. Fork the Repository When logged in to your GitHub account, and you are viewing the dgrid repository, you will see the *Fork* button. Clicking this button will show you which organizations you can fork to. Choose your own account. Once the process finishes, you will have your own repository that is "forked" from the official one. Forking is a GitHub term and not a git term. Git is a wholly distributed source control system and simply worries about local and remote repositories and allows you to manage your code against them. GitHub then adds this additional layer of structure of how repositories can relate to each other. ## 2. Clone the Forked Repository Once you have successfully forked your repository, you will need to clone it locally to your machine: ```sh $ git clone git@github.com:username/dgrid.git ``` This will clone your fork to your current path in a directory named `dgrid`. Be sure to read dgrid's [README][dgrid-readme] and ensure you have the necessary dependencies for development and testing. You should also set up an `upstream` remote. This will allow you to take changes from SitePen's repository, merge them into your local clone, and rebase your branches: ```sh $ cd dgrid $ git remote add upstream https://github.com/SitePen/dgrid.git $ git fetch upstream ``` Then you can retrieve upstream changes and rebase on them into your code like this: ```sh $ git pull --rebase upstream master ``` For more information on maintaining a fork, please see the GitHub Help article [Fork a Repo][] and information on [rebasing][] from git. ## 3. Create a Branch The easiest workflow is to keep your master branch in sync with the upstream branch and do not push any of your own commits to that branch (otherwise you may need to hard-reset it later). When you want to work on a new feature, you then ensure you are on the branch you wish to base your work on (usually `master`) and create a new branch from there. While the name of the branch can be anything, it can often be easy to use the issue number you might be working on as a start. For example: ```sh $ git checkout -b fix-123-short-description master Switched to a new branch 'fix-123-short-description' ``` You will then be on the feature branch. You can verify what branch you are on like this: ```sh $ git status # On branch t12345 nothing to commit, working directory clean ``` ## 4. Make Changes and Commit Now you just need to make your changes. Once you have finished your changes (and tested them) you need to commit them to your local repository (assuming you have staged your changes for committing via `git add`): ```sh $ git status # On branch t12345 # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: somefile.js # $ git commit -m 'Corrects some defect, fixes #123' [t12345 0000000] Corrects some defect, fixes #123 1 file changed, 2 insertions(+), 2 deletions(-) ``` ## 5. Rebase and Push Changes If you have been working on your contribution for a while, the upstream repository may have changed. You may want to ensure your work is on top of the latest changes so your pull request can be applied cleanly: ```sh $ git pull --rebase upstream master ``` When you are ready to push your commit to your GitHub repository for the first time on this branch you would do the following: ```sh $ git push -u origin t12345 ``` This sets up your local branch to track the newly-created branch on your remote. After the first time, you can simply type: ```sh $ git push ``` ## 6. Issue a Pull Request In order to have your commits merged into the main repository, you need to create a pull request. The instructions for this can be found in the GitHub Help article [Creating a Pull Request][]. Essentially you do the following: 1. Go to the GitHub page for your repository (e.g. `https://github.com/username/dgrid/`) 2. Select the feature branch from your repository 3. Click the Pull Request button 4. If necessary, select the appropriate branch that your branch should be merged into 4. Enter a title and description of your pull request, mentioning the corresponding [issue tracker][] ticket 5. Review the "Commits" and "Files changed" tabs; if you see more than just your commits here, double-check that you've selected the correct branch to merge into 6. Click "Send Pull Request" You will be notified about the status of your pull request based on your GitHub notification settings. ## 7. Request is Reviewed and Merged Your request will be reviewed. It may be merged directly or [interactively rebased][], or you may receive feedback or questions on your pull request. # What Makes a Successful Pull Request? Having your contribution accepted is more than just the mechanics of getting your contribution into a pull request; there are several other things that are expected when contributing to dgrid which are covered below. ## Version Support Code added to dgrid should work with Dojo 1.8 and later, and should support all modern browsers plus IE 8 and later. ## Coding Style and Linting dgrid 0.4 and later follows SitePen's [style guide]. Pull requests should adhere to this. ## Documentation If the pull request adds or changes features, make sure to update the documentation in the repository's `doc` folder as needed. dgrid source code follows the Dojo Toolkit's approach to [inline API documentation][]. Any pull request should ensure it has updated or added the appropriate inline documentation. ## Test Cases If the pull request adds or changes functional behavior or is fixing a defect, the unit test cases should be modified to reflect this. The committer reviewing your pull request is likely to request the appropriate changes to the test cases. dgrid uses [Intern][] for automated testing. It is expected that you will have tested your changes against the existing test cases and appropriate platforms prior to submitting your pull request. ## Licensing All of your submissions will be licensed under the "New" BSD license. ## Expect Discussion and Rework Unless your changes are trivial or you have been working with contributing to dgrid for a while, expect a significant amount of feedback on your pull requests once a committer has the opportunity to review it. Don't be offended or discouraged by feedback, but keep in mind that the committers have a keener eye to how your changes may affect existing code, or contain corner cases or incompatibilities. Also keep in mind that any pull request is essentially asking the dgrid committers to continue maintaining the code you contribute, so features that seem overly specific to a given application or which expose a wide array of edge cases when used more generically may be deemed inappropriate for incorporation into the dgrid repository. In such cases, you are certainly encouraged to roll your own repository of extensions that you can continue to maintain and provide to the community. [github-docs]: http://help.github.com/send-pull-requests [issue tracker]: https://github.com/SitePen/dgrid/issues [Dojo Toolkit Community page]: http://dojotoolkit.org/community/ [dojo-interest mailing list]: http://mail.dojotoolkit.org/mailman/listinfo/dojo-interest [dojo-contrib]: http://mail.dojotoolkit.org/mailman/listinfo/dojo-contributors [cla]: http://dojofoundation.org/about/cla [Creating a Pull Request]: https://help.github.com/articles/creating-a-pull-request [Fork a Repo]: https://help.github.com/articles/fork-a-repo [dgrid-readme]: README.md [style guide]: https://github.com/SitePen/.jshintrc#readme [inline API documentation]: http://dojotoolkit.org/reference-guide/developer/markup.html [Intern]: http://theintern.io/ [interactively rebased]: http://git-scm.com/book/en/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages [rebasing]: http://git-scm.com/book/en/Git-Branching-Rebasing corelib/dgrid/CellSelection.js
New file @@ -0,0 +1,201 @@ define([ 'dojo/_base/declare', 'dojo/aspect', 'dojo/dom-class', 'dojo/on', 'dojo/has', './Selection' ], function (declare, aspect, domClass, listen, has, Selection) { return declare(Selection, { // summary: // Add cell level selection capabilities to a grid. The grid will have a selection property and // fire "dgrid-select" and "dgrid-deselect" events. // ensure we don't select when an individual cell is not identifiable selectionDelegate: '.dgrid-cell', _selectionTargetType: 'cells', _select: function (cell, toCell, value) { var i, id; if (typeof value === 'undefined') { // default to true value = true; } if (typeof cell !== 'object' || !('element' in cell)) { cell = this.cell(cell); } else if (!cell.row) { // Row object was passed instead of cell if (value && typeof value === 'object') { // value is a hash of true/false values for (id in value) { this._select(this.cell(cell.id, id), null, value[id]); } } else { // Select/deselect all columns in row for (id in this.columns) { this._select(this.cell(cell.id, id), null, value); } } return; } if (this.allowSelect(cell)) { var selection = this.selection, rowId = cell.row.id, previousRow = selection[rowId]; if (!cell.column) { for (i in this.columns) { this._select(this.cell(rowId, i), null, value); } return; } var previous = previousRow && previousRow[cell.column.id]; if (value === null) { // indicates a toggle value = !previous; } var element = cell.element; previousRow = previousRow || {}; previousRow[cell.column.id] = value; this.selection[rowId] = previousRow; // Check for all-false objects to see if it can be deleted. // This prevents build-up of unnecessary iterations later. var hasSelected = false; for (i in previousRow) { if (previousRow[i] === true) { hasSelected = true; break; } } if (!hasSelected) { delete this.selection[rowId]; } if (element) { // add or remove classes as appropriate if (value) { domClass.add(element, 'dgrid-selected' + (this.addUiClasses ? ' ui-state-active' : '')); } else { domClass.remove(element, 'dgrid-selected ui-state-active'); } } /* jshint eqeqeq: false */ // This comparison could coerce if previous is undefined; TODO: rewrite if (value != previous && element) { this._selectionEventQueues[(value ? '' : 'de') + 'select'].push(cell); } if (toCell) { if (!toCell.element) { toCell = this.cell(toCell); } if (!toCell || !toCell.row) { this._lastSelected = element; console.warn('The selection range has been reset because the ' + 'beginning of the selection is no longer in the DOM. ' + 'If you are using OnDemandList, you may wish to increase ' + 'farOffRemoval to avoid this, but note that keeping more nodes ' + 'in the DOM may impact performance.'); return; } var toElement = toCell.element; var fromElement = cell.element; // Find if it is earlier or later in the DOM var direction = this._determineSelectionDirection(fromElement, toElement); if (!direction) { // The original element was actually replaced toCell = this.cell( document.getElementById(toCell.row.element.id), toElement.columnId); toElement = toCell && toCell.element; direction = this._determineSelectionDirection(fromElement, toElement); } // now we determine which columns are in the range var idFrom = cell.column.id, idTo = toCell.column.id, started, columnIds = []; for (id in this.columns) { if (started) { columnIds.push(id); } if (id === idFrom && (idFrom = columnIds) || id === idTo && (idTo = columnIds)) { // Once found, mark it off so we don't hit it again columnIds.push(id); if (started || (idFrom == columnIds && id == idTo)) { // We are done if we hit the last ID, or if the IDs are the same break; } started = true; } } // now we iterate over rows var row = cell.row, nextNode = row.element; toElement = toCell.row.element; do { // looping through each row.. // and now loop through each column to be selected for (i = 0; i < columnIds.length; i++) { cell = this.cell(nextNode, columnIds[i]); this._select(cell, null, value); } if (nextNode == toElement) { break; } } while ((nextNode = cell.row.element[direction])); } } }, _determineSelectionDirection: function () { // Extend Selection to return next/previousSibling instead of down/up, // given how CellSelection#_select is written var result = this.inherited(arguments); if (result === 'down') { return 'nextSibling'; } if (result === 'up') { return 'previousSibling'; } return result; }, isSelected: function (object, columnId) { // summary: // Returns true if the indicated cell is selected. if (typeof object === 'undefined' || object === null) { return false; } if (!object.element) { object = this.cell(object, columnId); } // First check whether the given cell is indicated in the selection hash; // failing that, check if allSelected is true (testing against the // allowSelect method if possible) var rowId = object.row.id; if (rowId in this.selection) { return !!this.selection[rowId][object.column.id]; } else { return this.allSelected && (!object.row.data || this.allowSelect(object)); } }, clearSelection: function (exceptId) { // disable exceptId in cell selection, since it would require double parameters exceptId = false; this.inherited(arguments); } }); }); corelib/dgrid/ColumnSet.js
New file @@ -0,0 +1,419 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/dom-class', 'dojo/dom-construct', 'dojo/on', 'dojo/aspect', 'dojo/query', 'dojo/has', './util/misc', 'dojo/_base/sniff' ], function (declare, lang, domClass, domConstruct, on, aspect, query, has, miscUtil) { has.add('event-mousewheel', function (global, document, element) { return 'onmousewheel' in element; }); has.add('event-wheel', function (global, document, element) { return 'onwheel' in element; }); var colsetidAttr = 'data-dgrid-column-set-id'; function adjustScrollLeft(grid, root) { // Adjusts the scroll position of each column set in each row under the given root. // (root can be a row, or e.g. a tree parent row element's connected property to adjust children) var scrollLefts = grid._columnSetScrollLefts; query('.dgrid-column-set', root).forEach(function (element) { element.scrollLeft = scrollLefts[element.getAttribute(colsetidAttr)]; }); } function getColumnSetSubRows(subRows, columnSetId) { // Builds a subRow collection that only contains columns that correspond to // a given column set id. if (!subRows || !subRows.length) { return; } var subset = []; var idPrefix = columnSetId + '-'; for (var i = 0, numRows = subRows.length; i < numRows; i++) { var row = subRows[i]; var subsetRow = []; subsetRow.className = row.className; for (var k = 0, numCols = row.length; k < numCols; k++) { var column = row[k]; // The column id begins with the column set id. if (column.id != null && column.id.indexOf(idPrefix) === 0) { subsetRow.push(column); } } subset.push(subsetRow); } return subset; } function isRootNode(node, rootNode) { // If we've reached the top-level node for the grid then there is no parent column set. // This guard prevents an error when scroll is initated over some node in the grid that is not a descendant of // a column set. This can happen in a grid that has empty space below its rows (grid is taller than the rows). return (rootNode && node === rootNode) || domClass.contains(node, 'dgrid'); } function findParentColumnSet(node, root) { // WebKit will invoke mousewheel handlers with an event target of a text // node; check target and if it's not an element node, start one node higher // in the tree if (node.nodeType !== 1) { node = node.parentNode; } while (node && !query.matches(node, '.dgrid-column-set[' + colsetidAttr + ']', root)) { if (isRootNode(node, root)) { return null; } node = node.parentNode; } return node; } var pointerMap = { start: 'down', end: 'up' }; function getTouchEventName(type) { // Given 'start', 'move', or 'end', returns appropriate touch or pointer event name // based on browser support. (Assumes browser supports touch or pointer.) var hasPointer = has('pointer'); if (hasPointer) { type = pointerMap[type] || type; if (hasPointer.slice(0, 2) === 'MS') { return 'MSPointer' + type.slice(0, 1).toUpperCase() + type.slice(1); } else { return 'pointer' + type; } } return 'touch' + type; } var horizTouchMove = has('touch') && function (grid) { return function (target, listener) { var listeners = [ on(target, getTouchEventName('start'), function (event) { if (!grid._currentlyTouchedColumnSet) { var node = findParentColumnSet(event.target, target); // If handling pointer events, only react to touch; // MSPointerDown (IE10) reports 2, 3, 4 for touch, pen, mouse if (node && (!event.pointerType || event.pointerType === 'touch' || event.pointerType === 2)) { grid._currentlyTouchedColumnSet = node; grid._lastColumnSetTouchX = event.clientX; grid._lastColumnSetTouchY = event.clientY; } } }), on(target, getTouchEventName('move'), function (event) { if (grid._currentlyTouchedColumnSet === null) { return; } var node = findParentColumnSet(event.target); if (!node) { return; } listener.call(null, grid, node, grid._lastColumnSetTouchX - event.clientX); grid._lastColumnSetTouchX = event.clientX; grid._lastColumnSetTouchY = event.clientY; }), on(target, getTouchEventName('end'), function () { grid._currentlyTouchedColumnSet = null; }) ]; return { remove: function () { for (var i = listeners.length; i--;) { listeners[i].remove(); } } }; }; }; var horizMouseWheel = has('event-mousewheel') || has('event-wheel') ? function (grid) { return function (target, listener) { return on(target, has('event-wheel') ? 'wheel' : 'mousewheel', function (event) { var node = findParentColumnSet(event.target, target), deltaX; if (!node) { return; } // Normalize reported delta value: // wheelDeltaX (webkit, mousewheel) needs to be negated and divided by 3 // deltaX (FF17+, wheel) can be used exactly as-is deltaX = event.deltaX || -event.wheelDeltaX / 3; if (deltaX) { // only respond to horizontal movement listener.call(null, grid, node, deltaX); } }); }; } : function (grid) { return function (target, listener) { return on(target, '.dgrid-column-set[' + colsetidAttr + ']:MozMousePixelScroll', function (event) { if (event.axis === 1) { // only respond to horizontal movement listener.call(null, grid, this, event.detail); } }); }; }; function horizMoveHandler(grid, colsetNode, amount) { var id = colsetNode.getAttribute(colsetidAttr), scroller = grid._columnSetScrollers[id], scrollLeft = scroller.scrollLeft + amount; scroller.scrollLeft = scrollLeft < 0 ? 0 : scrollLeft; } return declare(null, { // summary: // Provides column sets to isolate horizontal scroll of sets of // columns from each other. This mainly serves the purpose of allowing for // column locking. postCreate: function () { var self = this; this.inherited(arguments); this.on(horizMouseWheel(this), horizMoveHandler); if (has('touch')) { this.on(horizTouchMove(this), horizMoveHandler); } this.on('.dgrid-column-set:dgrid-cellfocusin', function (event) { self._onColumnSetCellFocus(event, this); }); if (typeof this.expand === 'function') { aspect.after(this, 'expand', function (promise, args) { promise.then(function () { var row = self.row(args[0]); if (self._expanded[row.id]) { // scrollLeft changes can't take effect on collapsed child rows; // ensure they are properly updated once re-expanded. adjustScrollLeft(self, row.element.connected); } }); return promise; }); } }, columnSets: [], createRowCells: function (tag, each, subRows, object, options) { var row = domConstruct.create('table', { className: 'dgrid-row-table' }); var tbody = domConstruct.create('tbody', null, row); var tr = domConstruct.create('tr', null, tbody); for (var i = 0, l = this.columnSets.length; i < l; i++) { // iterate through the columnSets var cell = domConstruct.create(tag, { className: 'dgrid-column-set-cell dgrid-column-set-' + i }, tr); cell = domConstruct.create('div', { className: 'dgrid-column-set' }, cell); cell.setAttribute(colsetidAttr, i); var subset = getColumnSetSubRows(subRows || this.subRows, i) || this.columnSets[i]; cell.appendChild(this.inherited(arguments, [tag, each, subset, object, options])); } return row; }, renderArray: function () { var rows = this.inherited(arguments); for (var i = 0; i < rows.length; i++) { adjustScrollLeft(this, rows[i]); } return rows; }, insertRow: function () { var row = this.inherited(arguments); adjustScrollLeft(this, row); return row; }, renderHeader: function () { // summary: // Setup the headers for the grid this.inherited(arguments); var columnSets = this.columnSets, scrollers = this._columnSetScrollers, grid = this, i, l; function reposition() { grid._positionScrollers(); } this._columnSetScrollerContents = {}; this._columnSetScrollLefts = {}; if (scrollers) { // this isn't the first time; destroy existing scroller nodes first for (i in scrollers) { domConstruct.destroy(scrollers[i]); } } else { // first-time-only operations: hook up event/aspected handlers aspect.after(this, 'resize', reposition, true); aspect.after(this, 'styleColumn', reposition, true); this._columnSetScrollerNode = domConstruct.create('div', { className: 'dgrid-column-set-scroller-container' }, this.footerNode, 'after'); } // reset to new object to be populated in loop below scrollers = this._columnSetScrollers = {}; for (i = 0, l = columnSets.length; i < l; i++) { this._putScroller(columnSets[i], i); } this._positionScrollers(); }, styleColumnSet: function (colsetId, css) { // summary: // Dynamically creates a stylesheet rule to alter a columnset's style. var rule = this.addCssRule('#' + miscUtil.escapeCssIdentifier(this.domNode.id) + ' .dgrid-column-set-' + miscUtil.escapeCssIdentifier(colsetId, '-'), css); this._positionScrollers(); return rule; }, configStructure: function () { // Squash the column sets together so the grid and other dgrid extensions and mixins can // configure the columns and create any needed subrows. this.columns = {}; this.subRows = []; for (var i = 0, l = this.columnSets.length; i < l; i++) { var columnSet = this.columnSets[i]; for (var j = 0; j < columnSet.length; j++) { columnSet[j] = this._configColumns(i + '-' + j + '-', columnSet[j]); } } this.inherited(arguments); }, _positionScrollers: function () { var domNode = this.domNode, scrollers = this._columnSetScrollers, scrollerContents = this._columnSetScrollerContents, columnSets = this.columnSets, scrollerWidth = 0, numScrollers = 0, // tracks number of visible scrollers (sets w/ overflow) i, l, columnSetElement, contentWidth; for (i = 0, l = columnSets.length; i < l; i++) { // iterate through the columnSets columnSetElement = query('.dgrid-column-set[' + colsetidAttr + '="' + i + '"]', domNode)[0]; scrollerWidth = columnSetElement.offsetWidth; contentWidth = columnSetElement.firstChild.offsetWidth; scrollerContents[i].style.width = contentWidth + 'px'; scrollers[i].style.width = scrollerWidth + 'px'; if (has('ie') < 9) { // IE seems to need scroll to be set explicitly scrollers[i].style.overflowX = contentWidth > scrollerWidth ? 'scroll' : 'auto'; } // Keep track of how many scrollbars we're showing if (contentWidth > scrollerWidth) { numScrollers++; } } this._columnSetScrollerNode.style.bottom = this.showFooter ? this.footerNode.offsetHeight + 'px' : '0'; // Align bottom of body node depending on whether there are scrollbars this.bodyNode.style.bottom = numScrollers ? (has('dom-scrollbar-height') + (has('ie') ? 1 : 0) + 'px') : '0'; }, _putScroller: function (columnSet, i) { // function called for each columnSet var scroller = this._columnSetScrollers[i] = domConstruct.create('span', { // IE8 needs dgrid-scrollbar-height class for scrollbar to be visible, // but for some reason IE11's scrollbar arrows become unresponsive, so avoid applying it there className: 'dgrid-column-set-scroller dgrid-column-set-scroller-' + i + (has('ie') < 9 ? ' dgrid-scrollbar-height' : '') }, this._columnSetScrollerNode); scroller.setAttribute(colsetidAttr, i); this._columnSetScrollerContents[i] = domConstruct.create('div', { className: 'dgrid-column-set-scroller-content' }, scroller); on(scroller, 'scroll', lang.hitch(this, '_onColumnSetScroll')); }, _onColumnSetScroll: function (evt) { var scrollLeft = evt.target.scrollLeft, colSetId = evt.target.getAttribute(colsetidAttr), newScrollLeft; if (this._columnSetScrollLefts[colSetId] !== scrollLeft) { query('.dgrid-column-set[' + colsetidAttr + '="' + colSetId + '"],.dgrid-column-set-scroller[' + colsetidAttr + '="' + colSetId + '"]', this.domNode ).forEach(function (element, i) { element.scrollLeft = scrollLeft; if (!i) { // Compute newScrollLeft based on actual resulting // value of scrollLeft, which may be different than // what we assigned under certain circumstances // (e.g. Chrome under 33% / 67% / 90% zoom). // Only need to compute this once, as it will be the // same for every row. newScrollLeft = element.scrollLeft; } }); this._columnSetScrollLefts[colSetId] = newScrollLeft; } }, _setColumnSets: function (columnSets) { this._destroyColumns(); this.columnSets = columnSets; this._updateColumns(); }, _scrollColumnSet: function (nodeOrId, offsetLeft) { var id = nodeOrId.tagName ? nodeOrId.getAttribute(colsetidAttr) : nodeOrId; var scroller = this._columnSetScrollers[id]; scroller.scrollLeft = offsetLeft < 0 ? 0 : offsetLeft; }, _onColumnSetCellFocus: function (event, columnSetNode) { var focusedNode = event.target; var columnSetId = columnSetNode.getAttribute(colsetidAttr); // columnSetNode's offsetLeft is not always correct, // so get the columnScroller to check offsetLeft against var columnScroller = this._columnSetScrollers[columnSetId]; var elementEdge = focusedNode.offsetLeft - columnScroller.scrollLeft + focusedNode.offsetWidth; if (elementEdge > columnSetNode.offsetWidth || columnScroller.scrollLeft > focusedNode.offsetLeft) { this._scrollColumnSet(columnSetNode, focusedNode.offsetLeft); } } }); }); corelib/dgrid/Editor.js
New file @@ -0,0 +1,803 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/Deferred', 'dojo/dom-construct', 'dojo/dom-class', 'dojo/on', 'dojo/has', 'dojo/query', './Grid', 'dojo/_base/sniff' ], function (declare, lang, Deferred, domConstruct, domClass, on, has, query, Grid) { return declare(null, { constructor: function () { this._editorInstances = {}; // Tracks shared editor dismissal listeners, and editor click/change listeners for old IE this._editorColumnListeners = []; // Tracks always-on editor listeners for old IE, or listeners for triggering shared editors this._editorCellListeners = {}; this._editorsPendingStartup = []; }, postCreate: function () { var self = this; this.inherited(arguments); this.on('.dgrid-input:focusin', function () { self._focusedEditorCell = self.cell(this); }); this._editorFocusoutHandle = on.pausable(this.domNode, '.dgrid-input:focusout', function () { self._focusedEditorCell = null; }); this._listeners.push(this._editorFocusoutHandle); }, insertRow: function () { this._editorRowListeners = {}; var rowElement = this.inherited(arguments); var row = this.row(rowElement); var rowListeners = this._editorCellListeners[rowElement.id] = this._editorCellListeners[rowElement.id] || {}; for (var key in this._editorRowListeners) { rowListeners[key] = this._editorRowListeners[key]; } // Null this out so that _createEditor can tell whether the editor being created is // an individual cell editor at insertion time, vs. a cell being refreshed this._editorRowListeners = null; var previouslyFocusedCell = this._previouslyFocusedEditorCell; if (previouslyFocusedCell && previouslyFocusedCell.row.id === row.id) { this.edit(this.cell(row, previouslyFocusedCell.column.id)); } return rowElement; }, refresh: function () { for (var id in this._editorInstances) { var editorInstanceDomNode = this._editorInstances[id].domNode; if (editorInstanceDomNode && editorInstanceDomNode.parentNode) { // Remove any editor widgets from the DOM before List destroys it, to avoid issues in IE (#1100) editorInstanceDomNode.parentNode.removeChild(editorInstanceDomNode); } } return this.inherited(arguments); }, removeRow: function (rowElement) { var self = this; var focusedCell = this._focusedEditorCell; if (focusedCell && focusedCell.row.id === this.row(rowElement).id) { this._previouslyFocusedEditorCell = focusedCell; // Pause the focusout handler until after this row has had // time to re-render, if this removal is part of an update. // A setTimeout is used here instead of resuming in insertRow, // since if a row were actually removed (not updated) while // editing, the handler would not be properly hooked up again // for future occurrences. this._editorFocusoutHandle.pause(); setTimeout(function () { self._editorFocusoutHandle.resume(); self._previouslyFocusedEditorCell = null; }, 0); } if (this._editorCellListeners[rowElement.id]) { for (var columnId in this._editorCellListeners[rowElement.id]) { this._editorCellListeners[rowElement.id][columnId].remove(); } delete this._editorCellListeners[rowElement.id]; } for (var i = this._alwaysOnWidgetColumns.length; i--;) { // Destroy always-on editor widgets during the row removal operation, // but don't trip over loading nodes from incomplete requests var cellElement = this.cell(rowElement, this._alwaysOnWidgetColumns[i].id).element, widget = cellElement && (cellElement.contents || cellElement).widget; if (widget) { this._editorFocusoutHandle.pause(); widget.destroyRecursive(); } } return this.inherited(arguments); }, renderArray: function () { var rows = this.inherited(arguments); if (rows.length) { // Finish processing any pending editors that are now displayed this._startupPendingEditors(); } else { this._editorsPendingStartup = []; } return rows; }, _onNotification: function () { this.inherited(arguments); this._startupPendingEditors(); }, _destroyColumns: function () { this._editorStructureCleanup(); this.inherited(arguments); }, _editorStructureCleanup: function () { var editorInstances = this._editorInstances; var listeners = this._editorColumnListeners; if (this._editTimer) { clearTimeout(this._editTimer); } // Do any clean up of previous column structure. for (var columnId in editorInstances) { var editor = editorInstances[columnId]; if (editor.domNode) { // The editor is a widget editor.destroyRecursive(); } } this._editorInstances = {}; for (var i = listeners.length; i--;) { listeners[i].remove(); } for (var rowId in this._editorCellListeners) { for (columnId in this._editorCellListeners[rowId]) { this._editorCellListeners[rowId][columnId].remove(); } } for (i = 0; i < this._editorColumnListeners.length; i++) { this._editorColumnListeners[i].remove(); } this._editorCellListeners = {}; this._editorColumnListeners = []; this._editorsPendingStartup = []; }, _configColumns: function () { var columnArray = this.inherited(arguments); this._alwaysOnWidgetColumns = []; for (var i = 0, l = columnArray.length; i < l; i++) { if (columnArray[i].editor) { this._configureEditorColumn(columnArray[i]); } } return columnArray; }, _configureEditorColumn: function (column) { // summary: // Adds editing capability to a column's cells. var editor = column.editor; var self = this; var originalRenderCell = column.renderCell || this._defaultRenderCell; var editOn = column.editOn; var isWidget = typeof editor !== 'string'; if (editOn) { // Create one shared widget/input to be swapped into the active cell. this._editorInstances[column.id] = this._createSharedEditor(column, originalRenderCell); } else if (isWidget) { // Append to array iterated in removeRow this._alwaysOnWidgetColumns.push(column); } column.renderCell = editOn ? function (object, value, cell, options) { // TODO: Consider using event delegation // (Would require using dgrid's focus events for activating on focus, // which we already advocate in docs for optimal use) if (!options || !options.alreadyHooked) { var listener = on(cell, editOn, function () { self._activeOptions = options; self.edit(this); }); if (self._editorRowListeners) { self._editorRowListeners[column.id] = listener; } else { // We're in refreshCell since _editorRowListeners doesn't exist, // so the row should exist var row = self.row(object); self._editorCellListeners[row.element.id][column.id] = listener; } } // initially render content in non-edit mode return originalRenderCell.call(column, object, value, cell, options); } : function (object, value, cell, options) { // always-on: create editor immediately upon rendering each cell if (!column.canEdit || column.canEdit(object, value)) { // _createEditor also needs the object for when this is invoked via refreshCell, to get the row var cmp = self._createEditor(column, object); self._showEditor(cmp, column, cell, value); // Maintain reference for later use. cell[isWidget ? 'widget' : 'input'] = cmp; } else { return originalRenderCell.call(column, object, value, cell, options); } }; }, edit: function (cell) { // summary: // Shows/focuses the editor for a given grid cell. // cell: Object // Cell (or something resolvable by grid.cell) to activate editor on. // returns: // If the cell is editable, returns a promise resolving to the editor // input/widget when the cell editor is focused. // If the cell is not editable, returns null. var self = this; var column; var cellElement; var dirty; var field; var value; var cmp; var dfd; function showEditor(dfd) { self._activeCell = cellElement; self._showEditor(cmp, column, cellElement, value); // focus / blur-handler-resume logic is surrounded in a setTimeout // to play nice with Keyboard's dgrid-cellfocusin as an editOn event self._editTimer = setTimeout(function () { // focus the newly-placed control (supported by form widgets and HTML inputs) if (cmp.focus) { cmp.focus(); } // resume blur handler once editor is focused if (column._editorBlurHandle) { column._editorBlurHandle.resume(); } self._editTimer = null; dfd.resolve(cmp); }, 0); } if (!cell.column) { cell = this.cell(cell); } if (!cell || !cell.element) { return null; } column = cell.column; field = column.field; cellElement = cell.element.contents || cell.element; if ((cmp = this._editorInstances[column.id])) { // Shared editor (editOn used) if (this._activeCell !== cellElement) { // Get the cell value var row = cell.row; dirty = this.dirty && this.dirty[row.id]; value = (dirty && field in dirty) ? dirty[field] : column.get ? column.get(row.data) : row.data[field]; // Check to see if the cell can be edited if (!column.canEdit || column.canEdit(cell.row.data, value)) { dfd = new Deferred(); // In some browsers, moving a DOM node causes a blur event to fire which in this case, // is a bad time for the blur handler to run. Blur the input node first. var node = cmp.domNode || cmp; if (node.offsetWidth) { // The editor is visible. Blur it. node.blur(); // In IE, the blur does not complete immediately. // Push showing of the editor to the next turn. // (dfd will be resolved within showEditor) setTimeout(function () { showEditor(dfd); }, 0); } else { showEditor(dfd); } return dfd.promise; } } } else if (column.editor) { // editor but not shared; always-on cmp = cellElement.widget || cellElement.input; if (cmp) { dfd = new Deferred(); if (cmp.focus) { cmp.focus(); } dfd.resolve(cmp); return dfd.promise; } } return null; }, refreshCell: function (cell) { var column = cell.column; var value = column.get ? column.get(cell.row.data) : cell.row.data[column.field]; var editor; if (column.editor) { if (cell.column.editOn && this._activeCell === cell.element) { editor = this._editorInstances[cell.column.id]; } else if (!cell.column.editOn) { editor = cell.element.widget || cell.element.input; } } if (editor) { if (editor.domNode) { editor.set('value', value); } else { this._updateInputValue(editor, value); } return (new Deferred()).resolve(); } return this.inherited(arguments); }, _showEditor: function (cmp, column, cellElement, value) { // Places a shared editor into the newly-active cell in the column. // Also called when rendering an editor in an "always-on" editor column. var isWidget = cmp.domNode; // for regular inputs, we can update the value before even showing it if (!isWidget) { this._updateInputValue(cmp, value); } cellElement.innerHTML = ''; domClass.add(cellElement, 'dgrid-cell-editing'); // If a shared editor is a validation widget, reset it to clear validation state // (The value will be preserved since it is explicitly set in _startupEditor) if (isWidget && column.editOn && cmp.validate && cmp.reset) { cmp.reset(); } cellElement.appendChild(cmp.domNode || cmp); if (isWidget && !column.editOn) { // Queue arguments to be run once editor is in DOM this._editorsPendingStartup.push([cmp, column, cellElement, value]); } else { this._startupEditor(cmp, column, cellElement, value); } }, _startupEditor: function (cmp, column, cellElement, value) { // summary: // Handles editor widget startup logic and updates the editor's value. if (cmp.domNode) { // For widgets, ensure startup is called before setting value, to maximize compatibility // with flaky widgets like dijit/form/Select. if (!cmp._started) { cmp.startup(); } // Set value, but ensure it isn't processed as a user-generated change. // (Clear flag on a timeout to wait for delayed onChange to fire first) cmp._dgridIgnoreChange = true; cmp.set('value', value); setTimeout(function () { cmp._dgridIgnoreChange = false; }, 0); } // track previous value for short-circuiting or in case we need to revert cmp._dgridLastValue = value; // if this is an editor with editOn, also update _activeValue // (_activeOptions will have been updated previously) if (this._activeCell) { this._activeValue = value; // emit an event immediately prior to placing a shared editor on.emit(cellElement, 'dgrid-editor-show', { grid: this, cell: this.cell(cellElement), column: column, editor: cmp, bubbles: true, cancelable: false }); } }, _startupPendingEditors: function () { var args = this._editorsPendingStartup; for (var i = args.length; i--;) { this._startupEditor.apply(this, args[i]); } this._editorsPendingStartup = []; }, _handleEditorChange: function (evt, column) { var target = evt.target; if ('_dgridLastValue' in target && target.className.indexOf('dgrid-input') > -1) { this._updatePropertyFromEditor(column || this.cell(target).column, target, evt); } }, _createEditor: function (column, object) { // Creates an editor instance based on column definition properties, // and hooks up events. var editor = column.editor, editOn = column.editOn, self = this, Widget = typeof editor !== 'string' && editor, args, cmp, node, tagName, tagArgs = {}; args = column.editorArgs || {}; if (typeof args === 'function') { args = args.call(this, column); } if (Widget) { cmp = new Widget(args); node = cmp.focusNode || cmp.domNode; // Add dgrid-input to className to make consistent with HTML inputs. node.className += ' dgrid-input'; // For editOn editors, connect to onBlur rather than onChange, since // the latter is delayed by setTimeouts in Dijit and will fire too late. cmp.on(editOn ? 'blur' : 'change', function () { if (!cmp._dgridIgnoreChange) { self._updatePropertyFromEditor(column, this, {type: 'widget'}); } }); } else { // considerations for standard HTML form elements if (!this._hasInputListener) { // register one listener at the top level that receives events delegated this._hasInputListener = true; this.on('change', function (evt) { self._handleEditorChange(evt); }); // also register a focus listener } if (editor === 'textarea') { tagName = 'textarea'; } else { tagName = 'input'; tagArgs.type = editor; } cmp = node = domConstruct.create(tagName, lang.mixin(tagArgs, { className: 'dgrid-input', name: column.field, tabIndex: isNaN(column.tabIndex) ? -1 : column.tabIndex }, args)); if (has('ie') < 9) { // IE<9 doesn't fire change events for all the right things, // and it doesn't bubble. var listener; if (editor === 'radio' || editor === 'checkbox') { // listen for clicks since IE doesn't fire change events properly for checks/radios listener = on(cmp, 'click', function (evt) { self._handleEditorChange(evt, column); }); } else { listener = on(cmp, 'change', function (evt) { self._handleEditorChange(evt, column); }); } if (editOn) { // Shared editor handlers are maintained in _editorColumnListeners, since they're not per-row this._editorColumnListeners.push(listener); } else if (this._editorRowListeners) { this._editorRowListeners[column.id] = listener; } // If editRowListeners doesn't exist and this is an always-on editor, // then we're here from renderCell via refreshCell, and the row should exist else { this._editorCellListeners[this.row(object).element.id][column.id] = listener; } } } if (column.autoSelect) { var selectNode = cmp.focusNode || cmp; if (selectNode.select) { on(selectNode, 'focus', function () { // setTimeout is needed for always-on editors on WebKit, // otherwise selection is reset immediately afterwards setTimeout(function () { selectNode.select(); }, 0); }); } } return cmp; }, _createSharedEditor: function (column) { // Creates an editor instance with additional considerations for // shared usage across an entire column (for columns with editOn specified). var cmp = this._createEditor(column), self = this, isWidget = cmp.domNode, node = cmp.domNode || cmp, focusNode = cmp.focusNode || node, reset = isWidget ? function () { cmp.set('value', cmp._dgridLastValue); } : function () { self._updateInputValue(cmp, cmp._dgridLastValue); // Update property again in case we need to revert a previous change self._updatePropertyFromEditor(column, cmp); }; function blur() { var element = self._activeCell; focusNode.blur(); if (typeof self.focus === 'function') { // Dijit form widgets don't end up dismissed until the next turn, // so wait before calling focus (otherwise Keyboard will focus the // input again). IE<9 needs to wait longer, otherwise the cell loses // focus after we've set it. setTimeout(function () { self.focus(element); }, isWidget && has('ie') < 9 ? 15 : 0); } } function onblur() { var parentNode = node.parentNode, options = { alreadyHooked: true }, cell = self.cell(node); // emit an event immediately prior to removing an editOn editor on.emit(cell.element, 'dgrid-editor-hide', { grid: self, cell: cell, column: column, editor: cmp, bubbles: true, cancelable: false }); column._editorBlurHandle.pause(); // Remove the editor from the cell, to be reused later. parentNode.removeChild(node); if (cell.row) { // If the row is still present (i.e. we didn't blur due to removal), // clear out the rest of the cell's contents, then re-render with new value. domClass.remove(cell.element, 'dgrid-cell-editing'); domConstruct.empty(parentNode); Grid.appendIfNode(parentNode, column.renderCell(cell.row.data, self._activeValue, parentNode, self._activeOptions ? lang.delegate(options, self._activeOptions) : options)); } // Reset state now that editor is deactivated; // reset _focusedEditorCell as well since some browsers will not // trigger the focusout event handler in this case self._focusedEditorCell = self._activeCell = self._activeValue = self._activeOptions = null; } function dismissOnKey(evt) { // Contains logic for reacting to enter/escape keypresses to save/cancel edits. // Calls `focusNode.blur()` in cases where field should be dismissed. var key = evt.keyCode || evt.which; if (key === 27) { // Escape: revert + dismiss reset(); self._activeValue = cmp._dgridLastValue; blur(); } else if (key === 13 && column.dismissOnEnter !== false) { // Enter: dismiss blur(); } } // hook up enter/esc key handling this._editorColumnListeners.push(on(focusNode, 'keydown', dismissOnKey)); // hook up blur handler, but don't activate until widget is activated (column._editorBlurHandle = on.pausable(cmp, 'blur', onblur)).pause(); this._editorColumnListeners.push(column._editorBlurHandle); return cmp; }, _updatePropertyFromEditor: function (column, cmp, triggerEvent) { var value, id, editedRow; if (!cmp.isValid || cmp.isValid()) { value = this._updateProperty((cmp.domNode || cmp).parentNode, this._activeCell ? this._activeValue : cmp._dgridLastValue, this._retrieveEditorValue(column, cmp), triggerEvent); if (this._activeCell) { // for editors with editOn defined this._activeValue = value; } else { // for always-on editors, update _dgridLastValue immediately cmp._dgridLastValue = value; } if (cmp.type === 'radio' && cmp.name && !column.editOn && column.field) { editedRow = this.row(cmp); // Update all other rendered radio buttons in the group query('input[type=radio][name=' + cmp.name + ']', this.contentNode).forEach(function (radioBtn) { var row = this.row(radioBtn); // Only update _dgridLastValue and the dirty data if it exists // and is not already false if (radioBtn !== cmp && radioBtn._dgridLastValue) { radioBtn._dgridLastValue = false; if (this.updateDirty) { this.updateDirty(row.id, column.field, false); } else { // update store-less grid row.data[column.field] = false; } } }, this); // Also update dirty data for rows that are not currently rendered for (id in this.dirty) { if (editedRow.id.toString() !== id && this.dirty[id][column.field]) { this.updateDirty(id, column.field, false); } } } } }, _updateProperty: function (cellElement, oldValue, value, triggerEvent) { // Updates dirty hash and fires dgrid-datachange event for a changed value. var self = this; // test whether old and new values are inequal, with coercion (e.g. for Dates) if ((oldValue && oldValue.valueOf()) !== (value && value.valueOf())) { var cell = this.cell(cellElement); var row = cell.row; var column = cell.column; // Re-resolve cellElement in case the passed element was nested cellElement = cell.element; if (column.field && row) { var eventObject = { grid: this, cell: cell, oldValue: oldValue, value: value, bubbles: true, cancelable: true }; if (triggerEvent && triggerEvent.type) { eventObject.parentType = triggerEvent.type; } if (on.emit(cellElement, 'dgrid-datachange', eventObject)) { if (this.updateDirty) { // for OnDemandGrid: update dirty data, and save if autoSave is true this.updateDirty(row.id, column.field, value); // perform auto-save (if applicable) in next tick to avoid // unintentional mishaps due to order of handler execution if (column.autoSave) { setTimeout(function () { self._trackError('save'); }, 0); } } else { // update store-less grid row.data[column.field] = value; } } else { // Otherwise keep the value the same // For the sake of always-on editors, need to manually reset the value var cmp; if ((cmp = cellElement.widget)) { // set _dgridIgnoreChange to prevent an infinite loop in the // onChange handler and prevent dgrid-datachange from firing // a second time cmp._dgridIgnoreChange = true; cmp.set('value', oldValue); setTimeout(function () { cmp._dgridIgnoreChange = false; }, 0); } else if ((cmp = cellElement.input)) { this._updateInputValue(cmp, oldValue); } return oldValue; } } } return value; }, _updateInputValue: function (input, value) { // summary: // Updates the value of a standard input, updating the // checked state if applicable. input.value = value; if (input.type === 'radio' || input.type === 'checkbox') { input.checked = input.defaultChecked = !!value; } }, _retrieveEditorValue: function (column, cmp) { // summary: // Intermediary between _convertEditorValue and // _updatePropertyFromEditor. if (typeof cmp.get === 'function') { // widget return this._convertEditorValue(cmp.get('value')); } else { // HTML input return this._convertEditorValue( cmp[cmp.type === 'checkbox' || cmp.type === 'radio' ? 'checked' : 'value']); } }, _convertEditorValue: function (value, oldValue) { // summary: // Contains default logic for translating values from editors; // tries to preserve type if possible. if (typeof oldValue === 'number') { value = isNaN(value) ? value : parseFloat(value); } else if (typeof oldValue === 'boolean') { value = value === 'true' ? true : value === 'false' ? false : value; } else if (oldValue instanceof Date) { var asDate = new Date(value); value = isNaN(asDate.getTime()) ? value : asDate; } return value; } }); }); corelib/dgrid/Grid.js
New file @@ -0,0 +1,568 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/dom-construct', 'dojo/dom-class', 'dojo/on', 'dojo/has', './List', './util/misc', 'dojo/_base/sniff' ], function (declare, lang, domConstruct, domClass, listen, has, List, miscUtil) { function appendIfNode(parent, subNode) { if (subNode && subNode.nodeType) { parent.appendChild(subNode); } } function replaceInvalidChars(str) { // Replaces invalid characters for a CSS identifier with hyphen, // as dgrid does for field names / column IDs when adding classes. return miscUtil.escapeCssIdentifier(str, '-'); } var Grid = declare(List, { columns: null, // hasNeutralSort: Boolean // Determines behavior of toggling sort on the same column. // If false, sort toggles between ascending and descending and cannot be // reset to neutral without sorting another column. // If true, sort toggles between ascending, descending, and neutral. hasNeutralSort: false, // cellNavigation: Boolean // This indicates that focus is at the cell level. This may be set to false to cause // focus to be at the row level, which is useful if you want only want row-level // navigation. cellNavigation: true, tabableHeader: true, showHeader: true, column: function (target) { // summary: // Get the column object by node, or event, or a columnId if (typeof target !== 'object') { return this.columns[target]; } else { return this.cell(target).column; } }, listType: 'grid', cell: function (target, columnId) { // summary: // Get the cell object by node, or event, id, plus a columnId if (target.column && target.element) { return target; } if (target.target && target.target.nodeType) { // event target = target.target; } var element; if (target.nodeType) { do { if (this._rowIdToObject[target.id]) { break; } var colId = target.columnId; if (colId) { columnId = colId; element = target; break; } target = target.parentNode; } while (target && target !== this.domNode); } if (!element && typeof columnId !== 'undefined') { var row = this.row(target), rowElement = row && row.element; if (rowElement) { var elements = rowElement.getElementsByTagName('td'); for (var i = 0; i < elements.length; i++) { if (elements[i].columnId === columnId) { element = elements[i]; break; } } } } if (target != null) { return { row: row || this.row(target), column: columnId && this.column(columnId), element: element }; } }, createRowCells: function (tag, createCell, subRows, item, options) { // summary: // Generates the grid for each row (used by renderHeader and and renderRow) var row = domConstruct.create('table', { className: 'dgrid-row-table', role: 'presentation' }), // IE < 9 needs an explicit tbody; other browsers do not tbody = (has('ie') < 9) ? domConstruct.create('tbody', null, row) : row, tr, si, sl, i, l, // iterators subRow, column, id, extraClasses, className, cell, colSpan, rowSpan; // used inside loops // Allow specification of custom/specific subRows, falling back to // those defined on the instance. subRows = subRows || this.subRows; for (si = 0, sl = subRows.length; si < sl; si++) { subRow = subRows[si]; // for single-subrow cases in modern browsers, TR can be skipped // http://jsperf.com/table-without-trs tr = domConstruct.create('tr', null, tbody); if (subRow.className) { tr.className = subRow.className; } for (i = 0, l = subRow.length; i < l; i++) { // iterate through the columns column = subRow[i]; id = column.id; extraClasses = column.field ? ' field-' + replaceInvalidChars(column.field) : ''; className = typeof column.className === 'function' ? column.className(item) : column.className; if (className) { extraClasses += ' ' + className; } cell = domConstruct.create(tag, { className: 'dgrid-cell' + (id ? ' dgrid-column-' + replaceInvalidChars(id) : '') + extraClasses, role: tag === 'th' ? 'columnheader' : 'gridcell' }); cell.columnId = id; colSpan = column.colSpan; if (colSpan) { cell.colSpan = colSpan; } rowSpan = column.rowSpan; if (rowSpan) { cell.rowSpan = rowSpan; } createCell(cell, column, item, options); // add the td to the tr at the end for better performance tr.appendChild(cell); } } return row; }, _createBodyRowCell: function (cellElement, column, item, options) { var cellData = item; // Support get function or field property (similar to DataGrid) if (column.get) { cellData = column.get(item); } else if ('field' in column && column.field !== '_item') { cellData = item[column.field]; } if (column.renderCell) { // A column can provide a renderCell method to do its own DOM manipulation, // event handling, etc. appendIfNode(cellElement, column.renderCell(item, cellData, cellElement, options)); } else { this._defaultRenderCell.call(column, item, cellData, cellElement, options); } }, _createHeaderRowCell: function (cellElement, column) { var contentNode = column.headerNode = cellElement; var field = column.field; if (field) { cellElement.field = field; } // allow for custom header content manipulation if (column.renderHeaderCell) { appendIfNode(contentNode, column.renderHeaderCell(contentNode)); } else if ('label' in column || column.field) { contentNode.appendChild(document.createTextNode( 'label' in column ? column.label : column.field)); } if (column.sortable !== false && field && field !== '_item') { cellElement.sortable = true; cellElement.className += ' dgrid-sortable'; } }, left: function (cell, steps) { if (!cell.element) { cell = this.cell(cell); } return this.cell(this._move(cell, -(steps || 1), 'dgrid-cell')); }, right: function (cell, steps) { if (!cell.element) { cell = this.cell(cell); } return this.cell(this._move(cell, steps || 1, 'dgrid-cell')); }, _defaultRenderCell: function (object, value, td) { // summary: // Default renderCell implementation. // NOTE: Called in context of column definition object. // object: Object // The data item for the row currently being rendered // value: Mixed // The value of the field applicable to the current cell // td: DOMNode // The cell element representing the current item/field // options: Object? // Any additional options passed through from renderRow if (this.formatter) { // Support formatter, with or without formatterScope var formatter = this.formatter, formatterScope = this.grid.formatterScope; td.innerHTML = typeof formatter === 'string' && formatterScope ? formatterScope[formatter](value, object) : this.formatter(value, object); } else if (value != null) { td.appendChild(document.createTextNode(value)); } }, renderRow: function (item, options) { var row = this.createRowCells('td', lang.hitch(this, '_createBodyRowCell'), options && options.subRows, item, options); // row gets a wrapper div for a couple reasons: // 1. So that one can set a fixed height on rows (heights can't be set on <table>'s AFAICT) // 2. So that outline style can be set on a row when it is focused, // and Safari's outline style is broken on <table> var div = domConstruct.create('div', { role: 'row' }); div.appendChild(row); return div; }, renderHeader: function () { // summary: // Setup the headers for the grid var grid = this, headerNode = this.headerNode; headerNode.setAttribute('role', 'row'); // clear out existing header in case we're resetting domConstruct.empty(headerNode); var row = this.createRowCells('th', lang.hitch(this, '_createHeaderRowCell'), this.subRows && this.subRows.headerRows); this._rowIdToObject[row.id = this.id + '-header'] = this.columns; headerNode.appendChild(row); // If the columns are sortable, re-sort on clicks. // Use a separate listener property to be managed by renderHeader in case // of subsequent calls. if (this._sortListener) { this._sortListener.remove(); } this._sortListener = listen(row, 'click,keydown', function (event) { // respond to click, space keypress, or enter keypress if (event.type === 'click' || event.keyCode === 32 || (!has('opera') && event.keyCode === 13)) { var target = event.target; var field; var sort; var newSort; var eventObj; do { if (target.sortable) { field = target.field || target.columnId; sort = grid.sort[0]; if (!grid.hasNeutralSort || !sort || sort.property !== field || !sort.descending) { // If the user toggled the same column as the active sort, // reverse sort direction newSort = [{ property: field, descending: sort && sort.property === field && !sort.descending }]; } else { // If the grid allows neutral sort and user toggled an already-descending column, // clear sort entirely newSort = []; } // Emit an event with the new sort eventObj = { bubbles: true, cancelable: true, grid: grid, parentType: event.type, sort: newSort }; if (listen.emit(event.target, 'dgrid-sort', eventObj)) { // Stash node subject to DOM manipulations, // to be referenced then removed by sort() grid._sortNode = target; grid.set('sort', newSort); } break; } } while ((target = target.parentNode) && target !== headerNode); } }); }, resize: function () { // extension of List.resize to allow accounting for // column sizes larger than actual grid area var headerTableNode = this.headerNode.firstChild, contentNode = this.contentNode, width; this.inherited(arguments); // Force contentNode width to match up with header width. contentNode.style.width = ''; // reset first if (contentNode && headerTableNode) { if ((width = headerTableNode.offsetWidth) > contentNode.offsetWidth) { // update size of content node if necessary (to match size of rows) // (if headerTableNode can't be found, there isn't much we can do) contentNode.style.width = width + 'px'; } } }, destroy: function () { // Run _destroyColumns first to perform any column plugin tear-down logic. this._destroyColumns(); if (this._sortListener) { this._sortListener.remove(); } this.inherited(arguments); }, _setSort: function () { // summary: // Extension of List.js sort to update sort arrow in UI // Normalize sort first via inherited logic, then update the sort arrow this.inherited(arguments); this.updateSortArrow(this.sort); }, _findSortArrowParent: function (field) { // summary: // Method responsible for finding cell that sort arrow should be // added under. Called by updateSortArrow; separated for extensibility. var columns = this.columns; for (var i in columns) { var column = columns[i]; if (column.field === field) { return column.headerNode; } } }, updateSortArrow: function (sort, updateSort) { // summary: // Method responsible for updating the placement of the arrow in the // appropriate header cell. Typically this should not be called (call // set("sort", ...) when actually updating sort programmatically), but // this method may be used by code which is customizing sort (e.g. // by reacting to the dgrid-sort event, canceling it, then // performing logic and calling this manually). // sort: Array // Standard sort parameter - array of object(s) containing property name // and optional descending flag // updateSort: Boolean? // If true, will update this.sort based on the passed sort array // (i.e. to keep it in sync when custom logic is otherwise preventing // it from being updated); defaults to false // Clean up UI from any previous sort if (this._lastSortedArrow) { // Remove the sort classes from the parent node domClass.remove(this._lastSortedArrow.parentNode, 'dgrid-sort-up dgrid-sort-down'); // Destroy the lastSortedArrow node domConstruct.destroy(this._lastSortedArrow); delete this._lastSortedArrow; } if (updateSort) { this.sort = sort; } if (!sort[0]) { return; // Nothing to do if no sort is specified } var prop = sort[0].property, desc = sort[0].descending, // if invoked from header click, target is stashed in _sortNode target = this._sortNode || this._findSortArrowParent(prop), arrowNode; delete this._sortNode; // Skip this logic if field being sorted isn't actually displayed if (target) { target = target.contents || target; // Place sort arrow under clicked node, and add up/down sort class arrowNode = this._lastSortedArrow = domConstruct.create('div', { className: 'dgrid-sort-arrow ui-icon', innerHTML: ' ', role: 'presentation' }, target, 'first'); domClass.add(target, 'dgrid-sort-' + (desc ? 'down' : 'up')); // Call resize in case relocation of sort arrow caused any height changes this.resize(); } }, styleColumn: function (colId, css) { // summary: // Dynamically creates a stylesheet rule to alter a column's style. return this.addCssRule('#' + miscUtil.escapeCssIdentifier(this.domNode.id) + ' .dgrid-column-' + replaceInvalidChars(colId), css); }, /*===== _configColumn: function (column, rowColumns, prefix) { // summary: // Method called when normalizing base configuration of a single // column. Can be used as an extension point for behavior requiring // access to columns when a new configuration is applied. },=====*/ _configColumns: function (prefix, rowColumns) { // configure the current column var subRow = [], isArray = rowColumns instanceof Array; function configColumn(column, columnId) { if (typeof column === 'string') { rowColumns[columnId] = column = { label: column }; } if (!isArray && !column.field) { column.field = columnId; } columnId = column.id = column.id || (isNaN(columnId) ? columnId : (prefix + columnId)); // allow further base configuration in subclasses if (this._configColumn) { this._configColumn(column, rowColumns, prefix); // Allow the subclasses to modify the column id. columnId = column.id; } if (isArray) { this.columns[columnId] = column; } // add grid reference to each column object for potential use by plugins column.grid = this; subRow.push(column); // make sure it can be iterated on } miscUtil.each(rowColumns, configColumn, this); return isArray ? rowColumns : subRow; }, _destroyColumns: function () { // summary: // Extension point for column-related cleanup. This is called // immediately before configuring a new column structure, // and when the grid is destroyed. // First remove rows (since they'll be refreshed after we're done), // so that anything temporarily extending removeRow can run. // (cleanup will end up running again, but with nothing to iterate.) this.cleanup(); }, configStructure: function () { // configure the columns and subRows var subRows = this.subRows, columns = this._columns = this.columns; // Reset this.columns unless it was already passed in as an object this.columns = !columns || columns instanceof Array ? {} : columns; if (subRows) { // Process subrows, which will in turn populate the this.columns object for (var i = 0; i < subRows.length; i++) { subRows[i] = this._configColumns(i + '-', subRows[i]); } } else { this.subRows = [this._configColumns('', columns)]; } }, _getColumns: function () { // _columns preserves what was passed to set("columns"), but if subRows // was set instead, columns contains the "object-ified" version, which // was always accessible in the past, so maintain that accessibility going // forward. return this._columns || this.columns; }, _setColumns: function (columns) { this._destroyColumns(); // reset instance variables this.subRows = null; this.columns = columns; // re-run logic this._updateColumns(); }, _setSubRows: function (subrows) { this._destroyColumns(); this.subRows = subrows; this._updateColumns(); }, _updateColumns: function () { // summary: // Called when columns, subRows, or columnSets are reset this.configStructure(); this.renderHeader(); this.refresh(); // re-render last collection if present this._lastCollection && this.renderArray(this._lastCollection); // After re-rendering the header, re-apply the sort arrow if needed. if (this._started) { if (this.sort.length) { this._lastSortedArrow = null; this.updateSortArrow(this.sort); } else { // Only call resize directly if we didn't call updateSortArrow, // since that calls resize itself when it updates. this.resize(); } } } }); Grid.appendIfNode = appendIfNode; return Grid; }); corelib/dgrid/GridFromHtml.js
New file @@ -0,0 +1,140 @@ define([ './Grid', 'dojo/_base/declare', 'dojo/dom-construct' ], function (Grid, declare, domConstruct) { // summary: // This module supports parsing grid structure information from an HTML table. // This module does NOT support ColumnSets; see GridWithColumnSetsFromHtml // name of data attribute to check for column properties var bagName = 'data-dgrid-column'; function getSubRowsFromDom(domNode) { // summary: // generate columns from DOM. Should this be in here, or a separate module? var columns = [], // to be pushed upon / returned trs = domNode.getElementsByTagName('tr'), trslen = trs.length, getCol = GridFromHtml.utils.getColumnFromCell, rowColumns, tr, ths, thslen; for (var i = 0; i < trslen; i++) { rowColumns = []; columns.push(rowColumns); tr = trs[i]; ths = tr.getElementsByTagName('th'), thslen = ths.length; for (var j = 0; j < thslen; j++) { rowColumns.push(getCol(ths[j])); } } if (tr) { // NOTE: this assumes that applicable TRs were ONLY found under one // grouping element (e.g. thead) domNode.removeChild(tr.parentNode); } return columns; } var GridFromHtml = declare(Grid, { configStructure: function () { // summary: // Configure subRows based on HTML originally in srcNodeRef if (!this._checkedTrs) { this._checkedTrs = true; this.subRows = getSubRowsFromDom(this.srcNodeRef, this.subRows); } return this.inherited(arguments); }, create: function (params, srcNodeRef) { // We need to replace srcNodeRef, presumably a table, with a div. // (Otherwise we'll generate highly invalid markup, which IE doesn't like) var div = document.createElement('div'), id = srcNodeRef.id, style = srcNodeRef.getAttribute('style'); // Copy some commonly-used attributes... if (id) { this.id = id; // Will be propagated in List's create } div.className = srcNodeRef.className; style && div.setAttribute('style', style); // replace srcNodeRef in DOM with the div srcNodeRef.parentNode.replaceChild(div, srcNodeRef); (params = params || {}).srcNodeRef = srcNodeRef; // call inherited with the new node // (but configStructure will look at srcNodeRef) this.inherited(arguments, [params, div]); // destroy srcNodeRef for good now that we're done with it domConstruct.destroy(srcNodeRef); } }); // hang some utility functions, potentially useful for extensions GridFromHtml.utils = { // Functions for getting various types of values from HTML attributes getBoolFromAttr: function (node, attr) { // used for e.g. sortable var val = node.getAttribute(attr); return val && val !== 'false'; }, getNumFromAttr: function (node, attr) { // used for e.g. rowSpan, colSpan var val = node.getAttribute(attr); val = val && Number(val); return isNaN(val) ? undefined : val; }, getPropsFromNode: function (node) { // used to pull properties out of bag e.g. "data-dgrid-column". var obj, str = node.getAttribute(bagName); if (!str) { return {}; } try { /* jshint evil: true */ // Yes, eval is evil, but this is ultimately the same thing that // dojo/parser does for objects. obj = eval('(' + str + ')'); } catch (error) { throw new Error('Error in ' + bagName + ' {' + str + '}: ' + error.toString()); } return obj; }, // Function for aggregating th attributes into column properties getColumnFromCell: function (th) { var getNum = GridFromHtml.utils.getNumFromAttr, obj, tmp; // Look for properties in data attribute. // It's imperative that we hold on to this object as returned, as the // object may be augmented further by other sources, // e.g. Grid adding the grid property to reference the instance. obj = GridFromHtml.utils.getPropsFromNode(th); // inspect standard attributes, but data attribute takes precedence obj.label = 'label' in obj ? obj.label : th.innerHTML; obj.field = obj.field || th.className || th.innerHTML; if (!obj.className && th.className) { obj.className = th.className; } if (!obj.rowSpan && (tmp = getNum(th, 'rowspan'))) { obj.rowSpan = tmp; } if (!obj.colSpan && (tmp = getNum(th, 'colspan'))) { obj.colSpan = tmp; } return obj; } }; return GridFromHtml; }); corelib/dgrid/GridWithColumnSetsFromHtml.js
New file @@ -0,0 +1,128 @@ define([ './GridFromHtml', './ColumnSet', 'dojo/_base/declare' ], function (GridFromHtml, ColumnSet, declare) { // summary: // This module augments GridFromHtml with additional support for interpreting // ColumnSets from colgroups in table markup. function getColumnSetsFromDom(domNode) { // summary: // Generates ColumnSets from DOM. var columnsets = [], // to be pushed upon / returned cgspans = [], // stores info on columnset sizes (colgroup span) rowspans = [], // will store info on any "unexhausted" rowspans colgroups = domNode.getElementsByTagName('colgroup'), cglen = colgroups.length, trs = domNode.getElementsByTagName('tr'), trslen = trs.length, getNum = GridFromHtml.utils.getNumFromAttr, getCol = GridFromHtml.utils.getColumnFromCell, // used in loops: currcol, // keeps track of what column we're at currcg, // and which colgroup groupColumns, tr, ths, thslen, i, j, tmp; function incCurrcol(amount) { // Check whether we've passed into the next colgroup within current row. // (Used within th loop) currcol += amount; tmp = cgspans[currcg]; if (currcol >= tmp) { // First, push info for the set we just finished: // (i is still the active row index from the for loop) columnsets[currcg][i] = groupColumns; // Now, time to move on to the next columnset for this row. currcol -= tmp; currcg++; groupColumns = []; } } // no need for ColumnSet unless there's >1 colgroup if (cglen < 2) { return false; } // read span from each colgroup (defaults to 1) for (i = 0; i < cglen; i++) { // store number of cells this column spans tmp = getNum(colgroups[i], 'span') || 1; cgspans[i] = tmp; // add nested array to return value to be populated for this set columnsets[i] = []; // initialize inner rowspan-tracking array for each rowspans[i] = []; for (j = 0; j < tmp; j++) { rowspans[i][j] = 0; } } for (i = 0; i < trslen; i++) { currcol = currcg = 0; groupColumns = []; tr = trs[i]; ths = tr.getElementsByTagName('th'); thslen = ths.length; for (j = 0; j < thslen; j++) { // account for space occupied by previous rowSpans while (rowspans[currcg][currcol]) { // decrement rowspan "leftover" for next iteration rowspans[currcg][currcol]--; // skip past this cell for now, and try again w/ updated currcg/col incCurrcol(1); } // store cell info tmp = getCol(ths[j]); groupColumns.push(tmp); // if this cell has rowspan, keep that in mind for future iterations rowspans[currcg][currcol] = tmp.rowSpan ? tmp.rowSpan - 1 : 0; // increment currcol/currcg appropriately, accounting for cell colSpan incCurrcol(tmp.colSpan || 1); } // At the end of processing each row, there is a chance that the last // column set didn't get pushed yet (specifically if there are trailing // rowspans - since rowspan "debt" gets iterated at the beginning of each // iteration, not the end). In that case, push the last one now. if (groupColumns.length) { columnsets[currcg][i] = groupColumns; } } if (tr) { domNode.removeChild(tr.parentNode); } return columnsets; } return declare([GridFromHtml, ColumnSet], { configStructure: function () { // summary: // Configure subRows based on HTML originally in srcNodeRef var tmp; if (!this._checkedTrs) { tmp = getColumnSetsFromDom(this.srcNodeRef); if (tmp) { this.columnSets = tmp; this._checkedTrs = true; } else { // no reason to worry about ColumnSets, let GridFromHtml do the job return this.inherited(arguments); } } return this.inherited(arguments); } }); }); corelib/dgrid/Gruntfile.js
New file @@ -0,0 +1,81 @@ /* jshint node:true */ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-contrib-stylus'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('intern'); // grunt-contrib-stylus does not appear to support globbed destination filenames, // so generate the desired destination/source configuration ahead of time var stylusFiles = grunt.file.expand([ 'css/dgrid.styl', 'css/skins/*.styl', '!css/skins/skin.styl' ]); var stylusFilesConfig = {}; stylusFiles.forEach(function (filename) { stylusFilesConfig[filename.slice(0, -5) + '.css'] = filename; }); grunt.initConfig({ clean: { css: { src: [ 'css/**/*.css' ] } }, stylus: { options: { compress: false, use: [ require('nib') ] }, compile: { files: stylusFilesConfig } }, watch: { stylus: { files: [ 'css/**/*.styl' ], tasks: [ 'stylus' ] } }, intern: { options: { reporters: [ 'LcovHtml', 'Pretty' ], runType: 'runner', config: 'test/intern/intern' }, local: { options: { config: 'test/intern/intern-local' } }, browserstack: {}, saucelabs: { options: { config: 'test/intern/intern-saucelabs' } } } }); grunt.registerTask('default', [ 'stylus', 'watch:stylus' ]); grunt.registerTask('test', function () { var flags = Object.keys(this.flags); if (!flags.length) { flags.push('local'); } flags.forEach(function (flag) { grunt.task.run('intern:' + flag); }); }); }; corelib/dgrid/Keyboard.js
New file @@ -0,0 +1,619 @@ define([ 'dojo/_base/declare', 'dojo/aspect', 'dojo/dom-class', 'dojo/on', 'dojo/_base/lang', 'dojo/has', './util/misc', 'dojo/_base/sniff' ], function (declare, aspect, domClass, on, lang, has, miscUtil) { var delegatingInputTypes = { checkbox: 1, radio: 1, button: 1 }, hasGridCellClass = /\bdgrid-cell\b/, hasGridRowClass = /\bdgrid-row\b/; var Keyboard = declare(null, { // summary: // Adds keyboard navigation capability to a list or grid. // pageSkip: Number // Number of rows to jump by when page up or page down is pressed. pageSkip: 10, tabIndex: 0, // keyMap: Object // Hash which maps key codes to functions to be executed (in the context // of the instance) for key events within the grid's body. keyMap: null, // headerKeyMap: Object // Hash which maps key codes to functions to be executed (in the context // of the instance) for key events within the grid's header row. headerKeyMap: null, postMixInProperties: function () { this.inherited(arguments); if (!this.keyMap) { this.keyMap = lang.mixin({}, Keyboard.defaultKeyMap); } if (!this.headerKeyMap) { this.headerKeyMap = lang.mixin({}, Keyboard.defaultHeaderKeyMap); } }, postCreate: function () { this.inherited(arguments); var grid = this; function handledEvent(event) { // Text boxes and other inputs that can use direction keys should be ignored // and not affect cell/row navigation var target = event.target; return target.type && (!delegatingInputTypes[target.type] || event.keyCode === 32); } function enableNavigation(areaNode) { var cellNavigation = grid.cellNavigation, isFocusableClass = cellNavigation ? hasGridCellClass : hasGridRowClass, isHeader = areaNode === grid.headerNode, initialNode = areaNode; function initHeader() { if (grid._focusedHeaderNode) { // Remove the tab index for the node that previously had it. grid._focusedHeaderNode.tabIndex = -1; } if (grid.showHeader) { if (cellNavigation) { // Get the focused element. Ensure that the focused element // is actually a grid cell, not a column-set-cell or some // other cell that should not be focused var elements = grid.headerNode.getElementsByTagName('th'); for (var i = 0, element; (element = elements[i]); ++i) { if (isFocusableClass.test(element.className)) { grid._focusedHeaderNode = initialNode = element; break; } } } else { grid._focusedHeaderNode = initialNode = grid.headerNode; } // Set the tab index only if the header is visible. if (initialNode) { initialNode.tabIndex = grid.tabIndex; } } } function afterContentAdded() { // Ensures the first element of a grid is always keyboard selectable after data has been // retrieved if there is not already a valid focused element. var focusedNode = grid._focusedNode || initialNode; // do not update the focused element if we already have a valid one if (isFocusableClass.test(focusedNode.className) && areaNode.contains(focusedNode)) { return; } // ensure that the focused element is actually a grid cell, not a // dgrid-preload or dgrid-content element, which should not be focusable, // even when data is loaded asynchronously var elements = areaNode.getElementsByTagName('*'); for (var i = 0, element; (element = elements[i]); ++i) { if (isFocusableClass.test(element.className)) { focusedNode = grid._focusedNode = element; break; } } initialNode.tabIndex = -1; focusedNode.tabIndex = grid.tabIndex; // This is initialNode if nothing focusable was found return; } if (isHeader) { // Initialize header now (since it's already been rendered), // and aspect after future renderHeader calls to reset focus. initHeader(); aspect.after(grid, 'renderHeader', initHeader, true); } else { aspect.after(grid, 'renderArray', afterContentAdded, true); aspect.after(grid, '_onNotification', function (rows, event) { if (event.totalLength === 0) { areaNode.tabIndex = 0; } else if (event.totalLength === 1 && event.type === 'add') { afterContentAdded(); } }, true); } grid._listeners.push(on(areaNode, 'mousedown', function (event) { if (!handledEvent(event)) { grid._focusOnNode(event.target, isHeader, event); } })); grid._listeners.push(on(areaNode, 'keydown', function (event) { // For now, don't squash browser-specific functionalities by letting // ALT and META function as they would natively if (event.metaKey || event.altKey) { return; } var handler = grid[isHeader ? 'headerKeyMap' : 'keyMap'][event.keyCode]; // Text boxes and other inputs that can use direction keys should be ignored // and not affect cell/row navigation if (handler && !handledEvent(event)) { handler.call(grid, event); } })); } if (this.tabableHeader) { enableNavigation(this.headerNode); on(this.headerNode, 'dgrid-cellfocusin', function () { grid.scrollTo({ x: this.scrollLeft }); }); } enableNavigation(this.contentNode); this._debouncedEnsureScroll = miscUtil.debounce(this._ensureScroll, this); }, _pruneRow: function () { // If rows are being pruned for scrolling, then don't try to restore focus. var savedFocusedNode = this._focusedNode; this._focusedNode = null; this.inherited(arguments); this._focusedNode = savedFocusedNode; }, removeRow: function (rowElement) { if (!this._focusedNode) { // Nothing special to do if we have no record of anything focused return this.inherited(arguments); } var self = this, isActive = document.activeElement === this._focusedNode, focusedTarget = this[this.cellNavigation ? 'cell' : 'row'](this._focusedNode), focusedRow = focusedTarget.row || focusedTarget, sibling; rowElement = rowElement.element || rowElement; // If removed row previously had focus, temporarily store information // to be handled in an immediately-following insertRow call, or next turn if (rowElement === focusedRow.element) { sibling = this.down(focusedRow, 1, true); // Check whether down call returned the same row, or failed to return // any (e.g. during a partial unrendering) if (!sibling || sibling.element === rowElement) { sibling = this.up(focusedRow, 1, true); } this._removedFocus = { active: isActive, rowId: focusedRow.id, columnId: focusedTarget.column && focusedTarget.column.id, siblingId: !sibling || sibling.element === rowElement ? undefined : sibling.id }; // Call _restoreFocus on next turn, to restore focus to sibling // if no replacement row was immediately inserted. // Pass original row's id in case it was re-inserted in a renderArray // call (and thus was found, but couldn't be focused immediately) setTimeout(function () { if (self._removedFocus) { self._restoreFocus(focusedRow.id); } }, 0); // Clear _focusedNode until _restoreFocus is called, to avoid // needlessly re-running this logic this._focusedNode = null; } this.inherited(arguments); }, insertRow: function () { var rowElement = this.inherited(arguments); if (this._removedFocus && !this._removedFocus.wait) { this._restoreFocus(rowElement); } return rowElement; }, _restoreFocus: function (row) { // summary: // Restores focus to the newly inserted row if it matches the // previously removed row, or to the nearest sibling otherwise. var focusInfo = this._removedFocus, newTarget, cell; row = row && this.row(row); newTarget = row && row.element && row.id === focusInfo.rowId ? row : typeof focusInfo.siblingId !== 'undefined' && this.row(focusInfo.siblingId); if (newTarget && newTarget.element) { if (!newTarget.element.parentNode.parentNode) { // This was called from renderArray, so the row hasn't // actually been placed in the DOM yet; handle it on the next // turn (called from removeRow). focusInfo.wait = true; return; } // Should focus be on a cell? if (typeof focusInfo.columnId !== 'undefined') { cell = this.cell(newTarget, focusInfo.columnId); if (cell && cell.element) { newTarget = cell; } } if (focusInfo.active && newTarget.element.offsetHeight !== 0) { // Row/cell was previously focused and is visible, so focus the new one immediately this._focusOnNode(newTarget, false, null); } else { // Row/cell was not focused or is not visible, but we still need to // update _focusedNode and the element's tabIndex/class domClass.add(newTarget.element, 'dgrid-focus'); newTarget.element.tabIndex = this.tabIndex; this._focusedNode = newTarget.element; } } delete this._removedFocus; }, addKeyHandler: function (key, callback, isHeader) { // summary: // Adds a handler to the keyMap on the instance. // Supports binding additional handlers to already-mapped keys. // key: Number // Key code representing the key to be handled. // callback: Function // Callback to be executed (in instance context) when the key is pressed. // isHeader: Boolean // Whether the handler is to be added for the grid body (false, default) // or the header (true). // Aspects may be about 10% slower than using an array-based appraoch, // but there is significantly less code involved (here and above). return aspect.after( // Handle this[isHeader ? 'headerKeyMap' : 'keyMap'], key, callback, true); }, _ensureRowScroll: function (rowElement) { // summary: // Ensures that the entire row is visible within the viewport. // Called for cell navigation in complex structures. var scrollY = this.getScrollPosition().y; if (scrollY > rowElement.offsetTop) { // Row starts above the viewport this.scrollTo({ y: rowElement.offsetTop }); } else if (scrollY + this.contentNode.offsetHeight < rowElement.offsetTop + rowElement.offsetHeight) { // Row ends below the viewport this.scrollTo({ y: rowElement.offsetTop - this.contentNode.offsetHeight + rowElement.offsetHeight }); } }, _ensureColumnScroll: function (cellElement) { // summary: // Ensures that the entire cell is visible in the viewport. // Called in cases where the grid can scroll horizontally. var scrollX = this.getScrollPosition().x; var cellLeft = cellElement.offsetLeft; if (scrollX > cellLeft) { this.scrollTo({ x: cellLeft }); } else { var bodyWidth = this.bodyNode.clientWidth; var cellWidth = cellElement.offsetWidth; var cellRight = cellLeft + cellWidth; if (scrollX + bodyWidth < cellRight) { // Adjust so that the right side of the cell and grid body align, // unless the cell is actually wider than the body - then align the left sides this.scrollTo({ x: bodyWidth > cellWidth ? cellRight - bodyWidth : cellLeft }); } } }, _ensureScroll: function (rowOrCell, isHeader) { // summary: // Corrects scroll based on the position of the newly-focused row/cell // as necessary based on grid configuration and dimensions. var isRow = !rowOrCell.column && !rowOrCell.row && rowOrCell.data && rowOrCell.element; if (isRow) { this._ensureRowScroll(rowOrCell.element); } else { if (this.cellNavigation && (this.columnSets || this.subRows.length > 1) && !isHeader) { this._ensureRowScroll(rowOrCell.row.element); } if (this.bodyNode.clientWidth < this.contentNode.offsetWidth) { this._ensureColumnScroll(rowOrCell.element); } } }, _focusOnNode: function (element, isHeader, event) { var focusedNodeProperty = '_focused' + (isHeader ? 'Header' : '') + 'Node', focusedNode = this[focusedNodeProperty], cellOrRowType = this.cellNavigation ? 'cell' : 'row', cell = this[cellOrRowType](element), inputs, input, numInputs, inputFocused, i; element = cell && cell.element; if (!element) { return; } if (this.cellNavigation) { inputs = element.getElementsByTagName('input'); for (i = 0, numInputs = inputs.length; i < numInputs; i++) { input = inputs[i]; if ((input.tabIndex !== -1 || '_dgridLastValue' in input) && !input.disabled) { input.focus(); inputFocused = true; break; } } } // Set up event information for dgrid-cellfocusout/in events. // Note that these events are not fired for _restoreFocus. if (event !== null) { event = lang.mixin({ grid: this }, event); if (event.type) { event.parentType = event.type; } if (!event.bubbles) { // IE doesn't always have a bubbles property already true. // Opera throws if you try to set it to true if it is already true. event.bubbles = true; } } if (focusedNode) { // Clean up previously-focused element // Remove the class name and the tabIndex attribute domClass.remove(focusedNode, 'dgrid-focus'); focusedNode.removeAttribute('tabindex'); // Expose object representing focused cell or row losing focus, via // event.cell or event.row; which is set depends on cellNavigation. if (event) { event[cellOrRowType] = this[cellOrRowType](focusedNode); on.emit(focusedNode, 'dgrid-cellfocusout', event); } } focusedNode = this[focusedNodeProperty] = element; if (event) { // Expose object representing focused cell or row gaining focus, via // event.cell or event.row; which is set depends on cellNavigation. // Note that yes, the same event object is being reused; on.emit // performs a shallow copy of properties into a new event object. event[cellOrRowType] = cell; } var isFocusableClass = this.cellNavigation ? hasGridCellClass : hasGridRowClass; if (!inputFocused && isFocusableClass.test(element.className)) { element.tabIndex = this.tabIndex; element.focus(); } domClass.add(element, 'dgrid-focus'); if (event) { on.emit(focusedNode, 'dgrid-cellfocusin', event); } this._debouncedEnsureScroll(cell, isHeader); }, focusHeader: function (element) { this._focusOnNode(element || this._focusedHeaderNode, true); }, focus: function (element) { var node = element || this._focusedNode; if (node) { this._focusOnNode(node, false); } else { if (this._removedFocus) { this._removedFocus.active = true; } this.contentNode.focus(); } } }); // Common functions used in default keyMap (called in instance context) var moveFocusVertical = Keyboard.moveFocusVertical = function (event, steps) { var cellNavigation = this.cellNavigation, target = this[cellNavigation ? 'cell' : 'row'](event), columnId = cellNavigation && target.column.id, next = this.down(this._focusedNode, steps, true); // Navigate within same column if cell navigation is enabled if (cellNavigation) { next = this.cell(next, columnId); } this._focusOnNode(next, false, event); event.preventDefault(); }; var moveFocusUp = Keyboard.moveFocusUp = function (event) { moveFocusVertical.call(this, event, -1); }; var moveFocusDown = Keyboard.moveFocusDown = function (event) { moveFocusVertical.call(this, event, 1); }; var moveFocusPageUp = Keyboard.moveFocusPageUp = function (event) { moveFocusVertical.call(this, event, -this.pageSkip); }; var moveFocusPageDown = Keyboard.moveFocusPageDown = function (event) { moveFocusVertical.call(this, event, this.pageSkip); }; var moveFocusHorizontal = Keyboard.moveFocusHorizontal = function (event, steps) { if (!this.cellNavigation) { return; } var isHeader = !this.row(event), // header reports row as undefined currentNode = this['_focused' + (isHeader ? 'Header' : '') + 'Node']; this._focusOnNode(this.right(currentNode, steps), isHeader, event); event.preventDefault(); }; var moveFocusLeft = Keyboard.moveFocusLeft = function (event) { moveFocusHorizontal.call(this, event, -1); }; var moveFocusRight = Keyboard.moveFocusRight = function (event) { moveFocusHorizontal.call(this, event, 1); }; var moveHeaderFocusEnd = Keyboard.moveHeaderFocusEnd = function (event, scrollToBeginning) { // Header case is always simple, since all rows/cells are present var nodes; if (this.cellNavigation) { nodes = this.headerNode.getElementsByTagName('th'); this._focusOnNode(nodes[scrollToBeginning ? 0 : nodes.length - 1], true, event); } // In row-navigation mode, there's nothing to do - only one row in header // Prevent browser from scrolling entire page event.preventDefault(); }; var moveHeaderFocusHome = Keyboard.moveHeaderFocusHome = function (event) { moveHeaderFocusEnd.call(this, event, true); }; var moveFocusEnd = Keyboard.moveFocusEnd = function (event, scrollToTop) { // summary: // Handles requests to scroll to the beginning or end of the grid. var cellNavigation = this.cellNavigation, contentNode = this.contentNode, contentPos = scrollToTop ? 0 : contentNode.scrollHeight, scrollPos = contentNode.scrollTop + contentPos, endChild = contentNode[scrollToTop ? 'firstChild' : 'lastChild'], hasPreload = endChild.className.indexOf('dgrid-preload') > -1, endTarget = hasPreload ? endChild[(scrollToTop ? 'next' : 'previous') + 'Sibling'] : endChild, handle; // Scroll explicitly rather than relying on native browser scrolling // (which might use smooth scrolling, which could incur extra renders for OnDemandList) event.preventDefault(); this.scrollTo({ y: scrollPos }); if (hasPreload) { // Find the nearest dgrid-row to the relevant end of the grid while (endTarget && endTarget.className.indexOf('dgrid-row') < 0) { endTarget = endTarget[(scrollToTop ? 'next' : 'previous') + 'Sibling']; } // If none is found, there are no rows, and nothing to navigate if (!endTarget) { return; } } // Grid content may be lazy-loaded, so check if content needs to be // loaded first if (!hasPreload || endChild.offsetHeight < 1) { // End row is loaded; focus the first/last row/cell now if (cellNavigation) { // Preserve column that was currently focused endTarget = this.cell(endTarget, this.cell(event).column.id); } this._focusOnNode(endTarget, false, event); } else { // In IE < 9, the event member references will become invalid by the time // _focusOnNode is called, so make a (shallow) copy up-front if (!has('dom-addeventlistener')) { event = lang.mixin({}, event); } // If the topmost/bottommost row rendered doesn't reach the top/bottom of // the contentNode, we are using OnDemandList and need to wait for more // data to render, then focus the first/last row in the new content. handle = aspect.after(this, 'renderArray', function (rows) { var target = rows[scrollToTop ? 0 : rows.length - 1]; if (cellNavigation) { // Preserve column that was currently focused target = this.cell(target, this.cell(event).column.id); } this._focusOnNode(target, false, event); handle.remove(); return rows; }); } }; var moveFocusHome = Keyboard.moveFocusHome = function (event) { moveFocusEnd.call(this, event, true); }; function preventDefault(event) { event.preventDefault(); } Keyboard.defaultKeyMap = { 32: preventDefault, // space 33: moveFocusPageUp, // page up 34: moveFocusPageDown, // page down 35: moveFocusEnd, // end 36: moveFocusHome, // home 37: moveFocusLeft, // left 38: moveFocusUp, // up 39: moveFocusRight, // right 40: moveFocusDown // down }; // Header needs fewer default bindings (no vertical), so bind it separately Keyboard.defaultHeaderKeyMap = { 32: preventDefault, // space 35: moveHeaderFocusEnd, // end 36: moveHeaderFocusHome, // home 37: moveFocusLeft, // left 39: moveFocusRight // right }; return Keyboard; }); corelib/dgrid/LICENSE
New file @@ -0,0 +1,28 @@ The "New" BSD License ********************* Copyright (c) 2010-2016, The Dojo Foundation All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Dojo Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. corelib/dgrid/List.js
New file @@ -0,0 +1,860 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/dom-construct', 'dojo/dom-class', 'dojo/on', 'dojo/has', './util/misc', 'dojo/_base/sniff' ], function (declare, lang, domConstruct, domClass, listen, has, miscUtil) { // Add user agent/feature CSS classes needed for structural CSS var featureClasses = []; if (has('mozilla')) { featureClasses.push('has-mozilla'); } if (has('touch')) { featureClasses.push('has-touch'); } domClass.add(document.documentElement, featureClasses); // Add a feature test for pointer (only Dojo 1.10 has pointer-events and MSPointer tests) has.add('pointer', function (global) { return 'PointerEvent' in global ? 'pointer' : 'MSPointerEvent' in global ? 'MSPointer' : false; }); var oddClass = 'dgrid-row-odd', evenClass = 'dgrid-row-even', scrollbarWidth, scrollbarHeight; function byId(id) { return document.getElementById(id); } function cleanupTestElement(element) { element.className = ''; if (element.parentNode) { document.body.removeChild(element); } } function getScrollbarSize(element, dimension) { // Used by has tests for scrollbar width/height element.className = 'dgrid-scrollbar-measure'; document.body.appendChild(element); var size = element['offset' + dimension] - element['client' + dimension]; cleanupTestElement(element); return size; } has.add('dom-scrollbar-width', function (global, doc, element) { return getScrollbarSize(element, 'Width'); }); has.add('dom-scrollbar-height', function (global, doc, element) { return getScrollbarSize(element, 'Height'); }); has.add('dom-rtl-scrollbar-left', function (global, doc, element) { var div = document.createElement('div'), isLeft; element.className = 'dgrid-scrollbar-measure'; element.setAttribute('dir', 'rtl'); element.appendChild(div); document.body.appendChild(element); // position: absolute makes modern IE and Edge always report child's offsetLeft as 0, // but other browsers factor in the position of the scrollbar if it is to the left. // All versions of IE and Edge are known to move the scrollbar to the left side for rtl. isLeft = !!has('ie') || !!has('trident') || /\bEdge\//.test(navigator.userAgent) || div.offsetLeft >= has('dom-scrollbar-width'); cleanupTestElement(element); domConstruct.destroy(div); element.removeAttribute('dir'); return isLeft; }); // var and function for autogenerating ID when one isn't provided var autoId = 0; function generateId() { return List.autoIdPrefix + autoId++; } // common functions for class and className setters/getters // (these are run in instance context) function setClass(cls) { domClass.replace(this.domNode, cls, this._class || ''); // Store for later retrieval/removal. this._class = cls; } function getClass() { return this._class; } // window resize event handler, run in context of List instance var winResizeHandler = function () { if (this._started) { this.resize(); } }; var List = declare(null, { tabableHeader: false, // showHeader: Boolean // Whether to render header (sub)rows. showHeader: false, // showFooter: Boolean // Whether to render footer area. Extensions which display content // in the footer area should set this to true. showFooter: false, // maintainOddEven: Boolean // Whether to maintain the odd/even classes when new rows are inserted. // This can be disabled to improve insertion performance if odd/even styling is not employed. maintainOddEven: true, // cleanAddedRules: Boolean // Whether to track rules added via the addCssRule method to be removed // when the list is destroyed. Note this is effective at the time of // the call to addCssRule, not at the time of destruction. cleanAddedRules: true, // addUiClasses: Boolean // Whether to add jQuery UI classes to various elements in dgrid's DOM. addUiClasses: true, // highlightDuration: Integer // The amount of time (in milliseconds) that a row should remain // highlighted after it has been updated. highlightDuration: 250, // resizeThrottleDelay: Integer // The delay (in milliseconds) passed to the resizeThrottleMethod. // A lower value will provide more responsive grid resizing. If there are a large number of grids on // the page, a higher value can improve performance (or specify 'debounce' for 'resizeThrottleMethod'). resizeThrottleDelay: miscUtil.defaultDelay, // resizeThrottleMethod: String or Function // String: the name of a method from dgrid/util/misc ('debounce', 'throttle', 'throttleDelayed') to throttle or debounce the window resize handler. // Function: a function to throttle or debounce the window resize handler. The function will receive // two parameters: // callback (Function): the function to be throttled // delay (Integer): the value of the resizeThrottleDelay property // The function must return a function that executes the callback function. resizeThrottleMethod: 'throttleDelayed', postscript: function (params, srcNodeRef) { // perform setup and invoke create in postScript to allow descendants to // perform logic before create/postCreate happen (a la dijit/_WidgetBase) var grid = this; (this._Row = function (id, object, element) { this.id = id; this.data = object; this.element = element; }).prototype.remove = function () { grid.removeRow(this.element); }; if (srcNodeRef) { // normalize srcNodeRef and store on instance during create process. // Doing this in postscript is a bit earlier than dijit would do it, // but allows subclasses to access it pre-normalized during create. this.srcNodeRef = srcNodeRef = srcNodeRef.nodeType ? srcNodeRef : byId(srcNodeRef); } this.create(params, srcNodeRef); }, listType: 'list', create: function (params, srcNodeRef) { var domNode = this.domNode = srcNodeRef || document.createElement('div'), cls; if (params) { this.params = params; declare.safeMixin(this, params); // Check for initial class or className in params or on domNode cls = params['class'] || params.className || domNode.className; } // ensure arrays and hashes are initialized this.sort = this.sort || []; this._listeners = []; this._rowIdToObject = {}; this.postMixInProperties && this.postMixInProperties(); // Apply id to widget and domNode, // from incoming node, widget params, or autogenerated. this.id = domNode.id = domNode.id || this.id || generateId(); // Perform initial rendering, and apply classes if any were specified. this.buildRendering(); if (cls) { setClass.call(this, cls); } this.postCreate(); // remove srcNodeRef instance property post-create delete this.srcNodeRef; // to preserve "it just works" behavior, call startup if we're visible if (this.domNode.offsetHeight) { this.startup(); } }, buildRendering: function () { var domNode = this.domNode, addUiClasses = this.addUiClasses, self = this, headerNode, bodyNode, footerNode, isRTL, throttledResizeHandler; // Detect RTL on html/body nodes; taken from dojo/dom-geometry isRTL = this.isRTL = (document.body.dir || document.documentElement.dir || document.body.style.direction).toLowerCase() === 'rtl'; // Clear out className (any pre-applied classes will be re-applied via the // class / className setter), then apply standard classes/attributes domNode.className = ''; domNode.setAttribute('role', 'grid'); domClass.add(domNode, 'dgrid dgrid-' + this.listType + (addUiClasses ? ' ui-widget' : '')); // Place header node (initially hidden if showHeader is false). headerNode = this.headerNode = domConstruct.create('div', { className: 'dgrid-header dgrid-header-row' + (addUiClasses ? ' ui-widget-header' : '') + (this.showHeader ? '' : ' dgrid-header-hidden') }, domNode); bodyNode = this.bodyNode = domConstruct.create('div', { className: 'dgrid-scroller' }, domNode); // Firefox 4+ adds overflow: auto elements to the tab index by default; // force them to not be tabbable, but restrict this to Firefox, // since it breaks accessibility support in other browsers if (has('ff')) { bodyNode.tabIndex = -1; } this.headerScrollNode = domConstruct.create('div', { className: 'dgrid-header dgrid-header-scroll dgrid-scrollbar-width' + (addUiClasses ? ' ui-widget-header' : '') }, domNode); // Place footer node (initially hidden if showFooter is false). footerNode = this.footerNode = domConstruct.create('div', { className: 'dgrid-footer' + (this.showFooter ? '' : ' dgrid-footer-hidden') }, domNode); if (isRTL) { domNode.className += ' dgrid-rtl' + (has('dom-rtl-scrollbar-left') ? ' dgrid-rtl-swap' : ''); } listen(bodyNode, 'scroll', function (event) { if (self.showHeader) { // keep the header aligned with the body headerNode.scrollLeft = event.scrollLeft || bodyNode.scrollLeft; } // re-fire, since browsers are not consistent about propagation here event.stopPropagation(); listen.emit(domNode, 'scroll', {scrollTarget: bodyNode}); }); this.configStructure(); this.renderHeader(); this.contentNode = this.touchNode = domConstruct.create('div', { className: 'dgrid-content' + (addUiClasses ? ' ui-widget-content' : '') }, this.bodyNode); if (typeof this.resizeThrottleMethod === 'string' && miscUtil[this.resizeThrottleMethod]) { throttledResizeHandler = miscUtil[this.resizeThrottleMethod](winResizeHandler, this, this.resizeThrottleDelay); } else if (typeof this.resizeThrottleMethod === 'function') { throttledResizeHandler = this.resizeThrottleMethod(lang.hitch(this, winResizeHandler), this.resizeThrottleDelay); } else { console.warn('Invalid value specified for resizeThrottleMethod: ' + this.resizeThrottleMethod); throttledResizeHandler = miscUtil.throttleDelayed(winResizeHandler, this, this.resizeThrottleDelay); } // add window resize handler, with reference for later removal if needed this._resizeHandle = listen(window, 'resize', throttledResizeHandler); this._listeners.push(this._resizeHandle); }, postCreate: function () { }, startup: function () { // summary: // Called automatically after postCreate if the component is already // visible; otherwise, should be called manually once placed. if (this._started) { return; } this.inherited(arguments); this._started = true; this.resize(); // apply sort (and refresh) now that we're ready to render this.set('sort', this.sort); }, configStructure: function () { // does nothing in List, this is more of a hook for the Grid }, resize: function () { var bodyNode = this.bodyNode, headerNode = this.headerNode, footerNode = this.footerNode, headerHeight = headerNode.offsetHeight, footerHeight = this.showFooter ? footerNode.offsetHeight : 0; this.headerScrollNode.style.height = bodyNode.style.marginTop = headerHeight + 'px'; bodyNode.style.marginBottom = footerHeight + 'px'; if (!scrollbarWidth) { // Measure the browser's scrollbar width using a DIV we'll delete right away scrollbarWidth = has('dom-scrollbar-width'); scrollbarHeight = has('dom-scrollbar-height'); // Avoid issues with certain widgets inside in IE7, and // ColumnSet scroll issues with all supported IE versions if (has('ie')) { scrollbarWidth++; scrollbarHeight++; } // add rules that can be used where scrollbar width/height is needed miscUtil.addCssRule('.dgrid-scrollbar-width', 'width: ' + scrollbarWidth + 'px'); miscUtil.addCssRule('.dgrid-scrollbar-height', 'height: ' + scrollbarHeight + 'px'); if (scrollbarWidth !== 17) { // for modern browsers, we can perform a one-time operation which adds // a rule to account for scrollbar width in all grid headers. miscUtil.addCssRule('.dgrid-header-row', 'right: ' + scrollbarWidth + 'px'); // add another for RTL grids miscUtil.addCssRule('.dgrid-rtl-swap .dgrid-header-row', 'left: ' + scrollbarWidth + 'px'); } } }, addCssRule: function (selector, css) { // summary: // Version of util/misc.addCssRule which tracks added rules and removes // them when the List is destroyed. var rule = miscUtil.addCssRule(selector, css); if (this.cleanAddedRules) { // Although this isn't a listener, it shares the same remove contract this._listeners.push(rule); } return rule; }, on: function (eventType, listener) { // delegate events to the domNode var signal = listen(this.domNode, eventType, listener); if (!has('dom-addeventlistener')) { this._listeners.push(signal); } return signal; }, cleanup: function () { // summary: // Clears out all rows currently in the list. var i; for (i in this._rowIdToObject) { if (this._rowIdToObject[i] !== this.columns) { var rowElement = byId(i); if (rowElement) { this.removeRow(rowElement, true); } } } }, destroy: function () { // summary: // Destroys this grid // Remove any event listeners and other such removables if (this._listeners) { // Guard against accidental subsequent calls to destroy for (var i = this._listeners.length; i--;) { this._listeners[i].remove(); } this._listeners = null; } this._started = false; this.cleanup(); // destroy DOM domConstruct.destroy(this.domNode); }, refresh: function () { // summary: // refreshes the contents of the grid this.cleanup(); this._rowIdToObject = {}; this._autoRowId = 0; // make sure all the content has been removed so it can be recreated this.contentNode.innerHTML = ''; // Ensure scroll position always resets this.scrollTo({ x: 0, y: 0 }); }, highlightRow: function (rowElement, delay) { // summary: // Highlights a row. Used when updating rows due to store // notifications, but potentially also useful in other cases. // rowElement: Object // Row element (or object returned from the row method) to // highlight. // delay: Number // Number of milliseconds between adding and removing the // ui-state-highlight class. var classes = 'dgrid-highlight' + (this.addUiClasses ? ' ui-state-highlight' : ''); rowElement = rowElement.element || rowElement; domClass.add(rowElement, classes); setTimeout(function () { domClass.remove(rowElement, classes); }, delay || this.highlightDuration); }, adjustRowIndices: function (firstRow) { // this traverses through rows to maintain odd/even classes on the rows when indexes shift; var next = firstRow; var rowIndex = next.rowIndex; if (rowIndex > -1) { // make sure we have a real number in case this is called on a non-row do { // Skip non-numeric, non-rows if (next.rowIndex > -1) { if (this.maintainOddEven) { if (domClass.contains(next, 'dgrid-row')) { domClass.replace(next, (rowIndex % 2 === 1 ? oddClass : evenClass), (rowIndex % 2 === 0 ? oddClass : evenClass)); } } next.rowIndex = rowIndex++; } } while ((next = next.nextSibling) && next.rowIndex !== rowIndex); } }, renderArray: function (results, beforeNode, options) { // summary: // Renders an array of objects as rows, before the given node. options = options || {}; var self = this, start = options.start || 0, rowsFragment = document.createDocumentFragment(), rows = [], container, i = 0, len = results.length; if (!beforeNode) { this._lastCollection = results; } // Insert a row for each item into the document fragment while (i < len) { rows[i] = this.insertRow(results[i], rowsFragment, null, start++, options); i++; } // Insert the document fragment into the appropriate position container = beforeNode ? beforeNode.parentNode : self.contentNode; if (container && container.parentNode && (container !== self.contentNode || len)) { container.insertBefore(rowsFragment, beforeNode || null); if (len) { self.adjustRowIndices(rows[len - 1]); } } return rows; }, renderHeader: function () { // no-op in a plain list }, _autoRowId: 0, insertRow: function (object, parent, beforeNode, i, options) { // summary: // Creates a single row in the grid. // Include parentId within row identifier if one was specified in options. // (This is used by tree to allow the same object to appear under // multiple parents.) var id = this.id + '-row-' + ((this.collection && this.collection.getIdentity) ? this.collection.getIdentity(object) : this._autoRowId++), row = byId(id), previousRow = row && row.previousSibling; if (row) { // If it existed elsewhere in the DOM, we will remove it, so we can recreate it if (row === beforeNode) { beforeNode = (beforeNode.connected || beforeNode).nextSibling; } this.removeRow(row, false, options); } row = this.renderRow(object, options); row.className = (row.className || '') + ' dgrid-row ' + (i % 2 === 1 ? oddClass : evenClass) + (this.addUiClasses ? ' ui-state-default' : ''); // Get the row id for easy retrieval this._rowIdToObject[row.id = id] = object; parent.insertBefore(row, beforeNode || null); row.rowIndex = i; if (previousRow && previousRow.rowIndex !== (row.rowIndex - 1)) { // In this case, we are pulling the row from another location in the grid, // and we need to readjust the rowIndices from the point it was removed this.adjustRowIndices(previousRow); } return row; }, renderRow: function (value) { // summary: // Responsible for returning the DOM for a single row in the grid. // value: Mixed // Value to render // options: Object? // Optional object with additional options var div = document.createElement('div'); div.appendChild(document.createTextNode(value)); return div; }, removeRow: function (rowElement, preserveDom) { // summary: // Simply deletes the node in a plain List. // Column plugins may aspect this to implement their own cleanup routines. // rowElement: Object|DOMNode // Object or element representing the row to be removed. // preserveDom: Boolean? // If true, the row element will not be removed from the DOM; this can // be used by extensions/plugins in cases where the DOM will be // massively cleaned up at a later point in time. // options: Object? // May be specified with a `rows` property for the purpose of // cleaning up collection tracking (used by `_StoreMixin`). rowElement = rowElement.element || rowElement; delete this._rowIdToObject[rowElement.id]; if (!preserveDom) { domConstruct.destroy(rowElement); } }, row: function (target) { // summary: // Get the row object by id, object, node, or event var id; if (target instanceof this._Row) { return target; // No-op; already a row } if (target.target && target.target.nodeType) { // Event target = target.target; } if (target.nodeType) { // Row element, or child of a row element var object; do { var rowId = target.id; if ((object = this._rowIdToObject[rowId])) { return new this._Row(rowId.substring(this.id.length + 5), object, target); } target = target.parentNode; }while (target && target !== this.domNode); return; } if (typeof target === 'object') { // Assume target represents a collection item id = this.collection.getIdentity(target); } else { // Assume target is a row ID id = target; target = this._rowIdToObject[this.id + '-row-' + id]; } return new this._Row(id, target, byId(this.id + '-row-' + id)); }, cell: function (target) { // this doesn't do much in a plain list return { row: this.row(target) }; }, _move: function (item, steps, targetClass, visible) { var nextSibling, current, element; // Start at the element indicated by the provided row or cell object. element = current = item.element; steps = steps || 1; do { // Outer loop: move in the appropriate direction. if ((nextSibling = current[steps < 0 ? 'previousSibling' : 'nextSibling'])) { do { // Inner loop: advance, and dig into children if applicable. current = nextSibling; if (current && (current.className + ' ').indexOf(targetClass + ' ') > -1) { // Element with the appropriate class name; count step, stop digging. element = current; steps += steps < 0 ? 1 : -1; break; } // If the next sibling isn't a match, drill down to search, unless // visible is true and children are hidden. } while ((nextSibling = (!visible || !current.hidden) && current[steps < 0 ? 'lastChild' : 'firstChild'])); } else { current = current.parentNode; if (!current || current === this.bodyNode || current === this.headerNode) { // Break out if we step out of the navigation area entirely. break; } } }while (steps); // Return the final element we arrived at, which might still be the // starting element if we couldn't navigate further in that direction. return element; }, up: function (row, steps, visible) { // summary: // Returns the row that is the given number of steps (1 by default) // above the row represented by the given object. // row: // The row to navigate upward from. // steps: // Number of steps to navigate up from the given row; default is 1. // visible: // If true, rows that are currently hidden (i.e. children of // collapsed tree rows) will not be counted in the traversal. // returns: // A row object representing the appropriate row. If the top of the // list is reached before the given number of steps, the first row will // be returned. if (!row.element) { row = this.row(row); } return this.row(this._move(row, -(steps || 1), 'dgrid-row', visible)); }, down: function (row, steps, visible) { // summary: // Returns the row that is the given number of steps (1 by default) // below the row represented by the given object. // row: // The row to navigate downward from. // steps: // Number of steps to navigate down from the given row; default is 1. // visible: // If true, rows that are currently hidden (i.e. children of // collapsed tree rows) will not be counted in the traversal. // returns: // A row object representing the appropriate row. If the bottom of the // list is reached before the given number of steps, the last row will // be returned. if (!row.element) { row = this.row(row); } return this.row(this._move(row, steps || 1, 'dgrid-row', visible)); }, scrollTo: function (options) { if (typeof options.x !== 'undefined') { this.bodyNode.scrollLeft = options.x; } if (typeof options.y !== 'undefined') { this.bodyNode.scrollTop = options.y; } }, getScrollPosition: function () { return { x: this.bodyNode.scrollLeft, y: this.bodyNode.scrollTop }; }, get: function (/*String*/ name /*, ... */) { // summary: // Get a property on a List instance. // name: // The property to get. // returns: // The property value on this List instance. // description: // Get a named property on a List object. The property may // potentially be retrieved via a getter method in subclasses. In the base class // this just retrieves the object's property. var fn = '_get' + name.charAt(0).toUpperCase() + name.slice(1); if (typeof this[fn] === 'function') { return this[fn].apply(this, [].slice.call(arguments, 1)); } // Alert users that try to use Dijit-style getter/setters so they don’t get confused // if they try to use them and it does not work if (!has('dojo-built') && typeof this[fn + 'Attr'] === 'function') { console.warn('dgrid: Use ' + fn + ' instead of ' + fn + 'Attr for getting ' + name); } return this[name]; }, set: function (/*String*/ name, /*Object*/ value /*, ... */) { // summary: // Set a property on a List instance // name: // The property to set. // value: // The value to set in the property. // returns: // The function returns this List instance. // description: // Sets named properties on a List object. // A programmatic setter may be defined in subclasses. // // set() may also be called with a hash of name/value pairs, ex: // | myObj.set({ // | foo: "Howdy", // | bar: 3 // | }) // This is equivalent to calling set(foo, "Howdy") and set(bar, 3) if (typeof name === 'object') { for (var k in name) { this.set(k, name[k]); } } else { var fn = '_set' + name.charAt(0).toUpperCase() + name.slice(1); if (typeof this[fn] === 'function') { this[fn].apply(this, [].slice.call(arguments, 1)); } else { // Alert users that try to use Dijit-style getter/setters so they don’t get confused // if they try to use them and it does not work if (!has('dojo-built') && typeof this[fn + 'Attr'] === 'function') { console.warn('dgrid: Use ' + fn + ' instead of ' + fn + 'Attr for setting ' + name); } this[name] = value; } } return this; }, // Accept both class and className programmatically to set domNode class. _getClass: getClass, _setClass: setClass, _getClassName: getClass, _setClassName: setClass, _setSort: function (property, descending) { // summary: // Sort the content // property: String|Array // String specifying field to sort by, or actual array of objects // with property and descending properties // descending: boolean // In the case where property is a string, this argument // specifies whether to sort ascending (false) or descending (true) this.sort = typeof property !== 'string' ? property : [{property: property, descending: descending}]; this._applySort(); }, _applySort: function () { // summary: // Applies the current sort // description: // This is an extension point to allow specializations to apply the sort differently this.refresh(); if (this._lastCollection) { var sort = this.sort; if (sort && sort.length > 0) { var property = sort[0].property, descending = !!sort[0].descending; this._lastCollection.sort(function (a, b) { var aVal = a[property], bVal = b[property]; // fall back undefined values to "" for more consistent behavior if (aVal === undefined) { aVal = ''; } if (bVal === undefined) { bVal = ''; } return aVal === bVal ? 0 : (aVal > bVal !== descending ? 1 : -1); }); } this.renderArray(this._lastCollection); } }, _setShowHeader: function (show) { // this is in List rather than just in Grid, primarily for two reasons: // (1) just in case someone *does* want to show a header in a List // (2) helps address IE < 8 header display issue in List var headerNode = this.headerNode; this.showHeader = show; // add/remove class which has styles for "hiding" header domClass.toggle(headerNode, 'dgrid-header-hidden', !show); this.renderHeader(); this.resize(); // resize to account for (dis)appearance of header if (show) { // Update scroll position of header to make sure it's in sync. headerNode.scrollLeft = this.getScrollPosition().x; } }, _setShowFooter: function (show) { this.showFooter = show; // add/remove class which has styles for hiding footer domClass.toggle(this.footerNode, 'dgrid-footer-hidden', !show); this.resize(); // to account for (dis)appearance of footer } }); List.autoIdPrefix = 'dgrid_'; return List; }); corelib/dgrid/OnDemandGrid.js
New file @@ -0,0 +1,7 @@ define([ 'dojo/_base/declare', './Grid', './OnDemandList' ], function (declare, Grid, OnDemandList) { return declare([ Grid, OnDemandList ], {}); }); corelib/dgrid/OnDemandList.js
New file @@ -0,0 +1,913 @@ define([ './List', './_StoreMixin', 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/dom-construct', 'dojo/on', 'dojo/when', 'dojo/query', './util/misc' ], function (List, _StoreMixin, declare, lang, domConstruct, on, when, query, miscUtil) { var preloadId = 0; function nextPreloadId() { return preloadId++; } function isRowNode(node) { return node && (node.className.indexOf('dgrid-row') >= 0 || node.className.indexOf('dgrid-loading') >= 0); } function isPreloadNode(node) { return node && node.className.indexOf('dgrid-preload') >= 0; } return declare([List, _StoreMixin], { // summary: // Extends List to include virtual scrolling functionality, querying a // dojo/store instance for the appropriate range when the user scrolls. // minRowsPerPage: Integer // The minimum number of rows to request at one time. minRowsPerPage: 25, // maxRowsPerPage: Integer // The maximum number of rows to request at one time. maxRowsPerPage: 250, // maxEmptySpace: Integer // Defines the maximum size (in pixels) of unrendered space below the // currently-rendered rows. Setting this to less than Infinity can be useful if you // wish to limit the initial vertical scrolling of the grid so that the scrolling is // not excessively sensitive. With very large grids of data this may make scrolling // easier to use, albiet it can limit the ability to instantly scroll to the end. maxEmptySpace: Infinity, // bufferRows: Integer // The number of rows to keep ready on each side of the viewport area so that the user can // perform local scrolling without seeing the grid being built. Increasing this number can // improve perceived performance when the data is being retrieved over a slow network. bufferRows: 10, // farOffRemoval: Integer // Defines the minimum distance (in pixels) from the visible viewport area // rows must be in order to be removed. Setting to Infinity causes rows // to never be removed. farOffRemoval: 2000, // queryRowsOverlap: Integer // Indicates the number of rows to overlap queries. This helps keep // continuous data when underlying data changes (and thus pages don't // exactly align) queryRowsOverlap: 0, // pagingMethod: String // Method (from dgrid/util/misc) to use to either throttle or debounce // requests. Default is "debounce" which will cause the grid to wait until // the user pauses scrolling before firing any requests; can be set to // "throttleDelayed" instead to progressively request as the user scrolls, // which generally incurs more overhead but might appear more responsive. pagingMethod: 'debounce', // pagingDelay: Integer // Indicates the delay (in milliseconds) imposed upon pagingMethod, to wait // before paging in more data on scroll events. This can be increased to // reduce client-side overhead or the number of requests sent to a server. pagingDelay: miscUtil.defaultDelay, // keepScrollPosition: Boolean // When refreshing the list, controls whether the scroll position is // preserved, or reset to the top. This can also be overridden for // specific calls to refresh. keepScrollPosition: false, // rowHeight: Number // Average row height, computed in renderQuery during the rendering of // the first range of data. rowHeight: 0, // _deleteQueue: Array // List of DOM nodes queued for deletion. _deleteQueue: [], postCreate: function () { this.inherited(arguments); var self = this; // check visibility on scroll events on(this.bodyNode, 'scroll', miscUtil[this.pagingMethod](function (event) { self._processScroll(event); }, null, this.pagingDelay) ); }, renderQuery: function (query, options) { // summary: // Creates a preload node for rendering a query into, and executes the query // for the first page of data. Subsequent data will be downloaded as it comes // into view. // query: Function // Function to be called when requesting new data. // options: Object? // Optional object containing the following: // * container: Container to build preload nodes within; defaults to this.contentNode var self = this, container = (options && options.container) || this.contentNode, preload, topPreloadNode, preloadNode, queryLevel, preloadLevel = 0, start = (options && options.start) || 0; if ('level' in query) { preloadLevel = queryLevel = query.level; } preload = { query: query, count: 0, level: preloadLevel, top: false }; // Initial query; set up top and bottom preload nodes var topPreload = { node: domConstruct.create('div', { className: 'dgrid-preload', style: { height: '0' } }, container), count: 0, query: query, next: preload, level: preloadLevel, top: true }; topPreloadNode = topPreload.node; topPreloadNode.rowIndex = 0; preload.previous = topPreload; preloadNode = preload.node = domConstruct.create('div', { className: 'dgrid-preload', style: { height: '0' } }, container); // Add preload ids. topPreload.id = nextPreloadId(); topPreloadNode.setAttribute('data-preloadid', topPreload.id); preload.id = nextPreloadId(); preloadNode.setAttribute('data-preloadid', preload.id); // this preload node is used to represent the area of the grid that hasn't been // downloaded yet preloadNode.rowIndex = this.minRowsPerPage; self._insertPreload(topPreload); var loadingNode = domConstruct.create('div', { className: 'dgrid-loading' }, preloadNode, 'before'), innerNode = domConstruct.create('div', { className: 'dgrid-below' }, loadingNode); innerNode.innerHTML = this.loadingMessage; // Establish query options, mixing in our own options = lang.mixin({ start: 0, count: this.minRowsPerPage }, options); if (queryLevel != null) { options.queryLevel = queryLevel; } // Protect the query within a _trackError call, but return the resulting collection return this._trackError(function () { var results = query(options); // Render the result set return self.renderQueryResults(results, preloadNode, options).then(function (trs) { return results.totalLength.then(function (total) { var trCount = trs.length; var parentNode = preloadNode.parentNode; if (self._rows && !('queryLevel' in options)) { self._rows.min = 0; self._rows.max = trCount === total ? Infinity : trCount - 1; } domConstruct.destroy(loadingNode); if (!('queryLevel' in options)) { self._total = total; } // now we need to adjust the height and total count based on the first result set if (total === 0 && parentNode) { if (self.noDataNode) { domConstruct.destroy(self.noDataNode); } self._insertNoDataNode(parentNode); } topPreload.count = start; preload.count = total - trCount - start; preloadNode.rowIndex = start + trCount; if (total) { self._updatePreloadRowHeights(topPreload); } else { preloadNode.style.display = 'none'; topPreloadNode.style.display = 'none'; } if (self._previousScrollPosition && parentNode.offsetHeight) { // Restore position after a refresh operation w/ keepScrollPosition but only // if the rows have been inserted into the DOM. self.scrollTo(self._previousScrollPosition); delete self._previousScrollPosition; } // Redo scroll processing in case the query didn't fill the screen, // or in case scroll position was restored return when(self._processScroll()).then(function () { return trs; }); }); }).otherwise(function (err) { // remove the loadingNode and re-throw domConstruct.destroy(loadingNode); throw err; }); }); }, _insertPreload: function (newTopPreload) { var preload = this.preload; if (!preload) { // first one this.preload = newTopPreload; return; } while (preload.node.compareDocumentPosition(newTopPreload.node) & Node.DOCUMENT_POSITION_PRECEDING) { preload = preload.previous; if (preload == null) { return; } } while (preload.node.compareDocumentPosition(newTopPreload.node) & Node.DOCUMENT_POSITION_FOLLOWING) { if (!preload.next) { break; } preload = preload.next; } // insert, newPreload before preload preload.previous.next = newTopPreload; newTopPreload.previous = preload.previous; var newBottomPreload = newTopPreload.next; newBottomPreload.next = preload; preload.previous = newBottomPreload; }, refresh: function (options) { // summary: // Refreshes the contents of the grid. // options: Object? // Optional object, supporting the following parameters: // * keepScrollPosition: like the keepScrollPosition instance property; // specifying it in the options here will override the instance // property's value for this specific refresh call only. var self = this, keep = (options && options.keepScrollPosition); // Fall back to instance property if option is not defined if (typeof keep === 'undefined') { keep = this.keepScrollPosition; } // Store scroll position to be restored after new total is received if (keep) { this._previousScrollPosition = this.getScrollPosition(); } this.inherited(arguments); if (this._renderedCollection) { // render the query // renderQuery calls _trackError internally return this.renderQuery(function (queryOptions) { return self._renderedCollection.fetchRange({ start: queryOptions.start, end: queryOptions.start + queryOptions.count }); }).then(function () { self._emitRefreshComplete(); }); } }, resize: function () { this.inherited(arguments); this._processScroll(); }, cleanup: function () { this.inherited(arguments); this.preload = null; }, renderQueryResults: function (results) { var rows = this.inherited(arguments); var collection = this._getRenderedCollection(this.preload); if (collection && collection.releaseRange) { rows.then(function (resolvedRows) { if (resolvedRows[0] && !resolvedRows[0].parentNode.tagName) { // Release this range, since it was never actually rendered; // need to wait until totalLength promise resolves, since // Trackable only adds the range then to begin with results.totalLength.then(function () { collection.releaseRange(resolvedRows[0].rowIndex, resolvedRows[resolvedRows.length - 1].rowIndex + 1); }); } }); } return rows; }, _getFirstRowSibling: function (container) { // summary: // Returns the DOM node that a new row should be inserted before // when there are no other rows in the current result set. // In the case of OnDemandList, this will always be the last child // of the container (which will be a trailing preload node). return container.lastChild; }, _calcRowHeight: function (rowElement) { // summary: // Calculate the height of a row. This is a method so it can be overriden for // plugins that add connected elements to a row, like the tree var sibling = rowElement.nextSibling; // If a next row exists, compare the top of this row with the // next one (in case "rows" are actually rendering side-by-side). // If no next row exists, this is either the last or only row, // in which case we count its own height. if (sibling && !/\bdgrid-preload\b/.test(sibling.className)) { return sibling.offsetTop - rowElement.offsetTop; } return rowElement.offsetHeight; }, _calcAverageRowHeight: function (rowElements) { // summary: // Sets this.rowHeight based on the average from heights of the provided row elements. var count = rowElements.length; var height = 0; for (var i = 0; i < count; i++) { height += this._calcRowHeight(rowElements[i]); } // only update rowHeight if elements were passed and are in flow if (count && height) { return height / count; } else { return 0; } }, _updatePreloadRowHeights: function () { var preload = this.preload; if (!preload) { return; } while (preload.previous) { preload = preload.previous; } while (preload) { if (!preload.rowHeight) { preload.rowHeight = this.rowHeight || this._calcAverageRowHeight(preload.node.parentNode.querySelectorAll('.dgrid-row')); this._adjustPreloadHeight(preload); } preload = preload.next; } }, lastScrollTop: 0, _processScroll: function (evt) { // summary:x // Checks to make sure that everything in the viewable area has been // downloaded, and triggering a request for the necessary data when needed. var preload = this.preload, rowHeight; this._updatePreloadRowHeights(); rowHeight = preload && preload.rowHeight; if (!rowHeight) { return; } var grid = this, scrollNode = grid.bodyNode, // grab current visible top from event if provided, otherwise from node visibleTop = (evt && evt.scrollTop) || this.getScrollPosition().y, visibleBottom = scrollNode.offsetHeight + visibleTop, priorPreload, preloadNode, lastScrollTop = grid.lastScrollTop, requestBuffer = grid.bufferRows * rowHeight, searchBuffer = requestBuffer - rowHeight, // Avoid rounding causing multiple queries // References related to emitting dgrid-refresh-complete if applicable lastRows, preloadSearchNext = true; // XXX: I do not know why this happens. // munging the actual location of the viewport relative to the preload node by a few pixels in either // direction is necessary because at least WebKit on Windows seems to have an error that causes it to // not quite get the entire element being focused in the viewport during keyboard navigation, // which means it becomes impossible to load more data using keyboard navigation because there is // no more data to scroll to to trigger the fetch. // 1 is arbitrary and just gets it to work correctly with our current test cases; don’t wanna go // crazy and set it to a big number without understanding more about what is going on. // wondering if it has to do with border-box or something, but changing the border widths does not // seem to make it break more or less, so I do not know… var mungeAmount = 1; grid.lastScrollTop = visibleTop; function calculateDistanceOffset(preload, removeBelow) { if (removeBelow) { return preload.node.offsetTop - visibleBottom; } else { return visibleTop - (preload.node.offsetTop + preload.node.offsetHeight); } } function traverseToEndPreload(preload, removeBelow) { var direction = removeBelow ? 'next' : 'previous'; var nextPreload; while ((nextPreload = preload[direction])) { preload = nextPreload; } return preload; } function removeDistantNodes(preload, removeBelow) { // we check to see the the nodes are "far off" var startingPreload = preload; preload = traverseToEndPreload(preload, removeBelow); var distanceOff = calculateDistanceOffset(preload, removeBelow); var farOffRemoval = grid.farOffRemoval; var preloadNode = preload.node; var domTraversal = removeBelow ? 'previousSibling' : 'nextSibling'; var count = 0; var reclaimedHeight = 0; var firstRowIndex; var lastRowIndex; function findNextPreload() { var topPreloadWanted = !removeBelow; var newPreload = preload; while ((newPreload = newPreload[removeBelow ? 'previous' : 'next'])) { if (topPreloadWanted === newPreload.top) { return newPreload; } } } function isEmpty(aPreload) { return isPreloadNode(aPreload.top ? aPreload.node.nextSibling : aPreload.node.previousSibling); } function traversePreload() { var newPreload = findNextPreload(); var node; if (newPreload && startingPreload !== newPreload && !isEmpty(newPreload)) { adjustPreloadStats(); preload = newPreload; preloadNode = preload.node; distanceOff = calculateDistanceOffset(preload, removeBelow); node = traverseNode(preloadNode); resetRowIndexes(node); return node; } } function traverseNode(referenceNode) { // Preload node referenced was first moved to the appropriate end of the list and // now we are moving toward the viewable area. var refIsPreload = isPreloadNode(referenceNode); var node = referenceNode[domTraversal]; var childNode; if (node) { if (!isRowNode(node)) { if (refIsPreload && isPreloadNode(node)) { node = null; } else { childNode = traversePreload(); if (childNode) { node = childNode; } else { node = traverseNode(node); } } } } return node; } function adjustPreloadStats() { // adjust the preloadNode based on the reclaimed space preload.count += count; if (removeBelow) { preloadNode.rowIndex -= count; } grid._adjustPreloadHeight(preload); count = 0; grid._releaseRange(preload, removeBelow, firstRowIndex, lastRowIndex); } function resetRowIndexes(row) { firstRowIndex = row && row.rowIndex; lastRowIndex = undefined; } if (distanceOff > 2 * farOffRemoval) { // there is a preloadNode that is far off; // remove rows until we get to in the current viewport var row; var nextRow = traverseNode(preloadNode); resetRowIndexes(nextRow); while ((row = nextRow) && startingPreload !== preload) { var currentRowHeight = grid._calcRowHeight(row); if (reclaimedHeight + currentRowHeight + farOffRemoval > distanceOff || !isRowNode(row)) { // we have reclaimed enough rows or we have gone beyond grid rows nextRow = traversePreload(); continue; } reclaimedHeight += currentRowHeight; count += row.count || 1; grid._pruneRow(row, removeBelow); if ('rowIndex' in row) { lastRowIndex = row.rowIndex; } nextRow = traverseNode(row); } adjustPreloadStats(); grid._deleteNodeQueue(); } } function traversePreload(preload, moveNext) { // Skip past preloads that are not currently connected do { preload = moveNext ? preload.next : preload.previous; } while (preload && !preload.node.offsetWidth); return preload; } while (preload && !preload.node.offsetWidth) { // skip past preloads that are not currently connected preload = preload.previous; } // there can be multiple preloadNodes (if they split, or multiple queries are created), // so we can traverse them until we find whatever is in the current viewport, making // sure we don't backtrack while (preload && preload !== priorPreload) { priorPreload = grid.preload; grid.preload = preload; preloadNode = preload.node; var preloadTop = preloadNode.offsetTop; if (visibleBottom + mungeAmount + searchBuffer < preloadTop) { // the preload is below the line of sight preload = traversePreload(preload, (preloadSearchNext = false)); } else if (visibleTop - mungeAmount - searchBuffer > preloadTop + preloadNode.offsetHeight) { // the preload is above the line of sight preload = traversePreload(preload, (preloadSearchNext = true)); } else { // the preload node is visible, or close to visible, better show it var offset = ((preloadNode.top ? visibleTop - requestBuffer : visibleBottom) - preloadTop) / preload.rowHeight; var count = (visibleBottom - visibleTop + 2 * requestBuffer) / preload.rowHeight; // utilize momentum for predictions var momentum = Math.max( Math.min((visibleTop - lastScrollTop) * preload.rowHeight, grid.maxRowsPerPage / 2), grid.maxRowsPerPage / -2); count += Math.min(Math.abs(momentum), 10); if (preloadNode.top) { // at the top, adjust from bottom to top offset -= count; } offset = Math.max(offset, 0); if (offset < 10 && offset > 0 && count + offset < grid.maxRowsPerPage) { // connect to the top of the preloadNode if possible to avoid excessive adjustments count += Math.max(0, offset); offset = 0; } count = Math.min(Math.max(count, grid.minRowsPerPage), grid.maxRowsPerPage, preload.count); if (count === 0) { preload = traversePreload(preload, preloadSearchNext); continue; } count = Math.ceil(count); offset = Math.min(Math.floor(offset), preload.count - count); var options = {}; preload.count -= count; var beforeNode = preloadNode, keepScrollTo, queryRowsOverlap = grid.queryRowsOverlap, bottomPreload = !preload.top && preload; if (bottomPreload) { // add new rows below var previous = preload.previous; if (previous) { removeDistantNodes(preload); if (offset > 0 && isPreloadNode(preloadNode.previousSibling)) { // all of the nodes above were removed offset = Math.min(preload.count, offset); preload.previous.count += offset; grid._adjustPreloadHeight(preload.previous, true); preloadNode.rowIndex += offset; queryRowsOverlap = 0; } else { count += offset; } preload.count -= offset; } options.start = preloadNode.rowIndex - queryRowsOverlap; options.count = Math.min(count + queryRowsOverlap, grid.maxRowsPerPage); preloadNode.rowIndex = options.start + options.count; } else { // add new rows above if (preload.next) { // remove out of sight nodes first beforeNode = preloadNode.nextSibling; removeDistantNodes(preload, true); if (isPreloadNode(preloadNode.nextSibling)) { // all of the nodes were removed, can position wherever we want preload.next.count += preload.count - offset; preload.next.node.rowIndex = offset + count; grid._adjustPreloadHeight(preload.next); preload.count = offset; queryRowsOverlap = 0; beforeNode = preload.next.node; } else { keepScrollTo = true; } } options.start = preload.count; options.count = Math.min(count + queryRowsOverlap, grid.maxRowsPerPage); options.scrollingUp = true; } if (keepScrollTo && beforeNode && beforeNode.offsetWidth) { // Before adjusting the size of the preload node for the new rows yet to be loaded, remember // the current position of beforeNode so the scroll position can be adjusted after // the new rows are added. keepScrollTo = beforeNode.offsetTop; } grid._adjustPreloadHeight(preload); // use the query associated with the preload node to get the next "page" if ('level' in preload.query) { options.queryLevel = preload.query.level; } // Avoid spurious queries (ideally this should be unnecessary...) if (!('queryLevel' in options) && (options.start > grid._total || options.count < 0)) { continue; } // create a loading node as a placeholder while the data is loaded var loadingNode = domConstruct.create('div', { className: 'dgrid-loading', style: { height: count * preload.rowHeight + 'px' } }, beforeNode, 'before'); domConstruct.create('div', { className: 'dgrid-' + (bottomPreload ? 'below' : 'above'), innerHTML: grid.loadingMessage }, loadingNode); loadingNode.count = count; // Query now to fill in these rows. grid._trackError(function () { // Use function to isolate the variables in case we make multiple requests // (which can happen if we need to render on both sides of an island of already-rendered rows) (function (loadingNode, below, keepScrollTo) { /* jshint maxlen: 122 */ var rangeResults = preload.query(options); lastRows = grid.renderQueryResults(rangeResults, loadingNode, options).then(function (rows) { var gridRows = grid._rows; if (gridRows && !('queryLevel' in options) && rows.length) { // Update relevant observed range for top-level items if (below) { if (gridRows.max <= gridRows.min) { // All rows were removed; update start of rendered range as well gridRows.min = rows[0].rowIndex; } gridRows.max = rows[rows.length - 1].rowIndex; } else { if (gridRows.max <= gridRows.min) { // All rows were removed; update end of rendered range as well gridRows.max = rows[rows.length - 1].rowIndex; } gridRows.min = rows[0].rowIndex; } } // can remove the loading node now beforeNode = loadingNode.nextSibling; domConstruct.destroy(loadingNode); // beforeNode may have been removed if the query results loading node was removed // as a distant node before rendering if (keepScrollTo && beforeNode && beforeNode.offsetWidth) { // if the preload area above the nodes is approximated based on average // row height, we may need to adjust the scroll once they are filled in // so we don't "jump" in the scrolling position grid.scrollTo({ y: grid.bodyNode.scrollTop + beforeNode.offsetTop - keepScrollTo }); } rangeResults.totalLength.then(function (total) { if (!('queryLevel' in options)) { grid._total = total; if (grid._rows && grid._rows.max >= grid._total - 1) { grid._rows.max = Infinity; } } if (below) { // if it is below, we will use the total from the collection to update // the count of the last preload in case the total changes as // later pages are retrieved // recalculate the count below.count = total - below.node.rowIndex; // readjust the height grid._adjustPreloadHeight(below); } }); // make sure we have covered the visible area grid._processScroll(); return rows; }, function (e) { domConstruct.destroy(loadingNode); throw e; }); })(loadingNode, bottomPreload, keepScrollTo); }); preload = preload.previous; } } // return the promise from the last render return lastRows; }, _adjustPreloadHeight: function (preload, noMax) { preload.node.style.height = this._calculatePreloadHeight(preload, noMax) + 'px'; }, _calculatePreloadHeight: function (preload, noMax) { return Math.min(preload.count * preload.rowHeight, noMax ? Infinity : this.maxEmptySpace); }, _pruneRow: function (rowElement, removeBelow, options) { // Calling _pruneRow indicates the row is not being deleted permanantly but could be restored // as the grid scrolls. // Just do cleanup here, as we will do a more efficient node destruction will be done later. this.removeRow(rowElement, true, options); this._queueNodeForDeletion(rowElement); }, _queueNodeForDeletion: function (node) { this._deleteQueue.push(node); }, _deleteNodeQueue: function () { var trashBin = document.createElement('div'); var toDelete = this._deleteQueue; for (var i = toDelete.length; i--;) { trashBin.appendChild(toDelete[i]); } this._deleteQueue = []; setTimeout(function () { // we can defer the destruction until later domConstruct.destroy(trashBin); }, 1); }, _removePreloads: function (preloadNodes) { // summary: // Remove the preload objects from the linked list that correspond to the // supplied DOM nodes. if (!preloadNodes || !preloadNodes.length) { return; } var grid = this; var headPreload = this._getHeadPreload(); preloadNodes.forEach(function (preloadNode) { var preload = grid._findPreload(preloadNode, headPreload); if (preload) { // Remove the found preload object from the linked list. if (preload.previous) { preload.previous.next = preload.next; } if (preload.next) { preload.next.previous = preload.previous; } } }); }, _getHeadPreload: function () { var headPreload = this.preload; if (headPreload) { while (headPreload.previous) { headPreload = headPreload.previous; } } return headPreload; }, _findPreload: function (preloadNode, startingPreload) { if (!startingPreload) { startingPreload = this._getHeadPreload(); } var preload = startingPreload; while (preload) { if (preload.node === preloadNode) { return preload; } preload = preload.next; } }, _getRenderedCollection: function (/* preload */) { // This allows extensions to overload the collection retrieval mechanism. return this._renderedCollection; }, _releaseRange: function (preload, removeBelow, firstRowIndex, lastRowIndex) { if (!preload) { return; } var level = preload.level; var renderedCollection = this._getRenderedCollection(preload); if (lastRowIndex != null) { if (renderedCollection.releaseRange && typeof firstRowIndex === 'number' && typeof lastRowIndex === 'number') { // Note that currently child rows in Tree structures are never unrendered; // this logic will need to be revisited when that is addressed. // releaseRange is end-exclusive, and won't remove anything if start >= end. if (removeBelow) { renderedCollection.releaseRange(lastRowIndex, firstRowIndex + 1); } else { renderedCollection.releaseRange(firstRowIndex, lastRowIndex + 1); } if (this._rows && !level) { this._rows[removeBelow ? 'max' : 'min'] = lastRowIndex; if (this._rows.max >= this._total - 1) { this._rows.max = Infinity; } } } } } }); }); corelib/dgrid/README.md
New file @@ -0,0 +1,238 @@ The dgrid project provides widgets for lists of data, including simple sets of scrolling rows, grids of data, on-demand lazy-loaded data, and various mixins for additional functionality. dgrid is available under the ["New" BSD License](LICENSE). # Installation ## Bower dgrid and its dependencies can be installed via [Bower](http://bower.io/) using the following command: ``` bower install dgrid ``` Note that by default, Bower installs to a `bower_components` subdirectory. If you'd like to install to the current directory instead (which tends to be more appropriate for AMD projects), add a `.bowerrc` with the following: ```json { "directory": "." } ``` By default, Bower will automatically find the highest tagged version of dgrid and install it along with its dependencies. Alternatively, the latest development version of dgrid can be installed by instructing Bower to install from the master branch: ``` bower install dgrid#master ``` Note that while dgrid lists the `dojo` package as a dependency, it will not automatically install `dijit`, as it is not a hard requirement. Dijit can be additionally installed by running: ``` bower install dijit#<target> ``` ...where `<target>` corresponds to the version of Dojo you have installed. ## Manual Download Alternatively, dgrid and its dependencies can be downloaded individually: * [dstore](https://github.com/SitePen/dstore) >= 1.0.3 or 1.1.1, for store-backed grids * [The Dojo Toolkit](http://dojotoolkit.org) SDK >= 1.8.2 * Out of the DTK components, Dojo core is the only hard dependency for dgrid; however, some of the test pages also use components from Dijit, and Dojox (namely grid for a comparison test, and mobile for a mobile page). It is recommended to arrange all dependencies as siblings, resulting in a directory structure like the following: * `dgrid` * `dijit` (optional, dependency of some dgrid tests/components) * `dojo` * `dojox` (optional, dependency of some dgrid tests) * `dstore` * `util` (optional, e.g. if pursuing a custom build) ## npm As of version 1.1.0, dgrid can also be [retrieved via npm](doc/usage/npm.md), but using Bower is recommended as it is more straightforward. ## CDN [RawGit](http://rawgit.com/) now offers CDN hosting of raw tagged git URLs. It can serve any version of dgrid and dstore via MaxCDN. For example, here's a `packages` configuration for dgrid 1.1.0 and dstore 1.1.1: ```js packages: [ { name: 'dgrid', location: '//cdn.rawgit.com/SitePen/dgrid/v1.1.0' }, { name: 'dstore', location: '//cdn.rawgit.com/SitePen/dstore/v1.1.1' } ] ``` # Browser and Dojo Version Support dgrid works with Dojo 1.8.2 or higher, and supports the following browsers: * IE 9+ (IE8 still unofficially supported, but no longer tested) * Edge latest * Firefox latest + ESR * Chrome latest (desktop and mobile) * Safari latest (desktop and mobile) * Opera latest dgrid *does not* support quirks mode. You are *heavily* encouraged to include the HTML5 DOCTYPE (`<!DOCTYPE html>`) at the beginning of your pages. # Documentation Documentation for dgrid components is available in the [doc folder](doc). In addition, the website hosts a number of [tutorials](http://dgrid.io/#tutorials). If upgrading from a previous dgrid release, please be sure to read the [release notes on GitHub](https://github.com/SitePen/dgrid/releases). # Community ## Reporting Issues Bugs or enhancements can be filed by opening an issue in the [issue tracker on GitHub](https://github.com/SitePen/dgrid/issues?state=open). When reporting a bug, please provide the following information: * Affected browsers and Dojo versions * A clear list of steps to reproduce the problem * If the problem cannot be easily reproduced in an existing dgrid test page, include a [Gist](https://gist.github.com/) with code for a page containing a reduced test case If you would like to suggest a fix for a particular issue, you are welcome to fork dgrid, create a branch, and submit a pull request. Please note that a [Dojo CLA](http://www.dojofoundation.org/about/cla) is required for any non-trivial modifications. ## Getting Support Questions about dgrid usage can be asked in the following places: * [Stack Overflow](http://stackoverflow.com/questions/tagged/dgrid) * The #dojo IRC channel on irc.freenode.net * The [dojo-interest mailing list](http://mail.dojotoolkit.org/mailman/listinfo/dojo-interest) Web interfaces for IRC and the mailing list are available from the [Dojo Toolkit Community page](https://dojotoolkit.org/community/). SitePen also offers [commercial support](https://www.sitepen.com/support/) for dgrid, as well as Dojo and a number of other JavaScript libraries. # Testing dgrid uses [Intern](http://theintern.io/) as its test runner. Tests can either be run using the browser, or using a cloud provider such as [BrowserStack](https://www.browserstack.com/) or [Sauce Labs](https://saucelabs.com/). More information on writing your own tests with Intern can be found in the [Intern user guide](https://theintern.github.io/intern/). *Note that installing dgrid via Bower will not include the test folder; if you wish to run dgrid's unit tests, download the package directly.* ## Setting up **Note:** Commands listed in this section are all written assuming they are run inside the `dgrid` directory. Run `npm install` to install Intern: ``` npm install ``` ## Running via the browser 1. Open a browser to http://hostname/path_to_dgrid/test/intern/runTests.html 2. View the console ## Running via BrowserStack or Sauce Labs Make sure the proper credentials are set in the environment: ``` # for BrowserStack: export BROWSERSTACK_USERNAME=<your_browserstack_username> export BROWSERSTACK_ACCESS_KEY=<your_browserstack_access_key> # for Sauce Labs: export SAUCE_USERNAME=<your_sauce_username> export SAUCE_ACCESS_KEY=<your_sauce_access_key> ``` Then kick off the runner with the following command: ``` # for BrowserStack: grunt intern:browserstack # for Sauce Labs: grunt intern:saucelabs ``` ## Running via local Selenium server ### Windows Obtain the latest version of the Selenium server and the IE driver server from [Selenium's Download page](http://docs.seleniumhq.org/download/). (The IE driver server needs to be placed in a folder on your PATH.) The Selenium server can be started by executing: ``` java -jar path\to\selenium-server-standalone-<version>.jar ``` ### Mac OS X The easiest way to obtain the Selenium standalone server for Mac OS X is by using [Homebrew](http://brew.sh/). Once Homebrew is installed, run the following commands: ```sh brew update # ensure you have the latest formulae brew install selenium-server-standalone brew install chromedriver # for automating tests in Chrome ``` `selenium-server-standalone` installs a `selenium-server` script which can be used to start up the server. For additional information (e.g. how to start the server at login), see the output of `brew info selenium-server-standalone`. ### Running the tests Once the Selenium server is running, kick off the Intern test runner with the following command: ``` grunt test ``` This runs the `intern:local` Grunt task, which uses the configuration in `intern-local.js`. This configuration overrides `intern.js` to use `NullTunnel`, and to test in Chrome by default (this can be customized as desired according to the browsers you have installed). corelib/dgrid/Selection.js
New file @@ -0,0 +1,688 @@ define([ 'dojo/_base/declare', 'dojo/dom-class', 'dojo/on', 'dojo/has', 'dojo/aspect', './List', 'dojo/has!touch?./util/touch', 'dojo/query', 'dojo/_base/sniff', 'dojo/dom' // for has('css-user-select') in 1.8.2+ ], function (declare, domClass, on, has, aspect, List, touchUtil) { has.add('dom-comparedocumentposition', function (global, doc, element) { return !!element.compareDocumentPosition; }); // Add a feature test for the onselectstart event, which offers a more // graceful fallback solution than node.unselectable. has.add('dom-selectstart', typeof document.onselectstart !== 'undefined'); var ctrlEquiv = has('mac') ? 'metaKey' : 'ctrlKey', hasUserSelect = has('css-user-select'), hasPointer = has('pointer'), hasMSPointer = hasPointer && hasPointer.slice(0, 2) === 'MS', downType = hasPointer ? hasPointer + (hasMSPointer ? 'Down' : 'down') : 'mousedown', upType = hasPointer ? hasPointer + (hasMSPointer ? 'Up' : 'up') : 'mouseup'; if (hasUserSelect === 'WebkitUserSelect' && typeof document.documentElement.style.msUserSelect !== 'undefined') { // Edge defines both webkit and ms prefixes, rendering feature detects as brittle as UA sniffs... hasUserSelect = false; } function makeUnselectable(node, unselectable) { // Utility function used in fallback path for recursively setting unselectable var value = node.unselectable = unselectable ? 'on' : '', elements = node.getElementsByTagName('*'), i = elements.length; while (--i) { if (elements[i].tagName === 'INPUT' || elements[i].tagName === 'TEXTAREA') { continue; // Don't prevent text selection in text input fields. } elements[i].unselectable = value; } } function setSelectable(grid, selectable) { // Alternative version of dojo/dom.setSelectable based on feature detection. // For FF < 21, use -moz-none, which will respect -moz-user-select: text on // child elements (e.g. form inputs). In FF 21, none behaves the same. // See https://developer.mozilla.org/en-US/docs/CSS/user-select var node = grid.bodyNode, value = selectable ? 'text' : has('ff') < 21 ? '-moz-none' : 'none'; // In IE10+, -ms-user-select: none will block selection from starting within the // element, but will not block an existing selection from entering the element. // When using a modifier key, IE will select text inside of the element as well // as outside of the element, because it thinks the selection started outside. // Therefore, fall back to other means of blocking selection for IE10+. // Newer versions of Dojo do not even report msUserSelect (see https://github.com/dojo/dojo/commit/7ae2a43). if (hasUserSelect && hasUserSelect !== 'msUserSelect') { node.style[hasUserSelect] = value; } else if (has('dom-selectstart')) { // For browsers that don't support user-select but support selectstart (IE<10), // we can hook up an event handler as necessary. Since selectstart bubbles, // it will handle any child elements as well. // Note, however, that both this and the unselectable fallback below are // incapable of preventing text selection from outside the targeted node. if (!selectable && !grid._selectstartHandle) { grid._selectstartHandle = on(node, 'selectstart', function (evt) { var tag = evt.target && evt.target.tagName; // Prevent selection except where a text input field is involved. if (tag !== 'INPUT' && tag !== 'TEXTAREA') { evt.preventDefault(); } }); } else if (selectable && grid._selectstartHandle) { grid._selectstartHandle.remove(); delete grid._selectstartHandle; } } else { // For browsers that don't support either user-select or selectstart (Opera), // we need to resort to setting the unselectable attribute on all nodes // involved. Since this doesn't automatically apply to child nodes, we also // need to re-apply it whenever rows are rendered. makeUnselectable(node, !selectable); if (!selectable && !grid._unselectableHandle) { grid._unselectableHandle = aspect.after(grid, 'renderRow', function (row) { makeUnselectable(row, true); return row; }); } else if (selectable && grid._unselectableHandle) { grid._unselectableHandle.remove(); delete grid._unselectableHandle; } } } return declare(null, { // summary: // Add selection capabilities to a grid. The grid will have a selection property and // fire "dgrid-select" and "dgrid-deselect" events. // selectionDelegate: String // Selector to delegate to as target of selection events. selectionDelegate: '.dgrid-row', // selectionEvents: String|Function // Event (or comma-delimited events, or extension event) to listen on // to trigger select logic. selectionEvents: downType + ',' + upType + ',dgrid-cellfocusin', // selectionTouchEvents: String|Function // Event (or comma-delimited events, or extension event) to listen on // in addition to selectionEvents for touch devices. selectionTouchEvents: has('touch') ? touchUtil.tap : null, // deselectOnRefresh: Boolean // If true, the selection object will be cleared when refresh is called. deselectOnRefresh: true, // allowSelectAll: Boolean // If true, allow ctrl/cmd+A to select all rows. // Also consulted by the selector plugin for showing select-all checkbox. allowSelectAll: false, // selection: // An object where the property names correspond to // object ids and values are true or false depending on whether an item is selected selection: {}, // selectionMode: String // The selection mode to use, can be "none", "multiple", "single", or "extended". selectionMode: 'extended', // allowTextSelection: Boolean // Whether to still allow text within cells to be selected. The default // behavior is to allow text selection only when selectionMode is none; // setting this property to either true or false will explicitly set the // behavior regardless of selectionMode. allowTextSelection: undefined, // _selectionTargetType: String // Indicates the property added to emitted events for selected targets; // overridden in CellSelection _selectionTargetType: 'rows', create: function () { this.selection = {}; return this.inherited(arguments); }, postCreate: function () { this.inherited(arguments); this._initSelectionEvents(); // Force selectionMode setter to run var selectionMode = this.selectionMode; this.selectionMode = ''; this._setSelectionMode(selectionMode); }, destroy: function () { this.inherited(arguments); // Remove any extra handles added by Selection. if (this._selectstartHandle) { this._selectstartHandle.remove(); } if (this._unselectableHandle) { this._unselectableHandle.remove(); } if (this._removeDeselectSignals) { this._removeDeselectSignals(); } }, _setSelectionMode: function (mode) { // summary: // Updates selectionMode, resetting necessary variables. if (mode === this.selectionMode) { return; } // Start selection fresh when switching mode. this.clearSelection(); this.selectionMode = mode; // Compute name of selection handler for this mode once // (in the form of _fooSelectionHandler) this._selectionHandlerName = '_' + mode + 'SelectionHandler'; // Also re-run allowTextSelection setter in case it is in automatic mode. this._setAllowTextSelection(this.allowTextSelection); }, _setAllowTextSelection: function (allow) { if (typeof allow !== 'undefined') { setSelectable(this, allow); } else { setSelectable(this, this.selectionMode === 'none'); } this.allowTextSelection = allow; }, _handleSelect: function (event, target) { // Don't run if selection mode doesn't have a handler (incl. "none"), target can't be selected, // or if coming from a dgrid-cellfocusin from a mousedown if (!this[this._selectionHandlerName] || !this.allowSelect(this.row(target)) || (event.type === 'dgrid-cellfocusin' && event.parentType === 'mousedown') || (event.type === upType && target !== this._waitForMouseUp)) { return; } this._waitForMouseUp = null; this._selectionTriggerEvent = event; // Don't call select handler for ctrl+navigation if (!event.keyCode || !event.ctrlKey || event.keyCode === 32) { // If clicking a selected item, wait for mouseup so that drag n' drop // is possible without losing our selection if (!event.shiftKey && event.type === downType && this.isSelected(target)) { this._waitForMouseUp = target; } else { this[this._selectionHandlerName](event, target); } } this._selectionTriggerEvent = null; }, _singleSelectionHandler: function (event, target) { // summary: // Selection handler for "single" mode, where only one target may be // selected at a time. var ctrlKey = event.keyCode ? event.ctrlKey : event[ctrlEquiv]; if (this._lastSelected === target) { // Allow ctrl to toggle selection, even within single select mode. this.select(target, null, !ctrlKey || !this.isSelected(target)); } else { this.clearSelection(); this.select(target); this._lastSelected = target; } }, _multipleSelectionHandler: function (event, target) { // summary: // Selection handler for "multiple" mode, where shift can be held to // select ranges, ctrl/cmd can be held to toggle, and clicks/keystrokes // without modifier keys will add to the current selection. var lastRow = this._lastSelected, ctrlKey = event.keyCode ? event.ctrlKey : event[ctrlEquiv], value; if (!event.shiftKey) { // Toggle if ctrl is held; otherwise select value = ctrlKey ? null : true; lastRow = null; } this.select(target, lastRow, value); if (!lastRow) { // Update reference for potential subsequent shift+select // (current row was already selected above) this._lastSelected = target; } }, _extendedSelectionHandler: function (event, target) { // summary: // Selection handler for "extended" mode, which is like multiple mode // except that clicks/keystrokes without modifier keys will clear // the previous selection. // Clear selection first for right-clicks outside selection and non-ctrl-clicks; // otherwise, extended mode logic is identical to multiple mode if (event.button === 2 ? !this.isSelected(target) : !(event.keyCode ? event.ctrlKey : event[ctrlEquiv])) { this.clearSelection(null, true); } this._multipleSelectionHandler(event, target); }, _toggleSelectionHandler: function (event, target) { // summary: // Selection handler for "toggle" mode which simply toggles the selection // of the given target. Primarily useful for touch input. this.select(target, null, null); }, _initSelectionEvents: function () { // summary: // Performs first-time hookup of event handlers containing logic // required for selection to operate. var grid = this, contentNode = this.contentNode, selector = this.selectionDelegate; this._selectionEventQueues = { deselect: [], select: [] }; if (has('touch') && !has('pointer') && this.selectionTouchEvents) { // Listen for taps, and also for mouse/keyboard, making sure not // to trigger both for the same interaction on(contentNode, touchUtil.selector(selector, this.selectionTouchEvents), function (evt) { grid._handleSelect(evt, this); grid._ignoreMouseSelect = this; }); on(contentNode, on.selector(selector, this.selectionEvents), function (event) { if (grid._ignoreMouseSelect !== this) { grid._handleSelect(event, this); } else if (event.type === upType) { grid._ignoreMouseSelect = null; } }); } else { // Listen for mouse/keyboard actions that should cause selections on(contentNode, on.selector(selector, this.selectionEvents), function (event) { grid._handleSelect(event, this); }); } // Also hook up spacebar (for ctrl+space) if (this.addKeyHandler) { this.addKeyHandler(32, function (event) { grid._handleSelect(event, event.target); }); } // If allowSelectAll is true, bind ctrl/cmd+A to (de)select all rows, // unless the event was received from an editor component. // (Handler further checks against _allowSelectAll, which may be updated // if selectionMode is changed post-init.) if (this.allowSelectAll) { this.on('keydown', function (event) { if (event[ctrlEquiv] && event.keyCode === 65 && !/\bdgrid-input\b/.test(event.target.className)) { event.preventDefault(); grid[grid.allSelected ? 'clearSelection' : 'selectAll'](); } }); } // Update aspects if there is a collection change if (this._setCollection) { aspect.before(this, '_setCollection', function (collection) { grid._updateDeselectionAspect(collection); }); } this._updateDeselectionAspect(); }, _updateDeselectionAspect: function (collection) { // summary: // Hooks up logic to handle deselection of removed items. // Aspects to a trackable collection's notify method if applicable, // or to the list/grid's removeRow method otherwise. var self = this, signals; function ifSelected(rowArg, methodName) { // Calls a method if the row corresponding to the object is selected. var row = self.row(rowArg), selection = row && self.selection[row.id]; // Is the row currently in the selection list. if (selection) { self[methodName](row); } } // Remove anything previously configured if (this._removeDeselectSignals) { this._removeDeselectSignals(); } if (collection && collection.track && this._observeCollection) { signals = [ aspect.before(this, '_observeCollection', function (collection) { signals.push( collection.on('delete', function (event) { if (typeof event.index === 'undefined') { // Call deselect on the row if the object is being removed. This allows the // deselect event to reference the row element while it still exists in the DOM. ifSelected(event.id, 'deselect'); } }) ); }), aspect.after(this, '_observeCollection', function (collection) { signals.push( collection.on('update', function (event) { if (typeof event.index !== 'undefined') { // When List updates an item, the row element is removed and a new one inserted. // If at this point the object is still in grid.selection, // then call select on the row so the element's CSS is updated. ifSelected(collection.getIdentity(event.target), 'select'); } }) ); }, true) ]; } else { signals = [ aspect.before(this, 'removeRow', function (rowElement, preserveDom) { var row; if (!preserveDom) { row = this.row(rowElement); // if it is a real row removal for a selected item, deselect it if (row && (row.id in this.selection)) { this.deselect(row); } } }) ]; } this._removeDeselectSignals = function () { for (var i = signals.length; i--;) { signals[i].remove(); } signals = []; }; }, allowSelect: function () { // summary: // A method that can be overriden to determine whether or not a row (or // cell) can be selected. By default, all rows (or cells) are selectable. // target: Object // Row object (for Selection) or Cell object (for CellSelection) for the // row/cell in question return true; }, _fireSelectionEvent: function (type) { // summary: // Fires an event for the accumulated rows once a selection // operation is finished (whether singular or for a range) var queue = this._selectionEventQueues[type], triggerEvent = this._selectionTriggerEvent, eventObject; eventObject = { bubbles: true, grid: this }; if (triggerEvent) { eventObject.parentType = triggerEvent.type; } eventObject[this._selectionTargetType] = queue; // Clear the queue so that the next round of (de)selections starts anew this._selectionEventQueues[type] = []; on.emit(this.contentNode, 'dgrid-' + type, eventObject); }, _fireSelectionEvents: function () { var queues = this._selectionEventQueues, type; for (type in queues) { if (queues[type].length) { this._fireSelectionEvent(type); } } }, _select: function (row, toRow, value) { // summary: // Contains logic for determining whether to select targets, but // does not emit events. Called from select, deselect, selectAll, // and clearSelection. var selection, previousValue, element, toElement, direction; if (typeof value === 'undefined') { // default to true value = true; } if (!row.element) { row = this.row(row); } // Check whether we're allowed to select the given row before proceeding. // If a deselect operation is being performed, this check is skipped, // to avoid errors when changing column definitions, and since disabled // rows shouldn't ever be selected anyway. if (value === false || this.allowSelect(row)) { selection = this.selection; previousValue = !!selection[row.id]; if (value === null) { // indicates a toggle value = !previousValue; } element = row.element; if (!value && !this.allSelected) { delete this.selection[row.id]; } else { selection[row.id] = value; } if (element) { // add or remove classes as appropriate if (value) { domClass.add(element, 'dgrid-selected' + (this.addUiClasses ? ' ui-state-active' : '')); } else { domClass.remove(element, 'dgrid-selected ui-state-active'); } } if (value !== previousValue && element) { // add to the queue of row events this._selectionEventQueues[(value ? '' : 'de') + 'select'].push(row); } if (toRow) { if (!toRow.element) { toRow = this.row(toRow); } if (!toRow) { this._lastSelected = element; console.warn('The selection range has been reset because the ' + 'beginning of the selection is no longer in the DOM. ' + 'If you are using OnDemandList, you may wish to increase ' + 'farOffRemoval to avoid this, but note that keeping more nodes ' + 'in the DOM may impact performance.'); return; } toElement = toRow.element; if (toElement) { direction = this._determineSelectionDirection(element, toElement); if (!direction) { // The original element was actually replaced toElement = document.getElementById(toElement.id); direction = this._determineSelectionDirection(element, toElement); } while (row.element !== toElement && (row = this[direction](row))) { this._select(row, null, value); } } } } }, // Implement _determineSelectionDirection differently based on whether the // browser supports element.compareDocumentPosition; use sourceIndex for IE<9 _determineSelectionDirection: has('dom-comparedocumentposition') ? function (from, to) { var result = to.compareDocumentPosition(from); if (result & 1) { return false; // Out of document } return result === 2 ? 'down' : 'up'; } : function (from, to) { if (to.sourceIndex < 1) { return false; // Out of document } return to.sourceIndex > from.sourceIndex ? 'down' : 'up'; }, select: function (row, toRow, value) { // summary: // Selects or deselects the given row or range of rows. // row: Mixed // Row object (or something that can resolve to one) to (de)select // toRow: Mixed // If specified, the inclusive range between row and toRow will // be (de)selected // value: Boolean|Null // Whether to select (true/default), deselect (false), or toggle // (null) the row this._select(row, toRow, value); this._fireSelectionEvents(); }, deselect: function (row, toRow) { // summary: // Deselects the given row or range of rows. // row: Mixed // Row object (or something that can resolve to one) to deselect // toRow: Mixed // If specified, the inclusive range between row and toRow will // be deselected this.select(row, toRow, false); }, clearSelection: function (exceptId, dontResetLastSelected) { // summary: // Deselects any currently-selected items. // exceptId: Mixed? // If specified, the given id will not be deselected. this.allSelected = false; for (var id in this.selection) { if (exceptId !== id) { this._select(id, null, false); } } if (!dontResetLastSelected) { this._lastSelected = null; } this._fireSelectionEvents(); }, selectAll: function () { this.allSelected = true; this.selection = {}; // we do this to clear out pages from previous sorts for (var i in this._rowIdToObject) { var row = this.row(this._rowIdToObject[i]); this._select(row.id, null, true); } this._fireSelectionEvents(); }, isSelected: function (object) { // summary: // Returns true if the indicated row is selected. if (typeof object === 'undefined' || object === null) { return false; } if (!object.element) { object = this.row(object); } // First check whether the given row is indicated in the selection hash; // failing that, check if allSelected is true (testing against the // allowSelect method if possible) return (object.id in this.selection) ? !!this.selection[object.id] : this.allSelected && (!object.data || this.allowSelect(object)); }, refresh: function () { if (this.deselectOnRefresh) { this.clearSelection(); } this._lastSelected = null; return this.inherited(arguments); }, renderArray: function () { var rows = this.inherited(arguments), selection = this.selection, i, row, selected; for (i = 0; i < rows.length; i++) { row = this.row(rows[i]); selected = row.id in selection ? selection[row.id] : this.allSelected; if (selected) { this.select(row, null, selected); } } this._fireSelectionEvents(); return rows; } }); }); corelib/dgrid/Selector.js
New file @@ -0,0 +1,222 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/_base/sniff', 'dojo/dom-construct', 'dojo/dom-class', './Selection' ], function (declare, lang, has, domConstruct, domClass, Selection) { return declare(Selection, { // summary: // Adds an input field (checkbox or radio) to a column that when checked, selects the row // that contains the input field. To enable, add a "selector" property to a column definition. // // description: // The selector property should contain "checkbox", "radio", or be a function that renders the input. // If set to "radio", the input field will be a radio button and only one input in the column will be // checked. If the value of selector is a function, then the function signature is // renderSelectorInput(column, value, cell, object) where: // * column - the column definition // * value - the cell's value // * cell - the cell's DOM node // * object - the row's data object // The custom renderSelectorInput function must return an input field. postCreate: function () { this.inherited(arguments); // Register one listener at the top level that receives events delegated this.on('.dgrid-selector:click,.dgrid-selector:keydown', lang.hitch(this, '_handleSelectorClick')); // Register listeners to the select and deselect events to change the input checked value this.on('dgrid-select', lang.hitch(this, '_changeSelectorInput', true)); this.on('dgrid-deselect', lang.hitch(this, '_changeSelectorInput', false)); }, _defaultRenderSelectorInput: function (column, selected, cell, object) { var grid = column.grid; domClass.add(cell, 'dgrid-selector'); return (cell.input = domConstruct.create('input', { 'aria-checked': selected, checked: selected, disabled: !grid.allowSelect(grid.row(object)), tabIndex: isNaN(column.tabIndex) ? -1 : column.tabIndex, type: column.selector }, cell)); }, _configureSelectorColumn: function (column) { var self = this; var selector = column.selector; this._selectorColumns.push(column); this._selectorSingleRow = this._selectorSingleRow || column.selector === 'radio'; var renderSelectorInput = typeof selector === 'function' ? selector : this._defaultRenderSelectorInput; column.sortable = false; column.renderCell = function (object, value, cell) { var row = object && self.row(object); value = row && self.selection[row.id]; renderSelectorInput(column, !!value, cell, object); }; column.renderHeaderCell = function (th) { var label = 'label' in column ? column.label : column.field || ''; if (column.selector === 'radio' || !self.allowSelectAll) { th.appendChild(document.createTextNode(label)); } else { column._selectorHeaderCheckbox = renderSelectorInput(column, false, th, {}); self._hasSelectorHeaderCheckbox = true; } }; }, _handleSelectorClick: function (event) { // Avoid double-triggering code below due to space key on input automatically triggering click (#731) if (event.target.nodeName === 'INPUT' && event.type === 'keydown' && event.keyCode === 32) { return; } var cell = this.cell(event); var row = cell.row; // We would really only care about click, since other input sources like spacebar // trigger a click, but the click event doesn't provide access to the shift key in firefox, so // listen for keydown as well to get an event in firefox that we can properly retrieve // the shiftKey property if (event.type === 'click' || event.keyCode === 32 || (!has('opera') && event.keyCode === 13) || event.keyCode === 0) { this._selectionTriggerEvent = event; if (row) { if (this.allowSelect(row)) { var lastRow = this._lastSelected && this.row(this._lastSelected); if (this._selectorSingleRow) { if (!lastRow || lastRow.id !== row.id) { this.clearSelection(); this.select(row, null, true); this._lastSelected = row.element; } } else { if (row) { if (event.shiftKey) { // Make sure the last input always ends up checked for shift key this._changeSelectorInput(true, {rows: [row]}); } else { // No shift key, so no range selection lastRow = null; } lastRow = event.shiftKey ? lastRow : null; this.select(lastRow || row, row, lastRow ? undefined : null); this._lastSelected = row.element; } } } } else { // No row resolved; must be the select-all checkbox. this[this.allSelected ? 'clearSelection' : 'selectAll'](); } this._selectionTriggerEvent = null; } }, _changeSelectorInput: function (value, event) { if (this._selectorColumns.length) { this._updateRowSelectors(value, event); } if (this._hasSelectorHeaderCheckbox) { this._updateHeaderCheckboxes(); } }, _updateRowSelectors: function (value, event) { var rows = event.rows; var lenRows = rows.length; var lenCols = this._selectorColumns.length; for (var iRows = 0; iRows < lenRows; iRows++) { for (var iCols = 0; iCols < lenCols; iCols++) { var column = this._selectorColumns[iCols]; var element = this.cell(rows[iRows], column.id).element; if (!element) { // Skip if row has been entirely removed continue; } element = (element.contents || element).input; if (element && !element.disabled) { // Only change the value if it is not disabled element.checked = value; element.setAttribute('aria-checked', value); } } } }, _updateHeaderCheckboxes: function () { /* jshint eqeqeq: false */ var lenCols = this._selectorColumns.length; for (var iCols = 0; iCols < lenCols; iCols++) { var column = this._selectorColumns[iCols]; var state = 'false'; var selection; var mixed; var selectorHeaderCheckbox = column._selectorHeaderCheckbox; if (selectorHeaderCheckbox) { selection = this.selection; mixed = false; // See if the header checkbox needs to be indeterminate for (var i in selection) { // If there is anything in the selection, than it is indeterminate // (Intentionally coerce since selection[i] can be undefined) if (selection[i] != this.allSelected) { mixed = true; break; } } selectorHeaderCheckbox.indeterminate = mixed; selectorHeaderCheckbox.checked = this.allSelected; if (mixed) { state = 'mixed'; } else if (this.allSelected) { state = 'true'; } selectorHeaderCheckbox.setAttribute('aria-checked', state); } } }, configStructure: function () { this.inherited(arguments); var columns = this.columns; this._selectorColumns = []; this._hasSelectorHeaderCheckbox = this._selectorSingleRow = false; for (var k in columns) { if (columns[k].selector) { this._configureSelectorColumn(columns[k]); } } }, _handleSelect: function (event) { // Ignore the default select handler for events that originate from the selector column var column = this.cell(event).column; if (!column || !column.selector) { this.inherited(arguments); } } }); }); corelib/dgrid/Tree.js
New file @@ -0,0 +1,635 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/_base/array', 'dojo/aspect', 'dojo/Deferred', 'dojo/dom-construct', 'dojo/dom-class', 'dojo/on', 'dojo/promise/all', 'dojo/query', 'dojo/when', './util/has-css3', './Grid', 'dojo/has!touch?./util/touch' ], function (declare, lang, arrayUtil, aspect, Deferred, domConstruct, domClass, on, all, querySelector, when, has, Grid, touchUtil) { return declare(null, { // collapseOnRefresh: Boolean // Whether to collapse all expanded nodes any time refresh is called. collapseOnRefresh: false, // enableTreeTransitions: Boolean // Enables/disables all expand/collapse CSS transitions. enableTreeTransitions: true, // treeIndentWidth: Number // Width (in pixels) of each level of indentation. treeIndentWidth: 9, constructor: function () { this._treeColumnListeners = []; }, shouldExpand: function (row, level, previouslyExpanded) { // summary: // Function called after each row is inserted to determine whether // expand(rowElement, true) should be automatically called. // The default implementation re-expands any rows that were expanded // the last time they were rendered (if applicable). return previouslyExpanded; }, expand: function (target, expand, noTransition, lastRowsFirst) { // summary: // Expands the row corresponding to the given target. // target: Object // Row object (or something resolvable to one) to expand/collapse. // expand: Boolean? // If specified, designates whether to expand or collapse the row; // if unspecified, toggles the current state. if (!this._treeColumn) { return; } var grid = this, row = target.element ? target : this.row(target), isExpanded = !!this._expanded[row.id], hasTransitionend = has('transitionend'), promise; function processScroll() { if (!expanded) { grid._processScroll && grid._processScroll(); } } target = row.element; target = target.className.indexOf('dgrid-expando-icon') > -1 ? target : querySelector('.dgrid-expando-icon', target)[0]; noTransition = noTransition || !this.enableTreeTransitions; if (target && target.mayHaveChildren && (noTransition || expand !== isExpanded)) { // toggle or set expand/collapsed state based on optional 2nd argument var expanded = expand === undefined ? !this._expanded[row.id] : expand; // Update _expanded map. var pos = this.getScrollPosition(); this._resetExpanded(row.id, expanded); // update the expando display domClass.replace(target, 'ui-icon-triangle-1-' + (expanded ? 'se' : 'e'), 'ui-icon-triangle-1-' + (expanded ? 'e' : 'se')); domClass.toggle(row.element, 'dgrid-row-expanded', expanded); var rowElement = row.element, container = rowElement.connected, containerStyle, scrollHeight, options = {}; if (!container) { // if the children have not been created, create a container, a preload node and do the // query for the children container = options.container = rowElement.connected = domConstruct.create('div', { className: 'dgrid-tree-container' }, rowElement, 'after'); var query = function (options) { var childCollection = grid._renderedCollection.getChildren(row.data), results; if (grid.sort && grid.sort.length > 0) { childCollection = childCollection.sort(grid.sort); } if (childCollection.track && grid.shouldTrackCollection) { container._rows = options.rows = []; childCollection = childCollection.track(); // remember observation handles so they can be removed when the parent row is destroyed container._handles = [ childCollection.tracking, grid._observeCollection(childCollection, container, options) ]; } query.collection = childCollection; if ('start' in options) { var rangeArgs = { start: options.start, end: options.start + options.count }; results = childCollection.fetchRange(rangeArgs); } else { results = childCollection.fetch(); } return results; }; if ('level' in target) { // Include level information on query for renderQuery case; // include on container for insertRow to detect in other cases container.level = query.level = target.level + 1; } // Add the query to the promise chain if (this.renderQuery) { if (lastRowsFirst) { promise = grid._renderedCollection.getChildren(row.data) .fetchRange({ start: 0, end: 1 }).totalLength.then(function (total) { options.start = total - grid.minRowsPerPage; options.end = total - 1; options.count = grid.minRowsPerPage; grid._previousScrollPosition = pos; return grid.renderQuery(query, options); }); } else { promise = this.renderQuery(query, options); } } else { // If not using OnDemandList, we don't need preload nodes, // but we still need a beforeNode to pass to renderArray, // so create a temporary one var firstChild = domConstruct.create('div', null, container); promise = this._trackError(function () { return grid.renderQueryResults( query(options), firstChild, lang.mixin({ rows: options.rows }, 'level' in query ? { queryLevel: query.level } : null ) ).then(function (rows) { domConstruct.destroy(firstChild); return rows; }); }); } if (hasTransitionend) { // Update height whenever a collapse/expand transition ends. // (This handler is only registered when each child container is first created.) on(container, hasTransitionend, this._onTreeTransitionEnd); } } // Show or hide all the children. container.hidden = !expanded; containerStyle = container.style; // make sure it is visible so we can measure it if (!hasTransitionend || noTransition) { containerStyle.display = expanded ? 'block' : 'none'; containerStyle.height = ''; processScroll(); } else { on.once(container, hasTransitionend, processScroll); if (expanded) { containerStyle.display = 'block'; scrollHeight = container.scrollHeight; containerStyle.height = '0px'; } else { // if it will be hidden we need to be able to give a full height // without animating it, so it has the right starting point to animate to zero domClass.add(container, 'dgrid-tree-resetting'); containerStyle.height = container.scrollHeight + 'px'; } // Perform a transition for the expand or collapse. setTimeout(function () { domClass.remove(container, 'dgrid-tree-resetting'); containerStyle.height = expanded ? (scrollHeight ? scrollHeight + 'px' : 'auto') : '0px'; }, 0); } } // Always return a promise return when(promise); }, _configColumns: function () { var columnArray = this.inherited(arguments); // Set up hash to store IDs of expanded rows (here rather than in // _configureTreeColumn so nothing breaks if no column has renderExpando) this._resetExpanded(); for (var i = 0, l = columnArray.length; i < l; i++) { if (columnArray[i].renderExpando) { this._configureTreeColumn(columnArray[i]); break; // Allow only one tree column. } } return columnArray; }, insertRow: function (object, container, beforeNode, i, options) { options = options || {}; var level = options.queryLevel = 'queryLevel' in options ? options.queryLevel : 'level' in container ? container.level : 0; var rowElement = this.inherited(arguments); // Auto-expand (shouldExpand) considerations var row = this.row(rowElement), expanded = this.shouldExpand(row, level, this._expanded[row.id]); if (expanded) { this._expandWhenInDom(rowElement, options); } if (expanded || (!this.collection.mayHaveChildren || this.collection.mayHaveChildren(object))) { domClass.add(rowElement, 'dgrid-row-expandable'); } return rowElement; // pass return value through }, _expandWhenInDom: function (rowElement, options, dfd) { // Expand a row after it has been inserted into the DOM. This is necessary because // the OnDemandList code that manages the preload nodes needs the nodes to be in the DOM // to create a correctly ordered linked list.; if (rowElement.offsetHeight) { var expandPromise = this.expand(rowElement, true, true, options.scrollingUp); if (dfd) { expandPromise.then(function () { dfd.resolve(); }); } } else { if (rowElement.parentNode && this.domNode.offsetHeight) { if (this._expandPromises && !dfd) { dfd = new Deferred(); this._expandPromises.push(dfd.promise); } // Continue to try to expand the row only while it is inserted into a document fragment. setTimeout(this._expandWhenInDom.bind(this, rowElement, options, dfd), 0); } } }, _queueNodeForDeletion: function (node) { this.inherited(arguments); var connected = node.connected; if (connected) { this._deleteQueue.push(connected); } }, _pruneRow: function (rowElement, removeBelow) { var connected = rowElement.connected; var preloadNode; var preload; if (connected) { var rowId = this.row(rowElement).id; if (this._expanded[rowId]) { preloadNode = querySelector('>.dgrid-preload', connected)[removeBelow ? 1 : 0]; if (preloadNode) { preload = this._findPreload(preloadNode); preload = removeBelow ? preload.next : preload.previous; if (!preload.expandedContent) { preload.expandedContent = {}; } preload.expandedContent[rowId] = connected.offsetHeight; } } } this.inherited(arguments, [rowElement, removeBelow, { treePrune: true, removeBelow: removeBelow }]); }, refresh: function (options) { // Restoring the previous scroll position with OnDemandList is not possible in some cases with // nested expanded nodes. In those cases, restoring the position would require scrolling and // loading rows incrementally to make sure the expanded rows are loaded and expanded. dgrid is not // currently written to do that. If there are expanded rows, then do not allow the position to be // restored. var refreshResult; this._expandPromises = []; var keepScrollPosition = this.keepScrollPosition || (options && options.keepScrollPosition); if (keepScrollPosition && Object.keys(this._expanded).length) { refreshResult = this.inherited(arguments, lang.mixin(options || {}, { keepScrollPosition: false })); } else { refreshResult = this.inherited(arguments); } return when(refreshResult).then(function () { var promises = this._expandPromises; delete this._expandPromises; return all(promises); }.bind(this)); }, removeRow: function (rowElement, preserveDom, options) { var connected = rowElement.connected, childOptions = {}, childRows, preloadNodes, firstIndex, lastIndex; if (connected) { if (connected._handles) { arrayUtil.forEach(connected._handles, function (handle) { handle.remove(); }); delete connected._handles; } if (connected._rows) { childOptions.rows = connected._rows; } childRows = querySelector('>.dgrid-row', connected); preloadNodes = querySelector('>.dgrid-preload', connected); if (childRows && childRows.length) { if (this._releaseRange) { firstIndex = childRows[0].rowIndex; lastIndex = childRows[childRows.length - 1].rowIndex; this._releaseRange(this._findPreload(preloadNodes[0]), false, firstIndex, lastIndex); } childRows.forEach(function (element) { if (options && options.treePrune) { this._pruneRow(element, options.removeBelow); } else { this.removeRow(element, true, childOptions); } }, this); } this._removePreloads && this._removePreloads(preloadNodes); if (connected._rows) { connected._rows.length = 0; delete connected._rows; } if (preserveDom) { this._queueNodeForDeletion(connected); } else { domConstruct.destroy(connected); } } this.inherited(arguments); }, _refreshCellFromItem: function (cell, item) { if (!cell.column.renderExpando) { return this.inherited(arguments); } this.inherited(arguments, [cell, item, { queryLevel: querySelector('.dgrid-expando-icon', cell.element)[0].level }]); }, cleanup: function () { this.inherited(arguments); if (this.collapseOnRefresh) { // Clear out the _expanded hash on each call to cleanup // (which generally coincides with refreshes, as well as destroy) this._resetExpanded(); } }, _destroyColumns: function () { this.inherited(arguments); var listeners = this._treeColumnListeners; for (var i = listeners.length; i--;) { listeners[i].remove(); } this._treeColumnListeners = []; this._treeColumn = null; }, _calcRowHeight: function (rowElement) { // Override this method to provide row height measurements that // include the children of a row var connected = rowElement.connected; // if connected, need to consider this in the total row height return this.inherited(arguments) + (connected ? connected.offsetHeight : 0); }, _configureTreeColumn: function (column) { // summary: // Adds tree navigation capability to a column. var grid = this; var colSelector = '.dgrid-content .dgrid-column-' + column.id; var clicked; // tracks row that was clicked (for expand dblclick event handling) this._treeColumn = column; if (!column._isConfiguredTreeColumn) { var originalRenderCell = column.renderCell || this._defaultRenderCell; column._isConfiguredTreeColumn = true; column.renderCell = function (object, value, td, options) { // summary: // Renders a cell that can be expanded, creating more rows var level = options && 'queryLevel' in options ? options.queryLevel : 0, mayHaveChildren = !grid.collection.mayHaveChildren || grid.collection.mayHaveChildren(object), expando, node; expando = column.renderExpando(level, mayHaveChildren, grid._expanded[grid.collection.getIdentity(object)], object); expando.level = level; expando.mayHaveChildren = mayHaveChildren; node = originalRenderCell.call(column, object, value, td, options); if (node && node.nodeType) { td.appendChild(expando); td.appendChild(node); } else { td.insertBefore(expando, td.firstChild); } }; if (typeof column.renderExpando !== 'function') { column.renderExpando = this._defaultRenderExpando; } } var treeColumnListeners = this._treeColumnListeners; if (treeColumnListeners.length === 0) { // Set up the event listener once and use event delegation for better memory use. treeColumnListeners.push(this.on(column.expandOn || '.dgrid-expando-icon:click,' + colSelector + ':dblclick,' + colSelector + ':keydown', function (event) { var row = grid.row(event); if ((!grid.collection.mayHaveChildren || grid.collection.mayHaveChildren(row.data)) && (event.type !== 'keydown' || event.keyCode === 32) && !(event.type === 'dblclick' && clicked && clicked.count > 1 && row.id === clicked.id && event.target.className.indexOf('dgrid-expando-icon') > -1)) { grid.expand(row); } // If the expando icon was clicked, update clicked object to prevent // potential over-triggering on dblclick (all tested browsers but IE < 9). if (event.target.className.indexOf('dgrid-expando-icon') > -1) { if (clicked && clicked.id === grid.row(event).id) { clicked.count++; } else { clicked = { id: grid.row(event).id, count: 1 }; } } }) ); if (has('touch')) { // Also listen on double-taps of the cell. treeColumnListeners.push(this.on(touchUtil.selector(colSelector, touchUtil.dbltap), function () { grid.expand(this); })); } } }, _defaultRenderExpando: function (level, hasChildren, expanded) { // summary: // Default implementation for column.renderExpando. // NOTE: Called in context of the column definition object. // level: Number // Level of indentation for this row (0 for top-level) // hasChildren: Boolean // Whether this item may have children (in most cases this determines // whether an expando icon should be rendered) // expanded: Boolean // Whether this item is currently in expanded state // object: Object // The item that this expando pertains to var dir = this.grid.isRTL ? 'right' : 'left', cls = 'dgrid-expando-icon'; if (hasChildren) { cls += ' ui-icon ui-icon-triangle-1-' + (expanded ? 'se' : 'e'); } return domConstruct.create('div', { className: cls, innerHTML: ' ', style: 'margin-' + dir + ': ' + (level * this.grid.treeIndentWidth) + 'px; float: ' + dir + ';' }); }, _onNotification: function (rows, event) { if (event.type === 'delete') { this._resetExpanded(event.id); } this.inherited(arguments); }, _onTreeTransitionEnd: function (event) { var container = this, height = this.style.height; if (height) { // After expansion, ensure display is correct; // after collapse, set display to none to improve performance this.style.display = height === '0px' ? 'none' : 'block'; } // Reset height to be auto, so future height changes (from children // expansions, for example), will expand to the right height. if (event) { // For browsers with CSS transition support, setting the height to // auto or "" will cause an animation to zero height for some // reason, so temporarily set the transition to be zero duration domClass.add(this, 'dgrid-tree-resetting'); setTimeout(function () { // Turn off the zero duration transition after we have let it render domClass.remove(container, 'dgrid-tree-resetting'); }, 0); } // Now set the height to auto this.style.height = ''; }, _resetPlaceHolder: function (rowId) { var headPreload = this._getHeadPreload && this._getHeadPreload(); var preload; var grid = this; if (!headPreload) { return; } function remove(rowId) { var preload = headPreload; while (preload) { var expandedContent = preload.expandedContent; if (expandedContent && expandedContent[rowId]) { delete expandedContent[rowId]; grid._adjustPreloadHeight(preload); return; } preload = preload.next; } } if (rowId != null) { remove(rowId); } else { preload = headPreload; while (preload) { if (preload.expandedContent) { delete preload.expandedContent; grid._adjustPreloadHeight(preload); } preload = preload.next; } } }, _resetExpanded: function (rowId, expanded) { // Always remove the place holder(s). this._resetPlaceHolder(rowId); if (rowId == null) { this._expanded = {}; } else { if (expanded) { this._expanded[rowId] = true; } else { delete this._expanded[rowId]; } } }, _calculatePreloadHeight: function (preload) { var newHeight = this.inherited(arguments); var expandedContent = preload.expandedContent; if (expandedContent) { Object.keys(expandedContent).forEach(function (key) { newHeight += expandedContent[key]; }); } return newHeight; }, _getRenderedCollection: function (preload) { if (preload.level) { return preload.query.collection; } else { return this.inherited(arguments); } } }); }); corelib/dgrid/_StoreMixin.js
New file @@ -0,0 +1,650 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/Deferred', 'dojo/aspect', 'dojo/dom-construct', 'dojo/has', 'dojo/on', 'dojo/when' ], function (declare, lang, Deferred, aspect, domConstruct, has, on, when) { // This module isolates the base logic required by store-aware list/grid // components, e.g. OnDemandList/Grid and the Pagination extension. function emitError(err) { // called by _trackError in context of list/grid, if an error is encountered if (typeof err !== 'object') { // Ensure we actually have an error object, so we can attach a reference. err = new Error(err); } else if (err.dojoType === 'cancel') { // Don't fire dgrid-error events for errors due to canceled requests // (unfortunately, the Deferred instrumentation will still log them) return; } var event = on.emit(this.domNode, 'dgrid-error', { grid: this, error: err, cancelable: true, bubbles: true }); if (event) { console.error(err); } } return declare(null, { // collection: Object // The base object collection (implementing the dstore/api/Store API) before being sorted // or otherwise processed by the grid. Use it for general purpose store operations such as // `getIdentity` and `get`, `add`, `put`, and `remove`. collection: null, // _renderedCollection: Object // The object collection from which data is to be fetched. This is the sorted collection. // Use it when retrieving data to be rendered by the grid. _renderedCollection: null, // _rows: Array // Sparse array of row nodes, used to maintain the grid in response to events from a tracked collection. // Each node's index corresponds to the index of its data object in the collection. _rows: null, // _observerHandle: Object // The observer handle for the current collection, if trackable. _observerHandle: null, // shouldTrackCollection: Boolean // Whether this instance should track any trackable collection it is passed. shouldTrackCollection: true, // getBeforePut: boolean // If true, a get request will be performed to the store before each put // as a baseline when saving; otherwise, existing row data will be used. getBeforePut: true, // noDataMessage: String // Message to be displayed when no results exist for a collection, whether at // the time of the initial query or upon subsequent observed changes. // Defined by _StoreMixin, but to be implemented by subclasses. noDataMessage: '', // loadingMessage: String // Message displayed when data is loading. // Defined by _StoreMixin, but to be implemented by subclasses. loadingMessage: '', _total: 0, constructor: function () { // Create empty objects on each instance, not the prototype this.dirty = {}; this._updating = {}; // Tracks rows that are mid-update this._columnsWithSet = {}; // Reset _columnsWithSet whenever column configuration is reset aspect.before(this, 'configStructure', lang.hitch(this, function () { this._columnsWithSet = {}; })); }, destroy: function () { this.inherited(arguments); if (this._renderedCollection) { this._cleanupCollection(); } if (this._refreshTimeout) { clearTimeout(this._refreshTimeout); } }, _configColumn: function (column) { // summary: // Implements extension point provided by Grid to store references to // any columns with `set` methods, for use during `save`. if (column.set) { this._columnsWithSet[column.field] = column; } this.inherited(arguments); }, _setCollection: function (collection) { // summary: // Assigns a new collection to the list/grid, sets up tracking // if applicable, and tells the list/grid to refresh. if (this._renderedCollection) { this.cleanup(); this._cleanupCollection({ // Only clear the dirty hash if the collection being used is actually from a different store // (i.e. not just a re-sorted / re-filtered version of the same store) shouldRevert: !collection || collection.storage !== this._renderedCollection.storage }); } this.collection = collection; // Avoid unnecessary rendering and processing before the grid has started up if (this._started) { // Once startup is called, List.startup sets the sort property which calls _StoreMixin._applySort // which sets the collection property again. So _StoreMixin._applySort will be executed again // after startup is called. if (collection) { var renderedCollection = collection; if (this.sort && this.sort.length > 0) { renderedCollection = collection.sort(this.sort); } if (renderedCollection.track && this.shouldTrackCollection) { renderedCollection = renderedCollection.track(); this._rows = []; this._observerHandle = this._observeCollection( renderedCollection, this.contentNode, { rows: this._rows } ); } this._renderedCollection = renderedCollection; } this.refresh(); } }, _setStore: function () { if (!this.collection) { console.debug('set(\'store\') call detected, but you probably meant set(\'collection\')'); } }, _getTotal: function () { // summary: // Retrieves the currently-tracked total (as updated by // subclasses after store queries, or by _StoreMixin in response to // updated totalLength in events) return this._total; }, _cleanupCollection: function (options) { // summary: // Handles cleanup duty for the previous collection; // called during _setCollection and destroy. // options: Object? // * shouldRevert: Whether to clear the dirty hash options = options || {}; if (this._renderedCollection.tracking) { this._renderedCollection.tracking.remove(); } // Remove observer and existing rows so any sub-row observers will be cleaned up if (this._observerHandle) { this._observerHandle.remove(); this._observerHandle = this._rows = null; } // Discard dirty map, as it applied to a previous collection if (options.shouldRevert !== false) { this.dirty = {}; } this._renderedCollection = this.collection = null; }, _applySort: function () { if (this.collection) { this.set('collection', this.collection); } else if (this.store) { console.debug('_StoreMixin found store property but not collection; ' + 'this is often the sign of a mistake during migration from 0.3 to 0.4'); } }, _emitRefreshComplete: function () { // summary: // Handles emitting the dgrid-refresh-complete event on a separate turn, // to enable event to be used consistently regardless of whether the backing store is async. var self = this; this._refreshTimeout = setTimeout(function () { on.emit(self.domNode, 'dgrid-refresh-complete', { bubbles: true, cancelable: false, grid: self }); self._refreshTimeout = null; }, 0); }, _insertNoDataNode: function (parentNode) { // summary: // Creates a node displaying noDataMessage. // Remove the current no data node if it exists. this._removeNoDataNode(); parentNode = parentNode || this.contentNode; var noDataNode = this.noDataNode = domConstruct.create('div', { className: 'dgrid-no-data', innerHTML: this.noDataMessage }); // 2nd param is *required*, even if it is null parentNode.insertBefore(noDataNode, this._getFirstRowSibling ? this._getFirstRowSibling(parentNode) : null); return noDataNode; }, _removeNoDataNode: function () { // summary: // Removes the noDataNode from the grid if it exists. // Returns true if a noDataNode existed previously. // Returns false if no noDataNode existed previously. if (this.noDataNode) { domConstruct.destroy(this.noDataNode); delete this.noDataNode; return true; // Indicate that a noDataNode was removed. } return false; // Indicate there was no noDataNode. }, row: function () { // Extend List#row with more appropriate lookup-by-id logic var row = this.inherited(arguments); if (row && row.data && typeof row.id !== 'undefined') { row.id = this.collection.getIdentity(row.data); } return row; }, refresh: function () { var result = this.inherited(arguments); if (!this.collection) { this._insertNoDataNode(); } return result; }, refreshCell: function (cell) { if (!this.collection || !this._createBodyRowCell) { throw new Error('refreshCell requires a Grid with a collection.'); } this.inherited(arguments); return this.collection.get(cell.row.id).then(lang.hitch(this, '_refreshCellFromItem', cell)); }, _refreshCellFromItem: function (cell, item, options) { var cellElement = cell.element; domConstruct.empty(cellElement); var dirtyItem = this.dirty && this.dirty[cell.row.id]; if (dirtyItem) { item = lang.delegate(item, dirtyItem); } this._createBodyRowCell(cellElement, cell.column, item, options); }, renderArray: function () { var rows = this.inherited(arguments); if (!this.collection) { if (rows.length && this.noDataNode) { domConstruct.destroy(this.noDataNode); } } return rows; }, insertRow: function (object, parent, beforeNode, i, options) { var store = this.collection, dirty = this.dirty, id = store && store.getIdentity(object), dirtyObj, row; if (id in dirty && !(id in this._updating)) { dirtyObj = dirty[id]; } if (dirtyObj) { // restore dirty object as delegate on top of original object, // to provide protection for subsequent changes as well object = lang.delegate(object, dirtyObj); } row = this.inherited(arguments); if (options && options.rows) { options.rows[i] = row; } // Remove no data message when a new row appears. // Run after inherited logic to prevent confusion due to noDataNode // no longer being present as a sibling. if (this.noDataNode) { domConstruct.destroy(this.noDataNode); this.noDataNode = null; } return row; }, updateDirty: function (id, field, value) { // summary: // Updates dirty data of a field for the item with the specified ID. var dirty = this.dirty, dirtyObj = dirty[id]; if (!dirtyObj) { dirtyObj = dirty[id] = {}; } dirtyObj[field] = value; }, save: function () { // Keep track of the store and puts var self = this, store = this.collection, dirty = this.dirty, dfd = new Deferred(), results = {}, getFunc = function (id) { // returns a function to pass as a step in the promise chain, // with the id variable closured var data; return (self.getBeforePut || !(data = self.row(id).data)) ? function () { return store.get(id); } : function () { return data; }; }; // function called within loop to generate a function for putting an item function putter(id, dirtyObj) { // Return a function handler return function (object) { var colsWithSet = self._columnsWithSet, updating = self._updating, key, data; if (typeof object.set === 'function') { object.set(dirtyObj); } else { // Copy dirty props to the original, applying setters if applicable for (key in dirtyObj) { object[key] = dirtyObj[key]; } } // Apply any set methods in column definitions. // Note that while in the most common cases column.set is intended // to return transformed data for the key in question, it is also // possible to directly modify the object to be saved. for (key in colsWithSet) { data = colsWithSet[key].set(object); if (data !== undefined) { object[key] = data; } } updating[id] = true; // Put it in the store, returning the result/promise return store.put(object).then(function (result) { // Clear the item now that it's been confirmed updated delete dirty[id]; delete updating[id]; results[id] = result; return results; }); }; } var promise = dfd.then(function () { // Ensure empty object is returned even if nothing was dirty, for consistency return results; }); // For every dirty item, grab the ID for (var id in dirty) { // Create put function to handle the saving of the the item var put = putter(id, dirty[id]); // Add this item onto the promise chain, // getting the item from the store first if desired. promise = promise.then(getFunc(id)).then(put); } // Kick off and return the promise representing all applicable get/put ops. // If the success callback is fired, all operations succeeded; otherwise, // save will stop at the first error it encounters. dfd.resolve(); return promise; }, revert: function () { // summary: // Reverts any changes since the previous save. this.dirty = {}; this.refresh(); }, _trackError: function (func) { // summary: // Utility function to handle emitting of error events. // func: Function|String // A function which performs some store operation, or a String identifying // a function to be invoked (sans arguments) hitched against the instance. // If sync, it can return a value, but may throw an error on failure. // If async, it should return a promise, which would fire the error // callback on failure. // tags: // protected if (typeof func === 'string') { func = lang.hitch(this, func); } var self = this, promise; try { promise = when(func()); } catch (err) { // report sync error var dfd = new Deferred(); dfd.reject(err); promise = dfd.promise; } promise.otherwise(function (err) { emitError.call(self, err); }); return promise; }, removeRow: function (rowElement, preserveDom, options) { var row = {element: rowElement}; // Check to see if we are now empty... if (!preserveDom && (this.up(row).element === rowElement) && (this.down(row).element === rowElement)) { // ...we are empty, so show the no data message. this._insertNoDataNode(); } var rows = (options && options.rows) || this._rows; if (rows) { delete rows[rowElement.rowIndex]; } return this.inherited(arguments); }, renderQueryResults: function (results, beforeNode, options) { // summary: // Renders objects from QueryResults as rows, before the given node. options = lang.mixin({ rows: this._rows }, options); var self = this; if (!has('dojo-built')) { // Check for null/undefined totalResults to help diagnose faulty services/stores results.totalLength.then(function (total) { if (total == null) { console.warn('Store reported null or undefined totalLength. ' + 'Make sure your store (and service, if applicable) are reporting total correctly!'); } }); } return results.then(function (resolvedResults) { var resolvedRows = self.renderArray(resolvedResults, beforeNode, options); delete self._lastCollection; // used only for non-store List/Grid return resolvedRows; }); }, _observeCollection: function (collection, container, options) { var self = this, rows = options.rows, row; var handles = [ collection.on('delete, update', function (event) { var from = event.previousIndex; var to = event.index; if (from !== undefined && rows[from]) { if ('max' in rows && (to === undefined || to < rows.min || to > rows.max)) { rows.max--; } row = rows[from]; // check to make the sure the node is still there before we try to remove it // (in case it was moved to a different place in the DOM) if (row.parentNode === container) { self.removeRow(row, false, options); } // remove the old slot rows.splice(from, 1); if (event.type === 'delete' || (event.type === 'update' && (from < to || to === undefined))) { // adjust the rowIndex so adjustRowIndices has the right starting point rows[from] && rows[from].rowIndex--; } } if (event.type === 'delete') { // Reset row in case this is later followed by an add; // only update events should retain the row variable below row = null; } }), collection.on('add, update', function (event) { var from = event.previousIndex; var to = event.index; var nextNode; function advanceNext() { nextNode = (nextNode.connected || nextNode).nextSibling; } // When possible, restrict observations to the actually rendered range if (to !== undefined && (!('max' in rows) || (to >= rows.min && to <= rows.max))) { if ('max' in rows && (from === undefined || from < rows.min || from > rows.max)) { rows.max++; } // Add to new slot (either before an existing row, or at the end) // First determine the DOM node that this should be placed before. if (rows.length) { nextNode = rows[to]; if (!nextNode) { nextNode = rows[to - 1]; if (nextNode) { // Make sure to skip connected nodes, so we don't accidentally // insert a row in between a parent and its children. advanceNext(); } } } else { // There are no rows. Allow for subclasses to insert new rows somewhere other than // at the end of the parent node. nextNode = self._getFirstRowSibling && self._getFirstRowSibling(container); } // Make sure we don't trip over a stale reference to a // node that was removed, or try to place a node before // itself (due to overlapped queries) if (row && nextNode && row.id === nextNode.id) { advanceNext(); } if (nextNode && !nextNode.parentNode) { nextNode = document.getElementById(nextNode.id); } rows.splice(to, 0, undefined); row = self.insertRow(event.target, container, nextNode, to, options); self.highlightRow(row); } // Reset row so it doesn't get reused on the next event row = null; }), collection.on('add, delete, update', function (event) { var from = (typeof event.previousIndex !== 'undefined') ? event.previousIndex : Infinity, to = (typeof event.index !== 'undefined') ? event.index : Infinity, adjustAtIndex = Math.min(from, to); from !== to && rows[adjustAtIndex] && self.adjustRowIndices(rows[adjustAtIndex]); // the removal of rows could cause us to need to page in more items if (from !== Infinity && self._processScroll && (rows[from] || rows[from - 1])) { self._processScroll(); } // Fire _onNotification, even for out-of-viewport notifications, // since some things may still need to update (e.g. Pagination's status/navigation) self._onNotification(rows, event, collection); // Update _total after _onNotification so that it can potentially // decide whether to perform actions based on whether the total changed if (collection === self._renderedCollection && 'totalLength' in event) { self._total = event.totalLength; } }) ]; return { remove: function () { while (handles.length > 0) { handles.pop().remove(); } } }; }, _onNotification: function () { // summary: // Protected method called whenever a store notification is observed. // Intended to be extended as necessary by mixins/extensions. // rows: Array // A sparse array of row nodes corresponding to data objects in the collection. // event: Object // The notification event // collection: Object // The collection that the notification is relevant to. // Useful for distinguishing child-level from top-level notifications. } }); }); corelib/dgrid/bower.json
New file @@ -0,0 +1,29 @@ { "name": "dgrid", "description": "A lightweight, mobile-ready, data-driven, modular widget designed for lists and grids", "keywords": [ "dojo", "grid" ], "authors": [ "Kris Zyp", "Kenneth G. Franqueiro", "Ed Hager" ], "main": "OnDemandGrid.js", "homepage": "http://dgrid.io", "repository": { "type": "git", "url": "git://github.com/SitePen/dgrid" }, "dependencies": { "dojo": ">=1.8.9", "dstore": "~1.0.3 || ~1.1.1" }, "ignore": [ ".*", "test" ], "license": [ "BSD-3-Clause" ], "moduleType": [ "amd" ] } corelib/dgrid/css/ColumnSet.styl
New file @@ -0,0 +1,32 @@ .dgrid-column-set { overflow: hidden; width: 100%; position: relative; // This is needed because we set position: relative on cells in the grid for focus in IE7 height: 100%; // On touch devices, disable default X-axis drag behavior but allow vertical scrolling -ms-touch-action: pan-y; touch-action: pan-y; } .dgrid-column-set-cell { vertical-align: top; height: 100%; } .dgrid-column-set-scroller-container { font-size: 0; position: absolute; bottom: 0; } .dgrid-autoheight .dgrid-column-set-scroller-container { position: relative; } .dgrid-column-set-scroller { display: inline-block; overflow-x: auto; overflow-y: hidden; } .dgrid-column-set-scroller-content { height: 1px; } corelib/dgrid/css/Tree.styl
New file @@ -0,0 +1,18 @@ .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .dgrid-expando-icon { width: 16px; height: 16px; } .dgrid-tree-container { transition-duration: 0.3s; overflow: hidden; } .dgrid-tree-container.dgrid-tree-resetting { transition-duration: 0; } corelib/dgrid/css/base.styl
New file @@ -0,0 +1,170 @@ // This stylesheet provides the structural CSS for dgrid .dgrid { position: relative; overflow: hidden; // This is needed by IE to prevent crazy scrollbar flashing border: 1px solid #ddd; height: 30em; display: block; } .dgrid-header { background-color: #eee; } .dgrid-header-row { position: absolute; right: 17px; // scrollbar width; revised in List.js if necessary left: 0; } .dgrid-header-scroll { position: absolute; top: 0; right: 0; } .dgrid-footer { position: absolute; bottom: 0; width: 100%; } .dgrid-header-hidden { // Used to "hide" header, without losing size information for reference. // !important is used to supersede theme styles at higher specificity. // Left/right box styles are untouched, as they may influence width of // .dgrid-content as updated in Grid's resize method. font-size: 0; // allow shrinkage in IE Quirks mode for Lists height: 0 !important; border-top: none !important; border-bottom: none !important; margin-top: 0 !important; margin-bottom: 0 !important; padding-top: 0 !important; padding-bottom: 0 !important; } .dgrid-footer-hidden { // Hiding footer is much simpler; simply set its display to none. display: none; } .dgrid-sortable { cursor: pointer; } .dgrid-header, .dgrid-header-row, .dgrid-footer { overflow: hidden; background-color: #eee; } .dgrid-row-table { border-collapse: collapse; border: none; table-layout: fixed; empty-cells: show; width: 100%; height: 100%; } .dgrid-cell { padding: 3px; text-align: left; overflow: hidden; vertical-align: top; border: 1px solid #ddd; border-top-style: none; box-sizing: border-box; } .dgrid-content { position: relative; height: 99%; } .dgrid-scroller { overflow-x: auto; overflow-y: scroll; position: absolute; top: 0px; margin-top: 25px; // this will be adjusted programmatically to fit below the header bottom: 0px; width: 100%; } .dgrid-preload { // Force IE6 to honor 0 height font-size: 0; line-height: 0; } .dgrid-loading { position: relative; height: 100%; } .dgrid-above { position: absolute; bottom: 0; } .ui-icon { width: 16px; height: 16px; background-image: url('images/ui-icons_222222_256x240.png'); } // Single Sort .dgrid-sort-arrow { background-position: -64px -16px; display: block; float: right; margin: 0 4px 0 5px; height: 12px; } .dgrid-sort-up .dgrid-sort-arrow { background-position: 0px -16px; } .dgrid-selected { background-color: #bbb; } .dgrid-input { width: 99%; } html.has-mozilla .dgrid { // Fix: Firefox's focus outline doesn't work by default for divs prior to actually tabbing into it .dgrid-row:focus, .dgrid-cell:focus { outline: 1px dotted; } } html.has-mozilla .dgrid-focus { // Tighten outline to fit within cells (avoids cutting off top/bottom outlines) outline-offset: -1px; } // Used by List.js to calculate width/height of scrollbars .dgrid-scrollbar-measure { width: 100px; height: 100px; overflow: scroll; position: absolute; top: -9999px; } // Styles for auto-height grids; simply add the dgrid-autoheight class .dgrid-autoheight { height: auto; } .dgrid-autoheight .dgrid-scroller { position: relative; overflow-y: hidden; } .dgrid-autoheight .dgrid-header-scroll { display: none; } .dgrid-autoheight .dgrid-header { right: 0; } corelib/dgrid/css/dgrid.css
New file @@ -0,0 +1,363 @@ .dgrid { position: relative; overflow: hidden; border: 1px solid #ddd; height: 30em; display: block; } .dgrid-header { background-color: #eee; } .dgrid-header-row { position: absolute; right: 17px; left: 0; } .dgrid-header-scroll { position: absolute; top: 0; right: 0; } .dgrid-footer { position: absolute; bottom: 0; width: 100%; } .dgrid-header-hidden { font-size: 0; height: 0 !important; border-top: none !important; border-bottom: none !important; margin-top: 0 !important; margin-bottom: 0 !important; padding-top: 0 !important; padding-bottom: 0 !important; } .dgrid-footer-hidden { display: none; } .dgrid-sortable { cursor: pointer; } .dgrid-header, .dgrid-header-row, .dgrid-footer { overflow: hidden; background-color: #eee; } .dgrid-row-table { border-collapse: collapse; border: none; table-layout: fixed; empty-cells: show; width: 100%; height: 100%; } .dgrid-cell { padding: 3px; text-align: left; overflow: hidden; vertical-align: top; border: 1px solid #ddd; border-top-style: none; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .dgrid-content { position: relative; height: 99%; } .dgrid-scroller { overflow-x: auto; overflow-y: scroll; position: absolute; top: 0px; margin-top: 25px; bottom: 0px; width: 100%; } .dgrid-preload { font-size: 0; line-height: 0; } .dgrid-loading { position: relative; height: 100%; } .dgrid-above { position: absolute; bottom: 0; } .ui-icon { width: 16px; height: 16px; background-image: url("images/ui-icons_222222_256x240.png"); } .dgrid-sort-arrow { background-position: -64px -16px; display: block; float: right; margin: 0 4px 0 5px; height: 12px; } .dgrid-sort-up .dgrid-sort-arrow { background-position: 0px -16px; } .dgrid-selected { background-color: #bbb; } .dgrid-input { width: 99%; } html.has-mozilla .dgrid .dgrid-row:focus, html.has-mozilla .dgrid .dgrid-cell:focus { outline: 1px dotted; } html.has-mozilla .dgrid-focus { outline-offset: -1px; } .dgrid-scrollbar-measure { width: 100px; height: 100px; overflow: scroll; position: absolute; top: -9999px; } .dgrid-autoheight { height: auto; } .dgrid-autoheight .dgrid-scroller { position: relative; overflow-y: hidden; } .dgrid-autoheight .dgrid-header-scroll { display: none; } .dgrid-autoheight .dgrid-header { right: 0; } .dgrid-column-set { overflow: hidden; width: 100%; position: relative; height: 100%; -ms-touch-action: pan-y; touch-action: pan-y; } .dgrid-column-set-cell { vertical-align: top; height: 100%; } .dgrid-column-set-scroller-container { font-size: 0; position: absolute; bottom: 0; } .dgrid-autoheight .dgrid-column-set-scroller-container { position: relative; } .dgrid-column-set-scroller { display: inline-block; overflow-x: auto; overflow-y: hidden; } .dgrid-column-set-scroller-content { height: 1px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .dgrid-expando-icon { width: 16px; height: 16px; } .dgrid-tree-container { -webkit-transition-duration: 0.3s; -moz-transition-duration: 0.3s; -o-transition-duration: 0.3s; -ms-transition-duration: 0.3s; transition-duration: 0.3s; overflow: hidden; } .dgrid-tree-container.dgrid-tree-resetting { -webkit-transition-duration: 0; -moz-transition-duration: 0; -o-transition-duration: 0; -ms-transition-duration: 0; transition-duration: 0; } .dgrid-hider-toggle { background-position: 0 -192px; background-color: transparent; border: none; cursor: pointer; position: absolute; right: 0; top: 0; z-index: 99999; } .dgrid-rtl-swap .dgrid-hider-toggle { right: auto; left: 0; } .dgrid-hider-menu { position: absolute; top: 0; right: 17px; width: 184px; background-color: #fff; border: 1px solid #000; z-index: 99999; padding: 4px; overflow-x: hidden; overflow-y: auto; } .dgrid-rtl-swap .dgrid-hider-menu { right: auto; left: 17px; } .dgrid-hider-menu-row { position: relative; padding: 2px; } .dgrid-hider-menu-check { position: absolute; top: 2px; left: 2px; padding: 0; } .dgrid-hider-menu-label { display: block; padding-left: 20px; } .dgrid-header .dojoDndTarget .dgrid-cell { display: table-cell; } .dgrid-header .dojoDndItemBefore { border-left: 2px dotted #000 !important; } .dgrid-header .dojoDndItemAfter { border-right: 2px dotted #000 !important; } .dgrid-column-resizer { cursor: col-resize; position: absolute; width: 2px; background-color: #666; z-index: 1000; } .dgrid-resize-handle { height: 100px; width: 0; position: absolute; right: -4px; top: -4px; cursor: col-resize; z-index: 999; border-left: 5px solid transparent; outline: none; } .dgrid-resize-header-container { height: 100%; } .dgrid-resize-guard { cursor: col-resize; position: absolute; bottom: 0; left: 0; right: 0; top: 0; } html.has-touch .dgrid-resize-handle { border-left: 20px solid transparent; } html.has-touch .dgrid-column-resizer { width: 2px; } .dgrid-resize-header-container { position: relative; } .dgrid-header .dgrid-cell { overflow: hidden; } .dgrid-spacer-row { height: 0; } .dgrid-spacer-row th { padding-top: 0; padding-bottom: 0; border-top: none; border-bottom: none; } .dgrid-status { padding: 2px; } .dgrid-pagination .dgrid-status { float: left; } .dgrid-pagination .dgrid-navigation, .dgrid-pagination .dgrid-page-size { float: right; } .dgrid-navigation .dgrid-page-link { cursor: pointer; font-weight: bold; text-decoration: none; color: inherit; padding: 0 4px; } .dgrid-first, .dgrid-last, .dgrid-next, .dgrid-previous { font-size: 130%; } .dgrid-pagination .dgrid-page-disabled { color: #aaa; cursor: default; } .dgrid-page-input { margin-top: 1px; width: 2em; text-align: center; } .dgrid-page-size { margin: 1px 4px 0 4px; } .dgrid-rtl-swap .dgrid-header-row { right: 0; left: 17px; } .dgrid-rtl-swap .dgrid-header-scroll { left: 0px; right: auto; } .dgrid-rtl .dgrid-cell { text-align: right; } .dgrid-rtl .dgrid-sort-arrow { float: left; margin: 0 5px 0 4px; } .dgrid-rtl .ui-icon-triangle-1-e { background-position: -96px -16px; } .dgrid-rtl .ui-icon-triangle-1-se { background-position: -80px -16px; } .dgrid-rtl .dgrid-pagination .dgrid-status { float: right; } .dgrid-rtl .dgrid-pagination .dgrid-page-size { float: right; } .dgrid-rtl .dgrid-pagination .dgrid-navigation { float: left; } .dgrid-rtl.dgrid-autoheight .dgrid-header { left: 0; } corelib/dgrid/css/dgrid.styl
New file @@ -0,0 +1,10 @@ @require 'nib/vendor'; @import 'base'; @import 'ColumnSet'; @import 'Tree'; @import 'extensions/ColumnHider'; @import 'extensions/ColumnReorder'; @import 'extensions/ColumnResizer'; @import 'extensions/CompoundColumns'; @import 'extensions/Pagination'; @import 'dgrid_rtl'; corelib/dgrid/css/dgrid_rtl.styl
New file @@ -0,0 +1,52 @@ // rtl support // IMPORTANT: // Safari places the scrollbars on the right even when in RTL mode. // .dgrid-rtl is added to the domNode if the grid's isRTL is true // .dgrid-rtl-swap is also added to the domNode if isRTL is true and // the client swaps the vertical scrollbar to the left side .dgrid-rtl-swap .dgrid-header-row { right: 0; left: 17px; } .dgrid-rtl-swap .dgrid-header-scroll { left: 0px; right: auto; } .dgrid-rtl .dgrid-cell { text-align: right; } // Reverse position of sort arrow .dgrid-rtl .dgrid-sort-arrow { float: left; margin: 0 5px 0 4px; } // Reverse arrows for tree expando states .dgrid-rtl .ui-icon-triangle-1-e { background-position: -96px -16px; } .dgrid-rtl .ui-icon-triangle-1-se { background-position: -80px -16px; } // Reverse Pagination .dgrid-rtl .dgrid-pagination .dgrid-status { float: right; } .dgrid-rtl .dgrid-pagination .dgrid-page-size { float: right; } .dgrid-rtl .dgrid-pagination .dgrid-navigation { float: left; } .dgrid-rtl.dgrid-autoheight .dgrid-header { left: 0; } corelib/dgrid/css/extensions/ColumnHider.styl
New file @@ -0,0 +1,47 @@ .dgrid-hider-toggle { background-position: 0 -192px; background-color: transparent; border: none; cursor: pointer; position: absolute; right: 0; top: 0; } .dgrid-rtl-swap .dgrid-hider-toggle { right: auto; left: 0; } .dgrid-hider-menu { position: absolute; top: 0; right: 17px; width: 184px; background-color: #fff; border: 1px solid black; z-index: 99999; padding: 4px; overflow-x: hidden; overflow-y: auto; } .dgrid-rtl-swap .dgrid-hider-menu { right: auto; left: 17px; } .dgrid-hider-menu-row { position: relative; padding: 2px; } .dgrid-hider-menu-check { position: absolute; top: 2px; left: 2px; padding: 0; } .dgrid-hider-menu-label { display: block; padding-left: 20px; } corelib/dgrid/css/extensions/ColumnReorder.styl
New file @@ -0,0 +1,10 @@ .dgrid-header .dojoDndTarget .dgrid-cell { display: table-cell; // override any spurious dojoDndItem settings elsewhere } .dgrid-header .dojoDndItemBefore { border-left: 2px dotted #000 !important; } .dgrid-header .dojoDndItemAfter { border-right: 2px dotted #000 !important; } corelib/dgrid/css/extensions/ColumnResizer.styl
New file @@ -0,0 +1,49 @@ .dgrid-column-resizer { cursor: col-resize; position: absolute; width: 2px; background-color: #666; z-index: 1000; } .dgrid-resize-handle { height: 100px; width: 0; position: absolute; right: -4px; top:-4px; cursor: col-resize; z-index: 999; border-left: 5px solid transparent; outline: none; } .dgrid-resize-header-container { height:100%; } .dgrid-resize-guard { // Used to prevent click events trickling down to the underlying header cell cursor: col-resize; position: absolute; bottom: 0; left: 0; right: 0; top: 0; } // make the resize handles larger on touch-capable devices html.has-touch .dgrid-resize-handle { border-left: 20px solid transparent; } html.has-touch .dgrid-column-resizer { width: 2px; } .dgrid-resize-header-container { // set to relative so we can do the resizing against this node position: relative; } .dgrid-header .dgrid-cell { overflow: hidden; } corelib/dgrid/css/extensions/CompoundColumns.styl
New file @@ -0,0 +1,11 @@ .dgrid-spacer-row { height: 0; } .dgrid-spacer-row th { // Need to make these cells zero height/invisible, but still force the table layout padding-top: 0; padding-bottom: 0; border-top: none; border-bottom: none; } corelib/dgrid/css/extensions/Pagination.styl
New file @@ -0,0 +1,33 @@ .dgrid-status { padding: 2px; } .dgrid-pagination .dgrid-status { float: left; } .dgrid-pagination .dgrid-navigation, .dgrid-pagination .dgrid-page-size { float: right; } .dgrid-navigation .dgrid-page-link { cursor: pointer; font-weight: bold; text-decoration: none; color: inherit; padding: 0 4px; } .dgrid-first, .dgrid-last, .dgrid-next, .dgrid-previous { font-size: 130%; } .dgrid-pagination .dgrid-page-disabled { color: #aaa; cursor: default; } .dgrid-page-input { margin-top: 1px; width: 2em; text-align: center; } .dgrid-page-size { margin: 1px 4px 0 4px; } corelib/dgrid/css/images/ui-icons_222222_256x240.png
corelib/dgrid/css/images/ui-icons_ffffff_256x240.png
corelib/dgrid/css/skins/README.md
New file @@ -0,0 +1,4 @@ This folder contains skins based on the Dijit themes (claro, tundra, soria, and nihilo), as well as a number of other skins (e.g. cactus, sage, slate). See the [Customizing Skins](../../doc/usage/Customizing-Skins.md) documentation for information on customizing skins. corelib/dgrid/css/skins/cactus.css
New file @@ -0,0 +1,82 @@ .cactus .dgrid { background: #faffef; color: #000; } .cactus .dgrid-header, .cactus .dgrid-footer { background: #333; background-image: -webkit-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: -moz-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: -o-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: -ms-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: linear-gradient(to bottom, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4e4e4e', endColorstr='#141414',GradientType=0 ); color: #fff; } .cactus .dgrid-header { text-transform: uppercase; } .cactus .dgrid-header .dgrid-cell { border-color: #111; font-weight: bold; } .cactus .dgrid-row-odd { background: #9a6; background-image: -webkit-linear-gradient(top, #b9cb7f 0%, #8fa05b 100%); background-image: -moz-linear-gradient(top, #b9cb7f 0%, #8fa05b 100%); background-image: -o-linear-gradient(top, #b9cb7f 0%, #8fa05b 100%); background-image: -ms-linear-gradient(top, #b9cb7f 0%, #8fa05b 100%); background-image: linear-gradient(to bottom, #b9cb7f 0%, #8fa05b 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#b9cb7f', endColorstr='#8fa05b',GradientType=0 ); color: #fff; } .cactus .dgrid-row:hover { background: none; background-color: #555; filter: none; border-color: #555; color: #fff; } .cactus .dgrid-selected { background: none; background-color: #333; filter: none; border-color: #333; color: #fff; } .cactus .dgrid-selected:hover { background: #333; border-color: #333; } .cactus .dgrid-highlight { background: none; background-color: #d6e5a5; filter: none; color: #000; } .cactus .dgrid-cell { border-color: #bbc581; } .cactus .dgrid-cell { border-left: none; border-right: none; } .cactus .dgrid-sort-arrow { background-image: url("../images/ui-icons_ffffff_256x240.png"); } .cactus .dgrid-header .dojoDndItemBefore { border-left: 2px dotted #fff !important; } .cactus .dgrid-header .dojoDndItemAfter { border-right: 2px dotted #fff !important; } .cactus .dgrid-header-row { border-bottom: none; } .cactus .dgrid-header .dgrid-cell { padding: 7px 3px; text-shadow: 0 -1px 0 rgba(0,0,0,0.9); } .cactus .dgrid-highlight { text-shadow: none; } corelib/dgrid/css/skins/cactus.styl
New file @@ -0,0 +1,65 @@ @require 'nib/gradients'; @require 'nib/vendor'; $dgrid-background ?= #faffef; $dgrid-color ?= #000; $dgrid-header-background ?= #333; $dgrid-header-background-image ?= linear-gradient(top, #4e4e4e 0%,#555555 12%,#636363 25%,#505050 39%,#303030 49%,#000000 50%,#1c1c1c 60%,#292929 76%,#1e1e1e 91%,#141414 100%); $dgrid-header-filter ?= unquote("progid:DXImageTransform.Microsoft.gradient( startColorstr='#4e4e4e', endColorstr='#141414',GradientType=0 )"); $dgrid-header-color ?= #fff; $dgrid-header-cell-border-color ?= #111; $dgrid-header-cell-font-weight ?= bold; $dgrid-header-text-transform ?= uppercase; $dgrid-body-cell-border-color ?= #bbc581; $dgrid-body-row-odd-background ?= #9a6; $dgrid-body-row-odd-background-image ?= linear-gradient(top, rgba(185,203,127,1) 0%,rgba(143,160,91,1) 100%); $dgrid-body-row-odd-filter ?= unquote("progid:DXImageTransform.Microsoft.gradient( startColorstr='#b9cb7f', endColorstr='#8fa05b',GradientType=0 )"); $dgrid-body-row-odd-border ?= 1px solid #ccd595; $dgrid-body-row-odd-color ?= #fff; $dgrid-body-cell-odd-border ?= 1px solid #e9efbd; $dgrid-body-row-even-border ?= 1px solid #fff; $dgrid-body-row-hover-background ?= none; $dgrid-body-row-hover-background-color ?= #555; $dgrid-body-row-hover-filter ?= none; $dgrid-body-row-hover-color ?= #fff; $dgrid-body-row-hover-border-color ?= $dgrid-body-row-hover-background-color; $dgrid-selected-background ?= none; $dgrid-selected-background-color ?= #333; $dgrid-selected-filter ?= none; $dgrid-selected-border-color ?= $dgrid-selected-background-color; $dgrid-selected-color ?= #fff; $dgrid-selected-hover-background ?= $dgrid-selected-background-color; $dgrid-selected-hover-border-color ?= $dgrid-selected-border-color; $dgrid-highlight-background ?= none; $dgrid-highlight-background-color ?= #d6e5a5; $dgrid-highlight-filter ?= none; $dgrid-highlight-color ?= #000; $dgrid-use-white-sort-arrow ?= true; $dgrid-suppress-cell-borders ?= true; $dgrid-column-reorder-border ?= 2px dotted #fff !important; .cactus { @import 'skin'; .dgrid-header-row { border-bottom: none; } .dgrid-header .dgrid-cell { padding: 7px 3px; text-shadow: 0 -1px 0 rgba(0,0,0,.9); } .dgrid-highlight { text-shadow: none; } } corelib/dgrid/css/skins/claro.css
New file @@ -0,0 +1,55 @@ .claro .dgrid { background: #fff; border-color: #aaa; color: #000; } .claro .dgrid-header, .claro .dgrid-footer { background: #ebf0f5; background-image: -webkit-linear-gradient(top, #ebf0f5 0%, #d5e0ea 100%); background-image: -moz-linear-gradient(top, #ebf0f5 0%, #d5e0ea 100%); background-image: -o-linear-gradient(top, #ebf0f5 0%, #d5e0ea 100%); background-image: -ms-linear-gradient(top, #ebf0f5 0%, #d5e0ea 100%); background-image: linear-gradient(to bottom, #ebf0f5 0%, #d5e0ea 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ebf0f5', endColorstr='#d5e0ea',GradientType=0 ); } .claro .dgrid-header .dgrid-cell { border-color: #bbb; font-weight: bold; } .claro .dgrid-header .dgrid-cell:hover { background: #ebf1f6; background-image: -webkit-linear-gradient(top, #fff 0%, #d2e0eb 100%); background-image: -moz-linear-gradient(top, #fff 0%, #d2e0eb 100%); background-image: -o-linear-gradient(top, #fff 0%, #d2e0eb 100%); background-image: -ms-linear-gradient(top, #fff 0%, #d2e0eb 100%); background-image: linear-gradient(to bottom, #fff 0%, #d2e0eb 100%); } .claro .dgrid-row { background: #fff url("images/row_back.png") repeat-x; -webkit-transition-duration: 0.2s; -moz-transition-duration: 0.2s; -o-transition-duration: 0.2s; -ms-transition-duration: 0.2s; transition-duration: 0.2s; -webkit-transition-property: background-color, border-color; -moz-transition-property: background-color, border-color; -o-transition-property: background-color, border-color; -ms-transition-property: background-color, border-color; transition-property: background-color, border-color; } .claro .dgrid-row:hover { background-color: #e9f2fe; } .claro .dgrid-selected { background-color: #cee6fa; } .claro .dgrid-selected:hover { background-color: #9bc6f2; } .claro .dgrid-highlight { background-color: #ff6; } .claro .dgrid-cell { border-color: #edc; } corelib/dgrid/css/skins/claro.styl
New file @@ -0,0 +1,30 @@ @require 'nib/gradients'; @require 'nib/vendor'; $dgrid-background ?= #fff; $dgrid-color ?= #000; $dgrid-border-color ?= #aaa; $dgrid-header-background ?= #ebf0f5; $dgrid-header-background-image ?= linear-gradient(top, #ebf0f5 0%,#d5e0ea 100%); $dgrid-header-filter ?= unquote("progid:DXImageTransform.Microsoft.gradient( startColorstr='#ebf0f5', endColorstr='#d5e0ea',GradientType=0 )"); $dgrid-header-cell-border-color ?= #bbb; $dgrid-header-cell-font-weight ?= bold; $dgrid-header-cell-hover-background ?= #ebf1f6; $dgrid-header-cell-hover-background-image ?= linear-gradient(top, #ffffff 0%,#d2e0eb 100%); $dgrid-body-cell-border-color ?= #edc; $dgrid-body-row-transition-duration ?= 0.2s; $dgrid-body-row-transition-property ?= unquote('background-color, border-color'); $dgrid-body-row-background ?= #fff url('images/row_back.png') repeat-x; $dgrid-body-row-hover-background-color ?= #e9f2fe; $dgrid-selected-background-color ?= #cee6fa; $dgrid-selected-hover-background-color ?= #9bc6f2; $dgrid-highlight-background-color ?= #ff6; .claro { @import 'skin'; } corelib/dgrid/css/skins/images/row_back.png
corelib/dgrid/css/skins/nihilo.css
New file @@ -0,0 +1,31 @@ .nihilo .dgrid { background: #fff; border-color: #bba; color: #000; } .nihilo .dgrid-header, .nihilo .dgrid-footer { background-color: #fff; } .nihilo .dgrid-header .dgrid-cell { border-color: #bba; font-weight: bold; } .nihilo .dgrid-row:hover { background-color: #ffe284; } .nihilo .dgrid-selected { background-color: #aec7e3; } .nihilo .dgrid-highlight { background-color: #ff6; } .nihilo .dgrid-cell { border-color: #ddc; } .nihilo .dgrid-header .dgrid-cell { border-right-color: #acab99; } .nihilo .dgrid-footer { border-top: 1px solid #919191; } corelib/dgrid/css/skins/nihilo.styl
New file @@ -0,0 +1,31 @@ $dgrid-border-color ?= #bba; $dgrid-background ?= #fff; $dgrid-color ?= #000; $dgrid-header-background-color ?= #fff; $dgrid-header-cell-border-color ?= #bba; $dgrid-header-cell-font-weight ?= bold; $dgrid-body-cell-border-color ?= #ddc; $dgrid-body-row-hover-background-color ?= #ffe284; $dgrid-selected-background-color ?= #aec7e3; $dgrid-highlight-background-color ?= #ff6; $dgrid-header-cell-border-right-color ?= #acab99; $dgrid-footer-border-color ?= #919191; .nihilo { @import 'skin'; .dgrid-header { .dgrid-cell { border-right-color: $dgrid-header-cell-border-right-color; } } .dgrid-footer { border-top: 1px solid $dgrid-footer-border-color; } } corelib/dgrid/css/skins/sage.css
New file @@ -0,0 +1,72 @@ .sage .dgrid { background: #fff; color: #000; } .sage .dgrid-header, .sage .dgrid-footer { background: #333; background-image: -webkit-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: -moz-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: -o-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: -ms-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: linear-gradient(to bottom, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4e4e4e', endColorstr='#141414',GradientType=0 ); color: #fff; } .sage .dgrid-header { text-transform: uppercase; } .sage .dgrid-header .dgrid-cell { border-color: #111; font-weight: bold; } .sage .dgrid-row { -webkit-transition-duration: 0.1s; -moz-transition-duration: 0.1s; -o-transition-duration: 0.1s; -ms-transition-duration: 0.1s; transition-duration: 0.1s; -webkit-transition-property: background-color, border-color; -moz-transition-property: background-color, border-color; -o-transition-property: background-color, border-color; -ms-transition-property: background-color, border-color; transition-property: background-color, border-color; } .sage .dgrid-row-odd { background: #f2f7e8; } .sage .dgrid-row:hover { background-color: #c5dca6; color: #333; } .sage .dgrid-selected { background-color: #b3d18b; } .sage .dgrid-selected:hover { background-color: #b3d18b; } .sage .dgrid-highlight { background: #d5e8bd; } .sage .dgrid-cell { border-color: #bbc581; } .sage .dgrid-cell { border-left: none; border-right: none; } .sage .dgrid-sort-arrow { background-image: url("../images/ui-icons_ffffff_256x240.png"); } .sage .dgrid-header .dojoDndItemBefore { border-left: 2px dotted #fff !important; } .sage .dgrid-header .dojoDndItemAfter { border-right: 2px dotted #fff !important; } .sage .dgrid-header-row { border-bottom: none; } .sage .dgrid-header .dgrid-cell { padding: 7px 3px; } corelib/dgrid/css/skins/sage.styl
New file @@ -0,0 +1,45 @@ @require 'nib/gradients'; @require 'nib/vendor'; $dgrid-background ?= #fff; $dgrid-color ?= #000; $dgrid-header-background ?= #333; $dgrid-header-background-image ?= linear-gradient(top, #4e4e4e 0%,#555555 12%,#636363 25%,#505050 39%,#303030 49%,#000000 50%,#1c1c1c 60%,#292929 76%,#1e1e1e 91%,#141414 100%); $dgrid-header-filter ?= unquote("progid:DXImageTransform.Microsoft.gradient( startColorstr='#4e4e4e', endColorstr='#141414',GradientType=0 )"); $dgrid-header-color ?= #fff; $dgrid-header-text-transform ?= uppercase; $dgrid-header-cell-border-color ?= #111; $dgrid-header-cell-font-weight ?= bold; $dgrid-body-cell-border-color ?= #bbc581; $dgrid-body-row-transition-duration ?= 0.1s; $dgrid-body-row-transition-property ?= unquote('background-color, border-color'); $dgrid-body-row-odd-background ?= #f2f7e8; $dgrid-body-row-hover-background-color ?= #c5dca6; $dgrid-body-row-hover-color ?= #333; $dgrid-selected-background-color ?= #b3d18b; $dgrid-selected-hover-background-color ?= $dgrid-selected-background-color; $dgrid-highlight-background ?= #d5e8bd; $dgrid-use-white-sort-arrow ?= true; $dgrid-suppress-cell-borders ?= true; $dgrid-column-reorder-border ?= 2px dotted #fff !important; .sage { @import 'skin'; .dgrid-header-row { border-bottom: none; } .dgrid-header .dgrid-cell { padding: 7px 3px; } } corelib/dgrid/css/skins/skin.styl
New file @@ -0,0 +1,96 @@ @require 'nib/gradients'; @require 'nib/vendor'; addStyleIfDefined($property, $varname) { $value = lookup($varname); {$property}: $value if ($value); } applyVariables(name) { // Applies variables (if defined) with a given prefix for several common styles. // Used to implement variables for header/footer and various row states while avoiding repetition. addStyleIfDefined(background, '$dgrid-' + name + '-background'); addStyleIfDefined(background-color, '$dgrid-' + name + '-background-color'); addStyleIfDefined(background-image, '$dgrid-' + name + '-background-image'); addStyleIfDefined(filter, '$dgrid-' + name + '-filter'); addStyleIfDefined(border-color, '$dgrid-' + name + '-border-color'); addStyleIfDefined(color, '$dgrid-' + name + '-color'); } .dgrid { background: $dgrid-background if ($dgrid-background is defined); border-color: $dgrid-border-color if ($dgrid-border-color is defined); color: $dgrid-color if ($dgrid-color is defined); } .dgrid-header, .dgrid-footer { applyVariables(header); } .dgrid-header { text-transform: $dgrid-header-text-transform if ($dgrid-header-text-transform is defined); .dgrid-cell { border-color: $dgrid-header-cell-border-color if ($dgrid-header-cell-border-color is defined); font-weight: $dgrid-header-cell-font-weight if ($dgrid-header-cell-font-weight is defined); &:hover { if ($dgrid-header-cell-hover-background is defined) { background: $dgrid-header-cell-hover-background; } if ($dgrid-header-cell-hover-background-image is defined) { background-image: $dgrid-header-cell-hover-background-image; } } } } .dgrid-row { applyVariables(body-row); transition-duration: $dgrid-body-row-transition-duration if ($dgrid-body-row-transition-duration is defined); transition-property: $dgrid-body-row-transition-property if ($dgrid-body-row-transition-property is defined); } .dgrid-row-odd { applyVariables(body-row-odd); } .dgrid-row:hover { applyVariables(body-row-hover); } .dgrid-selected { applyVariables(selected); } .dgrid-selected:hover { applyVariables(selected-hover); } .dgrid-highlight { applyVariables(highlight); } .dgrid-cell { border-color: $dgrid-body-cell-border-color if ($dgrid-body-cell-border-color is defined); } if ($dgrid-suppress-cell-borders == true) { .dgrid-cell { border-left: none; border-right: none; } } if ($dgrid-use-white-sort-arrow == true) { .dgrid-sort-arrow { background-image: url('../images/ui-icons_ffffff_256x240.png'); } } if ($dgrid-column-reorder-border is defined) { .dgrid-header .dojoDndItemBefore { border-left: $dgrid-column-reorder-border; } .dgrid-header .dojoDndItemAfter { border-right: $dgrid-column-reorder-border; } } corelib/dgrid/css/skins/slate.css
New file @@ -0,0 +1,54 @@ .slate .dgrid { background: #fff; color: #000; } .slate .dgrid-header, .slate .dgrid-footer { background: #333; background-image: -webkit-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: -moz-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: -o-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: -ms-linear-gradient(top, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); background-image: linear-gradient(to bottom, #4e4e4e 0%, #555 12%, #636363 25%, #505050 39%, #303030 49%, #000 50%, #1c1c1c 60%, #292929 76%, #1e1e1e 91%, #141414 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4e4e4e', endColorstr='#141414',GradientType=0 ); color: #fff; } .slate .dgrid-header { text-transform: uppercase; } .slate .dgrid-header .dgrid-cell { border-color: #111; font-weight: bold; } .slate .dgrid-row-odd { background: #f7f7f7; } .slate .dgrid-row:hover { background-color: #ddd; } .slate .dgrid-selected { background-color: #555; color: #fff; } .slate .dgrid-selected:hover { background-color: #555; color: #fff; } .slate .dgrid-highlight { background: #999; } .slate .dgrid-sort-arrow { background-image: url("../images/ui-icons_ffffff_256x240.png"); } .slate .dgrid-header .dojoDndItemBefore { border-left: 2px dotted #fff !important; } .slate .dgrid-header .dojoDndItemAfter { border-right: 2px dotted #fff !important; } .slate .dgrid-header-row { border-bottom: none; } .slate .dgrid-header .dgrid-cell { padding: 7px 3px; } corelib/dgrid/css/skins/slate.styl
New file @@ -0,0 +1,40 @@ @require 'nib/gradients'; @require 'nib/vendor'; $dgrid-background ?= #fff; $dgrid-color ?= #000; $dgrid-header-background ?= #333; $dgrid-header-background-image ?= linear-gradient(top, #4e4e4e 0%,#555555 12%,#636363 25%,#505050 39%,#303030 49%,#000000 50%,#1c1c1c 60%,#292929 76%,#1e1e1e 91%,#141414 100%); $dgrid-header-filter ?= unquote("progid:DXImageTransform.Microsoft.gradient( startColorstr='#4e4e4e', endColorstr='#141414',GradientType=0 )"); $dgrid-header-color ?= #fff; $dgrid-header-text-transform ?= uppercase; $dgrid-header-cell-border-color ?= #111; $dgrid-header-cell-font-weight ?= bold; $dgrid-body-row-odd-background ?= #f7f7f7; $dgrid-body-row-hover-background-color ?= #ddd; $dgrid-selected-background-color ?= #555; $dgrid-selected-color ?= #fff; $dgrid-selected-hover-background-color ?= $dgrid-selected-background-color; $dgrid-selected-hover-color ?= $dgrid-selected-color; $dgrid-highlight-background ?= #999; $dgrid-column-reorder-border ?= 2px dotted #fff !important; $dgrid-use-white-sort-arrow ?= true; .slate { @import 'skin'; .dgrid-header-row { border-bottom: none; } .dgrid-header .dgrid-cell { padding: 7px 3px; } } corelib/dgrid/css/skins/soria.css
New file @@ -0,0 +1,39 @@ .soria .dgrid { background: #fff; border-color: #bba; color: #000; } .soria .dgrid-header, .soria .dgrid-footer { background: #f2f4fe; background-image: -webkit-linear-gradient(top, #f2f4fe 0%, #d0dff5 50%, #c6d8f0 51%, #c2d5ef 100%); background-image: -moz-linear-gradient(top, #f2f4fe 0%, #d0dff5 50%, #c6d8f0 51%, #c2d5ef 100%); background-image: -o-linear-gradient(top, #f2f4fe 0%, #d0dff5 50%, #c6d8f0 51%, #c2d5ef 100%); background-image: -ms-linear-gradient(top, #f2f4fe 0%, #d0dff5 50%, #c6d8f0 51%, #c2d5ef 100%); background-image: linear-gradient(to bottom, #f2f4fe 0%, #d0dff5 50%, #c6d8f0 51%, #c2d5ef 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2f4fe', endColorstr='#c2d5ef',GradientType=0 ); } .soria .dgrid-header .dgrid-cell { border-color: #bba; font-weight: bold; } .soria .dgrid-header .dgrid-cell:hover { background: #d4deec; background-image: -webkit-linear-gradient(top, #dae2ed 0%, #b2c7e8 49%, #a8c1eb 50%, #9ebaec 100%); background-image: -moz-linear-gradient(top, #dae2ed 0%, #b2c7e8 49%, #a8c1eb 50%, #9ebaec 100%); background-image: -o-linear-gradient(top, #dae2ed 0%, #b2c7e8 49%, #a8c1eb 50%, #9ebaec 100%); background-image: -ms-linear-gradient(top, #dae2ed 0%, #b2c7e8 49%, #a8c1eb 50%, #9ebaec 100%); background-image: linear-gradient(to bottom, #dae2ed 0%, #b2c7e8 49%, #a8c1eb 50%, #9ebaec 100%); } .soria .dgrid-row:hover { background-color: #60a1ea; } .soria .dgrid-selected { background-color: #aec7e3; } .soria .dgrid-highlight { background-color: #ff6; } .soria .dgrid-cell { border-color: #ddc; } corelib/dgrid/css/skins/soria.styl
New file @@ -0,0 +1,25 @@ @require 'nib/gradients'; @require 'nib/vendor'; $dgrid-border-color ?= #bba; $dgrid-background ?= #fff; $dgrid-color ?= #000; $dgrid-header-background ?= #f2f4fe; $dgrid-header-background-image ?= linear-gradient(top, #f2f4fe 0%,#d0dff5 50%,#c6d8f0 51%,#c2d5ef 100%); $dgrid-header-filter ?= unquote("progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2f4fe', endColorstr='#c2d5ef',GradientType=0 )"); $dgrid-header-cell-border-color ?= #bba; $dgrid-header-cell-font-weight ?= bold; $dgrid-header-cell-hover-background ?= #d4deec; $dgrid-header-cell-hover-background-image ?= linear-gradient(top, #dae2ed 0%,#b2c7e8 49%,#a8c1eb 50%,#9ebaec 100%); $dgrid-body-cell-border-color ?= #ddc; $dgrid-body-row-hover-background-color ?= #60a1ea; $dgrid-selected-background-color ?= #aec7e3; $dgrid-highlight-background-color ?= #ff6; .soria { @import 'skin'; } corelib/dgrid/css/skins/tundra.css
New file @@ -0,0 +1,39 @@ .tundra .dgrid { background: #fff; border-color: #bba; color: #000; } .tundra .dgrid-header, .tundra .dgrid-footer { background: #e8e8e8; background-image: -webkit-linear-gradient(top, #fff 0%, #e8e8e8 100%); background-image: -moz-linear-gradient(top, #fff 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #fff 0%, #e8e8e8 100%); background-image: -ms-linear-gradient(top, #fff 0%, #e8e8e8 100%); background-image: linear-gradient(to bottom, #fff 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#e8e8e8',GradientType=0 ); } .tundra .dgrid-header .dgrid-cell { border-color: #bba; font-weight: bold; } .tundra .dgrid-header .dgrid-cell:hover { background: #f6f6f6; background-image: -webkit-linear-gradient(top, #fff 0%, #eee 100%); background-image: -moz-linear-gradient(top, #fff 0%, #eee 100%); background-image: -o-linear-gradient(top, #fff 0%, #eee 100%); background-image: -ms-linear-gradient(top, #fff 0%, #eee 100%); background-image: linear-gradient(to bottom, #fff 0%, #eee 100%); } .tundra .dgrid-row:hover { background-color: #60a1ea; } .tundra .dgrid-selected { background-color: #aec7e3; } .tundra .dgrid-highlight { background-color: #ff6; } .tundra .dgrid-cell { border-color: #ddc; } corelib/dgrid/css/skins/tundra.styl
New file @@ -0,0 +1,25 @@ @require 'nib/gradients'; @require 'nib/vendor'; $dgrid-background ?= #fff; $dgrid-color ?= #000; $dgrid-border-color ?= #bba; $dgrid-header-background ?= #e8e8e8; $dgrid-header-background-image ?= linear-gradient(top, #ffffff 0%,#e8e8e8 100%); $dgrid-header-filter ?= unquote("progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#e8e8e8',GradientType=0 )"); $dgrid-header-cell-border-color ?= #bba; $dgrid-header-cell-font-weight ?= bold; $dgrid-header-cell-hover-background ?= #f6f6f6; $dgrid-header-cell-hover-background-image ?= linear-gradient(top, #ffffff 0%,#eeeeee 100%); $dgrid-body-cell-border-color ?= #ddc; $dgrid-body-row-hover-background-color ?= #60a1ea; $dgrid-selected-background-color ?= #aec7e3; $dgrid-highlight-background-color ?= #ff6; .tundra { @import 'skin'; } corelib/dgrid/demos/dTuned/dTuned.js
New file @@ -0,0 +1,247 @@ define([ 'require', 'dgrid/List', 'dgrid/OnDemandGrid', 'dgrid/Selection', 'dgrid/Keyboard', 'dgrid/extensions/ColumnHider', 'dojo/_base/declare', 'dojo/_base/array', 'dojo/dom-construct', 'dojo/Stateful', 'dojo/when', 'dstore/RequestMemory', 'dojo/domReady!' ], function (require, List, Grid, Selection, Keyboard, Hider, declare, arrayUtil, domConstruct, Stateful, when, RequestMemory) { // Create DOM var headerNode = domConstruct.create('div', { id: 'header' }); var listNode = domConstruct.create('div', { id: 'list-container' }); var genresNode = domConstruct.create('div', { id: 'genres' }, listNode); var artistsNode = domConstruct.create('div', { id: 'artists' }, listNode); var albumsNode = domConstruct.create('div', { id: 'albums' }, listNode); var gridNode = domConstruct.create('div', { id: 'grid' }); // Use require.toUrl for portability (looking up via module path) var songStore = new RequestMemory({ target: require.toUrl('./data.json') }); domConstruct.create('div', { id: 'header-content', innerHTML: 'dTuned' }, headerNode); arrayUtil.forEach([ headerNode, listNode, gridNode ], function (node) { document.body.appendChild(node); }); // a formatting function for the Duration column. function timeFormatter(t) { var tmp = parseInt(t, 10); var min; var sec; if (isNaN(tmp)) { return t; } min = Math.floor(tmp / 60); sec = tmp % 60; // don't forget to pad seconds. return '' + min + ':' + (sec < 10 ? '0' : '') + sec; } function unique(arr) { // Create a unique list of items from the passed array // (removing duplicates). var ret = []; // First, set up a hashtable for unique objects. var obj = {}; for (var i = 0, l = arr.length; i < l; i++) { if (!(arr[i] in obj)) { obj[arr[i]] = true; } } // Now push the unique objects back into an array, and return it. for (var p in obj) { ret.push(p); } ret.sort(); return ret; } function pickField(fieldName) { return function (object) { return object[fieldName]; }; } // Create the main grid to appear below the genre/artist/album lists. var grid = new (declare([Grid, Selection, Keyboard, Hider]))({ collection: songStore, columns: { name: 'Name', time: { label: 'Duration', formatter: timeFormatter }, year: 'Year', artist: 'Artist', album: 'Album', genre: 'Genre' } }, gridNode); // define a List constructor with the features we want mixed in, // for use by the three lists in the top region var TunesList = declare([List, Selection, Keyboard], { selectionMode: 'single' }); // define our three lists for the top. var genresList = new TunesList({}, genresNode); var artistsList = new TunesList({}, artistsNode); var albumsList = new TunesList({}, albumsNode); // create the unique lists and render them var genres, artists, albums; songStore.fetch().then(function (songs) { genres = unique(arrayUtil.map(songs, pickField('genre'))); artists = unique(arrayUtil.map(songs, pickField('artist'))); albums = unique(arrayUtil.map(songs, pickField('album'))); genres.unshift('All (' + genres.length + ' Genre' + (genres.length !== 1 ? 's' : '') + ')'); artists.unshift('All (' + artists.length + ' Artist' + (artists.length !== 1 ? 's' : '') + ')'); albums.unshift('All (' + albums.length + ' Album' + (albums.length !== 1 ? 's' : '') + ')'); genresList.renderArray(genres); artistsList.renderArray(artists); albumsList.renderArray(albums); }); // As items are selected in each of the genre, artist, and album dgrid lists the // associated value will be set on this stateful object so the main grid can // watch for updates and filter accordingly var gridFilter = new Stateful(); // This function is used further down by the select handler for the artists list. // It builds a filtered list of album names depending on the selected genre and artist. function getFilteredAlbumList(gridFilter, songStore, selectedArtist) { var filterOptions = {}; if (gridFilter.get('genre')) { filterOptions.genre = gridFilter.get('genre'); } if (selectedArtist) { filterOptions.artist = selectedArtist; } return songStore.filter(filterOptions).fetch().then(function (filteredObjects) { var list = unique(arrayUtil.map(filteredObjects, pickField('album'))); list.unshift('All (' + list.length + ' Album' + (list.length !== 1 ? 's' : '') + ')'); return list; }); } gridFilter.watch(function () { var filter; if (this.genre || this.artist || this.album) { filter = {}; if (this.genre) { filter.genre = this.genre; } if (this.artist) { filter.artist = this.artist; } if (this.album) { filter.album = this.album; } grid.set('collection', songStore.filter(filter)); } else { if (grid.collection !== songStore) { grid.set('collection', songStore); } } }); // start listening for selections on the lists. genresList.on('dgrid-select', function (event) { // filter the albums, artists and grid var row = event.rows[0]; var selectedGenre = row.data; var filteredArtistList; if (row.id === '0') { // remove filtering gridFilter.set('genre', undefined); filteredArtistList = artists; } else { gridFilter.set('genre', selectedGenre); // filter the store on the current genre filteredArtistList = songStore.filter({ genre: selectedGenre }).fetch().then(function (filteredObjects) { // map the full album objects to a unique array of artist names (strings) var list = unique(arrayUtil.map(filteredObjects, pickField('artist'))); // add the "All" option at the top list.unshift('All (' + list.length + ' Artist' + (list.length !== 1 ? 's' : '') + ')'); return list; }); } when(filteredArtistList, function (list) { artistsList.refresh(); // clear contents artistsList.renderArray(list); artistsList.select('0'); // reselect "all", triggering albums+grid refresh }); }); artistsList.on('dgrid-select', function (event) { // filter the albums, grid var row = event.rows[0]; var selectedArtist = row.data; var filteredAlbumList; if (row.id === '0') { gridFilter.set('artist', undefined); if (gridFilter.get('genre')) { // filter only by genre filteredAlbumList = getFilteredAlbumList(gridFilter, songStore); } else { // remove filtering entirely filteredAlbumList = albums; } } else { // create filter based on artist gridFilter.set('artist', selectedArtist); filteredAlbumList = getFilteredAlbumList(gridFilter, songStore, selectedArtist); } when(filteredAlbumList, function (list) { albumsList.refresh(); // clear contents albumsList.renderArray(list); albumsList.select('0'); // reselect "all" item, triggering grid refresh }); }); albumsList.on('dgrid-select', function (event) { // filter the grid var row = event.rows[0]; var selectedAlbum = row.data; if (row.id === '0') { // show all albums gridFilter.set('album', undefined); } else { gridFilter.set('album', selectedAlbum); } }); // set the initial selections on the lists. genresList.select('0'); }); corelib/dgrid/demos/dTuned/data.json
New file @@ -0,0 +1,124 @@ [ {"id": "1", "name": "Grind", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 284, "trackNumber": 1, "year": 1995}, {"id": "2", "name": "Brush Away", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 202, "trackNumber": 2, "year": 1995}, {"id": "3", "name": "Sludge Factory", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 432, "trackNumber": 3, "year": 1995}, {"id": "4", "name": "Heaven Beside You", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 327, "trackNumber": 4, "year": 1995}, {"id": "5", "name": "Head Creeps", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 388, "trackNumber": 5, "year": 1995}, {"id": "6", "name": "Again", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 245, "trackNumber": 6, "year": 1995}, {"id": "7", "name": "Shame In You", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 335, "trackNumber": 7, "year": 1995}, {"id": "8", "name": "God Am", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 248, "trackNumber": 8, "year": 1995}, {"id": "9", "name": "So Close", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 165, "trackNumber": 9, "year": 1995}, {"id": "10", "name": "Nothin' Song", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 340, "trackNumber": 10, "year": 1995}, {"id": "11", "name": "Frogs", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 498, "trackNumber": 11, "year": 1995}, {"id": "12", "name": "Over Now", "artist": "Alice In Chains", "album": "Alice In Chains", "genre": "Alternative", "time": 423, "trackNumber": 12, "year": 1995}, {"id": "13", "name": "Man In the Box", "artist": "Alice In Chains", "album": "Facelift", "genre": "Alternative", "time": 284, "trackNumber": 2, "year": 1990}, {"id": "14", "name": "Get Born Again", "artist": "Alice In Chains", "album": "Music Bank", "genre": "Alternative", "time": 324, "trackNumber": 1, "year": 1999}, {"id": "15", "name": "Tempting Time", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 323, "trackNumber": 1, "year": 2009}, {"id": "16", "name": "Soraya", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 266, "trackNumber": 2, "year": 2009}, {"id": "17", "name": "Thoroughly At Home", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 241, "trackNumber": 3, "year": 2009}, {"id": "18", "name": "On Impulse", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 369, "trackNumber": 4, "year": 2009}, {"id": "19", "name": "Tessitura", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 66, "trackNumber": 5, "year": 2009}, {"id": "20", "name": "Behaving Badly", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 266, "trackNumber": 6, "year": 2009}, {"id": "21", "name": "The Price of Everything and the Value of Nothing", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 332, "trackNumber": 7, "year": 2009}, {"id": "22", "name": "CAFO", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 401, "trackNumber": 8, "year": 2009}, {"id": "23", "name": "Inamorata", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 368, "trackNumber": 9, "year": 2009}, {"id": "24", "name": "Point to Point", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 104, "trackNumber": 10, "year": 2009}, {"id": "25", "name": "Modern Meat", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 126, "trackNumber": 11, "year": 2009}, {"id": "26", "name": "Song of Solomon", "artist": "Animals As Leaders", "album": "Animals As Leaders", "genre": "Rock", "time": 256, "trackNumber": 12, "year": 2009}, {"id": "27", "name": "Hunter", "artist": "Bjork", "album": "Homogenic", "genre": "Electronica", "time": 255, "trackNumber": 1, "year": 1997}, {"id": "28", "name": "J\u00c3\u00b2ga", "artist": "Bjork", "album": "Homogenic", "genre": "Electronica", "time": 305, "trackNumber": 2, "year": 1997}, {"id": "29", "name": "Unravel", "artist": "Bjork", "album": "Homogenic", "genre": "Electronica", "time": 201, "trackNumber": 3, "year": 1997}, {"id": "30", "name": "Bachelorette", "artist": "Bjork", "album": "Homogenic", "genre": "Electronica", "time": 312, "trackNumber": 4, "year": 1997}, {"id": "31", "name": "All Neon Like", "artist": "Bjork", "album": "Homogenic", "genre": "Electronica", "time": 352, "trackNumber": 5, "year": 1997}, {"id": "32", "name": "5 Years", "artist": "Bjork", "album": "Homogenic", "genre": "Electronica", "time": 268, "trackNumber": 6, "year": 1997}, {"id": "33", "name": "Immature", "artist": "Bjork", "album": "Homogenic", "genre": "Electronica", "time": 186, "trackNumber": 7, "year": 1997}, {"id": "34", "name": "Alarm Call", "artist": "Bjork", "album": "Homogenic", "genre": "Electronica", "time": 259, "trackNumber": 8, "year": 1997}, {"id": "35", "name": "Pluto", "artist": "Bjork", "album": "Homogenic", "genre": "Electronica", "time": 199, "trackNumber": 9, "year": 1997}, {"id": "36", "name": "All Is Full of Love", "artist": "Bjork", "album": "Homogenic", "genre": "Electronica", "time": 272, "trackNumber": 10, "year": 1997}, {"id": "37", "name": "Sunday", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 285, "trackNumber": 1, "year": 2002}, {"id": "38", "name": "Cactus", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 174, "trackNumber": 2, "year": 2002}, {"id": "39", "name": "Slip Away", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 364, "trackNumber": 3, "year": 2002}, {"id": "40", "name": "Slow Burn", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 281, "trackNumber": 4, "year": 2002}, {"id": "41", "name": "Afraid", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 208, "trackNumber": 5, "year": 2002}, {"id": "42", "name": "I've Been Waiting For You", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 180, "trackNumber": 6, "year": 2002}, {"id": "43", "name": "I Would Be Your Slave", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 313, "trackNumber": 7, "year": 2002}, {"id": "44", "name": "I Took A Trip On A Gemini Spaceship", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 246, "trackNumber": 8, "year": 2002}, {"id": "45", "name": "5:15 The Angels Have Gone", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 301, "trackNumber": 9, "year": 2002}, {"id": "46", "name": "Everyone Says 'Hi'", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 237, "trackNumber": 10, "year": 2002}, {"id": "47", "name": "A Better Future", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 251, "trackNumber": 11, "year": 2002}, {"id": "48", "name": "Heathen (The Rays)", "artist": "David Bowie", "album": "Heathen", "genre": "Progressive Rock", "time": 256, "trackNumber": 12, "year": 2002}, {"id": "49", "name": "The New Bison", "artist": "Happy Apple", "album": "Happy Apple Back On Top", "genre": "Jazz", "time": 290, "trackNumber": 1, "year": 2007}, {"id": "50", "name": "Very Small Rock", "artist": "Happy Apple", "album": "Happy Apple Back On Top", "genre": "Jazz", "time": 300, "trackNumber": 2, "year": 2007}, {"id": "51", "name": "1996 A.D.", "artist": "Happy Apple", "album": "Happy Apple Back On Top", "genre": "Jazz", "time": 274, "trackNumber": 3, "year": 2007}, {"id": "52", "name": "Rise! Marc Anthony", "artist": "Happy Apple", "album": "Happy Apple Back On Top", "genre": "Jazz", "time": 432, "trackNumber": 4, "year": 2007}, {"id": "53", "name": "Calgon for Hetfield", "artist": "Happy Apple", "album": "Happy Apple Back On Top", "genre": "Jazz", "time": 325, "trackNumber": 5, "year": 2007}, {"id": "54", "name": "Lefse los Cubanos", "artist": "Happy Apple", "album": "Happy Apple Back On Top", "genre": "Jazz", "time": 337, "trackNumber": 6, "year": 2007}, {"id": "55", "name": "He's OK", "artist": "Happy Apple", "album": "Happy Apple Back On Top", "genre": "Jazz", "time": 379, "trackNumber": 7, "year": 2007}, {"id": "56", "name": "Brown Lights", "artist": "Happy Apple", "album": "Happy Apple Back On Top", "genre": "Jazz", "time": 431, "trackNumber": 8, "year": 2007}, {"id": "57", "name": "Hence the Turtleneck", "artist": "Happy Apple", "album": "Happy Apple Back On Top", "genre": "Jazz", "time": 331, "trackNumber": 9, "year": 2007}, {"id": "58", "name": "Most Popular to Succeed", "artist": "Happy Apple", "album": "Happy Apple Back On Top", "genre": "Jazz", "time": 545, "trackNumber": 10, "year": 2007}, {"id": "59", "name": "Density In Dan's Fan City", "artist": "Happy Apple", "album": "Happy Apple Back On Top", "genre": "Jazz", "time": 424, "trackNumber": 11, "year": 2007}, {"id": "60", "name": "Take Wes Chandler For Instance", "artist": "Happy Apple", "album": "Please Refrain From Fronting", "genre": "Jazz", "time": 329, "trackNumber": 1, "year": 2001}, {"id": "61", "name": "You & Mattel Vs Me & Coleco", "artist": "Happy Apple", "album": "Please Refrain From Fronting", "genre": "Jazz", "time": 332, "trackNumber": 2, "year": 2001}, {"id": "62", "name": "Who Is Your Midwest Representation?", "artist": "Happy Apple", "album": "Please Refrain From Fronting", "genre": "Jazz", "time": 179, "trackNumber": 3, "year": 2001}, {"id": "63", "name": "November", "artist": "Happy Apple", "album": "Please Refrain From Fronting", "genre": "Jazz", "time": 337, "trackNumber": 4, "year": 2001}, {"id": "64", "name": "The Invasion Has Become", "artist": "Happy Apple", "album": "Please Refrain From Fronting", "genre": "Jazz", "time": 358, "trackNumber": 5, "year": 2001}, {"id": "65", "name": "A Waltz For The Few Remaining", "artist": "Happy Apple", "album": "Please Refrain From Fronting", "genre": "Jazz", "time": 478, "trackNumber": 6, "year": 2001}, {"id": "66", "name": "Homage Ritchie Valens", "artist": "Happy Apple", "album": "Please Refrain From Fronting", "genre": "Jazz", "time": 315, "trackNumber": 7, "year": 2001}, {"id": "67", "name": "Acknowledge The Ascot", "artist": "Happy Apple", "album": "Please Refrain From Fronting", "genre": "Jazz", "time": 540, "trackNumber": 8, "year": 2001}, {"id": "68", "name": "Koala Bear Wearing A T-Shirt With Your Corporate Logo", "artist": "Happy Apple", "album": "Please Refrain From Fronting", "genre": "Jazz", "time": 245, "trackNumber": 9, "year": 2001}, {"id": "69", "name": "Buffalo '98", "artist": "Happy Apple", "album": "Please Refrain From Fronting", "genre": "Jazz", "time": 793, "trackNumber": 10, "year": 2001}, {"id": "70", "name": "Long Live Rock & Roll", "artist": "Happy Apple", "album": "Please Refrain From Fronting", "genre": "Jazz", "time": 170, "trackNumber": 11, "year": 2001}, {"id": "71", "name": "Take a Bow", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 275, "trackNumber": 1, "year": 2006}, {"id": "72", "name": "Starlight", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 239, "trackNumber": 2, "year": 2006}, {"id": "73", "name": "Supermassive Black Hole", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 210, "trackNumber": 3, "year": 2006}, {"id": "74", "name": "Map of the Problematique", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 258, "trackNumber": 4, "year": 2006}, {"id": "75", "name": "Soldier's Poem", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 124, "trackNumber": 5, "year": 2006}, {"id": "76", "name": "Invincible", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 300, "trackNumber": 6, "year": 2006}, {"id": "77", "name": "Assassin", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 211, "trackNumber": 7, "year": 2006}, {"id": "78", "name": "Exo-Politics", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 233, "trackNumber": 8, "year": 2006}, {"id": "79", "name": "City of Delusion", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 288, "trackNumber": 9, "year": 2006}, {"id": "80", "name": "Hoodoo", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 223, "trackNumber": 10, "year": 2006}, {"id": "81", "name": "Knights of Cydonia", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 367, "trackNumber": 11, "year": 2006}, {"id": "82", "name": "Glorious", "artist": "Muse", "album": "Black Holes and Revelations", "genre": "Alternative", "time": 281, "trackNumber": 12, "year": 2006}, {"id": "83", "name": "Rolling", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 216, "trackNumber": 1, "year": ""}, {"id": "84", "name": "Misinformed", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 204, "trackNumber": 2, "year": ""}, {"id": "85", "name": "Circles", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 186, "trackNumber": 3, "year": ""}, {"id": "86", "name": "Blame", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 300, "trackNumber": 4, "year": ""}, {"id": "87", "name": "St. Louise Is Listening", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 268, "trackNumber": 5, "year": ""}, {"id": "88", "name": "Maybe I'll Come Down", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 272, "trackNumber": 6, "year": ""}, {"id": "89", "name": "Houston", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 243, "trackNumber": 7, "year": ""}, {"id": "90", "name": "$300", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 187, "trackNumber": 8, "year": ""}, {"id": "91", "name": "Fully Retractable", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 205, "trackNumber": 9, "year": ""}, {"id": "92", "name": "Monster Man", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 256, "trackNumber": 10, "year": ""}, {"id": "93", "name": "Pensacola", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 255, "trackNumber": 11, "year": ""}, {"id": "94", "name": "I Miss the Girl", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 243, "trackNumber": 12, "year": ""}, {"id": "95", "name": "So Far I Have Not Found the Sc", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 173, "trackNumber": 13, "year": ""}, {"id": "96", "name": "The Incumbent", "artist": "Soul Coughing", "album": "El Oso", "genre": "Indie", "time": 406, "trackNumber": 14, "year": ""}, {"id": "97", "name": "Futures", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 229, "trackNumber": 1, "year": 2006}, {"id": "98", "name": "Throw it all away", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 320, "trackNumber": 2, "year": 2006}, {"id": "99", "name": "Seeing things", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 309, "trackNumber": 3, "year": 2006}, {"id": "100", "name": "The pageant of the bizarre", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 261, "trackNumber": 4, "year": 2006}, {"id": "101", "name": "You're my flame", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 195, "trackNumber": 5, "year": 2006}, {"id": "102", "name": "Left behind", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 75, "trackNumber": 6, "year": 2006}, {"id": "103", "name": "Today", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 243, "trackNumber": 7, "year": 2006}, {"id": "104", "name": "This fine social scene", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 267, "trackNumber": 8, "year": 2006}, {"id": "105", "name": "Your place", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 361, "trackNumber": 9, "year": 2006}, {"id": "106", "name": "If I can't have you", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 202, "trackNumber": 10, "year": 2006}, {"id": "107", "name": "Crosses", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 399, "trackNumber": 11, "year": 2006}, {"id": "108", "name": "Waiting to die", "artist": "Zero 7", "album": "The Garden", "genre": "Trip-Hop", "time": 219, "trackNumber": 12, "year": 2006}, {"id": "109", "name": "I Have Seen", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 307, "trackNumber": 1, "year": 2001}, {"id": "110", "name": "Polaris", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 288, "trackNumber": 2, "year": 2001}, {"id": "111", "name": "Destiny", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 337, "trackNumber": 3, "year": 2001}, {"id": "112", "name": "Give It Away", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 317, "trackNumber": 4, "year": 2001}, {"id": "113", "name": "Simple Things", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 264, "trackNumber": 5, "year": 2001}, {"id": "114", "name": "Red Dust", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 340, "trackNumber": 6, "year": 2001}, {"id": "115", "name": "Distractions", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 316, "trackNumber": 7, "year": 2001}, {"id": "116", "name": "In The Waiting Line", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 272, "trackNumber": 8, "year": 2001}, {"id": "117", "name": "Out Of Town", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 287, "trackNumber": 9, "year": 2001}, {"id": "118", "name": "This World", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 335, "trackNumber": 10, "year": 2001}, {"id": "119", "name": "Likufanele", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 371, "trackNumber": 11, "year": 2001}, {"id": "120", "name": "End Theme", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 219, "trackNumber": 12, "year": 2001}, {"id": "121", "name": "Salt Water Sound", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 330, "trackNumber": 13, "year": 2001}, {"id": "122", "name": "Spinning", "artist": "Zero 7", "album": "Simple Things", "genre": "Trip-Hop", "time": 363, "trackNumber": 14, "year": 2001} ] corelib/dgrid/demos/dTuned/index.html
New file @@ -0,0 +1,17 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>dTuned</title> <meta name="viewport" content="width=570"> <link rel="stylesheet" href="../../../dojo/resources/dojo.css"> <link rel="stylesheet" href="resources/layout.css"> <link rel="stylesheet" href="resources/dTuned.css"> <script src="../../../dojo/dojo.js" data-dojo-config="async: true"></script> <script> require(["dgrid/demos/dTuned/dTuned"]); </script> </head> <body class="dTuned"> </body> </html> corelib/dgrid/demos/dTuned/resources/dTuned.css
New file @@ -0,0 +1,44 @@ /* dgrid skin for dTuned demo */ .dTuned .dgrid { background: #fff; color: #000; } .dTuned .dgrid-header { background-image: url(images/grid-header-bg.png); background-repeat: repeat-x; font-weight: bold; } .dTuned .dgrid-header .dgrid-cell:hover, .dTuned .dgrid-header .dgrid-sort-up, .dTuned .dgrid-header .dgrid-sort-down{ background-image: url(images/grid-header-sorted.png); background-repeat: repeat-x; } .dTuned .dgrid-row { -webkit-transition-duration: 0.2s; -moz-transition-duration: 0.2s; -o-transition-duration: 0.2s; transition-duration: 0.2s; -webkit-transition-property: background-color, border-color; -moz-transition-property: background-color, border-color; -o-transition-property: background-color, border-color; transition-property: background-color, border-color; background: url("../../../css/skins/images/row_back.png") #fff repeat-x; } .dTuned .dgrid-row:hover { background-color: #e9f2fe; } .dTuned .dgrid-selected { background-color: #cee6fa; } .dTuned .dgrid-selected:hover { background-color: #9bc6f2; } .dTuned .dgrid-highlight { background-color: #ff6; } corelib/dgrid/demos/dTuned/resources/images/grid-header-bg.png
corelib/dgrid/demos/dTuned/resources/images/grid-header-separator.png
corelib/dgrid/demos/dTuned/resources/images/grid-header-sorted-separator.png
corelib/dgrid/demos/dTuned/resources/images/grid-header-sorted.png
corelib/dgrid/demos/dTuned/resources/images/header-background.png
corelib/dgrid/demos/dTuned/resources/images/header.png
corelib/dgrid/demos/dTuned/resources/layout.css
New file @@ -0,0 +1,84 @@ html, body { width: 100%; height: 100%; overflow: hidden; } body { font-family: "Lucida Grande", sans-serif; font-size: 11px; position: relative; } #header { position: relative; height: 64px; background-image: url(images/header-background.png); background-repeat: repeat-x; } #header-content { position: absolute; top: 10px; left: 50%; width: 431px; height: 45px; margin-left: -215px; font-size: 18px; font-weight: bold; text-align: center; padding-top: 12px; background-image: url(images/header.png); background-repeat: no-repeat; } #list-container { position: absolute; top: 65px; left: 0; right: 0; height: 120px; } /* styles for the three lists in the top region */ #genres, #artists, #albums { position: absolute; top: 0; bottom: 0; width: 33.3%; height: auto; } #list-container .dgrid-row { /* all rows in all 3 lists */ padding: 0.25em; cursor: default; } #artists { left: 33.3%; } #albums { right: 0; } #grid { position: absolute; left: 0; right: 0; top: 187px; bottom: 0; height: auto; /* override default height: 30em; in dgrid.css */ } #grid .dgrid-cell { border: 0; } #grid .dgrid-header th { border: 0; border-right: 1px solid #a6a6a6; } #grid .dgrid-header th:last-child { border: 0; } #grid .dgrid-row-even { background-color: #f2f6fa; } #grid .dgrid-row-even.dgrid-selected { background-color: #bfd6eb; } #grid .field-Time, #grid .field-Year { text-align: right; } corelib/dgrid/demos/laboratory/README.md
New file @@ -0,0 +1,165 @@ ## Overview The dgrid Laboratory is built using dgrid and provides a UI for defining and configuring your own dgrid. The configuration will be rendered in a demo grid and if you click the "Code" button you can see source code for creating the grid in your own application. While the Laboratory can be helpful in getting started creating and configuring your own grid, you will definitely want to read dgrid's [documentation](../../doc) and [tutorials](http://dgrid.io/#tutorials). The documentation below gives some information on the overall architecture of the Laboratory and some more detailed information on some of its more prominent modules. #### Module hierarchy * `Laboratory` * `ColumnEditor` * `ColumnGrid` * `ColumnConfigForm` * `FeatureEditor` * `FeatureGrid` * `ConfigForm` subclasses ## Widget communication In addition to the typical parent-child widget communication, and occasional cross-widget communication, the Laboratory listens at the top level (`Laboratory.js`) for data update events in order to keep the demo grid and generated code updated in real time. ### Pub-sub topics * **/configuration/changed**: Indicates that some data directly related to the display of the demo grid or generated code has changed * Publishers: * `ColumnGrid`: Published when the grid's store is modified * `FeatureEditor`: Published when the `FeatureGrid`'s store is modified * `ConfigForm`: Published when the form's `value` property changes * Subscribers: * `Laboratory`: Keeps the demo grid or generated code updated (depending on which is visible) * **/column/changed**: Indicates that column configuration data has been updated in the UI * Publishers: * `ColumnConfigForm`: Published when the form's `value` property changes * Subscribers: * `ColumnGrid`: Keeps the store data constantly in sync with the UI form values * **/store/columns/update**: Indicates that column configuration data has been updated in the store * Publishers: * `ColumnGrid`: Published when the grid's store is modified * Subscribers: * `configForms/Tree`: Updates the list of columns names so the user can select which one should render the tree expando * **/feature/select**: Indicates that a feature (dgrid mixin) has been selected (or de-selected) * Publishers: * `FeatureGrid`: Published when the grid's editable fields change (`dgrid-datachange` event) * Subscribers: * `ColumnConfigForm`: Updates which column features are visible for configuration * **/columnConfig/hidden**: Indicates changes to the hidden state of fields in the column configuration form. Passes an object hash whose keys correspond to the names of currently hidden fields. * Publishers: * `ColumnConfigForm`: Published in reaction to the `/feature/select` topic * Subscribers: * `ColumnGrid`: Updates column configurations to prune any properties which are no longer applicable ## Modules ### Laboratory This is the top-level widget. It provides the full-page UI layout and manages child widgets. While the functionality of most components is encapsulated in child widgets, `Laboratory` directly manages some items itself: * Tab navigation * Updating the demo grid (`_showDemoGrid`) or generated code (`_generateCode`), depending on which is visible * Both the `_showDemoGrid` and `_generateCode` methods rely on the `_generateGridOptions` method to read the current configuration from the UI and calculate a dgrid options object to pass to the grid constructor function * The "About" dialog ### ColumnEditor This widget is initially visible when the page is loaded in the far left pane in the tab titled "Columns". It is a lightweight container for the `ColumnGrid` and `ColumnConfigForm` widgets. #### API * `get('columns')`: Returns an array of objects from the store that represent the user-defined columns; proxies to `ColumnGrid#get('columns')` * `addColumn` and `removeColumn`: Provide the ability to add and remove user-defined columns; these methods proxy to the respective methods on `ColumnGrid` ### ColumnGrid This widget is a little more than just a grid - it's a templated widget that contains a grid, but it also manages the grid's store and the new column entry field in the UI (visible directly above the grid). #### API * `get('columns')`: Returns an array of objects from the store that represent the user-defined columns * `addColumn(label)`: Adds a new column to the grid with the specified label, and auto-generates a field name based on that label * `removeColumn(target)` (where `target` can be any value supported by dgrid's [`row` method](../../doc/components/core-components/List.md#method-summary)): Removes the associated column definition from the store (and grid) ### ColumnConfigForm This widget provides the UI for editing user-defined columns. Some sections are hidden or visible depending on which mixins are enabled (e.g. `Editor`, `ColumnHider`, etc.). It extends `dijit/form/_FormMixin` for basic form management and the `get/set('value')` methods. As a result, when the widget's `value` is set, any values in the object provided that do not map directly to fields in the form are discarded. In order to correctly update items in the store, whenever the `value` is set, the `id` property (which is not represented by any of the form fields) is persisted by the custom setter method. The custom getter method restores the `id` property to the object returned by `ColumnConfigForm#get('value')`. ### FeatureEditor This widget encapsulates the functionality in the "Grid Features" and "Column Features" tabs. It extends `dijit/layout/StackContainer` and contains one `FeatureGrid` and multiple widgets that extend `configForms/ConfigForm`. The config form widgets are defined by two components: 1. An item in the array defined in the `data/features` module 2. (Optional) If the feature has configurable properties, the UI to edit them should be provided in a module that extends `configForms/ConfigForm`. The module ID of the config form module should be indicated via the item's `configModule` property in the `data/features` module. #### API * `getModuleConfig(moduleId)`: Returns an object representing the configured options for the specified dgrid module ID * `isSelected(moduleId)`: Returns a boolean value indicating if the specified dgrid mixin module ID is selected * `filter(query)`: Filters the `FeatureGrid` by the specified query * `get('expandoColumn')`: If the `dgrid/Tree` mixin has been enabled, this method returns the name of the column that has been configured to render the tree expando icon * `set('featureType', featureType)` (where `featureType` is `'grid'` or `'column'`): Filters the `FeatureGrid` by the specified type; proxies to `FeatureGrid#set('featureType')`. The same grid is displayed in both the "Grid Features" and "Column Features" tabs using this method to filter which rows are displayed. ### FeatureGrid Like the `ColumnGrid` widget, this is a templated widget that encapsulates not only the grid but also its store. Logic is also included to prevent incompatible configurations (e.g. `OnDemandGrid` with `dgrid/extensions/Pagination`). #### API * `set('featureType', featureType)` (where `featureType` is `'grid'` or `'column'`): Filters the grid by the specified type * `set('gridModule', gridModule)` (where `gridModule` is `'Grid'` or `'OnDemandGrid'`): sets the base grid module of the user-defined grid and prevents incompatible combinations ### ConfigForm This module should not be instantiated directly. It provides the basic functionality for grid feature configuration forms (e.g. `Selection`, `Tree`, etc.). * Renders a "Done" button to return to dismiss the form and return to the grid * Extends `dijit/form/_FormMixin` with custom accessor/mutator methods * `set('value', value)`: Unspecified properties will be set to their default value * `get('value')`: Properties whose values match the default value will be omitted Each subclassing module should provide an object on the `defaultsObject` property that defines default values for configuration properties. This can typically be achieved by providing the dgrid module's prototype, since these modules define their configurable properties and their default values. The default values are used both to initially populate the form and to filter values - if the user has not changed the value from the default, it will be omitted from the generated code. `defaultsObject` is never modified. Each subclass should also specify `moduleName` and `documentationUrl` properties to be displayed in the config form's UI. All currently-implemented subclasses of `ConfigForm` are located under `widgets/configForms`. corelib/dgrid/demos/laboratory/data/config.js
New file @@ -0,0 +1,4 @@ define({ dgridUrl: 'http://dgrid.io', docBaseUrl: 'https://github.com/SitePen/dgrid/blob/dev-1.0/doc/' }); corelib/dgrid/demos/laboratory/data/features.js
New file @@ -0,0 +1,168 @@ /** REQUIRED id (Number): unique; sort key (any modules that depend on being loaded after another module should have a higher id) label (String): Display value for the feature mid (String): absolute mid of the module that provides the feature featureType (String): 'grid' or 'column', determining which tab of the UI it appears under OPTIONAL configLevel (String): if 'grid', feature will be applied to grid settings; otherwise feature will be applied to each column's settings configModule (String): relative (to the 'widgets' folder) mid of the module that provides the configuration UI info (String): Tooltip text - longer description of the feature */ define([ './config', 'dojo/i18n!../nls/laboratory' ], function (config, i18n) { return [ { id: 1.1, featureType: 'grid', mid: 'dgrid/Grid', label: 'Grid', configLevel: 'grid', configModule: 'configForms/Grid', documentationUrl: config.docBaseUrl + 'components/core-components/Grid.md', selected: true }, { id: 1.2, featureType: 'grid', mid: 'dgrid/OnDemandGrid', label: 'OnDemandGrid', configLevel: 'grid', configModule: 'configForms/OnDemandGrid', documentationUrl: config.docBaseUrl + 'components/core-components/OnDemandList-and-OnDemandGrid.md', selected: true }, { id: 2, featureType: 'grid', mid: 'dgrid/Keyboard', label: 'Keyboard', configLevel: 'grid', configModule: 'configForms/Keyboard', documentationUrl: config.docBaseUrl + 'components/mixins/Keyboard.md', info: i18n.infoKeyboard }, { id: 3, featureType: 'grid', mid: 'dgrid/Selection', label: 'Selection', configLevel: 'grid', configModule: 'configForms/Selection', documentationUrl: config.docBaseUrl + 'components/mixins/Selection.md', info: i18n.infoSelection }, { id: 4, featureType: 'grid', mid: 'dgrid/CellSelection', label: 'CellSelection', configLevel: 'grid', configModule: 'configForms/CellSelection', documentationUrl: config.docBaseUrl + 'components/mixins/CellSelection.md', info: i18n.infoCellSelection }, { id: 5, featureType: 'grid', mid: 'dgrid/Tree', label: 'Tree', configLevel: 'grid', configModule: 'configForms/Tree', documentationUrl: config.docBaseUrl + 'components/mixins/Tree.md', info: i18n.infoTree }, { id: 6, featureType: 'grid', mid: 'dgrid/extensions/Pagination', label: 'Pagination', configLevel: 'grid', configModule: 'configForms/Pagination', documentationUrl: config.docBaseUrl + 'components/extensions/Pagination.md', info: i18n.infoPagination }, { id: 7, featureType: 'grid', mid: 'dgrid/extensions/DijitRegistry', label: 'DijitRegistry', documentationUrl: config.docBaseUrl + 'components/extensions/DijitRegistry.md', info: i18n.infoDijitRegistry }, { id: 8, featureType: 'grid', mid: 'dgrid/extensions/DnD', label: 'DnD', configLevel: 'grid', documentationUrl: config.docBaseUrl + 'components/extensions/DnD.md', info: i18n.infoDnD }, { id: 9, featureType: 'column', mid: 'dgrid/Editor', label: 'Editor', documentationUrl: config.docBaseUrl + 'components/mixins/Editor.md', info: i18n.infoEditor }, { id: 10, featureType: 'column', mid: 'dgrid/extensions/ColumnHider', label: 'ColumnHider', documentationUrl: config.docBaseUrl + 'components/extensions/ColumnHider.md', info: i18n.infoColumnHider }, { id: 11, featureType: 'column', mid: 'dgrid/extensions/ColumnReorder', label: 'ColumnReorder', documentationUrl: config.docBaseUrl + 'components/extensions/ColumnReorder.md', info: i18n.infoColumnReorder }, { id: 12, featureType: 'column', mid: 'dgrid/extensions/ColumnResizer', label: 'ColumnResizer', configLevel: 'grid', configModule: 'configForms/ColumnResizer', documentationUrl: config.docBaseUrl + 'components/extensions/ColumnResizer.md', info: i18n.infoColumnResizer }, // There's no UI for configuring CompoundColumns or ColumnSet, so just omit them /* { id: 13, featureType: 'column', mid: 'dgrid/extensions/CompoundColumns', label: 'CompoundColumns', documentationUrl: config.docBaseUrl + 'components/extensions/CompoundColumns.md', info: 'TODO: i18n; Define column headers that span multiple grid columns' }, { id: 14, featureType: 'column', mid: 'dgrid/ColumnSet', label: 'ColumnSet', documentationUrl: config.docBaseUrl + 'components/mixins/ColumnSet.md', info: 'TODO: i18n; Define column sets that scroll independently' }, */ { id: 15, featureType: 'column', mid: 'dgrid/Selector', label: 'Selector', documentationUrl: config.docBaseUrl + 'components/mixins/Selector.md', info: i18n.infoSelector } ]; }); corelib/dgrid/demos/laboratory/index.html
New file @@ -0,0 +1,35 @@ <!DOCTYPE html> <html> <head> <title>dgrid Laboratory</title> <meta charset="utf-8"> <link rel="stylesheet" href="../../../dijit/themes/claro/claro.css"> <link rel="stylesheet" href="../../css/dgrid.css"> <link rel="stylesheet" href="../../css/skins/claro.css"> <link rel="stylesheet" href="resources/laboratory.css"> </head> <body class="claro"> <script> var dojoConfig = { async: true, baseUrl: '../../../', packages: [ 'dojo', 'dijit', 'dgrid', 'dstore' ] }; </script> <script src="../../../dojo/dojo.js"></script> <script> require([ 'dgrid/demos/laboratory/widgets/Laboratory' ], function (Laboratory) { var laboratory = new Laboratory().placeAt(document.body); laboratory.startup(); }); </script> </body> </html> corelib/dgrid/demos/laboratory/nls/laboratory.js
New file @@ -0,0 +1,70 @@ define({ root: { // Common clear: 'clear', moduleDocumentation: '${0} documentation', moduleConfiguration: '${0} configuration', // Laboratory laboratory: 'laboratory', about: 'About', docs: 'Docs', preview: 'Preview', code: 'Code', demoInstructions: 'Use the controls on the left to generate a dgrid instance.', // About dialog aboutTitle: 'Welcome to the laboratory!', appDescription: 'This application allows you to experiment with many of dgrid\'s features.', appInstructions1: 'Create, reorder, and configure columns in the Columns tab on the left', appInstructions2: 'Choose and configure mixins and extensions in the Features tabs', appInstructions3: 'As you make changes, the main area will update to display a grid based on your' + ' configuration. The Code tab displays code which can be used to achieve the chosen configuration.', appInformation: 'Note that while this application demonstrates many of dgrid\'s features, it does not' + ' demonstrate all of them. Namely, it does not include a way to configure advanced column structures,' + ' such as sub-rows, <a href="${docBaseUrl}components/mixins/ColumnSet.md" target="_blank">column sets' + '</a>, and <a href="${docBaseUrl}components/extensions/CompoundColumns.md" target="_blank">compound' + ' columns</a>.', // FeatureGrid dstoreObjectStore: 'dstore object store', array: 'array', gridFeatures: 'Grid Features', columnFeatures: 'Column Features', columns: 'Columns', // data/features.js infoKeyboard: 'Keyboard navigation and selection', infoSelection: 'Row selection', infoCellSelection: 'Cell selection', infoTree: 'Render hierarchical data under collapsible nodes', infoPagination: 'Paged data views', infoDijitRegistry: 'Add dgrid instances to Dijit\'s registry', infoDnD: 'Re-order rows with drag and drop', infoEditor: 'Edit values in grid cells', infoColumnHider: 'UI to show or hide individual columns', infoColumnReorder: 'Re-order columns with drag and drop', infoColumnResizer: 'Resize columns', infoSelector: 'Define a column with checkboxes/radios for selecting rows', // ConfigForms done: 'Done', configuration: 'configuration', documentation: 'documentation', // Tree parentNodeColumn: 'Parent node column', // ColumnGrid and ColumnConfigForm fieldNamePlaceholder: 'Column Title', fieldName: 'Field Name', fieldLabelPlaceholder: 'Field label', label: 'Label', addColumn: 'Add column', dragToMove: 'Drag to move', edit: 'Edit', 'delete': 'Delete', generalColumnProperties: 'Column Settings', mixinColumnProperties: 'Mixin column properties', moduleProperties: '${0} properties' } }); corelib/dgrid/demos/laboratory/resources/base.styl
New file @@ -0,0 +1,256 @@ * { box-sizing: border-box; } html, body { height: 100%; width: 100%; margin: 0; font-family: $fontFamily; font-size: 16px; background: #F8F8F8; } fieldset { border: 0; margin: 0; padding: 0; } .laboratory { font-size: 0; height: 100%; padding-top: $headerHeight; } .control { width: $sidebarWidth; height: 100%; display: inline-block; vertical-align: top; font-size: 16px; background: $sidebarBackground; position: relative; } .render { background: #F8F8F8; display: inline-block; font-size: 14px; padding: $renderPadding; position: relative; height: 100%; width: "calc(100% - %s)" % $sidebarWidth; vertical-align: top; z-index: 2; } .tabControl { line-height: 31px; color: #144C66; position: relative; font-weight: bold; } /* * Header */ .header { position: absolute; top:0; left:0; width: 100%; background: white; overflow: hidden; font-size: 24px; font-weight: 100; height: $headerHeight; color: white; vertical-align: middle; box-shadow: 0px 4px 10px -2px #0B1E2A; z-index: 3; .controlHeader { background: #1284CC; width: $sidebarWidth; display: inline-block; } .logoLink { box-shadow: 1px 0 6px 0px #0E6AA4; display: inline-block; vertical-align: middle; margin-right: 10px; } .menuLink { color: black; font-size: 18px; margin-left: 16px; text-decoration: none; } .logo { width: 98px; padding: 15px; } .splogo { position: absolute; top: 10px; right: 30px; } } /* * Icon font */ @font-face { font-family: 'icomoon'; src:url('fonts/icomoon.eot?kn321z'); src:url('fonts/icomoon.eot?#iefixkn321z') format('embedded-opentype'), url('fonts/icomoon.woff?kn321z') format('woff'), url('fonts/icomoon.ttf?kn321z') format('truetype'), url('fonts/icomoon.svg?kn321z#icomoon') format('svg'); font-weight: normal; font-style: normal; } [class^="icon-"], [class*=" icon-"] { font-family: 'icomoon'; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; transition: color 0.5s; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; &:hover { cursor:pointer; } } .icon-times:before { content: $closeIcon; } .icon-gear:before { content: $gearIcon; } .icon-info-circle:before { content: $infoIcon; } .icon-external-link:before { content: $externalLinkIcon; } .icon-navicon:before { content: $navIcon; } .icon-angle-up:before { content: $angleUpIcon; } .icon-angle-down:before { content: $angleDownIcon; } .icon-mail-reply:before { content: $replyIcon; } .icon-grid:before { content: $gridIcon; } .icon-code:before { content: $codeIcon; } /* * Tabs */ .tabs { font-size: 0; background: $sidebarTabStripBg; } .tab { color: #C3F1FF; font-size: 12px; padding: 15px 10px; display: inline-block; cursor: pointer; transition: background 0.4s; &.active { background: $sidebarTabActiveBg; &:hover { background: $sidebarTabActiveBg; } } &:hover { background: lighten($sidebarTabStripBg, 10%); } } .tabContent { display: none; overflow: auto; position: absolute; bottom: 0; top: $tabHeight; &.active { display: block; } } /* * About Dialog */ .claro .aboutDialog { overflow: visible; width:60%; border-radius: 8px; border:none; background:#fff; box-shadow: 0px 0px 15px 0px rgba(0,0,0,0.70); padding:2em; // dijit/Dialog's sizing logic does not expect border-box, so reset it * { box-sizing: content-box; } .dijitDialogCloseIcon { background-image: url("img/lab.png"); background-position: 0 0; width:286px; height: 241px; top:-130px; right:-60px; z-index: 951; position: absolute; } .dijitDialogTitleBar, .dijitDialogPaneContent { background: none; border:none; } .dijitDialogTitleBar { text-align:center; font-size:42px; } } corelib/dgrid/demos/laboratory/resources/columnsPane.styl
New file @@ -0,0 +1,334 @@ /* * Feature grid and Column grid */ .columnGridContainer { display: inline-block; padding-top: 1em; } .claro { .featureGrid { margin-top:0.5em; } .featureGrid, .columnGrid, .dojoDndAvatar { background: transparent; height: auto; border: 0 !important; .dgrid-row { color: #fff; font-size: 13px; font-weight: 100; border: none !important; width:100%; padding:0; transition: padding 0.3s; cursor: default; .dgrid-cell { padding: 4px; } } .dgrid-row-odd { background: $sidebarRowOddBg; } .dgrid-row-even { background: $sidebarRowEvenBg; } .dgrid-cell { line-height: 26px; border: 0; padding: 0; } .dijitCheckBox { background: none; border-radius: 3px; background-color: $checkBg; box-shadow: inset 1px 1px 3px 0px rgba(50, 50, 50, 0.65); width: $checkboxSize; height: $checkboxSize; transition: background-color 0.3s, box-shadow 0.3s; &:hover{ box-shadow: inset 1px 1px 1px 0px rgba(50, 50, 50, 0.45); } &.dijitCheckBoxDisabled { background-color: $checkDisabledBg; box-shadow: none; } &.dijitCheckBoxChecked { $sprite($checkboxChecked); background-color: $checkFilledBg; &:hover { background-color: lighten(@background-color, 15%); } } &.dijitCheckBoxCheckedDisabled { $sprite($checkboxChecked); background-color: darken($checkFilledBg, 30%); &:hover { background-color: @background-color; } } } .icon-gear { color: $sidebarIconColor; font-size: 16px; vertical-align: middle; &:hover { color:$sidebarGearColor; } } } .columnGrid, .dojoDndAvatar { .field-dragSource { width: 30px; font-size: 16px; color: $sidebarIconColor; i { position:relative; top:1px; &:hover { cursor: move; } } &:hover, &:active { color: $dgridBlue; } } .field-config { width: 45px; padding-left: 4px; } .field-label { padding-left: 2px; } .icon-gear { margin-left: 7px; } .icon-times { color: $sidebarIconColor; &:hover { color: $deleteColor; } vertical-align: middle; } .dojoDndItem { &:before, &:after { border:1px dotted #3C5E79; content: " "; height:1px; display:block; transition: height 0.2s, opacity 0.3s, background 0.3s; opacity: 0; } &:active, .dgrid-selected { opacity: 0.5; } .dojoDndHandle { padding-left:10px; &:hover { cursor:move; } } } .dojoDndItemBefore:before, .dojoDndItemAfter:after, .dojoDndItemAfter:nth-last-child(2):after { background: $dropTargetBg; height:30px; opacity: 1; cursor:move; } .dojoDndItemAfter:nth-last-child(2):before { height:1px; opacity:0; } .dgrid-selected { &:before, &:after { height:1px; opacity:0; } } .dojoDndItem .dgrid-cell { border-top: none; border-bottom: none; } /* END DnD FIX */ } .dijitRadio { $sprite($radio); } .dijitRadioChecked { $sprite($radioChecked); } } /* * Column grid form */ .columnGridForm { font-size: 0; position: relative; padding: 5px 0 14px 10px; .addBtn { background: transparent; border: none; color: #fff; font-size: 18px; outline: none; padding: 0 0 0 16px; transition: color 0.4s; vertical-align: middle; &:hover { color: lighten($confirmColor, 20%); cursor:pointer; } } .dijitTextBox:first-child { display: inline-block; width: calc(100% - 40px); } } /* * Column configuration form */ .columnEditor { margin: 0; overflow-x: hidden; .configForm { display: none; } // TODO: Ideally we'd like to use transitions here, but they're problematic // because keeping both elements rendered affects scrollHeight of the full container &.slid .columnGridContainer { display: none; } &.slid .configForm { display: block; } } .configForm { color: #fff; font-weight: 100; font-size: 14px; position: relative; padding: 15px; padding-top: 1em; display: inline-block; vertical-align: top; legend { // IE reverts to #000 for legends unless specifically told otherwise color: #fff; } .dijitButton { margin: 0; position: absolute; top: 18px; right: 15px; z-index: 1; } .dijitButton .dijitButtonNode { font-size: 12px; } fieldset { font-size: 0; position: relative; } legend { font-size: 14px; font-weight:400; margin:0 0 20px 0; padding: 10px 0 0 0; text-transform: uppercase; } .label { width: 150px; display: inline-block; font-size: 13px; vertical-align: top; height: 35px; } .propTitle { margin-bottom:0.55em; font-size:13px; color: $primaryButtonColor; text-transform:none; } .field { font-weight:400; width: calc(100% - 180px); display: inline-block; vertical-align: top; font-size: 12px; .dijitTextBox { width: 100%; margin-bottom:10px; } .halfWidth { width: 35%; } } .mixinProp { font-weight: 400; margin-top: 20px; text-transform: uppercase; } .actionLink { cursor:pointer; color: #A8EAFF; margin-left:1em; } } corelib/dgrid/demos/laboratory/resources/featuresPane.styl
New file @@ -0,0 +1,65 @@ .featureEditor .gridTypeForm { line-height: 26px; border: 0; padding: 0; } /* * Feature Editor Grid */ .featureEditor { width: 100%; .configForm { width: 100% !important; .dijitButton { top: 18px; right: 15px; margin: 0; z-index: 1; } a { color: white; font-size:13px; } } .gridTypeForm { padding: 10px; } .dgrid-row { padding: 0 7px !important; position:relative; a { text-decoration: none; color: white; font-size: 13px; } .icon-gear { position:absolute; right:10px; top:8px; } .dgrid-cell { padding:4px; } } .dgrid-row-even:hover { background: lighten($sidebarRowEvenBg, 5%); transition: background 0.4s; } .dgrid-row-odd:hover { background: lighten($sidebarRowOddBg, 5%); transition: background 0.4s; } .field-selected { width: 30px; } } corelib/dgrid/demos/laboratory/resources/fonts/icomoon.eotBinary files differ
corelib/dgrid/demos/laboratory/resources/fonts/icomoon.svg
New file @@ -0,0 +1,23 @@ <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > <svg xmlns="http://www.w3.org/2000/svg"> <metadata>Generated by IcoMoon</metadata> <defs> <font id="icomoon" horiz-adv-x="1024"> <font-face units-per-em="1024" ascent="960" descent="-64" /> <missing-glyph horiz-adv-x="1024" /> <glyph unicode=" " d="" horiz-adv-x="512" /> <glyph unicode="" d="M864 832l-480-480-224 224-160-160 384-384 640 640z" /> <glyph unicode="" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 64c-212.078 0-384 171.922-384 384s171.922 384 384 384c212.078 0 384-171.922 384-384s-171.922-384-384-384zM320 448c0 106.039 85.961 192 192 192s192-85.961 192-192c0-106.039-85.961-192-192-192s-192 85.961-192 192z" /> <glyph unicode="" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 64c-212.078 0-384 171.922-384 384s171.922 384 384 384c212.078 0 384-171.922 384-384s-171.922-384-384-384z" /> <glyph unicode="" d="M0 896v-896h1024v896h-1024zM384 320v192h256v-192h-256zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" /> <glyph unicode="" d="M389.734 754.79c-18.79 17.664-44.186 17.664-63.027 0l-326.707-293.99 326.707-293.939c18.842-17.715 44.237-17.715 63.027 0s18.79 46.387 0 64.102l-253.645 229.837 253.696 229.786c18.739 17.715 18.739 46.438-0.051 64.205zM697.293 754.79c-18.842 17.664-44.186 17.664-63.027 0-18.79-17.766-17.818-46.438 1.075-64.154l252.57-229.837-252.621-229.837c-18.842-17.715-19.866-46.387-1.075-64.102 18.842-17.715 44.186-17.715 63.027 0l326.758 293.939-326.707 293.99z" /> <glyph unicode="" d="M62.857 195.428q0 22.857 16 38.857l168 168-168 168q-16 16-16 38.857t16 38.857l77.714 77.714q16 16 38.857 16t38.857-16l168-168 168 168q16 16 38.857 16t38.857-16l77.714-77.714q16-16 16-38.857t-16-38.857l-168-168 168-168q16-16 16-38.857t-16-38.857l-77.714-77.714q-16-16-38.857-16t-38.857 16l-168 168-168-168q-16-16-38.857-16t-38.857 16l-77.714 77.714q-16 16-16 38.857z" horiz-adv-x="805" /> <glyph unicode="" d="M0 376.571v126.857q0 6.857 4.571 13.143t10.857 7.429l106.286 16q8 26.286 22.286 52.571-22.857 32.571-61.143 78.857-5.714 6.857-5.714 13.714 0 5.714 5.143 13.143 14.857 20.571 56.286 61.429t54 40.857q7.429 0 14.857-5.714l78.857-61.143q25.143 13.143 52 21.714 9.143 77.714 16.571 106.286 4 16 20.571 16h126.857q8 0 14-4.857t6.571-12.286l16-105.143q28-9.143 51.429-21.143l81.143 61.143q5.143 5.143 13.714 5.143 7.429 0 14.286-5.714 73.714-68 94.286-97.143 4-4.571 4-12.571 0-6.857-4.571-13.143-8.571-12-29.143-38t-30.857-40.286q14.857-28.571 23.429-56l104.571-16q7.429-1.143 12-7.143t4.571-13.429v-126.857q0-6.857-4.571-13.143t-11.429-7.429l-105.714-16q-10.857-30.857-22.286-52 20-28.571 61.143-78.857 5.714-6.857 5.714-14.286t-5.143-13.143q-15.429-21.143-56.571-61.714t-53.714-40.571q-6.857 0-14.857 5.143l-78.857 61.714q-25.143-13.143-52-21.714-9.143-77.714-16.571-106.286-4-16-20.571-16h-126.857q-8 0-14 4.857t-6.571 12.286l-16 105.143q-28 9.143-51.429 21.143l-80.571-61.143q-5.714-5.143-14.286-5.143-8 0-14.286 6.286-72 65.143-94.286 96-4 5.714-4 13.143 0 6.857 4.571 13.143 8.571 12 29.143 38t30.857 40.286q-15.429 28.571-23.429 56.571l-104.571 15.429q-7.429 1.143-12 7.143t-4.571 13.429zM292.571 438.857q0-60.571 42.857-103.429t103.429-42.857 103.429 42.857 42.857 103.429-42.857 103.429-103.429 42.857-103.429-42.857-42.857-103.429z" /> <glyph unicode="" d="M0 438.857q0 119.429 58.857 220.286t159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286-58.857-220.286-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286zM292.571 164.571q0-8 5.143-13.143t13.143-5.143h256q8 0 13.143 5.143t5.143 13.143v91.429q0 8-5.143 13.143t-13.143 5.143h-54.857v292.571q0 8-5.143 13.143t-13.143 5.143h-182.857q-8 0-13.143-5.143t-5.143-13.143v-91.429q0-8 5.143-13.143t13.143-5.143h54.857v-182.857h-54.857q-8 0-13.143-5.143t-5.143-13.143v-91.429zM365.714 676.571q0-8 5.143-13.143t13.143-5.143h109.714q8 0 13.143 5.143t5.143 13.143v91.429q0 8-5.143 13.143t-13.143 5.143h-109.714q-8 0-13.143-5.143t-5.143-13.143v-91.429z" /> <glyph unicode="" d="M0 237.714v475.429q0 68 48.286 116.286t116.286 48.286h402.286q8 0 13.143-5.143t5.143-13.143v-36.571q0-8-5.143-13.143t-13.143-5.143h-402.286q-37.714 0-64.571-26.857t-26.857-64.571v-475.429q0-37.714 26.857-64.571t64.571-26.857h475.429q37.714 0 64.571 26.857t26.857 64.571v182.857q0 8 5.143 13.143t13.143 5.143h36.571q8 0 13.143-5.143t5.143-13.143v-182.857q0-68-48.286-116.286t-116.286-48.286h-475.429q-68 0-116.286 48.286t-48.286 116.286zM391.429 402.286q0 7.429 5.714 13.143l372.571 372.571-100.571 100.571q-10.857 10.857-10.857 25.714t10.857 25.714 25.714 10.857h292.571q14.857 0 25.714-10.857t10.857-25.714v-292.571q0-14.857-10.857-25.714t-25.714-10.857-25.714 10.857l-100.571 100.571-372.571-372.571q-5.714-5.714-13.143-5.714t-13.143 5.714l-65.143 65.143q-5.714 5.714-5.714 13.143z" /> <glyph unicode="" d="M0 109.714v73.143q0 14.857 10.857 25.714t25.714 10.857h804.571q14.857 0 25.714-10.857t10.857-25.714v-73.143q0-14.857-10.857-25.714t-25.714-10.857h-804.571q-14.857 0-25.714 10.857t-10.857 25.714zM0 402.286v73.143q0 14.857 10.857 25.714t25.714 10.857h804.571q14.857 0 25.714-10.857t10.857-25.714v-73.143q0-14.857-10.857-25.714t-25.714-10.857h-804.571q-14.857 0-25.714 10.857t-10.857 25.714zM0 694.857v73.143q0 14.857 10.857 25.714t25.714 10.857h804.571q14.857 0 25.714-10.857t10.857-25.714v-73.143q0-14.857-10.857-25.714t-25.714-10.857h-804.571q-14.857 0-25.714 10.857t-10.857 25.714z" /> <glyph unicode="" d="M44 274.286q0 7.429 5.714 13.143l266.286 266.286q5.714 5.714 13.143 5.714t13.143-5.714l266.286-266.286q5.714-5.714 5.714-13.143t-5.714-13.143l-28.571-28.571q-5.714-5.714-13.143-5.714t-13.143 5.714l-224.571 224.571-224.571-224.571q-5.714-5.714-13.143-5.714t-13.143 5.714l-28.571 28.571q-5.714 5.714-5.714 13.143z" horiz-adv-x="658" /> <glyph unicode="" d="M44 530.286q0 7.429 5.714 13.143l28.571 28.571q5.714 5.714 13.143 5.714t13.143-5.714l224.571-224.571 224.571 224.571q5.714 5.714 13.143 5.714t13.143-5.714l28.571-28.571q5.714-5.714 5.714-13.143t-5.714-13.143l-266.286-266.286q-5.714-5.714-13.143-5.714t-13.143 5.714l-266.286 266.286q-5.714 5.714-5.714 13.143z" horiz-adv-x="658" /> <glyph unicode="" d="M0 585.143q0 14.857 10.857 25.714l292.571 292.571q10.857 10.857 25.714 10.857t25.714-10.857 10.857-25.714v-146.286h128q407.429 0 500-230.286 30.286-76.571 30.286-190.286 0-94.857-72.571-257.714-1.714-4-6-13.714t-7.714-17.143-7.429-12.571q-6.857-9.714-16-9.714-8.571 0-13.429 5.714t-4.857 14.286q0 5.143 1.429 15.143t1.429 13.429q2.857 38.857 2.857 70.286 0 57.714-10 103.429t-27.714 79.143-45.714 57.714-60.286 39.714-76 24.286-88 12.286-100.286 3.429h-128v-146.286q0-14.857-10.857-25.714t-25.714-10.857-25.714 10.857l-292.571 292.571q-10.857 10.857-10.857 25.714z" /> </font></defs></svg> corelib/dgrid/demos/laboratory/resources/fonts/icomoon.ttfBinary files differ
corelib/dgrid/demos/laboratory/resources/fonts/icomoon.woffBinary files differ
corelib/dgrid/demos/laboratory/resources/img/dgridLogo.png
corelib/dgrid/demos/laboratory/resources/img/expando.png
corelib/dgrid/demos/laboratory/resources/img/formSprite.png
corelib/dgrid/demos/laboratory/resources/img/formSprite@2x.png
corelib/dgrid/demos/laboratory/resources/img/lab.png
corelib/dgrid/demos/laboratory/resources/img/sitepenLogo.png
corelib/dgrid/demos/laboratory/resources/img/sitepenLogo.svg
New file @@ -0,0 +1,27 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg width="67px" height="102px" viewBox="0 0 67 102" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> <!-- Generator: Sketch 3.0.2 (7799) - http://www.bohemiancoding.com/sketch --> <title>sitepenLogo</title> <description>Created with Sketch.</description> <defs></defs> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> <g id="sitepenLogo" sketch:type="MSLayerGroup" transform="translate(0.000000, 1.000000)"> <g id="Rectangle-2-+-Layer_x25_201" transform="translate(0.000000, 13.000000)" sketch:type="MSShapeGroup"> <rect id="Rectangle-2" fill-opacity="0.899999559" fill="#FFFFFF" x="0" y="0" width="67" height="68" rx="6"></rect> <g id="Layer_x25_201" transform="translate(15.000000, 6.000000)" fill="#0F4B67"> <g id="Group"> <g id="Shape"> <path d="M30.2722535,21.2616822 L20.6835211,22.3581308 L9.56788732,33.4414206 C7.59959155,35.4045607 5.2696338,34.6231776 5.53280282,35.0685607 L16.1867183,34.1416822 L27.6218028,22.7380935 C28.379,21.9828785 29.299831,21.4914393 30.2722535,21.2616822 L30.2722535,21.2616822 Z" opacity="0.4"></path> <g> <path d="M25.3418732,1.88672897 L1.63164789,25.5281495 C-0.550830986,27.7042991 -0.543535211,31.2391028 1.64884507,33.4251963 C3.8401831,35.610243 7.38488732,35.6170467 9.5673662,33.4408972 L33.2770704,9.79947664 C35.4600704,7.62280374 35.4517324,4.08904673 33.2603944,1.904 C31.0685352,-0.282093458 27.5248732,-0.29046729 25.3418732,1.88672897 L25.3418732,1.88672897 Z"></path> <path d="M27.6212817,22.7380935 L3.91470423,46.3768972 C1.73222535,48.5525234 1.74056338,52.0888972 3.93242254,54.275514 C6.12480282,56.4610841 9.66794366,56.4663178 11.8504225,54.2896449 L35.5575211,30.6508411 C37.7394789,28.4746916 37.7363521,24.9404112 35.5439718,22.7543178 C33.3515915,20.5687477 29.8037606,20.5624673 27.6212817,22.7380935 L27.6212817,22.7380935 Z"></path> </g> </g> </g> </g> </g> <path d="M8.348,6.908 C7.928,7.112 7.28,7.244 6.644,7.244 C4.676,7.244 3.536,5.972 3.536,3.992 C3.536,1.868 4.796,0.656 6.692,0.656 C7.364,0.656 7.928,0.8 8.324,0.992 L8.576,0.14 C8.3,-0.004 7.664,-0.22 6.656,-0.22 C4.148,-0.22 2.432,1.496 2.432,4.028 C2.432,6.68 4.148,8.12 6.428,8.12 C7.412,8.12 8.18,7.928 8.564,7.736 L8.348,6.908 Z M9.872,8 L10.916,8 L10.916,4.496 L11.9,4.496 C12.848,4.532 13.28,4.952 13.52,6.068 C13.748,7.076 13.928,7.772 14.06,8 L15.14,8 C14.972,7.688 14.78,6.908 14.516,5.78 C14.324,4.94 13.952,4.364 13.328,4.148 L13.328,4.112 C14.18,3.824 14.852,3.116 14.852,2.048 C14.852,1.424 14.624,0.872 14.216,0.512 C13.712,0.056 12.992,-0.148 11.876,-0.148 C11.156,-0.148 10.4,-0.088 9.872,0.02 L9.872,8 Z M10.916,0.752 C11.084,0.704 11.444,0.656 11.948,0.656 C13.052,0.668 13.808,1.124 13.808,2.168 C13.808,3.092 13.1,3.704 11.984,3.704 L10.916,3.704 L10.916,0.752 Z M20.516,3.344 L17.372,3.344 L17.372,0.788 L20.696,0.788 L20.696,-0.088 L16.328,-0.088 L16.328,8 L20.876,8 L20.876,7.124 L17.372,7.124 L17.372,4.208 L20.516,4.208 L20.516,3.344 Z M26.408,5.456 L27.272,8 L28.388,8 L25.628,-0.088 L24.368,-0.088 L21.62,8 L22.7,8 L23.54,5.456 L26.408,5.456 Z M23.756,4.64 L24.548,2.3 C24.704,1.808 24.836,1.316 24.956,0.836 L24.98,0.836 C25.1,1.304 25.22,1.784 25.4,2.312 L26.192,4.64 L23.756,4.64 Z M31.112,8 L32.168,8 L32.168,0.8 L34.64,0.8 L34.64,-0.088 L28.652,-0.088 L28.652,0.8 L31.112,0.8 L31.112,8 Z M39.728,3.344 L36.584,3.344 L36.584,0.788 L39.908,0.788 L39.908,-0.088 L35.54,-0.088 L35.54,8 L40.088,8 L40.088,7.124 L36.584,7.124 L36.584,4.208 L39.728,4.208 L39.728,3.344 Z M41.444,7.976 C41.972,8.036 42.596,8.072 43.34,8.072 C44.912,8.072 46.16,7.664 46.916,6.908 C47.672,6.164 48.08,5.084 48.08,3.764 C48.08,2.456 47.66,1.52 46.94,0.86 C46.232,0.2 45.164,-0.148 43.664,-0.148 C42.836,-0.148 42.08,-0.076 41.444,0.02 L41.444,7.976 Z M42.488,0.788 C42.764,0.728 43.172,0.68 43.712,0.68 C45.92,0.68 47,1.892 46.988,3.8 C46.988,5.984 45.776,7.232 43.544,7.232 C43.136,7.232 42.752,7.22 42.488,7.172 L42.488,0.788 Z M51.98,7.976 C52.328,8.024 52.88,8.072 53.6,8.072 C54.92,8.072 55.832,7.832 56.396,7.316 C56.804,6.92 57.08,6.392 57.08,5.696 C57.08,4.496 56.18,3.86 55.412,3.668 L55.412,3.644 C56.264,3.332 56.78,2.648 56.78,1.868 C56.78,1.232 56.528,0.752 56.108,0.44 C55.604,0.032 54.932,-0.148 53.888,-0.148 C53.156,-0.148 52.436,-0.076 51.98,0.02 L51.98,7.976 Z M53.024,0.728 C53.192,0.692 53.468,0.656 53.948,0.656 C55.004,0.656 55.724,1.028 55.724,1.976 C55.724,2.756 55.076,3.332 53.972,3.332 L53.024,3.332 L53.024,0.728 Z M53.024,4.124 L53.888,4.124 C55.028,4.124 55.976,4.58 55.976,5.684 C55.976,6.86 54.98,7.256 53.9,7.256 C53.528,7.256 53.228,7.244 53.024,7.208 L53.024,4.124 Z M61.34,8 L61.34,4.556 L64.052,-0.088 L62.864,-0.088 L61.7,2.144 C61.388,2.756 61.112,3.284 60.884,3.812 L60.86,3.812 C60.608,3.248 60.368,2.756 60.056,2.144 L58.916,-0.088 L57.728,-0.088 L60.284,4.568 L60.284,8 L61.34,8 Z" id="CREATED-BY" opacity="0.899999976" fill="#FFFFFF" sketch:type="MSShapeGroup"></path> <path d="M4.741,96.563 C5.387,96.943 6.318,97.19 7.325,97.19 C9.51,97.19 10.764,96.05 10.764,94.435 C10.764,93.067 9.947,92.269 8.351,91.661 C7.154,91.205 6.603,90.863 6.603,90.103 C6.603,89.419 7.154,88.849 8.142,88.849 C8.997,88.849 9.662,89.153 10.023,89.381 L10.441,88.165 C9.928,87.861 9.111,87.595 8.18,87.595 C6.204,87.595 5.007,88.811 5.007,90.293 C5.007,91.395 5.786,92.307 7.439,92.896 C8.674,93.352 9.149,93.789 9.149,94.587 C9.149,95.347 8.579,95.955 7.363,95.955 C6.527,95.955 5.653,95.613 5.159,95.29 L4.741,96.563 Z M14.583,97 L14.583,87.804 L12.911,87.804 L12.911,97 L14.583,97 Z M13.747,84.175 C13.139,84.175 12.702,84.631 12.702,85.22 C12.702,85.79 13.12,86.246 13.709,86.246 C14.374,86.246 14.792,85.79 14.773,85.22 C14.773,84.631 14.374,84.175 13.747,84.175 Z M17.737,85.6 L17.737,87.804 L16.312,87.804 L16.312,89.077 L17.737,89.077 L17.737,94.093 C17.737,95.176 17.908,95.993 18.383,96.487 C18.782,96.943 19.409,97.19 20.188,97.19 C20.834,97.19 21.347,97.095 21.67,96.962 L21.594,95.708 C21.385,95.765 21.062,95.822 20.625,95.822 C19.694,95.822 19.371,95.176 19.371,94.036 L19.371,89.077 L21.765,89.077 L21.765,87.804 L19.371,87.804 L19.371,85.163 L17.737,85.6 Z M31.037,92.706 C31.056,92.535 31.094,92.269 31.094,91.927 C31.094,90.236 30.296,87.595 27.294,87.595 C24.615,87.595 22.981,89.78 22.981,92.554 C22.981,95.328 24.672,97.19 27.503,97.19 C28.966,97.19 29.973,96.886 30.562,96.62 L30.277,95.423 C29.65,95.689 28.928,95.898 27.731,95.898 C26.059,95.898 24.615,94.967 24.577,92.706 L31.037,92.706 Z M24.596,91.509 C24.729,90.35 25.47,88.792 27.161,88.792 C29.042,88.792 29.498,90.445 29.479,91.509 L24.596,91.509 Z M33.165,100.762 L34.818,100.762 L34.818,95.765 L34.856,95.765 C35.407,96.677 36.471,97.209 37.687,97.209 C39.853,97.209 41.867,95.575 41.867,92.269 C41.867,89.476 40.195,87.595 37.972,87.595 C36.471,87.595 35.388,88.26 34.704,89.381 L34.666,89.381 L34.59,87.804 L33.089,87.804 C33.127,88.678 33.165,89.628 33.165,90.806 L33.165,100.762 Z M34.818,91.68 C34.818,91.452 34.875,91.205 34.932,90.996 C35.255,89.742 36.319,88.925 37.459,88.925 C39.226,88.925 40.195,90.502 40.195,92.345 C40.195,94.454 39.169,95.898 37.402,95.898 C36.205,95.898 35.198,95.1 34.894,93.941 C34.856,93.732 34.818,93.504 34.818,93.257 L34.818,91.68 Z M51.367,92.706 C51.386,92.535 51.424,92.269 51.424,91.927 C51.424,90.236 50.626,87.595 47.624,87.595 C44.945,87.595 43.311,89.78 43.311,92.554 C43.311,95.328 45.002,97.19 47.833,97.19 C49.296,97.19 50.303,96.886 50.892,96.62 L50.607,95.423 C49.98,95.689 49.258,95.898 48.061,95.898 C46.389,95.898 44.945,94.967 44.907,92.706 L51.367,92.706 Z M44.926,91.509 C45.059,90.35 45.8,88.792 47.491,88.792 C49.372,88.792 49.828,90.445 49.809,91.509 L44.926,91.509 Z M53.495,97 L55.167,97 L55.167,91.471 C55.167,91.186 55.205,90.901 55.281,90.692 C55.566,89.761 56.421,88.982 57.523,88.982 C59.1,88.982 59.651,90.217 59.651,91.699 L59.651,97 L61.323,97 L61.323,91.509 C61.323,88.355 59.347,87.595 58.074,87.595 C56.554,87.595 55.49,88.45 55.034,89.324 L54.996,89.324 L54.901,87.804 L53.419,87.804 C53.476,88.564 53.495,89.343 53.495,90.293 L53.495,97 Z" id="sitepen" opacity="0.899999976" fill="#FFFFFF" sketch:type="MSShapeGroup"></path> </g> </g> </svg> corelib/dgrid/demos/laboratory/resources/laboratory.css
New file @@ -0,0 +1,2 @@ @import url("//fonts.googleapis.com/css?family=Open+Sans:100,400,300,700"); *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{height:100%;width:100%;margin:0;font-family:'Open Sans',sans-serif;font-size:16px;background:#f8f8f8}fieldset{border:0;margin:0;padding:0}.laboratory{font-size:0;height:100%;padding-top:70px}.control{width:370px;height:100%;display:inline-block;vertical-align:top;font-size:16px;background:#0b1e2a;position:relative}.render{background:#f8f8f8;display:inline-block;font-size:14px;padding:25px;position:relative;height:100%;width:calc(100% - 370px);vertical-align:top;z-index:2}.tabControl{line-height:31px;color:#144c66;position:relative;font-weight:bold}.header{position:absolute;top:0;left:0;width:100%;background:#fff;overflow:hidden;font-size:24px;font-weight:100;height:70px;color:#fff;vertical-align:middle;-webkit-box-shadow:0 4px 10px -2px #0b1e2a;box-shadow:0 4px 10px -2px #0b1e2a;z-index:3;}.header .controlHeader{background:#1284cc;width:370px;display:inline-block}.header .logoLink{-webkit-box-shadow:1px 0 6px 0 #0e6aa4;box-shadow:1px 0 6px 0 #0e6aa4;display:inline-block;vertical-align:middle;margin-right:10px}.header .menuLink{color:#000;font-size:18px;margin-left:16px;text-decoration:none}.header .logo{width:98px;padding:15px}.header .splogo{position:absolute;top:10px;right:30px}@font-face{font-family:'icomoon';src:url("fonts/icomoon.eot?kn321z");src:url("fonts/icomoon.eot?#iefixkn321z") format('embedded-opentype'),url("fonts/icomoon.woff?kn321z") format('woff'),url("fonts/icomoon.ttf?kn321z") format('truetype'),url("fonts/icomoon.svg?kn321z#icomoon") format('svg');font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:'icomoon';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-transition:color 0.5s;-moz-transition:color 0.5s;-o-transition:color 0.5s;-ms-transition:color 0.5s;transition:color 0.5s;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}[class^="icon-"]:hover,[class*=" icon-"]:hover{cursor:pointer}.icon-times:before{content:"\f00d"}.icon-gear:before{content:"\f013"}.icon-info-circle:before{content:"\f05a"}.icon-external-link:before{content:"\f08e"}.icon-navicon:before{content:"\f0c9"}.icon-angle-up:before{content:"\f106"}.icon-angle-down:before{content:"\f107"}.icon-mail-reply:before{content:"\f112"}.icon-grid:before{content:"\e603"}.icon-code:before{content:"\e604"}.tabs{font-size:0;background:#1a374f}.tab{color:#c3f1ff;font-size:12px;padding:15px 10px;display:inline-block;cursor:pointer;-webkit-transition:background 0.4s;-moz-transition:background 0.4s;-o-transition:background 0.4s;-ms-transition:background 0.4s;transition:background 0.4s;}.tab.active{background:#0b1e2a;}.tab.active:hover{background:#0b1e2a}.tab:hover{background:#244c6d}.tabContent{display:none;overflow:auto;position:absolute;bottom:0;top:47px;}.tabContent.active{display:block}.claro .aboutDialog{overflow:visible;width:60%;-webkit-border-radius:8px;border-radius:8px;border:none;background:#fff;-webkit-box-shadow:0 0 15px 0 rgba(0,0,0,0.7);box-shadow:0 0 15px 0 rgba(0,0,0,0.7);padding:2em;}.claro .aboutDialog *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.claro .aboutDialog .dijitDialogCloseIcon{background-image:url("img/lab.png");background-position:0 0;width:286px;height:241px;top:-130px;right:-60px;z-index:951;position:absolute}.claro .aboutDialog .dijitDialogTitleBar,.claro .aboutDialog .dijitDialogPaneContent{background:none;border:none}.claro .aboutDialog .dijitDialogTitleBar{text-align:center;font-size:42px}.claro .dijitButton .dijitButtonNode{border:1px solid #a8eaff;background:transparent;color:#a8eaff;padding:2px 7px 4px;-webkit-transition:background 0.3s, color 0.3s;-moz-transition:background 0.3s, color 0.3s;-o-transition:background 0.3s, color 0.3s;-ms-transition:background 0.3s, color 0.3s;transition:background 0.3s, color 0.3s;}.claro .dijitButton .dijitButtonNode:hover{background:#a8eaff;color:#000;border-color:#53d6ff}.claro .dijitTextBox{-webkit-border-radius:8px;border-radius:8px;border:0;padding:2px 6px;background:#fff !important;font-size:12px;color:#333;-webkit-box-shadow:inset 1px 1px 3px 0 rgba(50,50,50,0.75);box-shadow:inset 1px 1px 3px 0 rgba(50,50,50,0.75)}.claro .dijitTextBox .dijitInputInner{color:#333}.claro .dijitTextBox,.claro .dijitPlaceHolder,.claro .dgrid-input{font-style:normal;font-family:'Open Sans',sans-serif;outline:0}.claro .dgrid-input:focus{outline:0}.claro .dijitMenuItem{font-size:12px}.claro .dijitArrowButton{background-color:#fff !important}.claro .dijitComboBoxMenu{-webkit-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.claro .dijitComboBoxMenu .dijitMenuItem{-webkit-transition:background-color 0.3s;-moz-transition:background-color 0.3s;-o-transition:background-color 0.3s;-ms-transition:background-color 0.3s;transition:background-color 0.3s}.claro .dijitComboBoxMenu .dijitMenuItemSelected,.claro .dijitComboBoxMenu .dijitMenuItemHover{background-image:none;border-color:#fff}.claro table.dojoDndAvatar{border-collapse:collapse;background-color:none;-webkit-box-shadow:3px 3px 4px 0 rgba(0,0,0,0.67);box-shadow:3px 3px 4px 0 rgba(0,0,0,0.67);}.claro table.dojoDndAvatar td{border:0}.claro table.dojoDndAvatar table{width:370px;line-height:26px;border:0}.claro table.dojoDndAvatar .dgrid-row:before,.claro table.dojoDndAvatar .dgrid-row:after{display:none}.claro table.dojoDndAvatar .dgrid-row table td{background:#0e2736 !important;padding:5px;border:none}.claro table.dojoDndAvatar .dojoDndAvatarHeader{display:none}.claro table.dojoDndAvatar .dojoDndAvatarItem td{padding:0}.claro.dojoDndMove .dojoDndAvatarHeader{background-color:#f00}.claro.dojoDndMove .dojoDndAvatarCanDrop .dojoDndAvatarHeader{background-color:#008000}.columnGridContainer{display:inline-block;padding-top:1em}.claro .featureGrid{margin-top:.5em}.claro .featureGrid,.claro .columnGrid,.claro .dojoDndAvatar{background:transparent;height:auto;border:0 !important;}.claro .featureGrid .dgrid-row,.claro .columnGrid .dgrid-row,.claro .dojoDndAvatar .dgrid-row{color:#fff;font-size:13px;font-weight:100;border:none !important;width:100%;padding:0;-webkit-transition:padding 0.3s;-moz-transition:padding 0.3s;-o-transition:padding 0.3s;-ms-transition:padding 0.3s;transition:padding 0.3s;cursor:default;}.claro .featureGrid .dgrid-row .dgrid-cell,.claro .columnGrid .dgrid-row .dgrid-cell,.claro .dojoDndAvatar .dgrid-row .dgrid-cell{padding:4px}.claro .featureGrid .dgrid-row-odd,.claro .columnGrid .dgrid-row-odd,.claro .dojoDndAvatar .dgrid-row-odd{background:#23343f}.claro .featureGrid .dgrid-row-even,.claro .columnGrid .dgrid-row-even,.claro .dojoDndAvatar .dgrid-row-even{background:#0b1e2a}.claro .featureGrid .dgrid-cell,.claro .columnGrid .dgrid-cell,.claro .dojoDndAvatar .dgrid-cell{line-height:26px;border:0;padding:0}.claro .featureGrid .dijitCheckBox,.claro .columnGrid .dijitCheckBox,.claro .dojoDndAvatar .dijitCheckBox{background:none;-webkit-border-radius:3px;border-radius:3px;background-color:#ecf0f1;-webkit-box-shadow:inset 1px 1px 3px 0 rgba(50,50,50,0.65);box-shadow:inset 1px 1px 3px 0 rgba(50,50,50,0.65);width:16px;height:16px;-webkit-transition:background-color 0.3s, box-shadow 0.3s;-moz-transition:background-color 0.3s, box-shadow 0.3s;-o-transition:background-color 0.3s, box-shadow 0.3s;-ms-transition:background-color 0.3s, box-shadow 0.3s;transition:background-color 0.3s, box-shadow 0.3s;}.claro .featureGrid .dijitCheckBox:hover,.claro .columnGrid .dijitCheckBox:hover,.claro .dojoDndAvatar .dijitCheckBox:hover{-webkit-box-shadow:inset 1px 1px 1px 0 rgba(50,50,50,0.45);box-shadow:inset 1px 1px 1px 0 rgba(50,50,50,0.45)}.claro .featureGrid .dijitCheckBox.dijitCheckBoxDisabled,.claro .columnGrid .dijitCheckBox.dijitCheckBoxDisabled,.claro .dojoDndAvatar .dijitCheckBox.dijitCheckBoxDisabled{background-color:#687987;-webkit-box-shadow:none;box-shadow:none}.claro .featureGrid .dijitCheckBox.dijitCheckBoxChecked,.claro .columnGrid .dijitCheckBox.dijitCheckBoxChecked,.claro .dojoDndAvatar .dijitCheckBox.dijitCheckBoxChecked{background:url("img/formSprite.png") no-repeat 0 1px;background-color:#0b6dc4;}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.claro .featureGrid .dijitCheckBox.dijitCheckBoxChecked,.claro .columnGrid .dijitCheckBox.dijitCheckBoxChecked,.claro .dojoDndAvatar .dijitCheckBox.dijitCheckBoxChecked{background:url("img/formSprite@2x.png") no-repeat 0 1px x 2}}.claro .featureGrid .dijitCheckBox.dijitCheckBoxChecked:hover,.claro .columnGrid .dijitCheckBox.dijitCheckBoxChecked:hover,.claro .dojoDndAvatar .dijitCheckBox.dijitCheckBoxChecked:hover{background-color:#0d85ef}.claro .featureGrid .dijitCheckBox.dijitCheckBoxCheckedDisabled,.claro .columnGrid .dijitCheckBox.dijitCheckBoxCheckedDisabled,.claro .dojoDndAvatar .dijitCheckBox.dijitCheckBoxCheckedDisabled{background:url("img/formSprite.png") no-repeat 0 1px;background-color:#084c89;}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.claro .featureGrid .dijitCheckBox.dijitCheckBoxCheckedDisabled,.claro .columnGrid .dijitCheckBox.dijitCheckBoxCheckedDisabled,.claro .dojoDndAvatar .dijitCheckBox.dijitCheckBoxCheckedDisabled{background:url("img/formSprite@2x.png") no-repeat 0 1px x 2}}.claro .featureGrid .dijitCheckBox.dijitCheckBoxCheckedDisabled:hover,.claro .columnGrid .dijitCheckBox.dijitCheckBoxCheckedDisabled:hover,.claro .dojoDndAvatar .dijitCheckBox.dijitCheckBoxCheckedDisabled:hover{background-color:#084c89}.claro .featureGrid .icon-gear,.claro .columnGrid .icon-gear,.claro .dojoDndAvatar .icon-gear{color:#6a7782;font-size:16px;vertical-align:middle;}.claro .featureGrid .icon-gear:hover,.claro .columnGrid .icon-gear:hover,.claro .dojoDndAvatar .icon-gear:hover{color:#c3c9ce}.claro .columnGrid .field-dragSource,.claro .dojoDndAvatar .field-dragSource{width:30px;font-size:16px;color:#6a7782;}.claro .columnGrid .field-dragSource i,.claro .dojoDndAvatar .field-dragSource i{position:relative;top:1px;}.claro .columnGrid .field-dragSource i:hover,.claro .dojoDndAvatar .field-dragSource i:hover{cursor:move}.claro .columnGrid .field-dragSource:hover,.claro .dojoDndAvatar .field-dragSource:hover,.claro .columnGrid .field-dragSource:active,.claro .dojoDndAvatar .field-dragSource:active{color:#0b6dc4}.claro .columnGrid .field-config,.claro .dojoDndAvatar .field-config{width:45px;padding-left:4px}.claro .columnGrid .field-label,.claro .dojoDndAvatar .field-label{padding-left:2px}.claro .columnGrid .icon-gear,.claro .dojoDndAvatar .icon-gear{margin-left:7px}.claro .columnGrid .icon-times,.claro .dojoDndAvatar .icon-times{color:#6a7782;vertical-align:middle}.claro .columnGrid .icon-times:hover,.claro .dojoDndAvatar .icon-times:hover{color:#d31605}.claro .columnGrid .dojoDndItem:before,.claro .dojoDndAvatar .dojoDndItem:before,.claro .columnGrid .dojoDndItem:after,.claro .dojoDndAvatar .dojoDndItem:after{border:1px dotted #3c5e79;content:" ";height:1px;display:block;-webkit-transition:height 0.2s, opacity 0.3s, background 0.3s;-moz-transition:height 0.2s, opacity 0.3s, background 0.3s;-o-transition:height 0.2s, opacity 0.3s, background 0.3s;-ms-transition:height 0.2s, opacity 0.3s, background 0.3s;transition:height 0.2s, opacity 0.3s, background 0.3s;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0)}.claro .columnGrid .dojoDndItem:active,.claro .dojoDndAvatar .dojoDndItem:active,.claro .columnGrid .dojoDndItem .dgrid-selected,.claro .dojoDndAvatar .dojoDndItem .dgrid-selected{opacity:.5;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";filter:alpha(opacity=50)}.claro .columnGrid .dojoDndItem .dojoDndHandle,.claro .dojoDndAvatar .dojoDndItem .dojoDndHandle{padding-left:10px;}.claro .columnGrid .dojoDndItem .dojoDndHandle:hover,.claro .dojoDndAvatar .dojoDndItem .dojoDndHandle:hover{cursor:move}.claro .columnGrid .dojoDndItemBefore:before,.claro .dojoDndAvatar .dojoDndItemBefore:before,.claro .columnGrid .dojoDndItemAfter:after,.claro .dojoDndAvatar .dojoDndItemAfter:after,.claro .columnGrid .dojoDndItemAfter:nth-last-child(2):after,.claro .dojoDndAvatar .dojoDndItemAfter:nth-last-child(2):after{background:#102b3c;height:30px;opacity:1;-ms-filter:none;filter:none;cursor:move}.claro .columnGrid .dojoDndItemAfter:nth-last-child(2):before,.claro .dojoDndAvatar .dojoDndItemAfter:nth-last-child(2):before{height:1px;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0)}.claro .columnGrid .dgrid-selected:before,.claro .dojoDndAvatar .dgrid-selected:before,.claro .columnGrid .dgrid-selected:after,.claro .dojoDndAvatar .dgrid-selected:after{height:1px;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0)}.claro .columnGrid .dojoDndItem .dgrid-cell,.claro .dojoDndAvatar .dojoDndItem .dgrid-cell{border-top:none;border-bottom:none}.claro .dijitRadio{background:url("img/formSprite.png") no-repeat -20px 0;}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.claro .dijitRadio{background:url("img/formSprite@2x.png") no-repeat -20px 0 x 2}}.claro .dijitRadioChecked{background:url("img/formSprite.png") no-repeat -41px 0;}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.claro .dijitRadioChecked{background:url("img/formSprite@2x.png") no-repeat -41px 0 x 2}}.columnGridForm{font-size:0;position:relative;padding:5px 0 14px 10px;}.columnGridForm .addBtn{background:transparent;border:none;color:#fff;font-size:18px;outline:none;padding:0 0 0 16px;-webkit-transition:color 0.4s;-moz-transition:color 0.4s;-o-transition:color 0.4s;-ms-transition:color 0.4s;transition:color 0.4s;vertical-align:middle;}.columnGridForm .addBtn:hover{color:#44de04;cursor:pointer}.columnGridForm .dijitTextBox:first-child{display:inline-block;width:calc(100% - 40px)}.columnEditor{margin:0;overflow-x:hidden;}.columnEditor .configForm{display:none}.columnEditor.slid .columnGridContainer{display:none}.columnEditor.slid .configForm{display:block}.configForm{color:#fff;font-weight:100;font-size:14px;position:relative;padding:15px;padding-top:1em;display:inline-block;vertical-align:top;}.configForm legend{color:#fff}.configForm .dijitButton{margin:0;position:absolute;top:18px;right:15px;z-index:1}.configForm .dijitButton .dijitButtonNode{font-size:12px}.configForm fieldset{font-size:0;position:relative}.configForm legend{font-size:14px;font-weight:400;margin:0 0 20px 0;padding:10px 0 0 0;text-transform:uppercase}.configForm .label{width:150px;display:inline-block;font-size:13px;vertical-align:top;height:35px}.configForm .propTitle{margin-bottom:.55em;font-size:13px;color:#a8eaff;text-transform:none}.configForm .field{font-weight:400;width:calc(100% - 180px);display:inline-block;vertical-align:top;font-size:12px;}.configForm .field .dijitTextBox{width:100%;margin-bottom:10px}.configForm .field .halfWidth{width:35%}.configForm .mixinProp{font-weight:400;margin-top:20px;text-transform:uppercase}.configForm .actionLink{cursor:pointer;color:#a8eaff;margin-left:1em}.featureEditor .gridTypeForm{line-height:26px;border:0;padding:0}.featureEditor{width:100%;}.featureEditor .configForm{width:100% !important;}.featureEditor .configForm .dijitButton{top:18px;right:15px;margin:0;z-index:1}.featureEditor .configForm a{color:#fff;font-size:13px}.featureEditor .gridTypeForm{padding:10px}.featureEditor .dgrid-row{padding:0 7px !important;position:relative;}.featureEditor .dgrid-row a{text-decoration:none;color:#fff;font-size:13px}.featureEditor .dgrid-row .icon-gear{position:absolute;right:10px;top:8px}.featureEditor .dgrid-row .dgrid-cell{padding:4px}.featureEditor .dgrid-row-even:hover{background:#102b3c;-webkit-transition:background 0.4s;-moz-transition:background 0.4s;-o-transition:background 0.4s;-ms-transition:background 0.4s;transition:background 0.4s}.featureEditor .dgrid-row-odd:hover{background:#2a3f4c;-webkit-transition:background 0.4s;-moz-transition:background 0.4s;-o-transition:background 0.4s;-ms-transition:background 0.4s;transition:background 0.4s}.featureEditor .field-selected{width:30px}.gridTypeForm{color:#fff;font-size:14px;font-weight:100;margin-bottom:10px}.demoGridPane,.demoCodePane{position:absolute;top:59px;bottom:25px;left:25px;right:25px}.demoGridPane{color:#95a5a6;}.demoGridPane .dgrid{height:100%}.demoGridPane .dgrid-content .dojoDndItem,.demoGridPane .dgrid-content .dojoDndItemOver{padding:0;border:0}.demoCodePane textarea{background:#ebebeb;border:0;font-family:Consolas,Courier,monospace;font-size:12px;height:100%;padding:5px;resize:none;width:100%}.render{padding-top:13px;}.render .gridBtn,.render .codeBtn{font-size:13px;margin:0;padding:.55em .75em;font-weight:normal;cursor:pointer;-webkit-transition:background 0.3s;-moz-transition:background 0.3s;-o-transition:background 0.3s;-ms-transition:background 0.3s;transition:background 0.3s;}.render .gridBtn i,.render .codeBtn i{margin-right:.45em;position:relative;top:1px}.render .gridBtn{-webkit-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.render .codeBtn{-webkit-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.render[data-selected-page="code"] .demoGridPane{display:none}.render[data-selected-page="code"] .codeBtn{background:#2b6ba2;color:#fff}.render[data-selected-page="code"] .gridBtn{background:#e1e1e1;color:#333;}.render[data-selected-page="code"] .gridBtn:hover{background:#cfe2f2}.render[data-selected-page="grid"] .demoCodePane{display:none}.render[data-selected-page="grid"] .codeBtn{background:#e1e1e1;color:#333;}.render[data-selected-page="grid"] .codeBtn:hover{background:#cfe2f2}.render[data-selected-page="grid"] .gridBtn{background:#2b6ba2;color:#fff} corelib/dgrid/demos/laboratory/resources/laboratory.styl
New file @@ -0,0 +1,10 @@ // Compilation instructions: stylus -u nib -c [-w] laboratory.styl @import url("//fonts.googleapis.com/css?family=Open+Sans:100,400,300,700"); @import 'nib/vendor'; @import 'variables'; @import 'base'; @import 'overrides'; @import 'columnsPane'; @import 'featuresPane'; @import 'result'; corelib/dgrid/demos/laboratory/resources/overrides.styl
New file @@ -0,0 +1,108 @@ /* * Dijit overrides */ .claro { .dijitButton .dijitButtonNode { border: 1px solid $primaryButtonColor; background: transparent; color: $primaryButtonColor; padding: 2px 7px 4px; transition: background 0.3s, color 0.3s; &:hover { background:$primaryButtonColor; color:#000; border-color: darken($primaryButtonColor, 20%); } } .dijitTextBox { border-radius: 8px; border: 0; padding: 2px 6px; background: #FFF !important; font-size: 12px; color: #333; box-shadow: inset 1px 1px 3px 0px rgba(50, 50, 50, 0.75); } .dijitTextBox .dijitInputInner { color: #333; } .dijitTextBox, .dijitPlaceHolder, .dgrid-input { font-style: normal; font-family: $fontFamily; outline: 0; } .dgrid-input:focus { outline: 0; } .dijitMenuItem { font-size:12px; } .dijitArrowButton { background-color:#fff !important; } .dijitComboBoxMenu { border-radius: 0 0 4px 4px; .dijitMenuItem { transition:background-color 0.3s; } .dijitMenuItemSelected, .dijitMenuItemHover { background-image:none; border-color:#fff; } } } /* Override DND Avatar */ .claro table.dojoDndAvatar { border-collapse: collapse; background-color: none; box-shadow: 3px 3px 4px 0px rgba(0, 0, 0, 0.67); td { border:0; } table { width:$sidebarWidth; line-height:26px; border:0; } .dgrid-row:before, .dgrid-row:after { display:none; } .dgrid-row table td { background: $draggedRowBg !important; padding:5px; border:none; } .dojoDndAvatarHeader { display:none; } .dojoDndAvatarItem td { padding: 0px; } } .claro.dojoDndMove .dojoDndAvatarHeader { background-color: red; } .claro.dojoDndMove .dojoDndAvatarCanDrop .dojoDndAvatarHeader { background-color: green; } corelib/dgrid/demos/laboratory/resources/result.styl
New file @@ -0,0 +1,107 @@ .gridTypeForm { color: white; font-size: 14px; font-weight: 100; margin-bottom: 10px; } .demoGridPane, .demoCodePane { position: absolute; top: 59px; bottom: $renderPadding; left: $renderPadding; right: $renderPadding; } .demoGridPane { color: #95a5a6; .dgrid { height: 100%; } .dgrid-content { .dojoDndItem, .dojoDndItemOver { padding: 0; border: 0; } } } .demoCodePane { textarea { background: #EBEBEB; border: 0; font-family: Consolas, Courier, monospace; font-size: 12px; height: 100%; padding: 5px; resize: none; width: 100%; } } .render { padding-top:13px; .gridBtn, .codeBtn { font-size:13px; margin:0; padding:0.55em 0.75em; font-weight: normal; cursor: pointer; transition: background 0.3s; i { margin-right:0.45em; position:relative; top:1px; } } .gridBtn { border-radius: 4px 0 0 4px; } .codeBtn { border-radius: 0 4px 4px 0; } &[data-selected-page="code"] { .demoGridPane { display: none; } .codeBtn { background: $resultButtonOnBg; color: $resultButtonOnText; } .gridBtn { background: $resultButtonOffBg; color: $resultButtonOffText; &:hover { background: lighten($resultButtonOnBg, 80%); } } } &[data-selected-page="grid"] { .demoCodePane { display: none; } .codeBtn { background: $resultButtonOffBg; color: $resultButtonOffText; &:hover { background: lighten($resultButtonOnBg, 80%); } } .gridBtn { background: $resultButtonOnBg; color: $resultButtonOnText; } } } corelib/dgrid/demos/laboratory/resources/variables.styl
New file @@ -0,0 +1,63 @@ $fontFamily = 'Open Sans', sans-serif; $confirmColor = #2F9903; $deleteColor = #D31605; $dgridBlue = #0B6DC4; $sidebarBackground = #0b1e2a; $sidebarIconColor = #6A7782; $sidebarGearColor = lighten($sidebarIconColor, 60%); $sidebarRowEvenBg = #0B1E2A; $sidebarRowOddBg = #23343F; $sidebarTabActiveBg = #0B1E2A; $sidebarTabStripBg = #1A374F; $dropTargetBg = lighten($sidebarRowEvenBg, 5%); $draggedRowBg = darken($dropTargetBg, 10%); $primaryButtonColor = #A8EAFF; $sidebarWidth = 370px; $headerHeight = 70px; $tabHeight = 47px; $resultButtonOnBg = #2B6BA2; $resultButtonOnText = #fff; $resultButtonOffBg = #E1E1E1; $resultButtonOffText = #333; $renderPadding = 25px; $checkBg = #ECF0F1; $checkFilledBg = $dgridBlue; $checkDisabledBg = #687987; $checkboxSize = 16px; $checkmark = "\e600"; $closeIcon = "\f00d"; $gearIcon = "\f013"; $infoIcon = "\f05a"; $externalLinkIcon = "\f08e"; $navIcon = "\f0c9"; $angleUpIcon = "\f106"; $angleDownIcon = "\f107"; $replyIcon = "\f112"; $gridIcon = "\e603"; $codeIcon = "\e604"; $radio = -20px 0; $radioChecked = -41px 0; $checkboxChecked = 0 1px; $formSprite = "img/formSprite.png"; $formSprite2x = "img/formSprite@2x.png" $sprite() { background: url($formSprite) no-repeat arguments; @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2) { background: url($formSprite2x) no-repeat (arguments x 2); } } corelib/dgrid/demos/laboratory/util/toJavaScript.js
New file @@ -0,0 +1,168 @@ define([ 'dojo/_base/lang' ], function (lang) { // A basic check to ensure a property name is valid. Will incorrectly flag some valid names, // which is fine - they'll just get unnecessarily wrapped in quotes var propertyNameRegex = /^[A-Za-z]+[A-Za-z0-9_]*$/; // Check for dijit form widgets for editor property var dijitFormWidgetRegex = /dijit\/form\/([A-Za-z]*)$/; function tab(count) { var tabString = ''; while (count--) { tabString += '\t'; } return tabString; } /** * @param {Object|Array} obj: object to convert to JavaScript * @param {Object} options: option bag object * @param {number} options.indent: (integer) indentation level of output code * @param {boolean} options.includeEmpty: if true, empty properties ('', null, undefined) will be included in output * @param {boolean} options.inline: if true, print just properties, not wrapping braces */ function toJavaScript(obj, options) { options = options || {}; var javascript = ''; var indent = options.indent || 0; // TODO: does not handle some things, e.g. null, undefined if (typeof obj === 'string') { return escapeString(obj); } if (typeof obj !== 'object') { return obj; } if (!options.inline) { if (obj instanceof Array) { javascript = '['; } else { javascript = '{'; } javascript += '\n'; } indent++; if (obj instanceof Array) { javascript += printArray(obj, lang.delegate(options, { inline: false }), indent); } else { javascript += printObject(obj, lang.delegate(options, { inline: false }), indent); } indent--; if (!options.inline) { javascript += '\n' + tab(indent); if (obj instanceof Array) { javascript += ']'; } else { javascript += '}'; } } return javascript; } function printObject(obj, options, indent) { var javascript = ''; var property; var firstProperty = true; for (property in obj) { // TODO: filtering with hasOwnProperty may not be necessary (or desirable?) if (obj.hasOwnProperty(property)) { if ((options.includeEmpty || (obj[property] !== '' && obj[property] !== null && obj[property] !== undefined))) { if (firstProperty) { firstProperty = false; } else { javascript += ',\n'; } javascript += tab(indent) + formatPropertyName(property) + ': '; switch (typeof obj[property]) { // Array, Object case 'object': javascript += toJavaScript(obj[property], lang.delegate(options, { indent: indent })); break; case 'string': // Coerce string values that should be boolean if (obj[property] === 'true' || obj[property] === 'false') { javascript += obj[property]; } else { // Widget editors are received by module ID, so convert any of those to constructors javascript += (property === 'editor' && formatDijitFormWidget(obj[property])) || '\'' + escapeString(obj[property]) + '\''; } break; // number, boolean default: javascript += obj[property]; } } } } return javascript; } function printArray(array, options, indent) { var javascript = ''; var i; for (i = 0; i < array.length; i++) { javascript += tab(indent); javascript += toJavaScript(array[i], lang.delegate(options, { indent: indent })); if (i < array.length - 1) { javascript += ',\n'; } } return javascript; } function escapeString(str) { return str.replace(/[\\']/g, '\\$&'); } function formatDijitFormWidget(str) { return typeof str === 'string' && dijitFormWidgetRegex.test(str) ? str.replace(dijitFormWidgetRegex, '$1') : ''; } function formatPropertyName(str) { if (!propertyNameRegex.test(str)) { return '\'' + str + '\''; } else { return str; } } toJavaScript.escapeString = escapeString; toJavaScript.formatDijitFormWidget = formatDijitFormWidget; toJavaScript.formatPropertyName = formatPropertyName; return toJavaScript; }); corelib/dgrid/demos/laboratory/widgets/ColumnConfigForm.js
New file @@ -0,0 +1,182 @@ define([ 'dojo/_base/array', 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/dom-class', 'dojo/on', 'dojo/query', 'dojo/string', 'dojo/topic', 'dijit/registry', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'dijit/_WidgetsInTemplateMixin', 'dijit/form/_FormMixin', './_ResizeMixin', '../data/config', 'dojo/i18n!../nls/laboratory', 'dojo/text!./templates/ColumnConfigForm.html', // for template 'dijit/form/Button', 'dijit/form/ComboBox', 'dijit/form/FilteringSelect', 'dijit/form/NumberTextBox', 'dijit/form/RadioButton', 'dijit/form/TextBox' ], function (arrayUtil, declare, lang, domClass, on, query, string, topic, registry, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _FormMixin, _ResizeMixin, config, i18n, template) { var defaultColumnValues = { // Standard column properties field: '', label: '', className: '', sortable: 'true', // Editor properties editor: '', editOn: '', autoSave: 'false', autoSelect: 'false', dismissOnEnter: 'true', // ColumnHider properties hidden: 'false', unhidable: 'false', // ColumnReorder properties reorderable: 'true', // ColumnResizer properties resizable: 'true', // Selector properties selector: '' }; return declare([ _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _FormMixin, _ResizeMixin ], { baseClass: 'configForm column', templateString: template, i18n: i18n, docBaseUrl: config.docBaseUrl, _featureMidToNodeMap: null, buildRendering: function () { this.inherited(arguments); if (!this.containerNode) { this.containerNode = this.domNode; } var map = this._featureMidToNodeMap = { 'dgrid/Editor': this.editorFields, 'dgrid/extensions/ColumnHider': this.columnHiderFields, 'dgrid/extensions/ColumnReorder': this.columnReorderFields, 'dgrid/extensions/ColumnResizer': this.columnResizerFields, 'dgrid/Selector': this.selectorFields }; for (var k in map) { // Add legend labels programmatically var moduleName = k.slice(k.lastIndexOf('/') + 1); map[k].getElementsByTagName('legend')[0].innerHTML = string.substitute(this.i18n.moduleProperties, [ moduleName ]); } }, postCreate: function () { function shouldDismiss(editor) { return editor ? editor.toLowerCase().indexOf('textarea') === -1 : true; } this.inherited(arguments); this.own( topic.subscribe('/feature/select', lang.hitch(this, '_onFeatureSelect')), on(this.doneButton, 'click', lang.hitch(this, function () { this.emit('close'); })), this.watch('value', function (propertyName, oldValue, newValue) { // Let the ColumnGrid know the column config has changed so it an update the store topic.publish('/column/changed', newValue); if (newValue.editor !== oldValue.editor) { // Set a sane default for dismissOnEnter if switching to/from a textarea editor var newDismiss = shouldDismiss(newValue.editor); var oldDismiss = shouldDismiss(oldValue.editor); if (newDismiss !== oldDismiss) { this.set('value', lang.mixin(newValue, { dismissOnEnter: '' + newDismiss })); } } }) ); }, _setValueAttr: function (value) { // Use default values for any unspecified fields this.inherited(arguments, [lang.mixin(lang.clone(defaultColumnValues), value)]); // Store the id - _FormMixin will discard this value, but we need it to persist the data back to the store this._id = value.id; }, _getValueAttr: function () { var returnValue = this.inherited(arguments); var propertyName, k; for (k in this._getHiddenFieldNames()) { delete returnValue[k]; } // Omit properties with default values for (propertyName in returnValue) { if (returnValue[propertyName] === defaultColumnValues[propertyName]) { delete returnValue[propertyName]; } } // Restore the id returnValue.id = this._id; return returnValue; }, _getHiddenFieldNames: function () { var hiddenFieldNames = {}; // Remove values from hidden fields query('fieldset.dijitHidden', this.domNode).forEach(function (fieldset) { arrayUtil.forEach(registry.findWidgets(fieldset), function (childWidget) { hiddenFieldNames[childWidget.name] = true; }); }); return hiddenFieldNames; }, _onFeatureSelect: function (featureMid, isEnabled) { var featureNode = this._featureMidToNodeMap[featureMid]; if (featureNode) { domClass.toggle(featureNode, 'dijitHidden', !isEnabled); if (!isEnabled) { // Close the dialog so input fields will reset if the user reenables the feature. this.emit('close'); topic.publish('/columnConfig/hidden', this._getHiddenFieldNames()); } } }, _clearField: function (event) { var fieldName = event.target.getAttribute('data-field-name'); var formValue = this.get('value'); if (!fieldName) { return; } if (fieldName in formValue) { formValue[fieldName] = ''; this.set('value', formValue); } } }); }); corelib/dgrid/demos/laboratory/widgets/ColumnEditor.js
New file @@ -0,0 +1,57 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/dom-class', 'dijit/_WidgetBase', './ColumnConfigForm', './ColumnGrid' ], function (declare, lang, domClass, _WidgetBase, ColumnConfigForm, ColumnGrid) { return declare(_WidgetBase, { baseClass: 'columnEditor', buildRendering: function () { this.inherited(arguments); this.columnGrid = new ColumnGrid().placeAt(this.domNode); this.form = new ColumnConfigForm().placeAt(this.domNode); }, postCreate: function () { this.inherited(arguments); this.form.on('close', lang.hitch(this, '_showGrid')); this.columnGrid.on('editcolumn', lang.hitch(this, '_onEditColumn')); }, startup: function () { if (this._started) { return; } this.inherited(arguments); this.columnGrid.startup(); this.form.startup(); }, _getColumnsAttr: function () { return this.columnGrid.get('columns'); }, _showGrid: function () { domClass.remove(this.domNode, 'slid'); }, _onEditColumn: function (event) { domClass.add(this.domNode, 'slid'); this.form.set('value', event.data); }, addColumn: function (label) { this.columnGrid.addColumn(label); }, removeColumn: function (target) { this.columnGrid.removeColumn(target); } }); }); corelib/dgrid/demos/laboratory/widgets/ColumnGrid.js
New file @@ -0,0 +1,160 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/dom-class', 'dojo/topic', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'dijit/_WidgetsInTemplateMixin', './_ResizeMixin', 'dojo/i18n!../nls/laboratory', 'dojo/text!./templates/ColumnGrid.html', 'dgrid/Grid', 'dgrid/Editor', 'dgrid/extensions/DijitRegistry', 'dgrid/extensions/DnD', 'dgrid/extensions/SingleQuery', 'dstore/Memory', 'dstore/Trackable', // Widgets in template: 'dijit/form/Form', 'dijit/form/Button', 'dijit/form/TextBox' ], function (declare, lang, domClass, topic, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _ResizeMixin, i18n, template, Grid, Editor, DijitRegistry, DnD, SingleQuery, Memory, Trackable) { function renderDragSourceCell(item, value, node) { domClass.add(node, 'dojoDndHandle'); node.innerHTML = '<i class="icon-navicon" title="' + i18n.dragToMove + '"></i>'; } return declare([ _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _ResizeMixin ], { baseClass: 'columnGridContainer', templateString: template, i18n: i18n, buildRendering: function () { this.inherited(arguments); this.store = new (declare([ Memory, Trackable ]))(); this.grid = new (declare([ Grid, SingleQuery, Editor, DnD, DijitRegistry ], { columns: { dragSource: { label: '', renderCell: renderDragSourceCell, sortable: false }, label: { field: 'label', label: i18n.label, autoSave: true, sortable: false }, config: { label: '', formatter: function () { return '<i class="icon-times" title="' + i18n['delete'] + '"></i>' + '<i class="icon-gear" title="' + i18n.edit + '"></i> '; }, sortable: false } }, showHeader: false, dndParams: { withHandles: true } }))({ collection: this.store, className: 'columnGrid dgrid-autoheight' }, this.gridNode); this._startupWidgets.push(this.grid); }, postCreate: function () { this.inherited(arguments); this.own( this.store.on('add,delete,update', lang.hitch(this, '_onStoreChange')), this.grid.on('.icon-times:click', lang.hitch(this, 'removeColumn')), this.grid.on('.icon-gear:click', lang.hitch(this, '_editColumn')), topic.subscribe('/column/changed', lang.hitch(this, '_onColumnChange')), topic.subscribe('/columnConfig/hidden', lang.hitch(this, '_onFieldsHidden')) ); }, _getColumnsAttr: function () { return this.store.fetchSync(); }, addColumn: function (label) { // summary: // Adds a column to the store with the given label; // the column's field name will be based on the label provided this.store.put({ field: label.replace(/[^\w-]/g, '_'), label: label }); }, removeColumn: function (target) { // summary: // Removes the column from the store corresponding to the given target // (whether an event, element, ID, or item) this.store.remove(this.grid.row(target).id); }, _onFormSubmit: function (event) { // summary: // Adds a column to the store from the UI values event.preventDefault(); var form = this.columnGridForm; var value = form.get('value'); if (!value.label) { return; } this.addColumn(value.label); form.reset(); this.fieldLabelTextBox.focus(); }, _editColumn: function (event) { // summary: // Shows the column configuration for a column var row = this.grid.row(event); // Let the ColumnEditor know that is should set the form data and display the form this.emit('editcolumn', { data: row.data }); }, _onColumnChange: function (value) { this.store.put(value); }, _onStoreChange: function () { // Let the Laboratory know that it should update the demo display (grid or generated code) topic.publish('/configuration/changed'); // Let the Tree config module know that is should update its list of column names topic.publish('/store/columns/update', this.store); }, _onFieldsHidden: function (hiddenFieldNames) { this.store.forEach(function (columnConfig) { var k, updated; for (k in columnConfig) { if (hiddenFieldNames[k]) { delete columnConfig[k]; updated = true; } } updated && this.store.put(columnConfig); }, this); } }); }); corelib/dgrid/demos/laboratory/widgets/FeatureEditor.js
New file @@ -0,0 +1,117 @@ define([ 'require', 'dojo/_base/array', 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/Deferred', 'dojo/topic', 'dstore/Memory', 'dstore/Trackable', 'dijit/layout/StackContainer', './FeatureGrid', '../data/features' ], function (require, arrayUtil, declare, lang, Deferred, topic, Memory, Trackable, StackContainer, FeatureGrid, featureData) { return declare(StackContainer, { baseClass: 'featureEditor', doLayout: false, buildRendering: function () { this.inherited(arguments); this.configPanes = {}; this.store = new (declare([ Memory, Trackable ]))({ data: featureData }); this.featureGrid = new FeatureGrid({ store: this.store, featureType: 'grid' }); this.addChild(this.featureGrid); }, postCreate: function () { this.inherited(arguments); this.own( this.featureGrid.on('configure-module', lang.hitch(this, '_showModuleConfig')), this.store.on('add,delete,update', lang.hitch(this, '_onUpdateStore')) ); }, startup: function () { this.inherited(arguments); var self = this; var configModuleIds = []; var dfd = new Deferred(); arrayUtil.forEach(featureData, function (feature) { if (feature.configModule) { configModuleIds.push('./' + feature.configModule); } }); require(configModuleIds, function () { arrayUtil.forEach(featureData, function (feature) { var ConfigConstructor; var configPane; if (feature.configModule !== undefined) { ConfigConstructor = require('./' + feature.configModule); configPane = new ConfigConstructor({ moduleName: feature.mid.slice(feature.mid.lastIndexOf('/') + 1), documentationUrl: feature.documentationUrl }); configPane.on('close', function () { self.selectChild(self.featureGrid); }); this.addChild(configPane); this.configPanes[feature.mid] = configPane; } }, self); dfd.resolve(); }); return dfd.promise; }, isSelected: function (moduleId) { return !!this.store.filter({ mid: moduleId, selected: true }).fetchSync().length; }, filter: function (query) { return this.store.filter(query).fetchSync(); }, getModuleConfig: function (mid) { return this.configPanes[mid] && this.configPanes[mid].get('value'); }, _showModuleConfig: function (event) { var configPane = this.configPanes[event.mid]; if (configPane) { this.selectChild(configPane); } }, _onUpdateStore: function () { // Let the Laboratory know that it should update the demo display (grid or generated code) topic.publish('/configuration/changed'); }, _getExpandoColumnAttr: function () { return this.configPanes['dgrid/Tree'].get('expandoColumn'); }, _setFeatureTypeAttr: function (featureType) { this.featureGrid.set('featureType', featureType); // Make sure the grid is actually the selected child (not one of the option panes) this.selectChild(this.featureGrid); } }); }); corelib/dgrid/demos/laboratory/widgets/FeatureGrid.js
New file @@ -0,0 +1,255 @@ define([ 'dojo/_base/array', 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/mouse', 'dojo/on', 'dojo/query', 'dojo/topic', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'dijit/_WidgetsInTemplateMixin', './_ResizeMixin', 'dijit/Tooltip', 'dijit/form/CheckBox', 'dgrid/Grid', 'dgrid/Editor', 'dgrid/extensions/DijitRegistry', 'dgrid/extensions/SingleQuery', 'dojo/i18n!../nls/laboratory', 'dojo/text!./templates/FeatureGrid.html', // Widgets in template 'dijit/form/Form', 'dijit/form/RadioButton' ], function (arrayUtil, declare, lang, mouse, on, query, topic, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _ResizeMixin, Tooltip, CheckBox, Grid, Editor, DijitRegistry, SingleQuery, i18n, template) { function renderLabelCell (item, value, node) { // Render the label cell, adding the doc link, tooltip icon, and config icon when appropriate var cellHtml = '<a class="featureLabel" href="#">' + item.label + '</a>'; // If configModule has not been defined there's no config widget to display if (item.configLevel === 'grid' && item.configModule) { cellHtml = cellHtml + ' <i class="icon-gear"></i>'; } node.innerHTML = cellHtml; } var CustomGrid = declare([ Grid, SingleQuery, Editor, DijitRegistry ], { gridTypeForm: null, // Passed from FeatureGrid when instantiated showHeader: false, columns: { selected: { label: '', editor: CheckBox, editorArgs: { value: true }, autoSave: true, sortable: false }, label: { renderCell: renderLabelCell, sortable: false } }, postCreate: function () { this.inherited(arguments); this.on('dgrid-datachange', lang.hitch(this, '_onDataChange')); this.on('.featureLabel:click', lang.hitch(this, '_onFeatureLabelClick')); this.on(on.selector('.field-label', mouse.enter), lang.hitch(this, '_showInfoTip')); this.on(on.selector('.field-label', mouse.leave), lang.hitch(this, '_hideInfoTip')); }, _onFeatureLabelClick: function (event) { event.preventDefault(); // Since we are using Dijit checkbox editors, updating one's checked state will fire // change handlers, which will route into _onDataChange below var checkbox = this.cell(this.row(event), 'selected').element.widget; if (!checkbox.get('disabled')) { checkbox.set('checked', !checkbox.get('checked')); } }, _onDataChange: function (event) { var store = this._store; var selectedMid = event.cell.row.data.mid; var otherRow; // Let the ColumnConfigForm know that a feature is selected/deselected so it can show/hide its config topic.publish('/feature/select', event.cell.row.data.mid, event.value); // Enforce mutual exclusivity between CellSelection-Selection and Pagination-OnDemandGrid switch (selectedMid) { case 'dgrid/Selection': if (event.value) { otherRow = store.filter({ mid: 'dgrid/CellSelection', selected: true }).fetchSync()[0]; if (otherRow) { otherRow.selected = false; store.put(otherRow); } } break; case 'dgrid/CellSelection': if (event.value) { otherRow = store.filter({ mid: 'dgrid/Selection', selected: true }).fetchSync()[0]; if (otherRow) { otherRow.selected = false; store.put(otherRow); } } break; case 'dgrid/extensions/Pagination': otherRow = store.filter({ mid: 'dgrid/OnDemandGrid' }).fetchSync()[0]; // If the user clicks to select Pagination... if (event.value) { // ...and OnDemandGrid was not selected, then we can assume gridType is array and we need to // switch it to store-based (OnDemandGrid) if (!otherRow.selected) { this.gridTypeForm.set('value', { gridType: 'OnDemandGrid' }); } else { // ...but we actually want to deselect OnDemandGrid otherRow.selected = false; store.put(otherRow); } } // If the user clicks to deselect Pagination then we want to select OnDemandGrid else { otherRow.selected = true; store.put(otherRow); } break; case 'dgrid/Selector': // Fall through case 'dgrid/Tree': // Fall through case 'dgrid/extensions/DnD': // If the user selects a mixin or extension that requires a store, // make sure a store-based config is active: // 1. If OnDemandGrid or Pagination is already selected, a store is in use // 2. Otherwise select OnDemandGrid if (event.value) { otherRow = store.filter({ mid: /(OnDemandGrid|Pagination)$/, selected: true }).fetchSync(); if (!otherRow.length) { this.gridTypeForm.set('value', { gridType: 'OnDemandGrid' }); } } break; } }, insertRow: function (object) { // This method ensures that the editor (checkbox) rendered for the Grid and OnDemandGrid rows // is always disabled var rowNode = this.inherited(arguments); var cell = this.cell(rowNode, 'selected'); var mid = object.mid; if (mid === 'dgrid/Grid' || mid === 'dgrid/OnDemandGrid') { cell.element.widget.set('disabled', true); } return rowNode; }, _showInfoTip: function (event) { var row = this.row(event); var info = row.data.info; if (info) { Tooltip.show(info, row.element); } }, _hideInfoTip: function (event) { Tooltip.hide(this.row(event).element); } }); return declare([ _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _ResizeMixin ], { className: 'featureGridContainer', templateString: template, i18n: i18n, store: null, featureType: null, buildRendering: function () { this.inherited(arguments); this.grid = new CustomGrid({ className: 'featureGrid dgrid-autoheight', _store: this.store, collection: this.store.filter({ featureType: this.featureType }), gridTypeForm: this.gridTypeForm }, this.gridNode); this._startupWidgets ? this._startupWidgets.push(this.grid) : this._startupWidgets = [this.grid]; }, postCreate: function () { var self = this; this.inherited(arguments); this.own( this.grid.on('.icon-gear:click', function (event) { self.emit('configure-module', { mid: self.grid.row(event).data.mid }); }) ); }, _setGridModuleAttr: function (module) { // 'module' should be either 'Grid' or 'OnDemandGrid' var store = this.store; var items; if (module === 'OnDemandGrid') { // Select OnDemandGrid, unless Pagination is already selected items = store.filter({ mid: 'dgrid/extensions/Pagination', selected: true }).fetchSync(); if (!items.length) { items = store.filter({ mid: 'dgrid/OnDemandGrid' }).fetchSync(); items[0].selected = true; store.put(items[0]); } } else { // Deselect any modules that require a store items = store.filter({ mid: /\/(OnDemandGrid|Selector|Tree|extensions\/(DnD|Pagination))$/, selected: true }).fetchSync(); arrayUtil.forEach(items, function (item) { item.selected = false; store.put(item); }); } }, _setFeatureTypeAttr: function (featureType){ this.grid.set('collection', this.store.filter({ featureType: featureType })); } }); }); corelib/dgrid/demos/laboratory/widgets/Laboratory.js
New file @@ -0,0 +1,441 @@ define([ 'require', 'dojo/_base/array', 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/dom-class', 'dojo/query', 'dojo/string', 'dojo/on', 'dojo/topic', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'dijit/_WidgetsInTemplateMixin', 'dijit/form/TextBox', 'dijit/form/SimpleTextarea', 'dstore/Memory', 'dstore/Trackable', 'dstore/Tree', './aboutDialog', './ColumnEditor', './FeatureEditor', '../util/toJavaScript', '../data/config', 'dojo/i18n!../nls/laboratory', 'dojo/text!./templates/Laboratory.html', 'dojo/text!./templates/gridCode.js', 'dojo/query', // Widgets in template 'dijit/layout/ContentPane', 'dijit/layout/TabContainer' ], function (require, arrayUtil, declare, lang, domClass, query, string, on, topic, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, TextBox, SimpleTextarea, Memory, Trackable, TreeStoreMixin, aboutDialog, ColumnEditor, FeatureEditor, toJavaScript, config, i18n, template, codeTemplate) { var NUM_ITEMS = 50; var dijitNameToConstructor = { TextBox: TextBox, SimpleTextarea: SimpleTextarea }; return declare([ _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin ], { templateString: template, i18n: i18n, docBaseUrl: config.docBaseUrl, dgridUrl: config.dgridUrl, // resourcesBaseUrl is used for image paths; toUrl includes cacheBust so strip it resourcesBaseUrl: require.toUrl('../resources').replace(/\?.*$/, ''), baseClass: 'laboratory', aboutVisible: true, aboutKey: '', // Passed from index.html if localStorage is supported buildRendering: function () { this.inherited(arguments); this.featureEditor = new FeatureEditor({}, this.featureEditorNode); this.columnEditor = new ColumnEditor({}, this.columnEditorNode); }, postCreate: function () { this.inherited(arguments); this.own( topic.subscribe('/configuration/changed', lang.hitch(this, '_updateDemo')) // this.previewTabs.watch('selectedChildWidget', lang.hitch(this, '_updateDemo')) ); this._selectedChildWidget = this.demoGridPane; }, startup: function () { var columnEditor = this.columnEditor; this.inherited(arguments); this.featureEditor.startup().then(function () { columnEditor.startup(); // Add a couple of columns by default; // wait until after FeatureEditor's startup promise resolves, // to give forms a chance to react to column addition/removal (e.g. Tree) columnEditor.addColumn('First Name'); columnEditor.addColumn('Last Name'); }); }, selectTab: function (evt) { var target = evt.target.getAttribute('data-target'); query('.active', this.domNode).removeClass('active'); query('[data-target="' + target + '"]', this.domNode).addClass('active'); if (target !== 'columns') { // The Grid and Column Features "tabs" actually both show the same widget, // but using a different filter for its grid this.featureEditor.set('featureType', (target === 'gridFeatures') ? 'grid' : 'column'); target = 'features'; } query('[data-tab="' + target + '"]', this.domNode).addClass('active'); }, _showAbout: function (event) { event.preventDefault(); aboutDialog.show(); }, _toggleColumns: function () { domClass.toggle(this.columnEditorNode, 'open'); }, _updateDemo: function () { if (this.demoGrid) { this.demoGrid.destroy(); } this.gridCodeTextArea.value = ''; // If no columns have been defined, then don't bother rendering an empty demo grid // or generating code for an empty grid if (this.columnEditor.get('columns').length < 1) { return; } if (this._selectedChildWidget === this.demoGridPane) { this._showDemoGrid(); } else { this._showCode(); } }, _selectCode: function () { this._selectedChildWidget = this.demoCodePane; this.previewTabs.setAttribute('data-selected-page', 'code'); this._updateDemo(); }, _selectGrid: function () { this._selectedChildWidget = this.demoGridPane; this.previewTabs.setAttribute('data-selected-page', 'grid'); this._updateDemo(); }, _showCode: function () { this.gridCodeTextArea.value = this._generateCode(); }, _generateCode: function () { var gridConfig = { gridOptions: '{\n', dataDeclaration: '', dataCreation: '', gridRender: '' }; // deps, prams, and grid modules are built as arrays then joined when assigned to gridConfig var dependencies = [ 'dojo/_base/declare' ]; var callbackParams = [ 'declare' ]; var gridModules = []; var gridOptions = this._generateGridOptions(); var columnNames = []; var columnName; var treeExpandoColumn; var storeModules; var hasStore = this.featureEditor.isSelected('dgrid/OnDemandGrid') || this.featureEditor.isSelected('dgrid/extensions/Pagination'); arrayUtil.forEach(this.columnEditor.get('columns'), function (columnConfig) { // Convert any dijit module IDs for column.editor to constructors, and add the necessary dependencies var formWidgetCallbackParam = toJavaScript.formatDijitFormWidget(columnConfig.editor); if (formWidgetCallbackParam && callbackParams.indexOf(formWidgetCallbackParam) < 0) { dependencies.push(columnConfig.editor); callbackParams.push(formWidgetCallbackParam); } }, this); // The expandoColumn for Tree is a special case: // In the UI, it works better to present it in the grid feature config, // although it's really a column config option. In order to add it to the appropriate column config // we need to get its value if (this.featureEditor.isSelected('dgrid/Tree')) { treeExpandoColumn = this.featureEditor.get('expandoColumn'); } if (hasStore) { storeModules = [ 'Memory', 'Trackable' ]; if (treeExpandoColumn) { storeModules.push('TreeStoreMixin'); } gridConfig.dataDeclaration = 'var store = new (declare([' + storeModules.join(', ') + ']))({\n' + '\t\tdata: createData()\n\t});'; } else { gridConfig.dataDeclaration = 'var data = createData();'; } for (columnName in gridOptions.columns) { columnNames.push(toJavaScript.formatPropertyName(columnName)); } gridConfig.dataCreation = '\n\n\tfunction createData() {' + '\n\t\tvar data = [];' + '\n\t\tvar column;' + '\n\t\tvar i;' + '\n\t\tvar item;' + '\n' + '\n\t\tfor (i = 0; i < ' + NUM_ITEMS + '; i++) {' + '\n\t\t\titem = {};' + '\n\t\t\tfor (column in { ' + columnNames.join(': 1, ') + ': 1 }) {' + '\n\t\t\t\titem.id = i;' + '\n\t\t\t\titem[column] = column + \'_\' + (i + 1);' + '\n\t\t\t}'; if (treeExpandoColumn) { gridConfig.dataCreation += '\n\t\t\tif (i > 1) {'; gridConfig.dataCreation += '\n\t\t\t\titem.hasChildren = false;'; gridConfig.dataCreation += '\n\t\t\t\titem.parent = i % 2;'; gridConfig.dataCreation += '\n\t\t\t}'; } gridConfig.dataCreation += '\n\t\t\tdata.push(item);' + '\n\t\t}' + '\n' + '\n\t\treturn data;' + '\n\t}'; if (hasStore) { dependencies.push('dstore/Memory', 'dstore/Trackable'); callbackParams.push('Memory', 'Trackable'); if (treeExpandoColumn) { dependencies.push('dstore/Tree'); callbackParams.push('TreeStoreMixin'); } gridConfig.storeDeclaration = '\n\tvar store = new (declare([ Memory, Trackable ]))({\n' + '\t\tdata: data\n\t});\n'; gridConfig.storeAssignment = '\n\tgrid.set(\'collection\', store);'; } else { gridConfig.gridRender = '\n\tgrid.renderArray(data);'; } // Add selected items from the feature store to the dependency list arrayUtil.forEach(this.featureEditor.filter({ selected: true }), function (item) { // Configuration for dgrid/Grid is always available since it is the base clase for OnDemandGrid // If OnDemandGrid is selected then we can skip adding dgrid/Grid to the dependencies if (item.mid === 'dgrid/Grid' && this.featureEditor.isSelected('dgrid/OnDemandGrid')) { return; } var moduleReference = item.mid.slice(item.mid.lastIndexOf('/') + 1); dependencies.push(item.mid); callbackParams.push(moduleReference); gridModules.push(moduleReference); }, this); if (hasStore) { gridConfig.gridOptions += '\t\tcollection: store,\n'; } gridConfig.gridOptions += toJavaScript(gridOptions, { indent: 1, inline: true } ); gridConfig.gridOptions += '\n\t}'; gridConfig.dependencies = '\'' + dependencies.join('\',\n\t\'') + '\''; gridConfig.callbackParams = callbackParams.join(', '); gridConfig.gridModules = gridModules.join(', '); return string.substitute(codeTemplate, gridConfig); }, _showDemoGrid: function () { var self = this; var gridOptions = this._generateGridOptions(); var gridModules = []; var isTree = this.featureEditor.isSelected('dgrid/Tree'); var data = this._generateMockData(); var hasStore = this.featureEditor.isSelected('dgrid/OnDemandGrid') || this.featureEditor.isSelected('dgrid/extensions/Pagination'); arrayUtil.forEach(this.featureEditor.filter({ selected: true }), function (item) { // Configuration for dgrid/Grid is always available since it is the base clase for OnDemandGrid // If OnDemandGrid is selected then we can skip adding dgrid/Grid to the dependencies if (item.mid === 'dgrid/Grid' && this.featureEditor.isSelected('dgrid/OnDemandGrid')) { return; } gridModules.push(item.mid); }, this); this._fixDijitConstructors(gridOptions.columns); require(gridModules, function () { var storeModules; var store; gridOptions.className = 'demoGrid'; if (hasStore) { storeModules = [ Memory, Trackable ]; if (isTree) { storeModules.push(TreeStoreMixin); } store = new (declare(storeModules))({ data: data }); gridOptions.collection = isTree ? store.filter('mayHaveChildren') : store; } self.demoGrid = new (declare(Array.prototype.slice.apply(arguments)))(gridOptions); self.demoGridPane.innerHTML = ''; self.demoGridPane.appendChild(self.demoGrid.domNode); self.demoGrid.startup(); if (!hasStore) { self.demoGrid.renderArray(data); } }); }, _generateGridOptions: function () { var gridOptions = {}; var selectedFeatures = this.featureEditor.filter({ selected: true, configLevel: 'grid' }); var treeExpandoColumn; var columns = []; var column; var tempColumns; var numFieldName; if (this.featureEditor.isSelected('dgrid/Tree')) { treeExpandoColumn = this.featureEditor.get('expandoColumn'); } arrayUtil.forEach(selectedFeatures, function (feature) { var moduleConfig = this.featureEditor.getModuleConfig(feature.mid); if (moduleConfig) { lang.mixin(gridOptions, moduleConfig); } }, this); arrayUtil.forEach(this.columnEditor.get('columns'), function (columnConfig) { var config = this._fixDataTypes(lang.clone(columnConfig)); // The laboratory needs the store items to have a unique id property, // but we don't want to include it in our output delete config.id; if (config.field === treeExpandoColumn) { config.renderExpando = true; } numFieldName = numFieldName || isFinite(config.field); columns.push(config); }, this); if (!numFieldName) { // If there are no field names that are numbers, then use an object to define the columns. tempColumns = {}; while ((column = columns.shift())) { tempColumns[column.field] = column; delete column.field; } columns = tempColumns; } if (this.featureEditor.isSelected('dgrid/ColumnSet')) { gridOptions.columnSets = [[columns]]; } else { gridOptions.columns = columns; } return gridOptions; }, // Fix data types on objects created from widget values // Change string 'true'/'false' values to booleans _fixDataTypes: function (obj) { var propertyName; if (typeof obj !== 'object') { return obj; } for (propertyName in obj) { if (obj[propertyName] === 'true') { obj[propertyName] = true; } else if(obj[propertyName] === 'false') { obj[propertyName] = false; } } return obj; }, _generateMockData: function () { var mockData = []; var fieldNames = []; var i; arrayUtil.forEach(this.columnEditor.get('columns'), function (columnConfig) { fieldNames.push(columnConfig.field); }); if (fieldNames.length > 0) { for (i = 0; i < NUM_ITEMS; i++) { mockData.push({}); mockData[i].id = i; if (i > 1) { mockData[i].hasChildren = false; mockData[i].parent = i % 2; } arrayUtil.forEach(fieldNames, function (fieldName) { mockData[i][fieldName] = fieldName + '_' + (i + 1); }); } } return mockData; }, _fixDijitConstructors: function(obj) { if (obj) { for (var columnKey in obj) { var column = obj[columnKey]; if (column && column.editor) { var dijitConstructorName = toJavaScript.formatDijitFormWidget(column.editor); if (dijitConstructorName) { column.editor = dijitNameToConstructor[dijitConstructorName]; } } } } } }); }); corelib/dgrid/demos/laboratory/widgets/_ResizeMixin.js
New file @@ -0,0 +1,19 @@ define([ 'dojo/_base/declare', 'dojo/_base/array', 'dojo/dom-geometry' ], function (declare, arrayUtil, domGeometry) { return declare(null, { resize: function (changeSize) { if (changeSize) { domGeometry.setMarginBox(this.domNode, changeSize); } arrayUtil.forEach(this.getChildren(), function (child) { if (child.resize) { child.resize(); } }); this.inherited(arguments); } }); }); corelib/dgrid/demos/laboratory/widgets/aboutDialog.js
New file @@ -0,0 +1,27 @@ define([ 'dojo/_base/declare', 'dojo/string', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'dijit/Dialog', 'dojo/text!./templates/AboutDialog.html', 'dojo/i18n!../nls/laboratory', '../data/config' ], function (declare, string, _WidgetBase, _TemplatedMixin, Dialog, template, i18n, config) { var AboutContent = declare([ _WidgetBase, _TemplatedMixin ], { templateString: template, i18n: i18n, buildRendering: function () { this.inherited(arguments); this.appInformationNode.innerHTML = string.substitute(i18n.appInformation, config); } }); return new Dialog({ 'class': 'aboutDialog', content: new AboutContent(), draggable: false, title: i18n.aboutTitle }); }); corelib/dgrid/demos/laboratory/widgets/configForms/CellSelection.js
New file @@ -0,0 +1,5 @@ define([ './Selection' ], function (Selection) { return Selection; }); corelib/dgrid/demos/laboratory/widgets/configForms/ColumnResizer.js
New file @@ -0,0 +1,14 @@ define([ 'dojo/_base/declare', './ConfigForm', 'dojo/text!./templates/ColumnResizer.html', 'dgrid/extensions/ColumnResizer', // for template 'dijit/form/NumberTextBox', 'dijit/form/RadioButton' ], function (declare, ConfigForm, template, ColumnResizer) { return declare(ConfigForm, { templateString: template, defaultsObject: ColumnResizer.prototype }); }); corelib/dgrid/demos/laboratory/widgets/configForms/ConfigForm.js
New file @@ -0,0 +1,121 @@ define([ 'dojo/_base/array', 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/dom-construct', 'dojo/on', 'dojo/string', 'dojo/topic', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'dijit/_WidgetsInTemplateMixin', 'dijit/form/_FormMixin', '../_ResizeMixin', 'dijit/form/Button', 'dojo/i18n!../../nls/laboratory' ], function (arrayUtil, declare, lang, domConstruct, on, string, topic, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _FormMixin, _ResizeMixin, Button, i18n) { return declare([ _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _FormMixin, _ResizeMixin ], { i18n: i18n, baseClass: 'configForm', // This should be over-ridden by sub-classes and define an object with properties that specify default // configuration values for the module defaultsObject: {}, documentationUrl: '', moduleName: '', buildRendering: function () { this.inherited(arguments); if (!this.containerNode) { this.containerNode = this.domNode; } // Add button bar to the top of each config form (including subclasses) var buttonBar = domConstruct.create('div', { className: 'buttonBar' }); this.doneButton = new Button({ label: i18n.done }).placeAt(buttonBar); this._startupWidgets.push(this.doneButton); domConstruct.place(buttonBar, this.domNode, 'first'); if (this.moduleName) { // Populate "x configuration" and "x documentation" strings if (this.legendNode) { this.legendNode.innerHTML = string.substitute(this.i18n.moduleConfiguration, [ this.moduleName ]); } if (this.documentationUrl) { var documentationUrlTemplate = '<a href="' + this.documentationUrl + '" target="_blank">' + string.substitute(this.i18n.moduleDocumentation, [ this.moduleName ]) + '</a>'; domConstruct.place(documentationUrlTemplate, this.domNode); } } }, postCreate: function () { this.own( on(this.doneButton, 'click', lang.hitch(this, function () { this.emit('close'); })), this.watch('value', lang.hitch(this, function () { // Let the Laboratory know that it should update the demo display (grid or generated code) topic.publish('/configuration/changed'); })) ); }, startup: function () { this.inherited(arguments); // This must be done in startup: _FormMixin doesn't set this._descendants until startup this._setDefaultValues(); }, _getValueAttr: function () { var returnValue = this.inherited(arguments); var property; // Remove properties that just give the default behavior for (property in returnValue) { // Values from RadioButtons are strings; convert true/false strings to boolean values if (returnValue[property] === 'true') { returnValue[property] = true; } else if (returnValue[property] === 'false') { returnValue[property] = false; } if (returnValue[property] === this.defaultsObject[property]) { delete returnValue[property]; } } return returnValue; }, _setDefaultValues: function () { var defaultValues = {}; arrayUtil.forEach(this._descendants, function (widget) { if (widget.name && widget.name in this.defaultsObject) { defaultValues[widget.name] = '' + this.defaultsObject[widget.name]; } }, this); // TODO: it would be ideal to ignore this in the 'value' watcher registered in postCreate // but it's difficult since `this.set` fires change handlers async and does not return a promise this.set('value', defaultValues); } }); }); corelib/dgrid/demos/laboratory/widgets/configForms/Grid.js
New file @@ -0,0 +1,14 @@ define([ 'dojo/_base/declare', './ConfigForm', 'dojo/text!./templates/Grid.html', 'dgrid/Grid', // for template 'dijit/form/RadioButton', 'dijit/form/TextBox' ], function (declare, ConfigForm, template, Grid) { return declare(ConfigForm, { templateString: template, defaultsObject: Grid.prototype }); }); corelib/dgrid/demos/laboratory/widgets/configForms/Keyboard.js
New file @@ -0,0 +1,15 @@ define([ 'dojo/_base/declare', './ConfigForm', 'dojo/text!./templates/Keyboard.html', 'dgrid/Grid', 'dgrid/Keyboard', // for template 'dijit/form/NumberTextBox', 'dijit/form/RadioButton' ], function (declare, ConfigForm, template, Grid, Keyboard) { return declare(ConfigForm, { templateString: template, defaultsObject: declare([ Grid, Keyboard ]).prototype }); }); corelib/dgrid/demos/laboratory/widgets/configForms/OnDemandGrid.js
New file @@ -0,0 +1,34 @@ define([ 'dojo/_base/declare', './ConfigForm', 'dojo/text!./templates/OnDemandGrid.html', 'dgrid/OnDemandGrid', // for template 'dijit/form/NumberTextBox', 'dijit/form/RadioButton', 'dijit/form/FilteringSelect' ], function (declare, ConfigForm, template, OnDemandGrid) { return declare(ConfigForm, { templateString: template, defaultsObject: OnDemandGrid.prototype, _getValueAttr: function () { var returnValue = this.inherited(arguments); var numericValue; if ('maxEmptySpace' in returnValue) { numericValue = +returnValue.maxEmptySpace; if (numericValue !== this.defaultsObject.maxEmptySpace && !isNaN(numericValue)) { returnValue.maxEmptySpace = numericValue; } else { delete returnValue.maxEmptySpace; } } return returnValue; } }); }); corelib/dgrid/demos/laboratory/widgets/configForms/Pagination.js
New file @@ -0,0 +1,14 @@ define([ 'dojo/_base/declare', './ConfigForm', 'dojo/text!./templates/Pagination.html', 'dgrid/extensions/Pagination', // for template 'dijit/form/MultiSelect', 'dijit/form/RadioButton' ], function (declare, ConfigForm, template, Pagination) { return declare(ConfigForm, { templateString: template, defaultsObject: Pagination.prototype }); }); corelib/dgrid/demos/laboratory/widgets/configForms/Selection.js
New file @@ -0,0 +1,28 @@ define([ 'dojo/_base/declare', './ConfigForm', 'dojo/text!./templates/Selection.html', 'dgrid/Selection', // for template 'dijit/form/FilteringSelect', 'dijit/form/RadioButton' ], function (declare, ConfigForm, template, Selection) { return declare(ConfigForm, { templateString: template, defaultsObject: Selection.prototype, _clearField: function (event) { var fieldName = event.target.getAttribute('data-field-name'); var formValue = this.get('value'); if (!fieldName) { return; } if (fieldName in formValue) { formValue[fieldName] = ''; this.set('value', formValue); } } }); }); corelib/dgrid/demos/laboratory/widgets/configForms/Tree.js
New file @@ -0,0 +1,61 @@ define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/dom-construct', 'dojo/topic', 'dojo/store/Memory', './ConfigForm', 'dojo/text!./templates/Tree.html', 'dgrid/Tree', // for template 'dijit/form/FilteringSelect', 'dijit/form/RadioButton' ], function (declare, lang, domConstruct, topic, Memory, ConfigForm, template, Tree) { return declare(ConfigForm, { templateString: template, defaultsObject: Tree.prototype, postCreate: function () { this.inherited(arguments); this.own( topic.subscribe('/store/columns/update', lang.hitch(this, '_updateColumnNames')) ); }, _updateColumnNames: function (columnStore) { var self = this; var data = []; var firstValue; columnStore.fetch().forEach(function (column) { if (!firstValue) { firstValue = column.field; } data.push({ id: column.field, name: column.field }); }).then(function () { self.expandoSelect.set('store', new Memory({ data: data })); // Select the first column by default // (in case the user selects tree without first visiting the options) self.expandoSelect.set('value', firstValue); }); }, _getValueAttr: function () { var returnValue = this.inherited(arguments); // The renderExpando property needs to be specified on the column definition // (it's not a grid config property) delete returnValue.renderExpando; return returnValue; }, _getExpandoColumnAttr: function () { return this.expandoSelect.get('value'); } }); }); corelib/dgrid/demos/laboratory/widgets/configForms/templates/ColumnResizer.html
New file @@ -0,0 +1,21 @@ <form class="${baseClass}"> <fieldset> <legend data-dojo-attach-point="legendNode"></legend> <div class="label"> adjustLastColumn </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="adjustLastColumn" value="true" id="${id}_adjustLastColumnTrue" type="radio"> <label for="${id}_adjustLastColumnTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="adjustLastColumn" value="false" id="${id}_adjustLastColumnFalse" type="radio"> <label for="${id}_adjustLastColumnFalse">false</label> </div> <div class="label"> minWidth </div> <div class="field"> <input data-dojo-type="dijit/form/NumberTextBox" name="minWidth" type="text" class="halfWidth"> </div> </fieldset> </form> corelib/dgrid/demos/laboratory/widgets/configForms/templates/Grid.html
New file @@ -0,0 +1,48 @@ <div class="${baseClass}"> <!-- TODO: wrap template in a 'form' element instead of 'div' Each collection of fields should be contained in its own form to avoid name collisions between forms. Changing the top-level node from 'div' to 'form' for this template causes the CSS class value to get messed up because the form contains an element named "className". --> <fieldset> <legend data-dojo-attach-point="legendNode"></legend> <div class="label"> addUiClasses </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="addUiClasses" value="true" id="${id}_uiClassesTrue" type="radio"> <label for="${id}_uiClassesTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="addUiClasses" value="false" id="${id}_uiClassesFalse" type="radio"> <label for="${id}_uiClassesFalse">false</label> </div> <div class="label"> className </div> <div class="field"> <input data-dojo-type="dijit/form/TextBox" name="className" type="text"> </div> <div class="label"> showHeader </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="showHeader" value="true" id="${id}_showHeaderTrue" type="radio"> <label for="${id}_showHeaderTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="showHeader" value="false" id="${id}_showHeaderFalse" type="radio"> <label for="${id}_showHeaderFalse">false</label> </div> <div class="label"> showFooter </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="showFooter" value="true" id="${id}_showFooterTrue" type="radio"> <label for="${id}_showFooterTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="showFooter" value="false" id="${id}_showFooterFalse" type="radio"> <label for="${id}_showFooterFalse">false</label> </div> </fieldset> </div> corelib/dgrid/demos/laboratory/widgets/configForms/templates/Keyboard.html
New file @@ -0,0 +1,22 @@ <form class="${baseClass}"> <fieldset> <legend data-dojo-attach-point="legendNode"></legend> <div class="label"> cellNavigation </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="cellNavigation" value="true" id="${id}_navTrue" type="radio"> <label for="${id}_navTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="cellNavigation" value="false" id="${id}_navFalse" type="radio"> <label for="${id}_navFalse">false</label> </div> <div class="label"> pageSkip </div> <div class="field"> <input data-dojo-type="dijit/form/NumberTextBox" type="text" name="pageSkip" class="halfWidth"> </div> </fieldset> </form> corelib/dgrid/demos/laboratory/widgets/configForms/templates/OnDemandGrid.html
New file @@ -0,0 +1,75 @@ <form class="${baseClass}"> <fieldset> <legend data-dojo-attach-point="legendNode"></legend> <div class="label"> minRowsPerPage </div> <div class="field"> <input data-dojo-type="dijit/form/NumberTextBox" type="text" name="minRowsPerPage" class="halfWidth"> </div> <div class="label"> maxRowsPerPage </div> <div class="field"> <input data-dojo-type="dijit/form/NumberTextBox" type="text" name="maxRowsPerPage" class="halfWidth"> </div> <div class="label"> maxEmptySpace </div> <div class="field"> <input data-dojo-type="dijit/form/TextBox" type="text" name="maxEmptySpace" class="halfWidth"> </div> <div class="label"> bufferRows </div> <div class="field"> <input data-dojo-type="dijit/form/NumberTextBox" type="text" name="bufferRows" class="halfWidth"> </div> <div class="label"> farOffRemoval </div> <div class="field"> <input data-dojo-type="dijit/form/NumberTextBox" type="text" name="farOffRemoval" class="halfWidth"> </div> <div class="label"> queryRowsOverlap </div> <div class="field"> <input data-dojo-type="dijit/form/NumberTextBox" type="text" name="queryRowsOverlap" class="halfWidth"> </div> <div class="label"> pagingMethod </div> <div class="field"> <select data-dojo-type="dijit/form/FilteringSelect" name="pagingMethod"> <option value="debounce">debounce</option> <option value="throttle">throttle</option> <option value="throttleDelayed">throttleDelayed</option> </select> </div> <div class="label"> pagingDelay </div> <div class="field"> <input data-dojo-type="dijit/form/NumberTextBox" type="text" name="pagingDelay" class="halfWidth"> </div> <div class="label"> keepScrollPosition </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="keepScrollPosition" value="true" id="${id}_keepScrollTrue" type="radio"> <label for="${id}_keepScrollTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="keepScrollPosition" value="false" id="${id}_keepScrollFalse" type="radio"> <label for="${id}_keepScrollFalse">false</label> </div> </fieldset> </form> corelib/dgrid/demos/laboratory/widgets/configForms/templates/Pagination.html
New file @@ -0,0 +1,59 @@ <form class="${baseClass}"> <fieldset> <legend data-dojo-attach-point="legendNode"></legend> <div class="label"> rowsPerPage </div> <div class="field"> <input data-dojo-type="dijit/form/NumberTextBox" name="rowsPerPage" type="text" class="halfWidth"> </div> <div class="label"> previousNextArrows </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="previousNextArrows" value="true" id="${id}_previousNextTrue" type="radio"> <label for="${id}_previousNextTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="previousNextArrows" value="false" id="${id}_previousNextFalse" type="radio"> <label for="${id}_previousNextFalse">false</label> </div> <div class="label"> firstLastArrows </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="firstLastArrows" value="true" id="${id}_firstLastTrue" type="radio"> <label for="${id}_firstLastTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="firstLastArrows" value="false" id="${id}_firstLastFalse" type="radio"> <label for="${id}_firstLastFalse">false</label> </div> <div class="label"> pagingLinks </div> <div class="field"> <input data-dojo-type="dijit/form/NumberTextBox" name="pagingLinks" type="text" class="halfWidth"> </div> <div class="label"> pagingTextBox </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="pagingTextBox" value="true" id="${id}_pagingTextBoxTrue" type="radio"> <label for="${id}_pagingTextBoxTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="pagingTextBox" value="false" id="${id}_pagingTextBoxFalse" type="radio"> <label for="${id}_pagingTextBoxFalse">false</label> </div> <div class="label"> showLoadingMessage </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="showLoadingMessage" value="true" id="${id}_showLoadingMessageTrue" type="radio"> <label for="${id}_showLoadingMessageTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="showLoadingMessage" value="false" id="${id}_showLoadingMessageFalse" type="radio"> <label for="${id}_showLoadingMessageFalse">false</label> </div> </fieldset> </form> corelib/dgrid/demos/laboratory/widgets/configForms/templates/Selection.html
New file @@ -0,0 +1,49 @@ <form class="${baseClass}"> <fieldset> <legend data-dojo-attach-point="legendNode"></legend> <div class="label"> selectionMode </div> <div class="field"> <select data-dojo-type="dijit/form/FilteringSelect" name="selectionMode"> <option value="extended">extended</option> <option value="multiple">multiple</option> <option value="single">single</option> <option value="toggle">toggle</option> <option value="none">none</option> </select> </div> <div class="label"> allowTextSelection </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="allowTextSelection" value="true" id="${id}_textTrue" type="radio"> <label for="${id}_textTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="allowTextSelection" value="false" id="${id}_textFalse" type="radio"> <label for="${id}_textFalse">false</label> <span class="actionLink" data-dojo-attach-event="click: _clearField" data-field-name="allowTextSelection">${i18n.clear}</span> </div> <div class="label"> deselectOnRefresh </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="deselectOnRefresh" value="true" id="${id}_deselectTrue" type="radio"> <label for="${id}_deselectTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="deselectOnRefresh" value="false" id="${id}_deselectFalse" type="radio"> <label for="${id}_deselectFalse">false</label> </div> <div class="label"> allowSelectAll </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="allowSelectAll" value="true" id="${id}_allowAllTrue" type="radio"> <label for="${id}_allowAllTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="allowSelectAll" value="false" id="${id}_allowAllFalse" type="radio"> <label for="${id}_allowAllFalse">false</label> </div> </fieldset> </form> corelib/dgrid/demos/laboratory/widgets/configForms/templates/Tree.html
New file @@ -0,0 +1,43 @@ <form class="${baseClass}"> <fieldset> <legend data-dojo-attach-point="legendNode"></legend> <div class="label"> ${i18n.parentNodeColumn} </div> <div class="field"> <select data-dojo-type="dijit/form/FilteringSelect" name="renderExpando" data-dojo-attach-point="expandoSelect"> </select> </div> <div class="label"> treeIndentWidth </div> <div class="field"> <input data-dojo-type="dijit/form/NumberTextBox" name="treeIndentWidth" type="text" class="halfWidth"> px </div> <div class="label"> collapseOnRefresh </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="collapseOnRefresh" value="true" id="${id}_collapseTrue" type="radio"> <label for="${id}_collapseTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="collapseOnRefresh" value="false" id="${id}_collapseFalse" type="radio"> <label for="${id}_collapseFalse">false</label> </div> <div class="label"> enableTreeTransitions </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="enableTreeTransitions" value="true" id="${id}_transitionsTrue" type="radio"> <label for="${id}_transitionsTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="enableTreeTransitions" value="false" id="${id}_transitionsFalse" type="radio"> <label for="${id}_transitionsFalse">false</label> </div> </fieldset> </form> corelib/dgrid/demos/laboratory/widgets/templates/AboutDialog.html
New file @@ -0,0 +1,9 @@ <div> <p>${i18n.appDescription}</p> <ol> <li>${i18n.appInstructions1}</li> <li>${i18n.appInstructions2}</li> <li>${i18n.appInstructions3}</li> </ol> <p data-dojo-attach-point="appInformationNode"></p> </div> corelib/dgrid/demos/laboratory/widgets/templates/ColumnConfigForm.html
New file @@ -0,0 +1,166 @@ <div class="${baseClass}"> <button data-dojo-type="dijit/form/Button" type="button" data-dojo-attach-point="doneButton"> Done </button> <fieldset> <legend>${i18n.generalColumnProperties}</legend> <div class="label"> field </div> <div class="field"> <input data-dojo-type="dijit/form/TextBox" name="field" type="text"> </div> <div class="label"> label </div> <div class="field"> <input data-dojo-type="dijit/form/TextBox" name="label" type="text"> </div> <div class="label"> className </div> <div class="field"> <input data-dojo-type="dijit/form/TextBox" name="className" type="text"> </div> <div class="label"> sortable </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="sortable" value="true" id="${id}_sortableTrue" type="radio" checked> <label for="${id}_sortableTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="sortable" value="false" id="${id}_sortableFalse" type="radio"> <label for="${id}_sortableFalse">false</label> </div> </fieldset> <div class="mixinProp">${i18n.mixinColumnProperties}</div> <fieldset data-dojo-attach-point="editorFields" class="dijitHidden"> <legend class="propTitle"></legend> <div class="label"> editor </div> <div class="field"> <select data-dojo-type="dijit/form/FilteringSelect" required="false" name="editor"> <option value="text">text</option> <option value="textarea">textarea</option> <option value="dijit/form/TextBox">dijit/form/TextBox</option> <option value="dijit/form/SimpleTextarea">dijit/form/SimpleTextarea</option> </select> </div> <div class="label"> editOn </div> <div class="field"> <select data-dojo-type="dijit/form/FilteringSelect" required="false" name="editOn"> <option value="click">click</option> <option value="dblclick">dblclick</option> </select> </div> <div class="label"> autoSave </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="autoSave" value="true" id="${id}_autoSaveTrue" type="radio"> <label for="${id}_autoSaveTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="autoSave" value="false" id="${id}_autoSaveFalse" type="radio" checked> <label for="${id}_autoSaveFalse">false</label> </div> <div class="label"> autoSelect </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="autoSelect" value="true" id="${id}_autoSelectTrue" type="radio"> <label for="${id}_autoSelectTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="autoSelect" value="false" id="${id}_autoSelectFalse" type="radio" checked> <label for="${id}_autoSelectFalse">false</label> </div> <div class="label"> dismissOnEnter </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="dismissOnEnter" value="true" id="${id}_dismissOnEnterTrue" type="radio" checked> <label for="${id}_dismissOnEnterTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="dismissOnEnter" value="false" id="${id}_dismissOnEnterFalse" type="radio"> <label for="${id}_dismissOnEnterFalse">false</label> </div> </fieldset> <fieldset data-dojo-attach-point="columnHiderFields" class="dijitHidden"> <legend class="propTitle"></legend> <div class="label"> hidden </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="hidden" value="true" id="${id}_hiddenTrue" type="radio"> <label for="${id}_hiddenTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="hidden" value="false" id="${id}_hiddenFalse" type="radio" checked> <label for="${id}_hiddenFalse">false</label> </div> <div class="label"> unhidable </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="unhidable" value="true" id="${id}_unhidableTrue" type="radio"> <label for="${id}_unhidableTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="unhidable" value="false" id="${id}_unhidableFalse" type="radio" checked> <label for="${id}_unhidableFalse">false</label> </div> </fieldset> <fieldset data-dojo-attach-point="columnReorderFields" class="dijitHidden"> <legend class="propTitle"></legend> <div class="label"> reorderable </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="reorderable" value="true" id="${id}_reorderableTrue" type="radio" checked> <label for="${id}_reorderableTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="reorderable" value="false" id="${id}_reorderableFalse" type="radio"> <label for="${id}_reorderableFalse">false</label> </div> </fieldset> <fieldset data-dojo-attach-point="columnResizerFields" class="dijitHidden"> <legend class="propTitle"></legend> <div class="label"> resizable </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="resizable" value="true" id="${id}_resizableTrue" type="radio" checked> <label for="${id}_resizableTrue">true</label> <input data-dojo-type="dijit/form/RadioButton" name="resizable" value="false" id="${id}_resizableFalse" type="radio"> <label for="${id}_resizableFalse">false</label> </div> </fieldset> <fieldset data-dojo-attach-point="selectorFields" class="dijitHidden"> <legend class="propTitle"></legend> <div class="label"> selector </div> <div class="field"> <input data-dojo-type="dijit/form/RadioButton" name="selector" value="checkbox" id="${id}_selectorTrue" type="radio"> <label for="${id}_selectorTrue">checkbox</label> <input data-dojo-type="dijit/form/RadioButton" name="selector" value="radio" id="${id}_selectorFalse" type="radio"> <label for="${id}_selectorFalse">radio</label> <span class="actionLink" data-dojo-attach-event="click: _clearField" data-field-name="selector">${i18n.clear}</span> </div> </fieldset> </div> corelib/dgrid/demos/laboratory/widgets/templates/ColumnGrid.html
New file @@ -0,0 +1,10 @@ <div data-dojo-attach-point="containerNode"> <form data-dojo-type="dijit/form/Form" class="columnGridForm" data-dojo-attach-point="columnGridForm" data-dojo-attach-event="onSubmit: _onFormSubmit"> <input data-dojo-type="dijit/form/TextBox" name="label" data-dojo-attach-point="fieldLabelTextBox" placeholder="${i18n.fieldNamePlaceholder}"> <button type="submit" class="addBtn" data-dojo-attach-point="addColumnButton">+</button> </form> <div data-dojo-attach-point="gridNode"></div> </div> corelib/dgrid/demos/laboratory/widgets/templates/FeatureGrid.html
New file @@ -0,0 +1,3 @@ <div data-dojo-attach-point="containerNode"> <div data-dojo-attach-point="gridNode"></div> </div> corelib/dgrid/demos/laboratory/widgets/templates/Laboratory.html
New file @@ -0,0 +1,46 @@ <div> <!-- Top pane --> <div class="header"> <div class="controlHeader"> <a class="logoLink" href="${dgridUrl}"><img class="logo" src="${resourcesBaseUrl}/img/dgridLogo.png" alt="dgrid logo"></a> ${i18n.laboratory} </div> <a href="#" class="menuLink" data-dojo-attach-event="click:_showAbout">${i18n.about}</a> <a href="${docBaseUrl}" target="_blank" class="menuLink">${i18n.docs}</a> <a href="http://sitepen.com/" class="splogo"><img src="${resourcesBaseUrl}/img/sitepenLogo.png" alt="SitePen logo"></a> </div> <div class="control"> <div class="tabs"> <div class="tab active" data-target="columns" data-dojo-attach-event="click:selectTab"> ${i18n.columns} </div> <div class="tab" data-target="gridFeatures" data-dojo-attach-event="click:selectTab"> ${i18n.gridFeatures} </div> <div class="tab" data-target="columnFeatures" data-dojo-attach-event="click:selectTab"> ${i18n.columnFeatures} </div> </div> <div data-dojo-attach-point="columnEditorNode" data-tab="columns" class="tabContent active"></div> <div data-dojo-attach-point="featureEditorNode" data-tab="features" class="tabContent"></div> </div> <div data-dojo-attach-point="previewTabs" data-selected-page="grid" class="render"> <div class="tabControl"> <span data-dojo-attach-event="click:_selectGrid" class="gridBtn"> <i class="icon-grid"></i>${i18n.preview} </span><span data-dojo-attach-event="click:_selectCode" class="codeBtn"> <i class="icon-code"></i>${i18n.code} </span> </div> <div class="demoGridPane" data-dojo-attach-point="demoGridPane"> ${i18n.demoInstructions} </div> <div class="demoCodePane" data-dojo-attach-point="demoCodePane"> <textarea data-dojo-attach-point="gridCodeTextArea" class="demoCode" readonly></textarea> </div> </div> </div> corelib/dgrid/demos/laboratory/widgets/templates/gridCode.js
New file @@ -0,0 +1,10 @@ require([ ${dependencies} ], function (${callbackParams}) { ${dataDeclaration} // Instantiate grid var grid = new (declare([${gridModules}]))(${gridOptions}, 'grid'); grid.startup();${gridRender}${dataCreation} }); corelib/dgrid/demos/multiview/data.json
New file @@ -0,0 +1,32 @@ [ { "id": "dojo", "name": "Dojo Core", "icon": "dojo", "summary": "Dojo core is a powerful, lightweight library that makes common tasks quicker and easier. Animate elements, manipulate the DOM, and query with easy CSS syntax, all without sacrificing performance." }, { "id": "dijit", "name": "Dijit", "icon": "dojo", "summary": "Dijit provides a complete collection of user interface controls based on Dojo, giving you the power to create web applications that are highly optimized for usability, performance, internationalization, accessibility, but above all deliver an incredible user experience." }, { "id": "dgrid", "name": "dgrid", "icon": "df", "summary": "A lightweight, mobile-ready, data-driven, modular widget designed for lists and grids." }, { "id": "xstyle", "name": "xstyle", "icon": "df", "summary": "CSS framework providing polyfills, extensions, dynamic loading, and selector based DOM manipulation." }, { "id": "put-selector", "name": "put-selector", "icon": "df", "summary": "A high-performance, lightweight function for creating and manipulating DOM elements with succinct, elegant, familiar CSS selector-based syntax." } ] corelib/dgrid/demos/multiview/index.html
New file @@ -0,0 +1,16 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Multi-view dgrid</title> <link rel="stylesheet" href="../../../dojo/resources/dojo.css"> <link rel="stylesheet" href="../../css/skins/slate.css"> <link rel="stylesheet" href="resources/multiview.css"> </head> <body class="slate"> <script src="../../../dojo/dojo.js" data-dojo-config="async: true"></script> <script> require(["dgrid/demos/multiview/multiview"]); </script> </body> </html> corelib/dgrid/demos/multiview/multiview.js
New file @@ -0,0 +1,118 @@ define([ 'require', 'dgrid/OnDemandGrid', 'dgrid/Selection', 'dgrid/Keyboard', 'dojo/_base/declare', 'dojo/dom-construct', 'dojo/dom-class', 'dojo/on', 'dstore/RequestMemory', 'dojo/text!./resources/description.html', 'dojo/query' ], function (require, Grid, Selection, Keyboard, declare, domConstruct, domClass, on, RequestMemory, descriptionHtml) { // Render DOM var containerNode = domConstruct.create('div', null, document.body); var switchNode = domConstruct.create('div', { className: 'controls', innerHTML: 'Select View: ' }); var tableButton = domConstruct.create('button', { innerHTML: 'Table', type: 'button' }, switchNode); var detailsButton = domConstruct.create('button', { innerHTML: 'Details', type: 'button' }, switchNode); var galleryButton = domConstruct.create('button', { innerHTML: 'Gallery', type: 'button' }, switchNode); var contentNode = domConstruct.create('div', { className: 'content' }); var gridNode; var grid; var store; var expandoListener; var expandedNode; var renderers = { gallery: function (obj) { // function used for renderRow for gallery view (large tiled thumbnails) return domConstruct.create('div', { innerHTML: '<div class="icon" style="background-image:url(resources/' + obj.icon + '-128.png);"> </div><div class="name">' + obj.name + '</div>' }); }, details: function (obj) { // function used for renderRow for details view (items w/ summary) return domConstruct.create('div', { innerHTML: '<div class="icon" style="background-image:url(resources/' + obj.icon + '-64.png);"> </div><div class="name">' + obj.name + '</div><div class="summary">' + obj.summary + '</div>' }); }, table: function (obj) { var div = domConstruct.create('div', { className: 'collapsed' }); div.appendChild(Grid.prototype.renderRow.apply(this, arguments)); var summaryDiv = domConstruct.create('div', { className: 'expando' }, div); summaryDiv.appendChild(document.createTextNode(obj.summary)); return div; } }; function makeViewClickHandler(view) { return function () { // pause/resume click listener for expando in "table" view expandoListener[view === 'table' ? 'resume' : 'pause'](); // reset expanded node for table view expandedNode = null; // update renderRow function grid.renderRow = renderers[view]; // update class on grid domNode domClass.replace(grid.domNode, view, 'table gallery details'); // only show headers if we're in "table" view grid.set('showHeader', view === 'table'); // force redraw of rows grid.refresh(); }; } containerNode.appendChild(switchNode); gridNode = domConstruct.create('div', { className: 'table', id: 'grid' }, contentNode); domConstruct.place(descriptionHtml, contentNode); containerNode.appendChild(contentNode); // Use require.toUrl for portability (looking up via module path) store = new RequestMemory({ target: require.toUrl('./data.json') }); grid = new Grid({ columns: [ { label: ' ', field: 'icon', sortable: false, formatter: function (icon) { return '<div class="icon" style="background-image:url(resources/' + icon + '-32.png);"> </div>'; } }, { label: 'Package', field: 'id' }, { label: 'Name', field: 'name' } ], collection: store, renderRow: renderers.table }, 'grid'); // store initially-active renderRow as renderer for table view renderers.table = grid.renderRow; // listen for clicks to trigger expand/collapse in table view mode expandoListener = on.pausable(grid.domNode, '.dgrid-row:click', function (event) { var node = grid.row(event).element; var collapsed = domClass.contains(node, 'collapsed'); // toggle state of node which was clicked domClass.toggle(node, 'collapsed', !collapsed); // if clicked row wasn't expanded, collapse any previously-expanded row collapsed && expandedNode && domClass.add(expandedNode, 'collapsed'); // if the row clicked was previously expanded, nothing is expanded now expandedNode = collapsed ? node : null; }); // switch views when buttons are clicked on(tableButton, 'click', makeViewClickHandler('table')); on(detailsButton, 'click', makeViewClickHandler('details')); on(galleryButton, 'click', makeViewClickHandler('gallery')); }); corelib/dgrid/demos/multiview/resources/description.html
New file @@ -0,0 +1,13 @@ <h3>About</h3> <p> This page demonstrates presenting several different views within a single Grid instance, by swapping out the <code>renderRow</code> function. The details and gallery views also demonstrate switching the grid header off by calling <code>setShowHeader</code>. (In fact, if only the Details and Gallery views were desired, the <code>List</code> module would be sufficient.) </p> <p> In addition, the "table" view demonstrates hooking up a click callback, in order to display more information when a row is clicked. </p> corelib/dgrid/demos/multiview/resources/df-128.png
corelib/dgrid/demos/multiview/resources/df-32.png
corelib/dgrid/demos/multiview/resources/df-64.png
corelib/dgrid/demos/multiview/resources/dojo-128.png
corelib/dgrid/demos/multiview/resources/dojo-32.png
corelib/dgrid/demos/multiview/resources/dojo-64.png
corelib/dgrid/demos/multiview/resources/multiview.css
New file @@ -0,0 +1,106 @@ .content h3 { margin: 1em 0 0.5em; } #grid { width: 80%; margin: auto; height: 332px; /* tall enough for 2 rows in gallery view */ } .controls, .content { width: 944px; margin: 0 auto; padding: 2em; } .controls { background: #000; padding: 1.25em 2em; color: #fff; text-align: center; } .controls button { margin: 0 0.5em; padding: 0 1em; } /* styles for icon node in various views */ .icon { font-size: 0; /*TODO: is this needed?*/ background-repeat: no-repeat; } .table .icon { width: 32px; height: 32px; } .details .icon { width: 72px; /* 64px + buffer to separate icon from text */ height: 64px; } .gallery .icon { width: 128px; height: 128px; margin: auto; } /* styles for "table" view (using Grid.renderRow) */ .table .field-icon { width: 33px; padding: 0; } .table .dgrid-cell { vertical-align: middle; } /* Table view allows expanding/collapsing rows to show summary */ .table .expando { /* style of area containing summary, expanded on click */ border-bottom: 1px solid #ccc !important; padding: 0.7em 1em 0.5em 3em; background: #fff; background: -moz-linear-gradient(top, rgba(255,255,255,1) 24%, rgba(237,237,237,1) 100%); background: -webkit-linear-gradient(top, rgba(255,255,255,1) 24%,rgba(237,237,237,1) 100%); background: -ms-linear-gradient(top, rgba(255,255,255,1) 24%,rgba(237,237,237,1) 100%); background: linear-gradient(top, rgba(255,255,255,1) 24%,rgba(237,237,237,1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ededed',GradientType=0 ); } .table .collapsed .expando { display: none; } /* styles for details view */ .details .dgrid-row { clear: both; min-height: 64px; padding: 0.5em; } .details .icon { float: left; } .details .name { font-weight: bold; margin-bottom: 1em; } /* styles for gallery view */ .gallery .dgrid-row { width: 25%; display: inline-block; text-align: center; padding: 1em 0; } corelib/dgrid/demos/todo/index.html
New file @@ -0,0 +1,18 @@ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Todo List</title> <link rel="stylesheet" href="../../../dojo/resources/dojo.css"> <link rel="stylesheet" href="../../css/skins/slate.css"> <!-- some of the DnD styles reside within the Dijit theme --> <link rel="stylesheet" href="../../../dijit/themes/tundra/Common.css"> <link rel="stylesheet" href="resources/todo.css"> </head> <body class="slate"> <script src="../../../dojo/dojo.js" data-dojo-config="async: true"></script> <script> require(["dgrid/demos/todo/todo"]); </script> </body> </html> corelib/dgrid/demos/todo/resources/todo.css
New file @@ -0,0 +1,39 @@ #container { width: 500px; margin: auto; } .actionArea { position: absolute; height: 2em; } .topArea { top: 0; } .bottomArea { bottom: 0; } #list { position: absolute; top: 2em; bottom: 2em; height: auto; width: 500px; } #list .field-completed { /* column with checkboxes for completing tasks */ width: 30px; } #list .completed { /* tasks that are checked off on the list get this class applied */ text-decoration: line-through; font-style: italic; } #txtTask { /* text field for adding tasks */ width: 400px; } corelib/dgrid/demos/todo/todo.js
New file @@ -0,0 +1,116 @@ define([ 'dgrid/OnDemandGrid', 'dgrid/Selection', 'dgrid/Editor', 'dgrid/extensions/DnD', 'dojo/_base/declare', 'dojo/dom-construct', 'dojo/json', 'dojo/on', 'dstore/Memory', 'dstore/Trackable', 'dojo/domReady!' ], function (OnDemandGrid, Selection, Editor, DnD, declare, domConstruct, JSON, on, Memory, Trackable) { // Create DOM var container = domConstruct.create('div', { id: 'container' }); var itemForm = domConstruct.create('form', { className: 'actionArea topArea', id: 'itemForm' }, container); var taskField = domConstruct.create('input', { id: 'txtTask', name: 'task' }, itemForm); domConstruct.create('button', { innerHTML: 'add', type: 'submit' }, itemForm); var listNode = domConstruct.create('div', { id: 'list' }, container); var removeArea = domConstruct.create('div', { className: 'actionArea bottomArea' }, container); var removeSelectedButton = domConstruct.create('button', { innerHTML: 'Remove Selected', type: 'button' }, removeArea); var removeCompletedButton = domConstruct.create('button', { innerHTML: 'Remove Completed', type: 'button' }, removeArea); document.body.appendChild(container); var storeMixins = [ Memory, Trackable ]; if (window.localStorage) { // add functionality for saving/recalling from localStorage storeMixins.push(declare(null, { STORAGE_KEY: 'dgrid_demo_todo_list', constructor: function () { var self = this; var jsondata = localStorage[this.STORAGE_KEY]; jsondata && this.setData(JSON.parse(jsondata)); this.on('add, update, delete', function () { localStorage[self.STORAGE_KEY] = JSON.stringify(self.fetchSync()); }); } })); } var Store = declare(storeMixins); var store = new Store({ idProperty: 'summary' }); var grid = new (declare([OnDemandGrid, Selection, DnD, Editor]))({ collection: store, columns: { completed: { editor: 'checkbox', label: ' ', autoSave: true, sortable: false }, summary: { field: '_item', // get whole item for use by formatter label: 'TODOs', sortable: false, formatter: function (item) { return '<div' + (item.completed ? ' class="completed"' : '') + '>' + item.summary + '</div>'; } } } }, listNode); on(itemForm, 'submit', function (event) { event.preventDefault(); // allow overwrite if already exists (by using put, not add) store.put({ completed: false, summary: taskField.value }); taskField.value = ''; }); on(removeSelectedButton, 'click', function () { for (var i in grid.selection) { // Each key in the selection map is the id of the item, // so we can pass it directly to store.remove. store.remove(i); } }); on(removeCompletedButton, 'click', function () { // query for all completed items and remove them store.filter({ completed: true }).fetch().forEach(function (item) { store.remove(item[store.idProperty]); }); }); if (window.localStorage) { // add extra button to clear the localStorage key we're using var button = domConstruct.create('button', { innerHTML: 'Clear localStorage', type: 'button' }, removeArea); on(button, 'click', function () { localStorage.removeItem(store.STORAGE_KEY); // remove all items in grid the quick way (no need to iteratively remove) store.setData([]); grid.refresh(); }); } }); corelib/dgrid/doc/README.md
New file @@ -0,0 +1,56 @@ # dgrid Documentation This folder contains the official dgrid documentation. It includes information on dgrid's core components, mixins, and extensions that are available to further expand dgrid's functionality. ## Components * Core Components * [List](components/core-components/List.md) * [Grid](components/core-components/Grid.md) * [GridFromHtml](components/core-components/GridFromHtml.md) * [OnDemandList and OnDemandGrid](components/core-components/OnDemandList-and-OnDemandGrid.md) * Mixins * [Keyboard](components/mixins/Keyboard.md) * [ColumnSet](components/mixins/ColumnSet.md) * [Selection](components/mixins/Selection.md) * [Selector](components/mixins/Selector.md) * [CellSelection](components/mixins/CellSelection.md) * [Editor](components/mixins/Editor.md) * [Tree](components/mixins/Tree.md) * Extensions * [ColumnReorder](components/extensions/ColumnReorder.md) * [ColumnResizer](components/extensions/ColumnResizer.md) * [ColumnHider](components/extensions/ColumnHider.md) * [CompoundColumns](components/extensions/CompoundColumns.md) * [Pagination](components/extensions/Pagination.md) * [SingleQuery](components/extensions/SingleQuery.md) * [DijitRegistry](components/extensions/DijitRegistry.md) * [DnD](components/extensions/DnD.md) * Utilities * [touch](components/utilities/touch.md) * [misc](components/utilities/misc.md) ## Usage * [Working with Events](usage/Working-with-Events.md) * [Working with Widgets](usage/Working-with-Widgets.md) * [Styling dgrid](usage/Styling-dgrid.md) * [Customizing Skins](usage/Customizing-Skins.md) * [Limitations](usage/Limitations.md) ## Upgrading dgrid * [0.4 Migration Guide](migrating/0.4-Migration.md) * Migrating from 0.4 to 1.0 is generally straightforward; see the [dgrid 1.0 Release Notes](https://github.com/SitePen/dgrid/releases/tag/v1.0.0). ## Migrating from dojox/grid * [API Comparison](migrating/API-Comparison.md) * [Usage Comparison](migrating/Usage-Comparison.md) ## Tutorials Various tutorials are available on [dgrid.io](http://dgrid.io/#tutorials). corelib/dgrid/doc/components/core-components/Grid.md
New file @@ -0,0 +1,205 @@ # Grid Grid extends List to provide tabular display of data items, with different fields arranged into columns. ```js require([ 'dgrid/Grid' ], function (Grid) { var columns = { first: { label: "First Name" }, last: { label: "Last Name" } }; var grid = new Grid({ columns: columns }, 'grid'); // attach to a DOM id grid.renderArray(arrayOfData); // render some data }); ``` **Note:** `dgrid/Grid` does not directly support `dstore` stores. `dstore` stores are supported by the following: * [`dgrid/OnDemandList` and `dgrid/OnDemandGrid`](OnDemandList-and-OnDemandGrid.md) * [`dgrid/extensions/Pagination`](../extensions/Pagination.md) * Anything else that extends `dgrid/_StoreMixin` ## APIs In addition to the methods and properties inherited from [List](List.md), the Grid component also exposes the following properties and methods. ### Property Summary Property | Description -------- | ----------- `formatterScope` | Optional object; if specified, column formatters may be specified as strings instead of functions, in which case they will be searched for as properties within the given `formatterScope` object, and executed in the context of that object. `hasNeutralSort` | Boolean; controls behavior when clicking the same column heading repeatedly. `false` (the default) alternates between sorting ascending and descending. `true` alternates between ascending, descending, and no sort. ### Method Summary Method | Description ------ | ------------- `cell(target[, columnId])` | Analogous to the `row` method, but at the `cell` level instead. The `cell` method can look up based on an event or DOM element, or alternatively, a data item (or ID thereof) and the ID of a column. Returns an object containing the following properties: `row` - a Row object (as would be obtained from the `row` method) for the row the cell is within, `column` - the column definition object for the column the cell is within, `element`- the cell's DOM element. `column(target)` | Returns the column definition object for the given column ID; typically analogous to `cell(...).column`. `left(cell[, steps])` | Given a cell object (or something that resolves to one via the `cell` method), returns a cell object representing the cell located `steps` cells to the left (where `steps` defaults to `1`), wrapping to previous rows if necessary. `right(cell[, steps])` | Same as `left()`, but operating towards the right, wrapping to subsequent rows if necessary. `styleColumn(columnId, css)` | Programmatically adds styles to a column, given its column id, by injecting a rule string into a stylesheet in the document. Returns a handle with a `remove` function, which can be called to later remove the added style rule. Styles added via this method will be removed when the instance is destroyed if `cleanAddedRules` is set to `true`. `updateSortArrow(sort, updateSort)` | Updates the placement of the sort arrow indicator in the appropriate header cell. Normally called automatically, but can be called manually in the case of custom sort logic where the `dgrid-sort` event is canceled. `sort` is the new sort order to be reflected by the UI update; `updateSort` is an optional boolean (defaulting to `false`) which, if `true`, will update the internal `_sort` variable to keep it in sync. By default, the Grid renders a header, containing cells which display the label of each column. This can be disabled by setting `showHeader: false` in the arguments object to the Grid; it can also be changed later using `set("showHeader", ...)`. ## Events The Grid component emits one custom event, `dgrid-sort`, when a header cell is clicked to initiate a sort. This event includes the following properties: * `grid`: The Grid instance which fired the event * `parentType`: The original type of event responsible for firing this one (`click` or `keydown` within a header cell) * `sort`: An array of objects with `property` and optionally `descending` properties, representing the new sort order to be put into effect The `dgrid-sort` event bubbles and is cancelable; if canceled, the sort order will not be set. This can be useful for instituting custom sort logic where setting the actual sort on an array or store is undesirable; in this case, `updateSortArrow` should be called manually if the header is to be updated. ## Specifying Grid Columns In the simplest cases, the columns of the grid are defined via the `columns` property. This property can be a hash (object) or array, containing column definition objects. When `columns` is an object, each property's key represents the `id` and `field` of the column, and each value is the column definition object. When `columns` is an array, the numeric indices become the column IDs; `field` must be specified within each definition. Generally, using object notation is slightly more concise and convenient. However, it's worth noting that doing so relies on the order of enumeration employed by the JavaScript runtime. Typically this isn't a problem, as it matches the order in which properties are specified, but one common exception is in the case of keys coercible to numbers. ### Columns using an object This is an example of a `Grid` using object column definitions: ```js require([ 'dgrid/Grid' ], function (Grid) { var columns = { first: { label: 'First Name' }, last: { label: 'Last Name' }, age: { label: 'Age', get: function(object){ return (new Date() - object.birthDate) / 31536000000; } } }; var grid = new Grid({ columns: columns }, 'grid'); // attach to a DOM id grid.renderArray(arrayOfData); // render some data // ... }); ``` ### Columns using an array Alternatively, the same columns as above could be defined in an array, as follows: ```js var columns = [ { label: 'First Name', field: 'first' }, { label: 'Last Name', field: 'last' }, { label: 'Age', field: 'age', get: function(object){ return (new Date() - object.birthDate) / 31536000000; } } ]; ``` ### Column shorthand A column definition may also be specified simply as a string, in which case the value of the string is interpreted as the label of the column. Thus, the simplest column structures can be more succinctly written: ```js var columns = { first: 'First Name', last: 'Last Name', // ... }; ``` ### Sub-rows The Grid component also supports structures with multiple "sub-rows"; that is, it supports the idea of rendering multiple rows for each data item. Specification of multiple sub-rows is very much like specifying columns, except that one uses the `subRows` property instead of `columns`, and it receives an array of columns objects/arrays. Both the `columns` and `subRows` properties can be later reset by using the central `set` method. ```js require([ 'dgrid/Grid' ],function (Grid) { var grid = new Grid({ subRows: [ [ { field: 'id', label: 'ID' }, { field: 'name', label: 'Name' } ], [ { field: 'description', label: 'Description', colSpan: 2 } ] ], // ... }, 'grid'); }); ``` #### Column and row spanning with sub-rows When defining column structures with multiple sub-rows (via `subRows` or the [`ColumnSet`](../mixins/ColumnSet.md) mixin), the `colSpan` and `rowSpan` properties (documented below) can be specified in column definitions. See the [`complex_column.html`](../../../test/complex_column.html) test page for examples of these properties in action. ## Column Definition Properties In any of the above formats, each individual column definition object may have the following properties (all are optional): Property | Description -------- | ------------- `field` | The property from the object in the list to display in the body of the grid (unless otherwise overridden via the `get` function, explained below). In cases where `columns` is passed an object, the key of each property represents the field name, and thus this property is normally omitted. `id` | The id of the column; normally this is determined automatically from the keys or indices in the `columns` object or array. `label` | The label to show in the header of the grid. Defaults to the value of `field`. `className` | CSS class(es) to assign to the cells in the column. The value of this property may be a string to apply equally to all cells in the column, or a function which is passed the item for each row (or `undefined` for the header row) and should return a string. In either case, multiple classes may be specified space-delimited. In addition, a class in the format `field-<field>` is added if the column has a `field` defined. `colSpan` | A number specifying how many columns the cell should span, when multiple sub-rows are defined. `rowSpan` | A number specifying how many rows the cell should span, when multiple sub-rows are defined. `sortable` | Indicates whether or not the grid should allow sorting by values in this field, by clicking on the column's header cell. Defaults to `true`. Note that it is always possible to programmatically sort a Grid by a given field by calling `set("sort", property, descending)` regardless of`sortable` status or even visible presence in the Grid altogether. `get(item)` | An optional function that, given a data item, will return the value to render in the cell. `set(item)` | An optional function that, given a modified data item, will return the value to set for the respective field on that item upon a call to `save()`. If no value is returned, the value as set in the passed item will be used. (Modifying the passed item directly is thus also an option.) `formatter(value, object)` | An optional function that will return a string of HTML for rendering. The function is passed the value that would normally be rendered, and the object from the collection. If `formatterScope` is used, this can be a string instead of a function, in which case a function will be looked up on the `formatterScope` object using the given string. (Note: if a custom `renderCell` is specified, `formatter` will be ignored unless the custom `renderCell` accounts for it.) `renderCell(object, value, node)` | An optional function that will be called to render the value into the target cell. `object` refers to the record from the grid's collection for the row, and `value` refers to the specific value for the current cell (which may have been modified by the column definition's `get` function). `node` refers to the table cell that will be placed in the grid; if `renderCell` returns a node, that returned node will be placed inside the table cell. (Note: if a custom `renderCell` is specified, `formatter` will be ignored unless the custom `renderCell` accounts for it.) `renderHeaderCell(node)` | An optional function that will be called to render the column's header cell. Like `renderCell`, this may either operate on the node directly, or return a new node to be placed within it. Diff truncated after the above file
corelib/dgrid/doc/components/core-components/GridFromHtml.md corelib/dgrid/doc/components/core-components/List.md corelib/dgrid/doc/components/core-components/OnDemandList-and-OnDemandGrid.md corelib/dgrid/doc/components/extensions/ColumnHider.md corelib/dgrid/doc/components/extensions/ColumnReorder.md corelib/dgrid/doc/components/extensions/ColumnResizer.md corelib/dgrid/doc/components/extensions/CompoundColumns.md corelib/dgrid/doc/components/extensions/DijitRegistry.md corelib/dgrid/doc/components/extensions/DnD.md corelib/dgrid/doc/components/extensions/Pagination.md corelib/dgrid/doc/components/extensions/SingleQuery.md corelib/dgrid/doc/components/mixins/CellSelection.md corelib/dgrid/doc/components/mixins/ColumnSet.md corelib/dgrid/doc/components/mixins/Editor.md corelib/dgrid/doc/components/mixins/Keyboard.md corelib/dgrid/doc/components/mixins/Selection.md corelib/dgrid/doc/components/mixins/Selector.md corelib/dgrid/doc/components/mixins/Tree.md corelib/dgrid/doc/components/utilities/misc.md corelib/dgrid/doc/components/utilities/mouse.md corelib/dgrid/doc/components/utilities/touch.md corelib/dgrid/doc/migrating/0.4-Migration.md corelib/dgrid/doc/migrating/API-Comparison.md corelib/dgrid/doc/migrating/Usage-Comparison.md corelib/dgrid/doc/usage/Customizing-Skins.md corelib/dgrid/doc/usage/Limitations.md corelib/dgrid/doc/usage/Styling-dgrid.md corelib/dgrid/doc/usage/Working-with-Events.md corelib/dgrid/doc/usage/Working-with-Widgets.md corelib/dgrid/doc/usage/npm.md corelib/dgrid/extensions/ColumnHider.js corelib/dgrid/extensions/ColumnReorder.js corelib/dgrid/extensions/ColumnResizer.js corelib/dgrid/extensions/CompoundColumns.js corelib/dgrid/extensions/DijitRegistry.js corelib/dgrid/extensions/DnD.js corelib/dgrid/extensions/Pagination.js corelib/dgrid/extensions/SingleQuery.js corelib/dgrid/extensions/nls/ar/pagination.js corelib/dgrid/extensions/nls/columnHider.js corelib/dgrid/extensions/nls/de/pagination.js corelib/dgrid/extensions/nls/es/columnHider.js corelib/dgrid/extensions/nls/es/pagination.js corelib/dgrid/extensions/nls/fr/pagination.js corelib/dgrid/extensions/nls/ja/pagination.js corelib/dgrid/extensions/nls/pagination.js corelib/dgrid/extensions/nls/pt/pagination.js corelib/dgrid/extensions/nls/ro/columnHider.js corelib/dgrid/extensions/nls/ro/pagination.js corelib/dgrid/extensions/nls/sk/pagination.js corelib/dgrid/extensions/nls/sl/columnHider.js corelib/dgrid/extensions/nls/sl/pagination.js corelib/dgrid/extensions/nls/th/pagination.js corelib/dgrid/extensions/nls/zh-cn/pagination.js corelib/dgrid/extensions/nls/zh-hk/pagination.js corelib/dgrid/package.js corelib/dgrid/package.json corelib/dgrid/test/Editor.html corelib/dgrid/test/Editor_autosave.html corelib/dgrid/test/Editor_more_widgets.html corelib/dgrid/test/Editor_no_store.html corelib/dgrid/test/Editor_widgets.html corelib/dgrid/test/GridFromHtml.html corelib/dgrid/test/GridFromHtml_Editors.html corelib/dgrid/test/Grid_headerless.html corelib/dgrid/test/Grid_mouseevents.html corelib/dgrid/test/Grid_rendering.html corelib/dgrid/test/Keyboard.html corelib/dgrid/test/OnDemand.html corelib/dgrid/test/OnDemand_pagingMethod.html corelib/dgrid/test/OnDemand_promises.html corelib/dgrid/test/OnDemand_tile.html corelib/dgrid/test/Rest.html corelib/dgrid/test/Selection.html corelib/dgrid/test/Selector.html corelib/dgrid/test/Tree.html corelib/dgrid/test/Tree_editor.html corelib/dgrid/test/Tree_expand.html corelib/dgrid/test/Tree_extra_filter.html corelib/dgrid/test/autoheight.html corelib/dgrid/test/common_cases.html corelib/dgrid/test/complex_column.html corelib/dgrid/test/data/createAsyncStore.js corelib/dgrid/test/data/createHierarchicalStore.js corelib/dgrid/test/data/createIndex.js corelib/dgrid/test/data/createOrderedStore.js corelib/dgrid/test/data/createSyncStore.js corelib/dgrid/test/data/errorStores.js corelib/dgrid/test/data/genericData.js corelib/dgrid/test/data/hierarchicalCountryData.js corelib/dgrid/test/data/index.json corelib/dgrid/test/data/largeColorData.js corelib/dgrid/test/data/orderedData.js corelib/dgrid/test/data/requestData.json corelib/dgrid/test/data/rest.php corelib/dgrid/test/data/smallColorData.js corelib/dgrid/test/data/stateData.js corelib/dgrid/test/data/testPerformanceStore.js corelib/dgrid/test/data/testStore.js corelib/dgrid/test/data/testTopHeavyHierarchicalStore.js corelib/dgrid/test/data/typesData.js corelib/dgrid/test/dijit_layout.html corelib/dgrid/test/dijit_layout_mixed.html corelib/dgrid/test/dijit_layout_programmatic.html corelib/dgrid/test/extensions/ColumnHider.html corelib/dgrid/test/extensions/ColumnHider_MenuHeight.html corelib/dgrid/test/extensions/ColumnReorder.html corelib/dgrid/test/extensions/ColumnReorder_complex.html corelib/dgrid/test/extensions/ColumnResizer.html corelib/dgrid/test/extensions/ColumnResizer_complex.html corelib/dgrid/test/extensions/CompoundColumns.html corelib/dgrid/test/extensions/CompoundColumns_Tree.html corelib/dgrid/test/extensions/DnD.html corelib/dgrid/test/extensions/DnD_Tree.html corelib/dgrid/test/extensions/DnD_error.html corelib/dgrid/test/extensions/DnD_touch.html corelib/dgrid/test/extensions/Pagination.html corelib/dgrid/test/extensions/Pagination_Tree.html corelib/dgrid/test/extensions/Pagination_i18n.html corelib/dgrid/test/extensions/SingleQuery.html corelib/dgrid/test/has-css3.html corelib/dgrid/test/index.html corelib/dgrid/test/intern/addCss.js corelib/dgrid/test/intern/all.js corelib/dgrid/test/intern/core/List.js corelib/dgrid/test/intern/core/OnDemandList.js corelib/dgrid/test/intern/core/_StoreMixin.js corelib/dgrid/test/intern/core/addCssRule.js corelib/dgrid/test/intern/core/columns.js corelib/dgrid/test/intern/core/createDestroy.js corelib/dgrid/test/intern/core/setClass.js corelib/dgrid/test/intern/core/stores.js corelib/dgrid/test/intern/core/trackable.js corelib/dgrid/test/intern/extensions/ColumnHider.js corelib/dgrid/test/intern/extensions/ColumnResizer.js corelib/dgrid/test/intern/extensions/CompoundColumns.js corelib/dgrid/test/intern/extensions/DijitRegistry.js corelib/dgrid/test/intern/extensions/Pagination.js corelib/dgrid/test/intern/extensions/SingleQuery.js corelib/dgrid/test/intern/extensions/_insertNoDataNode.js corelib/dgrid/test/intern/functional.js corelib/dgrid/test/intern/functional/Editor-OnDemand.html corelib/dgrid/test/intern/functional/Editor.html corelib/dgrid/test/intern/functional/Editor.js corelib/dgrid/test/intern/functional/Keyboard.html corelib/dgrid/test/intern/functional/Keyboard.js corelib/dgrid/test/intern/functional/KeyboardTab.html corelib/dgrid/test/intern/functional/KeyboardTab.js corelib/dgrid/test/intern/functional/Selector.html corelib/dgrid/test/intern/functional/Selector.js corelib/dgrid/test/intern/functional/Tree.html corelib/dgrid/test/intern/functional/Tree.js corelib/dgrid/test/intern/functional/TreeCompound.html corelib/dgrid/test/intern/functional/util.js corelib/dgrid/test/intern/intern-local.js corelib/dgrid/test/intern/intern-saucelabs.js corelib/dgrid/test/intern/intern.js corelib/dgrid/test/intern/mixins/ColumnSet.js corelib/dgrid/test/intern/mixins/Editor-radio.js corelib/dgrid/test/intern/mixins/Editor.js corelib/dgrid/test/intern/mixins/Keyboard.js corelib/dgrid/test/intern/mixins/Selection.js corelib/dgrid/test/intern/mixins/Selector.js corelib/dgrid/test/intern/mixins/Tree-additional-filter.js corelib/dgrid/test/intern/mixins/Tree-expand-promise.js corelib/dgrid/test/intern/mixins/Tree-indent.js corelib/dgrid/test/intern/mixins/Tree.js corelib/dgrid/test/intern/resources/setClass.html corelib/dgrid/test/intern/runTests.html corelib/dgrid/test/mobile_grid.html corelib/dgrid/test/performance.html corelib/dgrid/test/performance_dojox_datagrid.html corelib/dgrid/test/performance_slow_network.html corelib/dgrid/test/performance_widgets.html corelib/dgrid/test/rtl.html corelib/dgrid/test/simple_grid.html corelib/dgrid/test/skin.html corelib/dgrid/test/sparse_sort.html corelib/dgrid/test/widths.html corelib/dgrid/util/has-css3.js corelib/dgrid/util/misc.js corelib/dgrid/util/touch.js corelib/dijit/BackgroundIframe.js corelib/dijit/CONTRIBUTING.md corelib/dijit/Calendar.js corelib/dijit/CalendarLite.js corelib/dijit/CheckedMenuItem.js corelib/dijit/ColorPalette.js corelib/dijit/ConfirmDialog.js corelib/dijit/ConfirmTooltipDialog.js corelib/dijit/Declaration.js corelib/dijit/Destroyable.js corelib/dijit/Dialog.js corelib/dijit/DialogUnderlay.js corelib/dijit/DropDownMenu.js corelib/dijit/Editor.js corelib/dijit/Fieldset.js corelib/dijit/InlineEditBox.js corelib/dijit/LICENSE corelib/dijit/Menu.js corelib/dijit/MenuBar.js corelib/dijit/MenuBarItem.js corelib/dijit/MenuItem.js corelib/dijit/MenuSeparator.js corelib/dijit/PopupMenuBarItem.js corelib/dijit/PopupMenuItem.js corelib/dijit/ProgressBar.js corelib/dijit/README.md corelib/dijit/RadioMenuItem.js corelib/dijit/TitlePane.js corelib/dijit/Toolbar.js corelib/dijit/ToolbarSeparator.js corelib/dijit/Tooltip.js corelib/dijit/TooltipDialog.js corelib/dijit/Tree.js corelib/dijit/Viewport.js corelib/dijit/WidgetSet.js corelib/dijit/_AttachMixin.js corelib/dijit/_BidiMixin.js corelib/dijit/_BidiSupport.js corelib/dijit/_Calendar.js corelib/dijit/_ConfirmDialogMixin.js corelib/dijit/_Contained.js corelib/dijit/_Container.js corelib/dijit/_CssStateMixin.js corelib/dijit/_DialogMixin.js corelib/dijit/_FocusMixin.js corelib/dijit/_HasDropDown.js corelib/dijit/_KeyNavContainer.js corelib/dijit/_KeyNavMixin.js corelib/dijit/_MenuBase.js corelib/dijit/_OnDijitClickMixin.js corelib/dijit/_PaletteMixin.js corelib/dijit/_Templated.js corelib/dijit/_TemplatedMixin.js corelib/dijit/_TimePicker.js corelib/dijit/_Widget.js corelib/dijit/_WidgetBase.js corelib/dijit/_WidgetsInTemplateMixin.js corelib/dijit/_base.js corelib/dijit/_base/focus.js corelib/dijit/_base/manager.js corelib/dijit/_base/place.js corelib/dijit/_base/popup.js corelib/dijit/_base/scroll.js corelib/dijit/_base/sniff.js corelib/dijit/_base/typematic.js corelib/dijit/_base/wai.js corelib/dijit/_base/window.js corelib/dijit/_editor/RichText.js corelib/dijit/_editor/_Plugin.js corelib/dijit/_editor/html.js corelib/dijit/_editor/nls/FontChoice.js corelib/dijit/_editor/nls/LinkDialog.js corelib/dijit/_editor/nls/ar/FontChoice.js corelib/dijit/_editor/nls/ar/LinkDialog.js corelib/dijit/_editor/nls/ar/commands.js corelib/dijit/_editor/nls/az/FontChoice.js corelib/dijit/_editor/nls/az/LinkDialog.js corelib/dijit/_editor/nls/az/commands.js corelib/dijit/_editor/nls/bg/FontChoice.js corelib/dijit/_editor/nls/bg/LinkDialog.js corelib/dijit/_editor/nls/bg/commands.js corelib/dijit/_editor/nls/bs/FontChoice.js corelib/dijit/_editor/nls/bs/LinkDialog.js corelib/dijit/_editor/nls/bs/commands.js corelib/dijit/_editor/nls/ca/FontChoice.js corelib/dijit/_editor/nls/ca/LinkDialog.js corelib/dijit/_editor/nls/ca/commands.js corelib/dijit/_editor/nls/commands.js corelib/dijit/_editor/nls/cs/FontChoice.js corelib/dijit/_editor/nls/cs/LinkDialog.js corelib/dijit/_editor/nls/cs/commands.js corelib/dijit/_editor/nls/da/FontChoice.js corelib/dijit/_editor/nls/da/LinkDialog.js corelib/dijit/_editor/nls/da/commands.js corelib/dijit/_editor/nls/de/FontChoice.js corelib/dijit/_editor/nls/de/LinkDialog.js corelib/dijit/_editor/nls/de/commands.js corelib/dijit/_editor/nls/el/FontChoice.js corelib/dijit/_editor/nls/el/LinkDialog.js corelib/dijit/_editor/nls/el/commands.js corelib/dijit/_editor/nls/es/FontChoice.js corelib/dijit/_editor/nls/es/LinkDialog.js corelib/dijit/_editor/nls/es/commands.js corelib/dijit/_editor/nls/et/FontChoice.js corelib/dijit/_editor/nls/et/LinkDialog.js corelib/dijit/_editor/nls/et/commands.js corelib/dijit/_editor/nls/eu/FontChoice.js corelib/dijit/_editor/nls/eu/LinkDialog.js corelib/dijit/_editor/nls/eu/commands.js corelib/dijit/_editor/nls/fi/FontChoice.js corelib/dijit/_editor/nls/fi/LinkDialog.js corelib/dijit/_editor/nls/fi/commands.js corelib/dijit/_editor/nls/fr/FontChoice.js corelib/dijit/_editor/nls/fr/LinkDialog.js corelib/dijit/_editor/nls/fr/commands.js corelib/dijit/_editor/nls/he/FontChoice.js corelib/dijit/_editor/nls/he/LinkDialog.js corelib/dijit/_editor/nls/he/commands.js corelib/dijit/_editor/nls/hi/FontChoice.js corelib/dijit/_editor/nls/hi/LinkDialog.js corelib/dijit/_editor/nls/hi/commands.js corelib/dijit/_editor/nls/hr/FontChoice.js corelib/dijit/_editor/nls/hr/LinkDialog.js corelib/dijit/_editor/nls/hr/commands.js corelib/dijit/_editor/nls/hu/FontChoice.js corelib/dijit/_editor/nls/hu/LinkDialog.js corelib/dijit/_editor/nls/hu/commands.js corelib/dijit/_editor/nls/id/FontChoice.js corelib/dijit/_editor/nls/id/LinkDialog.js corelib/dijit/_editor/nls/id/commands.js corelib/dijit/_editor/nls/it/FontChoice.js corelib/dijit/_editor/nls/it/LinkDialog.js corelib/dijit/_editor/nls/it/commands.js corelib/dijit/_editor/nls/ja/FontChoice.js corelib/dijit/_editor/nls/ja/LinkDialog.js corelib/dijit/_editor/nls/ja/commands.js corelib/dijit/_editor/nls/kk/FontChoice.js corelib/dijit/_editor/nls/kk/LinkDialog.js corelib/dijit/_editor/nls/kk/commands.js corelib/dijit/_editor/nls/ko/FontChoice.js corelib/dijit/_editor/nls/ko/LinkDialog.js corelib/dijit/_editor/nls/ko/commands.js corelib/dijit/_editor/nls/lt/FontChoice.js corelib/dijit/_editor/nls/lt/LinkDialog.js corelib/dijit/_editor/nls/lt/commands.js corelib/dijit/_editor/nls/lv/FontChoice.js corelib/dijit/_editor/nls/lv/LinkDialog.js corelib/dijit/_editor/nls/lv/commands.js corelib/dijit/_editor/nls/mk/FontChoice.js corelib/dijit/_editor/nls/mk/LinkDialog.js corelib/dijit/_editor/nls/mk/commands.js corelib/dijit/_editor/nls/nb/FontChoice.js corelib/dijit/_editor/nls/nb/LinkDialog.js corelib/dijit/_editor/nls/nb/commands.js corelib/dijit/_editor/nls/nl/FontChoice.js corelib/dijit/_editor/nls/nl/LinkDialog.js corelib/dijit/_editor/nls/nl/commands.js corelib/dijit/_editor/nls/pl/FontChoice.js corelib/dijit/_editor/nls/pl/LinkDialog.js corelib/dijit/_editor/nls/pl/commands.js corelib/dijit/_editor/nls/pt-pt/FontChoice.js corelib/dijit/_editor/nls/pt-pt/LinkDialog.js corelib/dijit/_editor/nls/pt-pt/commands.js corelib/dijit/_editor/nls/pt/FontChoice.js corelib/dijit/_editor/nls/pt/LinkDialog.js corelib/dijit/_editor/nls/pt/commands.js corelib/dijit/_editor/nls/ro/FontChoice.js corelib/dijit/_editor/nls/ro/LinkDialog.js corelib/dijit/_editor/nls/ro/commands.js corelib/dijit/_editor/nls/ru/FontChoice.js corelib/dijit/_editor/nls/ru/LinkDialog.js corelib/dijit/_editor/nls/ru/commands.js corelib/dijit/_editor/nls/sk/FontChoice.js corelib/dijit/_editor/nls/sk/LinkDialog.js corelib/dijit/_editor/nls/sk/commands.js corelib/dijit/_editor/nls/sl/FontChoice.js corelib/dijit/_editor/nls/sl/LinkDialog.js corelib/dijit/_editor/nls/sl/commands.js corelib/dijit/_editor/nls/sr/FontChoice.js corelib/dijit/_editor/nls/sr/LinkDialog.js corelib/dijit/_editor/nls/sr/commands.js corelib/dijit/_editor/nls/sv/FontChoice.js corelib/dijit/_editor/nls/sv/LinkDialog.js corelib/dijit/_editor/nls/sv/commands.js corelib/dijit/_editor/nls/th/FontChoice.js corelib/dijit/_editor/nls/th/LinkDialog.js corelib/dijit/_editor/nls/th/commands.js corelib/dijit/_editor/nls/tr/FontChoice.js corelib/dijit/_editor/nls/tr/LinkDialog.js corelib/dijit/_editor/nls/tr/commands.js corelib/dijit/_editor/nls/uk/FontChoice.js corelib/dijit/_editor/nls/uk/LinkDialog.js corelib/dijit/_editor/nls/uk/commands.js corelib/dijit/_editor/nls/vi/FontChoice.js corelib/dijit/_editor/nls/vi/LinkDialog.js corelib/dijit/_editor/nls/vi/commands.js corelib/dijit/_editor/nls/zh-hk/FontChoice.js corelib/dijit/_editor/nls/zh-hk/LinkDialog.js corelib/dijit/_editor/nls/zh-hk/commands.js corelib/dijit/_editor/nls/zh-tw/FontChoice.js corelib/dijit/_editor/nls/zh-tw/LinkDialog.js corelib/dijit/_editor/nls/zh-tw/commands.js corelib/dijit/_editor/nls/zh/FontChoice.js corelib/dijit/_editor/nls/zh/LinkDialog.js corelib/dijit/_editor/nls/zh/commands.js corelib/dijit/_editor/plugins/AlwaysShowToolbar.js corelib/dijit/_editor/plugins/EnterKeyHandling.js corelib/dijit/_editor/plugins/FontChoice.js corelib/dijit/_editor/plugins/FullScreen.js corelib/dijit/_editor/plugins/LinkDialog.js corelib/dijit/_editor/plugins/NewPage.js corelib/dijit/_editor/plugins/Print.js corelib/dijit/_editor/plugins/TabIndent.js corelib/dijit/_editor/plugins/TextColor.js corelib/dijit/_editor/plugins/ToggleDir.js corelib/dijit/_editor/plugins/ViewSource.js corelib/dijit/_editor/range.js corelib/dijit/_editor/selection.js corelib/dijit/_tree/dndSource.js corelib/dijit/a11y.js corelib/dijit/a11yclick.js corelib/dijit/bower.json corelib/dijit/commit-pseudo-changes.bat corelib/dijit/dijit-all.js corelib/dijit/dijit.js corelib/dijit/dijit.profile.js corelib/dijit/focus.js corelib/dijit/form/Button.js corelib/dijit/form/CheckBox.js corelib/dijit/form/ComboBox.js corelib/dijit/form/ComboBoxMixin.js corelib/dijit/form/ComboButton.js corelib/dijit/form/CurrencyTextBox.js corelib/dijit/form/DataList.js corelib/dijit/form/DateTextBox.js corelib/dijit/form/DropDownButton.js corelib/dijit/form/FilteringSelect.js corelib/dijit/form/Form.js corelib/dijit/form/HorizontalRule.js corelib/dijit/form/HorizontalRuleLabels.js corelib/dijit/form/HorizontalSlider.js corelib/dijit/form/MappedTextBox.js corelib/dijit/form/MultiSelect.js corelib/dijit/form/NumberSpinner.js corelib/dijit/form/NumberTextBox.js corelib/dijit/form/RadioButton.js corelib/dijit/form/RangeBoundTextBox.js corelib/dijit/form/Select.js corelib/dijit/form/SimpleTextarea.js corelib/dijit/form/Slider.js corelib/dijit/form/TextBox.js corelib/dijit/form/Textarea.js corelib/dijit/form/TimeTextBox.js corelib/dijit/form/ToggleButton.js corelib/dijit/form/ValidationTextBox.js corelib/dijit/form/VerticalRule.js corelib/dijit/form/VerticalRuleLabels.js corelib/dijit/form/VerticalSlider.js corelib/dijit/form/_AutoCompleterMixin.js corelib/dijit/form/_ButtonMixin.js corelib/dijit/form/_CheckBoxMixin.js corelib/dijit/form/_ComboBoxMenu.js corelib/dijit/form/_ComboBoxMenuMixin.js corelib/dijit/form/_DateTimeTextBox.js corelib/dijit/form/_ExpandingTextAreaMixin.js corelib/dijit/form/_FormMixin.js corelib/dijit/form/_FormSelectWidget.js corelib/dijit/form/_FormValueMixin.js corelib/dijit/form/_FormValueWidget.js corelib/dijit/form/_FormWidget.js corelib/dijit/form/_FormWidgetMixin.js corelib/dijit/form/_ListBase.js corelib/dijit/form/_ListMouseMixin.js corelib/dijit/form/_RadioButtonMixin.js corelib/dijit/form/_SearchMixin.js corelib/dijit/form/_Spinner.js corelib/dijit/form/_TextBoxMixin.js corelib/dijit/form/_ToggleButtonMixin.js corelib/dijit/form/nls/ComboBox.js corelib/dijit/form/nls/Textarea.js corelib/dijit/form/nls/ar/ComboBox.js corelib/dijit/form/nls/ar/Textarea.js corelib/dijit/form/nls/ar/validate.js corelib/dijit/form/nls/az/ComboBox.js corelib/dijit/form/nls/az/Textarea.js corelib/dijit/form/nls/az/validate.js corelib/dijit/form/nls/bg/ComboBox.js corelib/dijit/form/nls/bg/Textarea.js corelib/dijit/form/nls/bg/validate.js corelib/dijit/form/nls/bs/ComboBox.js corelib/dijit/form/nls/bs/Textarea.js corelib/dijit/form/nls/bs/validate.js corelib/dijit/form/nls/ca/ComboBox.js corelib/dijit/form/nls/ca/Textarea.js corelib/dijit/form/nls/ca/validate.js corelib/dijit/form/nls/cs/ComboBox.js corelib/dijit/form/nls/cs/Textarea.js corelib/dijit/form/nls/cs/validate.js corelib/dijit/form/nls/da/ComboBox.js corelib/dijit/form/nls/da/Textarea.js corelib/dijit/form/nls/da/validate.js corelib/dijit/form/nls/de/ComboBox.js corelib/dijit/form/nls/de/Textarea.js corelib/dijit/form/nls/de/validate.js corelib/dijit/form/nls/el/ComboBox.js corelib/dijit/form/nls/el/Textarea.js corelib/dijit/form/nls/el/validate.js corelib/dijit/form/nls/es/ComboBox.js corelib/dijit/form/nls/es/Textarea.js corelib/dijit/form/nls/es/validate.js corelib/dijit/form/nls/et/ComboBox.js corelib/dijit/form/nls/et/Textarea.js corelib/dijit/form/nls/et/validate.js corelib/dijit/form/nls/eu/ComboBox.js corelib/dijit/form/nls/eu/Textarea.js corelib/dijit/form/nls/eu/validate.js corelib/dijit/form/nls/fi/ComboBox.js corelib/dijit/form/nls/fi/Textarea.js corelib/dijit/form/nls/fi/validate.js corelib/dijit/form/nls/fr/ComboBox.js corelib/dijit/form/nls/fr/Textarea.js corelib/dijit/form/nls/fr/validate.js corelib/dijit/form/nls/he/ComboBox.js corelib/dijit/form/nls/he/Textarea.js corelib/dijit/form/nls/he/validate.js corelib/dijit/form/nls/hi/ComboBox.js corelib/dijit/form/nls/hi/Textarea.js corelib/dijit/form/nls/hi/validate.js corelib/dijit/form/nls/hr/ComboBox.js corelib/dijit/form/nls/hr/Textarea.js corelib/dijit/form/nls/hr/validate.js corelib/dijit/form/nls/hu/ComboBox.js corelib/dijit/form/nls/hu/Textarea.js corelib/dijit/form/nls/hu/validate.js corelib/dijit/form/nls/id/ComboBox.js corelib/dijit/form/nls/id/Textarea.js corelib/dijit/form/nls/id/validate.js corelib/dijit/form/nls/it/ComboBox.js corelib/dijit/form/nls/it/Textarea.js corelib/dijit/form/nls/it/validate.js corelib/dijit/form/nls/ja/ComboBox.js corelib/dijit/form/nls/ja/Textarea.js corelib/dijit/form/nls/ja/validate.js corelib/dijit/form/nls/kk/ComboBox.js corelib/dijit/form/nls/kk/Textarea.js corelib/dijit/form/nls/kk/validate.js corelib/dijit/form/nls/ko/ComboBox.js corelib/dijit/form/nls/ko/Textarea.js corelib/dijit/form/nls/ko/validate.js corelib/dijit/form/nls/lt/ComboBox.js corelib/dijit/form/nls/lt/Textarea.js corelib/dijit/form/nls/lt/validate.js corelib/dijit/form/nls/lv/ComboBox.js corelib/dijit/form/nls/lv/Textarea.js corelib/dijit/form/nls/lv/validate.js corelib/dijit/form/nls/mk/ComboBox.js corelib/dijit/form/nls/mk/Textarea.js corelib/dijit/form/nls/mk/validate.js corelib/dijit/form/nls/nb/ComboBox.js corelib/dijit/form/nls/nb/Textarea.js corelib/dijit/form/nls/nb/validate.js corelib/dijit/form/nls/nl/ComboBox.js corelib/dijit/form/nls/nl/Textarea.js corelib/dijit/form/nls/nl/validate.js corelib/dijit/form/nls/pl/ComboBox.js corelib/dijit/form/nls/pl/Textarea.js corelib/dijit/form/nls/pl/validate.js corelib/dijit/form/nls/pt-pt/ComboBox.js corelib/dijit/form/nls/pt-pt/Textarea.js corelib/dijit/form/nls/pt-pt/validate.js corelib/dijit/form/nls/pt/ComboBox.js corelib/dijit/form/nls/pt/Textarea.js corelib/dijit/form/nls/pt/validate.js corelib/dijit/form/nls/ro/ComboBox.js corelib/dijit/form/nls/ro/Textarea.js corelib/dijit/form/nls/ro/validate.js corelib/dijit/form/nls/ru/ComboBox.js corelib/dijit/form/nls/ru/Textarea.js corelib/dijit/form/nls/ru/validate.js corelib/dijit/form/nls/sk/ComboBox.js corelib/dijit/form/nls/sk/Textarea.js corelib/dijit/form/nls/sk/validate.js corelib/dijit/form/nls/sl/ComboBox.js corelib/dijit/form/nls/sl/Textarea.js corelib/dijit/form/nls/sl/validate.js corelib/dijit/form/nls/sr/ComboBox.js corelib/dijit/form/nls/sr/Textarea.js corelib/dijit/form/nls/sr/validate.js corelib/dijit/form/nls/sv/ComboBox.js corelib/dijit/form/nls/sv/Textarea.js corelib/dijit/form/nls/sv/validate.js corelib/dijit/form/nls/th/ComboBox.js corelib/dijit/form/nls/th/Textarea.js corelib/dijit/form/nls/th/validate.js corelib/dijit/form/nls/tr/ComboBox.js corelib/dijit/form/nls/tr/Textarea.js corelib/dijit/form/nls/tr/validate.js corelib/dijit/form/nls/uk/ComboBox.js corelib/dijit/form/nls/uk/Textarea.js corelib/dijit/form/nls/uk/validate.js corelib/dijit/form/nls/validate.js corelib/dijit/form/nls/vi/ComboBox.js corelib/dijit/form/nls/vi/Textarea.js corelib/dijit/form/nls/vi/validate.js corelib/dijit/form/nls/zh-hk/ComboBox.js corelib/dijit/form/nls/zh-hk/Textarea.js corelib/dijit/form/nls/zh-hk/validate.js corelib/dijit/form/nls/zh-tw/ComboBox.js corelib/dijit/form/nls/zh-tw/Textarea.js corelib/dijit/form/nls/zh-tw/validate.js corelib/dijit/form/nls/zh/ComboBox.js corelib/dijit/form/nls/zh/Textarea.js corelib/dijit/form/nls/zh/validate.js corelib/dijit/form/templates/Button.html corelib/dijit/form/templates/CheckBox.html corelib/dijit/form/templates/ComboButton.html corelib/dijit/form/templates/DropDownBox.html corelib/dijit/form/templates/DropDownButton.html corelib/dijit/form/templates/HorizontalSlider.html corelib/dijit/form/templates/Select.html corelib/dijit/form/templates/Spinner.html corelib/dijit/form/templates/TextBox.html corelib/dijit/form/templates/ValidationTextBox.html corelib/dijit/form/templates/VerticalSlider.html corelib/dijit/hccss.js corelib/dijit/icons/commonIcons.css corelib/dijit/icons/commonIcons_rtl.css corelib/dijit/icons/editorIcons.css corelib/dijit/icons/editorIcons_rtl.css corelib/dijit/icons/images/commonIconsObjActDisabled.png corelib/dijit/icons/images/commonIconsObjActDisabled_rtl.png corelib/dijit/icons/images/commonIconsObjActEnabled.png corelib/dijit/icons/images/commonIconsObjActEnabled8bit.png corelib/dijit/icons/images/commonIconsObjActEnabled8bit_rtl.png corelib/dijit/icons/images/commonIconsObjActEnabled_rtl.png corelib/dijit/icons/images/editorIconsDisabled.png corelib/dijit/icons/images/editorIconsDisabled_rtl.png corelib/dijit/icons/images/editorIconsEnabled.png corelib/dijit/icons/images/editorIconsEnabled_rtl.png corelib/dijit/icons/images/loadingAnimation.gif corelib/dijit/icons/images/loadingAnimation_rtl.gif corelib/dijit/layout/AccordionContainer.js corelib/dijit/layout/AccordionPane.js corelib/dijit/layout/BorderContainer.js corelib/dijit/layout/ContentPane.js corelib/dijit/layout/LayoutContainer.js corelib/dijit/layout/LinkPane.js corelib/dijit/layout/ScrollingTabController.js corelib/dijit/layout/SplitContainer.js corelib/dijit/layout/StackContainer.js corelib/dijit/layout/StackController.js corelib/dijit/layout/TabContainer.js corelib/dijit/layout/TabController.js corelib/dijit/layout/_ContentPaneResizeMixin.js corelib/dijit/layout/_LayoutWidget.js corelib/dijit/layout/_TabContainerBase.js corelib/dijit/layout/templates/AccordionButton.html corelib/dijit/layout/templates/ScrollingTabController.html corelib/dijit/layout/templates/TabContainer.html corelib/dijit/layout/templates/_ScrollingTabControllerButton.html corelib/dijit/layout/templates/_TabButton.html corelib/dijit/layout/utils.js corelib/dijit/main.js corelib/dijit/nls/ar/common.js corelib/dijit/nls/ar/loading.js corelib/dijit/nls/az/common.js corelib/dijit/nls/az/loading.js corelib/dijit/nls/bg/common.js corelib/dijit/nls/bg/loading.js corelib/dijit/nls/bs/common.js corelib/dijit/nls/bs/loading.js corelib/dijit/nls/ca/common.js corelib/dijit/nls/ca/loading.js corelib/dijit/nls/common.js corelib/dijit/nls/cs/common.js corelib/dijit/nls/cs/loading.js corelib/dijit/nls/da/common.js corelib/dijit/nls/da/loading.js corelib/dijit/nls/de/common.js corelib/dijit/nls/de/loading.js corelib/dijit/nls/el/common.js corelib/dijit/nls/el/loading.js corelib/dijit/nls/es/common.js corelib/dijit/nls/es/loading.js corelib/dijit/nls/et/common.js corelib/dijit/nls/et/loading.js corelib/dijit/nls/eu/common.js corelib/dijit/nls/eu/loading.js corelib/dijit/nls/fi/common.js corelib/dijit/nls/fi/loading.js corelib/dijit/nls/fr/common.js corelib/dijit/nls/fr/loading.js corelib/dijit/nls/he/common.js corelib/dijit/nls/he/loading.js corelib/dijit/nls/hi/common.js corelib/dijit/nls/hi/loading.js corelib/dijit/nls/hr/common.js corelib/dijit/nls/hr/loading.js corelib/dijit/nls/hu/common.js corelib/dijit/nls/hu/loading.js corelib/dijit/nls/id/common.js corelib/dijit/nls/id/loading.js corelib/dijit/nls/it/common.js corelib/dijit/nls/it/loading.js corelib/dijit/nls/ja/common.js corelib/dijit/nls/ja/loading.js corelib/dijit/nls/kk/common.js corelib/dijit/nls/kk/loading.js corelib/dijit/nls/ko/common.js corelib/dijit/nls/ko/loading.js corelib/dijit/nls/loading.js corelib/dijit/nls/lt/common.js corelib/dijit/nls/lt/loading.js corelib/dijit/nls/lv/common.js corelib/dijit/nls/lv/loading.js corelib/dijit/nls/mk/common.js corelib/dijit/nls/mk/loading.js corelib/dijit/nls/nb/common.js corelib/dijit/nls/nb/loading.js corelib/dijit/nls/nl/common.js corelib/dijit/nls/nl/loading.js corelib/dijit/nls/pl/common.js corelib/dijit/nls/pl/loading.js corelib/dijit/nls/pt-pt/common.js corelib/dijit/nls/pt-pt/loading.js corelib/dijit/nls/pt/common.js corelib/dijit/nls/pt/loading.js corelib/dijit/nls/ro/common.js corelib/dijit/nls/ro/loading.js corelib/dijit/nls/ru/common.js corelib/dijit/nls/ru/loading.js corelib/dijit/nls/sk/common.js corelib/dijit/nls/sk/loading.js corelib/dijit/nls/sl/common.js corelib/dijit/nls/sl/loading.js corelib/dijit/nls/sr/common.js corelib/dijit/nls/sr/loading.js corelib/dijit/nls/sv/common.js corelib/dijit/nls/sv/loading.js corelib/dijit/nls/th/common.js corelib/dijit/nls/th/loading.js corelib/dijit/nls/tr/common.js corelib/dijit/nls/tr/loading.js corelib/dijit/nls/uk/common.js corelib/dijit/nls/uk/loading.js corelib/dijit/nls/vi/common.js corelib/dijit/nls/vi/loading.js corelib/dijit/nls/zh-hk/common.js corelib/dijit/nls/zh-hk/loading.js corelib/dijit/nls/zh-tw/common.js corelib/dijit/nls/zh-tw/loading.js corelib/dijit/nls/zh/common.js corelib/dijit/nls/zh/loading.js corelib/dijit/package.json corelib/dijit/place.js corelib/dijit/popup.js corelib/dijit/registry.js corelib/dijit/selection.js corelib/dijit/templates/Calendar.html corelib/dijit/templates/CheckedMenuItem.html corelib/dijit/templates/ColorPalette.html corelib/dijit/templates/Dialog.html corelib/dijit/templates/Fieldset.html corelib/dijit/templates/InlineEditBox.html corelib/dijit/templates/Menu.html corelib/dijit/templates/MenuBar.html corelib/dijit/templates/MenuBarItem.html corelib/dijit/templates/MenuItem.html corelib/dijit/templates/MenuSeparator.html corelib/dijit/templates/ProgressBar.html corelib/dijit/templates/TitlePane.html corelib/dijit/templates/Tooltip.html corelib/dijit/templates/TooltipDialog.html corelib/dijit/templates/Tree.html corelib/dijit/templates/TreeNode.html corelib/dijit/templates/actionBar.html corelib/dijit/themes/a11y/README.txt corelib/dijit/themes/a11y/colors3x4.png corelib/dijit/themes/a11y/colors7x10.png corelib/dijit/themes/a11y/indeterminate_progress.gif corelib/dijit/themes/claro/Calendar.css corelib/dijit/themes/claro/Calendar.less corelib/dijit/themes/claro/Calendar_rtl.css corelib/dijit/themes/claro/Calendar_rtl.less corelib/dijit/themes/claro/ColorPalette.css corelib/dijit/themes/claro/ColorPalette.less corelib/dijit/themes/claro/Common.css corelib/dijit/themes/claro/Common.less corelib/dijit/themes/claro/Dialog.css corelib/dijit/themes/claro/Dialog.less corelib/dijit/themes/claro/Dialog_rtl.css corelib/dijit/themes/claro/Dialog_rtl.less corelib/dijit/themes/claro/Editor.css corelib/dijit/themes/claro/Editor.less corelib/dijit/themes/claro/Editor_rtl.css corelib/dijit/themes/claro/Editor_rtl.less corelib/dijit/themes/claro/InlineEditBox.css corelib/dijit/themes/claro/InlineEditBox.less corelib/dijit/themes/claro/Menu.css corelib/dijit/themes/claro/Menu.less corelib/dijit/themes/claro/Menu_rtl.css corelib/dijit/themes/claro/Menu_rtl.less corelib/dijit/themes/claro/ProgressBar.css corelib/dijit/themes/claro/ProgressBar.less corelib/dijit/themes/claro/ProgressBar_rtl.css corelib/dijit/themes/claro/ProgressBar_rtl.less corelib/dijit/themes/claro/README corelib/dijit/themes/claro/TimePicker.css corelib/dijit/themes/claro/TimePicker.less corelib/dijit/themes/claro/TitlePane.css corelib/dijit/themes/claro/TitlePane.less corelib/dijit/themes/claro/TitlePane_rtl.css corelib/dijit/themes/claro/TitlePane_rtl.less corelib/dijit/themes/claro/Toolbar.css corelib/dijit/themes/claro/Toolbar.less corelib/dijit/themes/claro/Toolbar_rtl.css corelib/dijit/themes/claro/Toolbar_rtl.less corelib/dijit/themes/claro/Tree.css corelib/dijit/themes/claro/Tree.less corelib/dijit/themes/claro/Tree_rtl.css corelib/dijit/themes/claro/Tree_rtl.less corelib/dijit/themes/claro/claro.css corelib/dijit/themes/claro/claro_rtl.css corelib/dijit/themes/claro/compile.js corelib/dijit/themes/claro/document.css corelib/dijit/themes/claro/document.less corelib/dijit/themes/claro/form/Button.css corelib/dijit/themes/claro/form/Button.less corelib/dijit/themes/claro/form/Button_rtl.css corelib/dijit/themes/claro/form/Button_rtl.less corelib/dijit/themes/claro/form/Checkbox.css corelib/dijit/themes/claro/form/Checkbox.less corelib/dijit/themes/claro/form/Common.css corelib/dijit/themes/claro/form/Common.less corelib/dijit/themes/claro/form/Common_rtl.css corelib/dijit/themes/claro/form/Common_rtl.less corelib/dijit/themes/claro/form/NumberSpinner.css corelib/dijit/themes/claro/form/NumberSpinner.less corelib/dijit/themes/claro/form/RadioButton.css corelib/dijit/themes/claro/form/RadioButton.less corelib/dijit/themes/claro/form/Select.css corelib/dijit/themes/claro/form/Select.less corelib/dijit/themes/claro/form/Slider.css corelib/dijit/themes/claro/form/Slider.less corelib/dijit/themes/claro/form/Slider_rtl.css corelib/dijit/themes/claro/form/Slider_rtl.less corelib/dijit/themes/claro/form/images/buttonArrows.png corelib/dijit/themes/claro/form/images/buttonDisabled.png corelib/dijit/themes/claro/form/images/buttonDisabled.svg corelib/dijit/themes/claro/form/images/buttonEnabled.png corelib/dijit/themes/claro/form/images/buttonEnabled.svg corelib/dijit/themes/claro/form/images/checkboxAndRadioButtons_IE6.png corelib/dijit/themes/claro/form/images/checkboxRadioButtonStates.png corelib/dijit/themes/claro/form/images/commonFormArrows.png corelib/dijit/themes/claro/form/images/error.png corelib/dijit/themes/claro/form/images/sliderThumbs.png corelib/dijit/themes/claro/images/activeGradient.png corelib/dijit/themes/claro/images/activeGradient.svg corelib/dijit/themes/claro/images/calendar.png corelib/dijit/themes/claro/images/calendarArrows.png corelib/dijit/themes/claro/images/calendarArrows8bit.png corelib/dijit/themes/claro/images/checkmarkNoBorder.gif corelib/dijit/themes/claro/images/checkmarkNoBorder.png corelib/dijit/themes/claro/images/dialogCloseIcon.png corelib/dijit/themes/claro/images/dialogCloseIcon8bit.png corelib/dijit/themes/claro/images/dnd.png corelib/dijit/themes/claro/images/progressBarAnim.gif corelib/dijit/themes/claro/images/progressBarFull.png corelib/dijit/themes/claro/images/spriteArrows.png corelib/dijit/themes/claro/images/standardGradient.png corelib/dijit/themes/claro/images/standardGradient.svg corelib/dijit/themes/claro/images/tooltip.png corelib/dijit/themes/claro/images/tooltip8bit.png corelib/dijit/themes/claro/images/treeExpandImages.png corelib/dijit/themes/claro/images/treeExpandImages8bit.png corelib/dijit/themes/claro/layout/AccordionContainer.css corelib/dijit/themes/claro/layout/AccordionContainer.less corelib/dijit/themes/claro/layout/BorderContainer.css corelib/dijit/themes/claro/layout/BorderContainer.less corelib/dijit/themes/claro/layout/ContentPane.css corelib/dijit/themes/claro/layout/ContentPane.less corelib/dijit/themes/claro/layout/TabContainer.css corelib/dijit/themes/claro/layout/TabContainer.less corelib/dijit/themes/claro/layout/TabContainer_rtl.css corelib/dijit/themes/claro/layout/TabContainer_rtl.less corelib/dijit/themes/claro/layout/images/tabBottomSelected.png corelib/dijit/themes/claro/layout/images/tabBottomSelected.svg corelib/dijit/themes/claro/layout/images/tabBottomUnselected.png corelib/dijit/themes/claro/layout/images/tabBottomUnselected.svg corelib/dijit/themes/claro/layout/images/tabClose.png corelib/dijit/themes/claro/layout/images/tabLeftSelected.png corelib/dijit/themes/claro/layout/images/tabLeftSelected.svg corelib/dijit/themes/claro/layout/images/tabLeftUnselected.png corelib/dijit/themes/claro/layout/images/tabLeftUnselected.svg corelib/dijit/themes/claro/layout/images/tabNested.png corelib/dijit/themes/claro/layout/images/tabRightSelected.png corelib/dijit/themes/claro/layout/images/tabRightSelected.svg corelib/dijit/themes/claro/layout/images/tabRightUnselected.png corelib/dijit/themes/claro/layout/images/tabRightUnselected.svg corelib/dijit/themes/claro/layout/images/tabTopSelected.png corelib/dijit/themes/claro/layout/images/tabTopSelected.svg corelib/dijit/themes/claro/layout/images/tabTopUnselected.png corelib/dijit/themes/claro/layout/images/tabTopUnselected.svg corelib/dijit/themes/claro/variables.less corelib/dijit/themes/dijit.css corelib/dijit/themes/dijit_rtl.css corelib/dijit/themes/nihilo/Calendar.css corelib/dijit/themes/nihilo/Calendar_rtl.css corelib/dijit/themes/nihilo/ColorPalette.css corelib/dijit/themes/nihilo/Common.css corelib/dijit/themes/nihilo/Dialog.css corelib/dijit/themes/nihilo/Dialog_rtl.css corelib/dijit/themes/nihilo/Editor.css corelib/dijit/themes/nihilo/Editor_rtl.css corelib/dijit/themes/nihilo/Menu.css corelib/dijit/themes/nihilo/Menu_rtl.css corelib/dijit/themes/nihilo/ProgressBar.css corelib/dijit/themes/nihilo/ProgressBar_rtl.css corelib/dijit/themes/nihilo/TimePicker.css corelib/dijit/themes/nihilo/TimePicker_rtl.css corelib/dijit/themes/nihilo/TitlePane.css corelib/dijit/themes/nihilo/TitlePane_rtl.css corelib/dijit/themes/nihilo/Toolbar.css corelib/dijit/themes/nihilo/Tree.css corelib/dijit/themes/nihilo/Tree_rtl.css corelib/dijit/themes/nihilo/form/Button.css corelib/dijit/themes/nihilo/form/Button_rtl.css corelib/dijit/themes/nihilo/form/Checkbox.css corelib/dijit/themes/nihilo/form/Common.css corelib/dijit/themes/nihilo/form/RadioButton.css corelib/dijit/themes/nihilo/form/Select.css corelib/dijit/themes/nihilo/form/Slider.css corelib/dijit/themes/nihilo/form/Slider_rtl.css corelib/dijit/themes/nihilo/form/TimeTextBox.css corelib/dijit/themes/nihilo/images/accordionItemActive.png corelib/dijit/themes/nihilo/images/buttonActive.png corelib/dijit/themes/nihilo/images/buttonDisabled.png corelib/dijit/themes/nihilo/images/buttonEnabled.png corelib/dijit/themes/nihilo/images/buttonHover.png corelib/dijit/themes/nihilo/images/dndCopy.png corelib/dijit/themes/nihilo/images/dndMove.png corelib/dijit/themes/nihilo/images/dndNoCopy.png corelib/dijit/themes/nihilo/images/dndNoMove.png corelib/dijit/themes/nihilo/images/no.gif corelib/dijit/themes/nihilo/images/preciseSliderThumb.gif corelib/dijit/themes/nihilo/images/preciseSliderThumb.png corelib/dijit/themes/nihilo/images/preciseSliderThumbFocus.gif corelib/dijit/themes/nihilo/images/preciseSliderThumbFocus.png corelib/dijit/themes/nihilo/images/progressBarAnim.gif corelib/dijit/themes/nihilo/images/progressBarEmpty.png corelib/dijit/themes/nihilo/images/progressBarFull.png corelib/dijit/themes/nihilo/images/sliderEmpty.png corelib/dijit/themes/nihilo/images/sliderEmptyVertical.png corelib/dijit/themes/nihilo/images/sliderFull.png corelib/dijit/themes/nihilo/images/sliderFullFocus.png corelib/dijit/themes/nihilo/images/sliderFullVertical.png corelib/dijit/themes/nihilo/images/sliderFullVerticalFocus.png corelib/dijit/themes/nihilo/images/sliderThumb.gif corelib/dijit/themes/nihilo/images/sliderThumb.png corelib/dijit/themes/nihilo/images/sliderThumbFocus.gif corelib/dijit/themes/nihilo/images/sliderThumbFocus.png corelib/dijit/themes/nihilo/images/splitContainerSizerH-thumb.png corelib/dijit/themes/nihilo/images/splitContainerSizerH.png corelib/dijit/themes/nihilo/images/splitContainerSizerV-thumb.png corelib/dijit/themes/nihilo/images/splitContainerSizerV.png corelib/dijit/themes/nihilo/images/spriteArrows.gif corelib/dijit/themes/nihilo/images/spriteArrows.png corelib/dijit/themes/nihilo/images/spriteCheckbox.gif corelib/dijit/themes/nihilo/images/spriteCheckbox.png corelib/dijit/themes/nihilo/images/spriteDivIcons.gif corelib/dijit/themes/nihilo/images/spriteDivIcons.png corelib/dijit/themes/nihilo/images/spriteRadio.gif corelib/dijit/themes/nihilo/images/spriteRadio.png corelib/dijit/themes/nihilo/images/spriteRoundedIconsSmall.gif corelib/dijit/themes/nihilo/images/spriteRoundedIconsSmall.png corelib/dijit/themes/nihilo/images/spriteTree.gif corelib/dijit/themes/nihilo/images/spriteTree.png corelib/dijit/themes/nihilo/images/spriteTree_rtl.gif corelib/dijit/themes/nihilo/images/spriteTree_rtl.png corelib/dijit/themes/nihilo/images/tabBottomActiveC.gif corelib/dijit/themes/nihilo/images/tabBottomEnabledC.gif corelib/dijit/themes/nihilo/images/tabBottomHoverC.gif corelib/dijit/themes/nihilo/images/tabContainerSprite.gif corelib/dijit/themes/nihilo/images/titleBar.png corelib/dijit/themes/nihilo/images/titleBarActive.png corelib/dijit/themes/nihilo/images/tooltipConnectorDown.gif corelib/dijit/themes/nihilo/images/tooltipConnectorDown.png corelib/dijit/themes/nihilo/images/tooltipConnectorLeft.gif corelib/dijit/themes/nihilo/images/tooltipConnectorLeft.png corelib/dijit/themes/nihilo/images/tooltipConnectorRight.gif corelib/dijit/themes/nihilo/images/tooltipConnectorRight.png corelib/dijit/themes/nihilo/images/tooltipConnectorUp.gif corelib/dijit/themes/nihilo/images/tooltipConnectorUp.png corelib/dijit/themes/nihilo/images/treeExpand_loading.gif corelib/dijit/themes/nihilo/images/treeHover.png corelib/dijit/themes/nihilo/images/treeI.gif corelib/dijit/themes/nihilo/images/treeI_half.gif corelib/dijit/themes/nihilo/images/treeI_half_rtl.gif corelib/dijit/themes/nihilo/images/treeI_rtl.gif corelib/dijit/themes/nihilo/images/validationInputBg.gif corelib/dijit/themes/nihilo/images/validationInputBg.png corelib/dijit/themes/nihilo/images/warning.png corelib/dijit/themes/nihilo/layout/AccordionContainer.css corelib/dijit/themes/nihilo/layout/AccordionContainer_rtl.css corelib/dijit/themes/nihilo/layout/BorderContainer.css corelib/dijit/themes/nihilo/layout/ContentPane.css corelib/dijit/themes/nihilo/layout/SplitContainer.css corelib/dijit/themes/nihilo/layout/TabContainer.css corelib/dijit/themes/nihilo/layout/TabContainer_rtl.css corelib/dijit/themes/nihilo/nihilo.css corelib/dijit/themes/nihilo/nihilo_rtl.css corelib/dijit/themes/soria/Calendar.css corelib/dijit/themes/soria/Calendar_rtl.css corelib/dijit/themes/soria/ColorPalette.css corelib/dijit/themes/soria/Common.css corelib/dijit/themes/soria/Dialog.css corelib/dijit/themes/soria/Dialog_rtl.css corelib/dijit/themes/soria/Editor.css corelib/dijit/themes/soria/Editor_rtl.css corelib/dijit/themes/soria/Menu.css corelib/dijit/themes/soria/Menu_rtl.css corelib/dijit/themes/soria/ProgressBar.css corelib/dijit/themes/soria/ProgressBar_rtl.css corelib/dijit/themes/soria/TimePicker.css corelib/dijit/themes/soria/TimePicker_rtl.css corelib/dijit/themes/soria/TitlePane.css corelib/dijit/themes/soria/TitlePane_rtl.css corelib/dijit/themes/soria/Toolbar.css corelib/dijit/themes/soria/Tree.css corelib/dijit/themes/soria/Tree_rtl.css corelib/dijit/themes/soria/form/Button.css corelib/dijit/themes/soria/form/Button_rtl.css corelib/dijit/themes/soria/form/Checkbox.css corelib/dijit/themes/soria/form/Common.css corelib/dijit/themes/soria/form/RadioButton.css corelib/dijit/themes/soria/form/Select.css corelib/dijit/themes/soria/form/Slider.css corelib/dijit/themes/soria/form/Slider_rtl.css corelib/dijit/themes/soria/form/TimeTextBox.css corelib/dijit/themes/soria/images/accordionItemActive.gif corelib/dijit/themes/soria/images/accordionItemActive.png corelib/dijit/themes/soria/images/buttonActive.png corelib/dijit/themes/soria/images/buttonDisabled.png corelib/dijit/themes/soria/images/buttonEnabled.png corelib/dijit/themes/soria/images/buttonHover.png corelib/dijit/themes/soria/images/dndCopy.png corelib/dijit/themes/soria/images/dndMove.png corelib/dijit/themes/soria/images/dndNoCopy.png corelib/dijit/themes/soria/images/dndNoMove.png corelib/dijit/themes/soria/images/preciseSliderThumb.gif corelib/dijit/themes/soria/images/preciseSliderThumb.png corelib/dijit/themes/soria/images/preciseSliderThumbFocus.gif corelib/dijit/themes/soria/images/preciseSliderThumbFocus.png corelib/dijit/themes/soria/images/progressBarAnim.gif corelib/dijit/themes/soria/images/progressBarEmpty.png corelib/dijit/themes/soria/images/progressBarFull.png corelib/dijit/themes/soria/images/sliderEmpty.png corelib/dijit/themes/soria/images/sliderEmptyVertical.png corelib/dijit/themes/soria/images/sliderFull.png corelib/dijit/themes/soria/images/sliderFullFocus.png corelib/dijit/themes/soria/images/sliderFullVertical.png corelib/dijit/themes/soria/images/sliderFullVerticalFocus.png corelib/dijit/themes/soria/images/sliderThumb.gif corelib/dijit/themes/soria/images/sliderThumb.png corelib/dijit/themes/soria/images/sliderThumbFocus.gif corelib/dijit/themes/soria/images/sliderThumbFocus.png corelib/dijit/themes/soria/images/splitContainerSizerH-thumb.png corelib/dijit/themes/soria/images/splitContainerSizerH.png corelib/dijit/themes/soria/images/splitContainerSizerV-thumb.png corelib/dijit/themes/soria/images/splitContainerSizerV.png corelib/dijit/themes/soria/images/spriteArrows.gif corelib/dijit/themes/soria/images/spriteArrows.png corelib/dijit/themes/soria/images/spriteCheckbox.gif corelib/dijit/themes/soria/images/spriteCheckbox.png corelib/dijit/themes/soria/images/spriteDivIcons.gif corelib/dijit/themes/soria/images/spriteDivIcons.png corelib/dijit/themes/soria/images/spriteRadio.gif corelib/dijit/themes/soria/images/spriteRadio.png corelib/dijit/themes/soria/images/spriteRoundedIconsSmall.gif corelib/dijit/themes/soria/images/spriteRoundedIconsSmall.png corelib/dijit/themes/soria/images/spriteRoundedIconsSmallBl.gif corelib/dijit/themes/soria/images/spriteRoundedIconsSmallBl.png corelib/dijit/themes/soria/images/spriteTree.gif corelib/dijit/themes/soria/images/spriteTree.png corelib/dijit/themes/soria/images/spriteTree_rtl.gif corelib/dijit/themes/soria/images/spriteTree_rtl.png corelib/dijit/themes/soria/images/tabBottomActiveC.gif corelib/dijit/themes/soria/images/tabBottomEnabledC.gif corelib/dijit/themes/soria/images/tabBottomEnabledSpriteLR.gif corelib/dijit/themes/soria/images/tabBottomHoverC.gif corelib/dijit/themes/soria/images/tabContainerSprite.gif corelib/dijit/themes/soria/images/tabLeftChecked.gif corelib/dijit/themes/soria/images/tabRightChecked.gif corelib/dijit/themes/soria/images/titleBar.png corelib/dijit/themes/soria/images/titleBarActive.png corelib/dijit/themes/soria/images/tooltipConnectorDown.gif corelib/dijit/themes/soria/images/tooltipConnectorDown.png corelib/dijit/themes/soria/images/tooltipConnectorLeft.gif corelib/dijit/themes/soria/images/tooltipConnectorLeft.png corelib/dijit/themes/soria/images/tooltipConnectorRight.gif corelib/dijit/themes/soria/images/tooltipConnectorRight.png corelib/dijit/themes/soria/images/tooltipConnectorUp.gif corelib/dijit/themes/soria/images/tooltipConnectorUp.png corelib/dijit/themes/soria/images/treeExpand_loading.gif corelib/dijit/themes/soria/images/treeHover.png corelib/dijit/themes/soria/images/treeI.gif corelib/dijit/themes/soria/images/treeI_half.gif corelib/dijit/themes/soria/images/treeI_half_rtl.gif corelib/dijit/themes/soria/images/treeI_rtl.gif corelib/dijit/themes/soria/images/validationInputBg.gif corelib/dijit/themes/soria/images/validationInputBg.png corelib/dijit/themes/soria/images/warning.png corelib/dijit/themes/soria/layout/AccordionContainer.css corelib/dijit/themes/soria/layout/AccordionContainer_rtl.css corelib/dijit/themes/soria/layout/BorderContainer.css corelib/dijit/themes/soria/layout/ContentPane.css corelib/dijit/themes/soria/layout/SplitContainer.css corelib/dijit/themes/soria/layout/TabContainer.css corelib/dijit/themes/soria/layout/TabContainer_rtl.css corelib/dijit/themes/soria/soria.css corelib/dijit/themes/soria/soria_rtl.css corelib/dijit/themes/tundra/Calendar.css corelib/dijit/themes/tundra/Calendar_rtl.css corelib/dijit/themes/tundra/ColorPalette.css corelib/dijit/themes/tundra/Common.css corelib/dijit/themes/tundra/Dialog.css corelib/dijit/themes/tundra/Dialog_rtl.css corelib/dijit/themes/tundra/Editor.css corelib/dijit/themes/tundra/Editor_rtl.css corelib/dijit/themes/tundra/Menu.css corelib/dijit/themes/tundra/Menu_rtl.css corelib/dijit/themes/tundra/ProgressBar.css corelib/dijit/themes/tundra/ProgressBar_rtl.css corelib/dijit/themes/tundra/TimePicker.css corelib/dijit/themes/tundra/TimePicker_rtl.css corelib/dijit/themes/tundra/TitlePane.css corelib/dijit/themes/tundra/TitlePane_rtl.css corelib/dijit/themes/tundra/Toolbar.css corelib/dijit/themes/tundra/Tree.css corelib/dijit/themes/tundra/Tree_rtl.css corelib/dijit/themes/tundra/form/Button.css corelib/dijit/themes/tundra/form/Checkbox.css corelib/dijit/themes/tundra/form/Common.css corelib/dijit/themes/tundra/form/RadioButton.css corelib/dijit/themes/tundra/form/Select.css corelib/dijit/themes/tundra/form/Slider.css corelib/dijit/themes/tundra/form/Slider_rtl.css corelib/dijit/themes/tundra/images/accordionItemActive.gif corelib/dijit/themes/tundra/images/accordionItemHover.gif corelib/dijit/themes/tundra/images/buttonActive.png corelib/dijit/themes/tundra/images/buttonDisabled.png corelib/dijit/themes/tundra/images/buttonEnabled.png corelib/dijit/themes/tundra/images/buttonHover.png corelib/dijit/themes/tundra/images/calendarDayLabel.png corelib/dijit/themes/tundra/images/calendarMonthLabel.png corelib/dijit/themes/tundra/images/calendarYearLabel.png corelib/dijit/themes/tundra/images/checkmark.gif corelib/dijit/themes/tundra/images/checkmark.png corelib/dijit/themes/tundra/images/checkmarkNoBorder.gif corelib/dijit/themes/tundra/images/checkmarkNoBorder.png corelib/dijit/themes/tundra/images/circleIcon.gif corelib/dijit/themes/tundra/images/circleIcon.png corelib/dijit/themes/tundra/images/comboArrowDown.gif corelib/dijit/themes/tundra/images/dijitProgressBarAnim.gif corelib/dijit/themes/tundra/images/dijitProgressBarAnim.psd corelib/dijit/themes/tundra/images/dndCopy.png corelib/dijit/themes/tundra/images/dndMove.png corelib/dijit/themes/tundra/images/dndNoCopy.png corelib/dijit/themes/tundra/images/dndNoMove.png corelib/dijit/themes/tundra/images/dojoTundraGradientBg.gif corelib/dijit/themes/tundra/images/dojoTundraGradientBg.png corelib/dijit/themes/tundra/images/doubleArrowDown.png corelib/dijit/themes/tundra/images/doubleArrowUp.png corelib/dijit/themes/tundra/images/folderClosed.gif corelib/dijit/themes/tundra/images/folderOpened.gif corelib/dijit/themes/tundra/images/i.gif corelib/dijit/themes/tundra/images/i_half.gif corelib/dijit/themes/tundra/images/i_half_rtl.gif corelib/dijit/themes/tundra/images/i_rtl.gif corelib/dijit/themes/tundra/images/leaf.gif corelib/dijit/themes/tundra/images/loading.gif corelib/dijit/themes/tundra/images/menu.png corelib/dijit/themes/tundra/images/minusButton.gif corelib/dijit/themes/tundra/images/no.gif corelib/dijit/themes/tundra/images/noX.gif corelib/dijit/themes/tundra/images/plusButton.gif corelib/dijit/themes/tundra/images/popupMenuBg.gif corelib/dijit/themes/tundra/images/preciseSliderThumb.gif corelib/dijit/themes/tundra/images/preciseSliderThumb.png corelib/dijit/themes/tundra/images/preciseSliderThumbFocus.gif corelib/dijit/themes/tundra/images/preciseSliderThumbFocus.png corelib/dijit/themes/tundra/images/progressBarAnim-1.png corelib/dijit/themes/tundra/images/progressBarAnim-2.png corelib/dijit/themes/tundra/images/progressBarAnim-3.png corelib/dijit/themes/tundra/images/progressBarAnim-4.png corelib/dijit/themes/tundra/images/progressBarAnim-5.png corelib/dijit/themes/tundra/images/progressBarAnim-6.png corelib/dijit/themes/tundra/images/progressBarAnim-7.png corelib/dijit/themes/tundra/images/progressBarAnim-8.png corelib/dijit/themes/tundra/images/progressBarAnim-9.png corelib/dijit/themes/tundra/images/progressBarAnim.gif corelib/dijit/themes/tundra/images/progressBarAnim.psd corelib/dijit/themes/tundra/images/progressBarEmpty.png corelib/dijit/themes/tundra/images/progressBarFull.png corelib/dijit/themes/tundra/images/radioButtonActive.png corelib/dijit/themes/tundra/images/radioButtonActiveDisabled.png corelib/dijit/themes/tundra/images/radioButtonActiveHover.png corelib/dijit/themes/tundra/images/radioButtonDisabled.png corelib/dijit/themes/tundra/images/radioButtonEnabled.png corelib/dijit/themes/tundra/images/radioButtonHover.png corelib/dijit/themes/tundra/images/sliderEmpty.png corelib/dijit/themes/tundra/images/sliderEmptyVertical.png corelib/dijit/themes/tundra/images/sliderFull.png corelib/dijit/themes/tundra/images/sliderFullFocus.png corelib/dijit/themes/tundra/images/sliderFullVertical.png corelib/dijit/themes/tundra/images/sliderFullVerticalFocus.png corelib/dijit/themes/tundra/images/sliderThumb.png corelib/dijit/themes/tundra/images/sliderThumbFocus.gif corelib/dijit/themes/tundra/images/sliderThumbFocus.png corelib/dijit/themes/tundra/images/smallArrowDown.png corelib/dijit/themes/tundra/images/smallArrowUp.png corelib/dijit/themes/tundra/images/splitContainerSizerH-thumb.png corelib/dijit/themes/tundra/images/splitContainerSizerH.png corelib/dijit/themes/tundra/images/splitContainerSizerV-thumb.png corelib/dijit/themes/tundra/images/splitContainerSizerV.png corelib/dijit/themes/tundra/images/spriteArrows.gif corelib/dijit/themes/tundra/images/spriteArrows.png corelib/dijit/themes/tundra/images/spriteRoundedIconsSmall.gif corelib/dijit/themes/tundra/images/spriteRoundedIconsSmall.png corelib/dijit/themes/tundra/images/tabActive.png corelib/dijit/themes/tundra/images/tabClose.gif corelib/dijit/themes/tundra/images/tabClose.png corelib/dijit/themes/tundra/images/tabCloseHover.gif corelib/dijit/themes/tundra/images/tabCloseHover.png corelib/dijit/themes/tundra/images/tabDisabled.png corelib/dijit/themes/tundra/images/tabEnabled.png corelib/dijit/themes/tundra/images/tabHover.gif corelib/dijit/themes/tundra/images/tabHover.png corelib/dijit/themes/tundra/images/titleBar.png corelib/dijit/themes/tundra/images/titleBarBg.gif corelib/dijit/themes/tundra/images/tooltipConnectorDown.gif corelib/dijit/themes/tundra/images/tooltipConnectorDown.png corelib/dijit/themes/tundra/images/tooltipConnectorLeft.gif corelib/dijit/themes/tundra/images/tooltipConnectorLeft.png corelib/dijit/themes/tundra/images/tooltipConnectorRight.gif corelib/dijit/themes/tundra/images/tooltipConnectorRight.png corelib/dijit/themes/tundra/images/tooltipConnectorUp.gif corelib/dijit/themes/tundra/images/tooltipConnectorUp.png corelib/dijit/themes/tundra/images/treeExpand_leaf.gif corelib/dijit/themes/tundra/images/treeExpand_leaf_rtl.gif corelib/dijit/themes/tundra/images/treeExpand_loading.gif corelib/dijit/themes/tundra/images/treeExpand_minus.gif corelib/dijit/themes/tundra/images/treeExpand_minus_rtl.gif corelib/dijit/themes/tundra/images/treeExpand_mius.gif corelib/dijit/themes/tundra/images/treeExpand_plus.gif corelib/dijit/themes/tundra/images/treeExpand_plus_rtl.gif corelib/dijit/themes/tundra/images/treeHover.png corelib/dijit/themes/tundra/images/validationInputBg.gif corelib/dijit/themes/tundra/images/validationInputBg.png corelib/dijit/themes/tundra/images/warning.png corelib/dijit/themes/tundra/layout/AccordionContainer.css corelib/dijit/themes/tundra/layout/BorderContainer.css corelib/dijit/themes/tundra/layout/ContentPane.css corelib/dijit/themes/tundra/layout/SplitContainer.css corelib/dijit/themes/tundra/layout/TabContainer.css corelib/dijit/themes/tundra/layout/TabContainer_rtl.css corelib/dijit/themes/tundra/tundra.css corelib/dijit/themes/tundra/tundra_rtl.css corelib/dijit/tree/ForestStoreModel.js corelib/dijit/tree/ObjectStoreModel.js corelib/dijit/tree/TreeStoreModel.js corelib/dijit/tree/_dndContainer.js corelib/dijit/tree/_dndSelector.js corelib/dijit/tree/dndSource.js corelib/dijit/tree/model.js corelib/dijit/typematic.js corelib/dojo/AdapterRegistry.js corelib/dojo/CONTRIBUTING.md corelib/dojo/Deferred.js corelib/dojo/DeferredList.js corelib/dojo/Evented.js corelib/dojo/LICENSE corelib/dojo/NodeList-data.js corelib/dojo/NodeList-dom.js corelib/dojo/NodeList-fx.js corelib/dojo/NodeList-html.js corelib/dojo/NodeList-manipulate.js corelib/dojo/NodeList-traverse.js corelib/dojo/NodeList.js corelib/dojo/OpenAjax.js corelib/dojo/README.md corelib/dojo/Stateful.js corelib/dojo/_base/Color.js corelib/dojo/_base/Deferred.js corelib/dojo/_base/NodeList.js corelib/dojo/_base/array.js corelib/dojo/_base/browser.js corelib/dojo/_base/config.js corelib/dojo/_base/configFirefoxExtension.js corelib/dojo/_base/configNode.js corelib/dojo/_base/configRhino.js corelib/dojo/_base/configSpidermonkey.js corelib/dojo/_base/connect.js corelib/dojo/_base/declare.js corelib/dojo/_base/event.js corelib/dojo/_base/fx.js corelib/dojo/_base/html.js corelib/dojo/_base/json.js corelib/dojo/_base/kernel.js corelib/dojo/_base/lang.js corelib/dojo/_base/loader.js corelib/dojo/_base/query.js corelib/dojo/_base/sniff.js corelib/dojo/_base/unload.js corelib/dojo/_base/url.js corelib/dojo/_base/window.js corelib/dojo/_base/xhr.js corelib/dojo/_firebug/firebug.js corelib/dojo/aspect.js corelib/dojo/back.js corelib/dojo/behavior.js corelib/dojo/bower.json corelib/dojo/cache.js corelib/dojo/cldr/LICENSE corelib/dojo/cldr/README corelib/dojo/cldr/monetary.js corelib/dojo/cldr/nls/ar/buddhist.js corelib/dojo/cldr/nls/ar/coptic.js corelib/dojo/cldr/nls/ar/currency.js corelib/dojo/cldr/nls/ar/ethiopic.js corelib/dojo/cldr/nls/ar/generic.js corelib/dojo/cldr/nls/ar/gregorian.js corelib/dojo/cldr/nls/ar/hebrew.js corelib/dojo/cldr/nls/ar/islamic.js corelib/dojo/cldr/nls/ar/japanese.js corelib/dojo/cldr/nls/ar/number.js corelib/dojo/cldr/nls/ar/persian.js corelib/dojo/cldr/nls/ar/roc.js corelib/dojo/cldr/nls/bs/currency.js corelib/dojo/cldr/nls/bs/generic.js corelib/dojo/cldr/nls/bs/gregorian.js corelib/dojo/cldr/nls/bs/islamic.js corelib/dojo/cldr/nls/bs/number.js corelib/dojo/cldr/nls/buddhist.js corelib/dojo/cldr/nls/ca/buddhist.js corelib/dojo/cldr/nls/ca/chinese.js corelib/dojo/cldr/nls/ca/currency.js corelib/dojo/cldr/nls/ca/generic.js corelib/dojo/cldr/nls/ca/gregorian.js corelib/dojo/cldr/nls/ca/number.js corelib/dojo/cldr/nls/ca/roc.js corelib/dojo/cldr/nls/chinese.js corelib/dojo/cldr/nls/coptic.js corelib/dojo/cldr/nls/cs/buddhist.js corelib/dojo/cldr/nls/cs/chinese.js corelib/dojo/cldr/nls/cs/currency.js corelib/dojo/cldr/nls/cs/generic.js corelib/dojo/cldr/nls/cs/gregorian.js corelib/dojo/cldr/nls/cs/hebrew.js corelib/dojo/cldr/nls/cs/islamic.js corelib/dojo/cldr/nls/cs/japanese.js corelib/dojo/cldr/nls/cs/number.js corelib/dojo/cldr/nls/cs/roc.js corelib/dojo/cldr/nls/currency.js corelib/dojo/cldr/nls/da/buddhist.js corelib/dojo/cldr/nls/da/currency.js corelib/dojo/cldr/nls/da/generic.js corelib/dojo/cldr/nls/da/gregorian.js corelib/dojo/cldr/nls/da/hebrew.js corelib/dojo/cldr/nls/da/islamic.js corelib/dojo/cldr/nls/da/japanese.js corelib/dojo/cldr/nls/da/number.js corelib/dojo/cldr/nls/da/roc.js corelib/dojo/cldr/nls/dangi.js corelib/dojo/cldr/nls/de/buddhist.js corelib/dojo/cldr/nls/de/chinese.js corelib/dojo/cldr/nls/de/currency.js corelib/dojo/cldr/nls/de/generic.js corelib/dojo/cldr/nls/de/gregorian.js corelib/dojo/cldr/nls/de/hebrew.js corelib/dojo/cldr/nls/de/islamic.js corelib/dojo/cldr/nls/de/japanese.js corelib/dojo/cldr/nls/de/number.js corelib/dojo/cldr/nls/de/roc.js corelib/dojo/cldr/nls/el/buddhist.js corelib/dojo/cldr/nls/el/currency.js corelib/dojo/cldr/nls/el/generic.js corelib/dojo/cldr/nls/el/gregorian.js corelib/dojo/cldr/nls/el/hebrew.js corelib/dojo/cldr/nls/el/japanese.js corelib/dojo/cldr/nls/el/number.js corelib/dojo/cldr/nls/el/roc.js corelib/dojo/cldr/nls/en-au/chinese.js corelib/dojo/cldr/nls/en-au/currency.js corelib/dojo/cldr/nls/en-au/generic.js corelib/dojo/cldr/nls/en-au/gregorian.js corelib/dojo/cldr/nls/en-au/islamic.js corelib/dojo/cldr/nls/en-au/japanese.js corelib/dojo/cldr/nls/en-au/number.js corelib/dojo/cldr/nls/en-ca/currency.js corelib/dojo/cldr/nls/en-ca/generic.js corelib/dojo/cldr/nls/en-ca/gregorian.js corelib/dojo/cldr/nls/en-gb/chinese.js corelib/dojo/cldr/nls/en-gb/currency.js corelib/dojo/cldr/nls/en-gb/generic.js corelib/dojo/cldr/nls/en-gb/gregorian.js corelib/dojo/cldr/nls/en-gb/indian.js corelib/dojo/cldr/nls/en-gb/islamic.js corelib/dojo/cldr/nls/en-gb/japanese.js corelib/dojo/cldr/nls/en/buddhist.js corelib/dojo/cldr/nls/en/chinese.js corelib/dojo/cldr/nls/en/currency.js corelib/dojo/cldr/nls/en/generic.js corelib/dojo/cldr/nls/en/gregorian.js corelib/dojo/cldr/nls/en/hebrew.js corelib/dojo/cldr/nls/en/islamic.js corelib/dojo/cldr/nls/en/japanese.js corelib/dojo/cldr/nls/en/number.js corelib/dojo/cldr/nls/en/roc.js corelib/dojo/cldr/nls/es-mx/currency.js corelib/dojo/cldr/nls/es-mx/generic.js corelib/dojo/cldr/nls/es-mx/gregorian.js corelib/dojo/cldr/nls/es-mx/number.js corelib/dojo/cldr/nls/es/buddhist.js corelib/dojo/cldr/nls/es/chinese.js corelib/dojo/cldr/nls/es/currency.js corelib/dojo/cldr/nls/es/generic.js corelib/dojo/cldr/nls/es/gregorian.js corelib/dojo/cldr/nls/es/hebrew.js corelib/dojo/cldr/nls/es/islamic.js corelib/dojo/cldr/nls/es/japanese.js corelib/dojo/cldr/nls/es/number.js corelib/dojo/cldr/nls/es/roc.js corelib/dojo/cldr/nls/et/chinese.js corelib/dojo/cldr/nls/et/currency.js corelib/dojo/cldr/nls/et/generic.js corelib/dojo/cldr/nls/et/gregorian.js corelib/dojo/cldr/nls/et/number.js corelib/dojo/cldr/nls/ethiopic-amete-alem.js corelib/dojo/cldr/nls/ethiopic.js corelib/dojo/cldr/nls/fi/buddhist.js corelib/dojo/cldr/nls/fi/chinese.js corelib/dojo/cldr/nls/fi/currency.js corelib/dojo/cldr/nls/fi/generic.js corelib/dojo/cldr/nls/fi/gregorian.js corelib/dojo/cldr/nls/fi/hebrew.js corelib/dojo/cldr/nls/fi/islamic.js corelib/dojo/cldr/nls/fi/japanese.js corelib/dojo/cldr/nls/fi/number.js corelib/dojo/cldr/nls/fi/roc.js corelib/dojo/cldr/nls/fr-ch/currency.js corelib/dojo/cldr/nls/fr-ch/generic.js corelib/dojo/cldr/nls/fr-ch/gregorian.js corelib/dojo/cldr/nls/fr-ch/number.js corelib/dojo/cldr/nls/fr/buddhist.js corelib/dojo/cldr/nls/fr/chinese.js corelib/dojo/cldr/nls/fr/coptic.js corelib/dojo/cldr/nls/fr/currency.js corelib/dojo/cldr/nls/fr/dangi.js corelib/dojo/cldr/nls/fr/ethiopic.js corelib/dojo/cldr/nls/fr/generic.js corelib/dojo/cldr/nls/fr/gregorian.js corelib/dojo/cldr/nls/fr/hebrew.js corelib/dojo/cldr/nls/fr/indian.js corelib/dojo/cldr/nls/fr/islamic.js corelib/dojo/cldr/nls/fr/japanese.js corelib/dojo/cldr/nls/fr/number.js corelib/dojo/cldr/nls/fr/persian.js corelib/dojo/cldr/nls/fr/roc.js corelib/dojo/cldr/nls/generic.js corelib/dojo/cldr/nls/gregorian.js corelib/dojo/cldr/nls/he/currency.js corelib/dojo/cldr/nls/he/generic.js corelib/dojo/cldr/nls/he/gregorian.js corelib/dojo/cldr/nls/he/hebrew.js corelib/dojo/cldr/nls/he/islamic.js corelib/dojo/cldr/nls/he/japanese.js corelib/dojo/cldr/nls/he/number.js corelib/dojo/cldr/nls/hebrew.js corelib/dojo/cldr/nls/hi/currency.js corelib/dojo/cldr/nls/hi/ethiopic.js corelib/dojo/cldr/nls/hi/generic.js corelib/dojo/cldr/nls/hi/gregorian.js corelib/dojo/cldr/nls/hi/indian.js corelib/dojo/cldr/nls/hi/islamic.js corelib/dojo/cldr/nls/hi/japanese.js corelib/dojo/cldr/nls/hi/number.js corelib/dojo/cldr/nls/hi/persian.js corelib/dojo/cldr/nls/hr/buddhist.js corelib/dojo/cldr/nls/hr/chinese.js corelib/dojo/cldr/nls/hr/currency.js corelib/dojo/cldr/nls/hr/generic.js corelib/dojo/cldr/nls/hr/gregorian.js corelib/dojo/cldr/nls/hr/hebrew.js corelib/dojo/cldr/nls/hr/islamic.js corelib/dojo/cldr/nls/hr/japanese.js corelib/dojo/cldr/nls/hr/number.js corelib/dojo/cldr/nls/hr/roc.js corelib/dojo/cldr/nls/hu/buddhist.js corelib/dojo/cldr/nls/hu/chinese.js corelib/dojo/cldr/nls/hu/coptic.js corelib/dojo/cldr/nls/hu/currency.js corelib/dojo/cldr/nls/hu/ethiopic.js corelib/dojo/cldr/nls/hu/generic.js corelib/dojo/cldr/nls/hu/gregorian.js corelib/dojo/cldr/nls/hu/hebrew.js corelib/dojo/cldr/nls/hu/indian.js corelib/dojo/cldr/nls/hu/islamic.js corelib/dojo/cldr/nls/hu/japanese.js corelib/dojo/cldr/nls/hu/number.js corelib/dojo/cldr/nls/hu/persian.js corelib/dojo/cldr/nls/hu/roc.js corelib/dojo/cldr/nls/id/buddhist.js corelib/dojo/cldr/nls/id/chinese.js corelib/dojo/cldr/nls/id/coptic.js corelib/dojo/cldr/nls/id/currency.js corelib/dojo/cldr/nls/id/ethiopic.js corelib/dojo/cldr/nls/id/generic.js corelib/dojo/cldr/nls/id/gregorian.js corelib/dojo/cldr/nls/id/hebrew.js corelib/dojo/cldr/nls/id/indian.js corelib/dojo/cldr/nls/id/islamic.js corelib/dojo/cldr/nls/id/japanese.js corelib/dojo/cldr/nls/id/number.js corelib/dojo/cldr/nls/id/persian.js corelib/dojo/cldr/nls/id/roc.js corelib/dojo/cldr/nls/indian.js corelib/dojo/cldr/nls/islamic-civil.js corelib/dojo/cldr/nls/islamic-rgsa.js corelib/dojo/cldr/nls/islamic-tbla.js corelib/dojo/cldr/nls/islamic-umalqura.js corelib/dojo/cldr/nls/islamic.js corelib/dojo/cldr/nls/it/buddhist.js corelib/dojo/cldr/nls/it/chinese.js corelib/dojo/cldr/nls/it/currency.js corelib/dojo/cldr/nls/it/generic.js corelib/dojo/cldr/nls/it/gregorian.js corelib/dojo/cldr/nls/it/hebrew.js corelib/dojo/cldr/nls/it/islamic.js corelib/dojo/cldr/nls/it/japanese.js corelib/dojo/cldr/nls/it/number.js corelib/dojo/cldr/nls/it/roc.js corelib/dojo/cldr/nls/ja/buddhist.js corelib/dojo/cldr/nls/ja/chinese.js corelib/dojo/cldr/nls/ja/coptic.js corelib/dojo/cldr/nls/ja/currency.js corelib/dojo/cldr/nls/ja/dangi.js corelib/dojo/cldr/nls/ja/ethiopic.js corelib/dojo/cldr/nls/ja/generic.js corelib/dojo/cldr/nls/ja/gregorian.js corelib/dojo/cldr/nls/ja/hebrew.js corelib/dojo/cldr/nls/ja/indian.js corelib/dojo/cldr/nls/ja/islamic.js corelib/dojo/cldr/nls/ja/japanese.js corelib/dojo/cldr/nls/ja/number.js corelib/dojo/cldr/nls/ja/persian.js corelib/dojo/cldr/nls/ja/roc.js corelib/dojo/cldr/nls/japanese.js corelib/dojo/cldr/nls/ko/buddhist.js corelib/dojo/cldr/nls/ko/chinese.js corelib/dojo/cldr/nls/ko/coptic.js corelib/dojo/cldr/nls/ko/currency.js corelib/dojo/cldr/nls/ko/dangi.js corelib/dojo/cldr/nls/ko/ethiopic.js corelib/dojo/cldr/nls/ko/generic.js corelib/dojo/cldr/nls/ko/gregorian.js corelib/dojo/cldr/nls/ko/hebrew.js corelib/dojo/cldr/nls/ko/islamic.js corelib/dojo/cldr/nls/ko/japanese.js corelib/dojo/cldr/nls/ko/number.js corelib/dojo/cldr/nls/ko/roc.js corelib/dojo/cldr/nls/lt/buddhist.js corelib/dojo/cldr/nls/lt/chinese.js corelib/dojo/cldr/nls/lt/coptic.js corelib/dojo/cldr/nls/lt/currency.js corelib/dojo/cldr/nls/lt/dangi.js corelib/dojo/cldr/nls/lt/ethiopic-amete-alem.js corelib/dojo/cldr/nls/lt/ethiopic.js corelib/dojo/cldr/nls/lt/generic.js corelib/dojo/cldr/nls/lt/gregorian.js corelib/dojo/cldr/nls/lt/hebrew.js corelib/dojo/cldr/nls/lt/indian.js corelib/dojo/cldr/nls/lt/islamic.js corelib/dojo/cldr/nls/lt/japanese.js corelib/dojo/cldr/nls/lt/number.js corelib/dojo/cldr/nls/lt/persian.js corelib/dojo/cldr/nls/lt/roc.js corelib/dojo/cldr/nls/lv/currency.js corelib/dojo/cldr/nls/lv/generic.js corelib/dojo/cldr/nls/lv/gregorian.js corelib/dojo/cldr/nls/lv/hebrew.js corelib/dojo/cldr/nls/lv/islamic.js corelib/dojo/cldr/nls/lv/number.js corelib/dojo/cldr/nls/mk/currency.js corelib/dojo/cldr/nls/mk/generic.js corelib/dojo/cldr/nls/mk/gregorian.js corelib/dojo/cldr/nls/mk/number.js corelib/dojo/cldr/nls/nb/buddhist.js corelib/dojo/cldr/nls/nb/currency.js corelib/dojo/cldr/nls/nb/generic.js corelib/dojo/cldr/nls/nb/gregorian.js corelib/dojo/cldr/nls/nb/hebrew.js corelib/dojo/cldr/nls/nb/islamic.js corelib/dojo/cldr/nls/nb/japanese.js corelib/dojo/cldr/nls/nb/number.js corelib/dojo/cldr/nls/nb/roc.js corelib/dojo/cldr/nls/nl/buddhist.js corelib/dojo/cldr/nls/nl/chinese.js corelib/dojo/cldr/nls/nl/coptic.js corelib/dojo/cldr/nls/nl/currency.js corelib/dojo/cldr/nls/nl/dangi.js corelib/dojo/cldr/nls/nl/ethiopic.js corelib/dojo/cldr/nls/nl/generic.js corelib/dojo/cldr/nls/nl/gregorian.js corelib/dojo/cldr/nls/nl/hebrew.js corelib/dojo/cldr/nls/nl/indian.js corelib/dojo/cldr/nls/nl/islamic.js corelib/dojo/cldr/nls/nl/japanese.js corelib/dojo/cldr/nls/nl/number.js corelib/dojo/cldr/nls/nl/persian.js corelib/dojo/cldr/nls/nl/roc.js corelib/dojo/cldr/nls/number.js corelib/dojo/cldr/nls/persian.js corelib/dojo/cldr/nls/pl/buddhist.js corelib/dojo/cldr/nls/pl/chinese.js corelib/dojo/cldr/nls/pl/coptic.js corelib/dojo/cldr/nls/pl/currency.js corelib/dojo/cldr/nls/pl/ethiopic.js corelib/dojo/cldr/nls/pl/generic.js corelib/dojo/cldr/nls/pl/gregorian.js corelib/dojo/cldr/nls/pl/hebrew.js corelib/dojo/cldr/nls/pl/indian.js corelib/dojo/cldr/nls/pl/islamic.js corelib/dojo/cldr/nls/pl/japanese.js corelib/dojo/cldr/nls/pl/number.js corelib/dojo/cldr/nls/pl/persian.js corelib/dojo/cldr/nls/pl/roc.js corelib/dojo/cldr/nls/pt-pt/buddhist.js corelib/dojo/cldr/nls/pt-pt/chinese.js corelib/dojo/cldr/nls/pt-pt/currency.js corelib/dojo/cldr/nls/pt-pt/generic.js corelib/dojo/cldr/nls/pt-pt/gregorian.js corelib/dojo/cldr/nls/pt-pt/hebrew.js corelib/dojo/cldr/nls/pt-pt/islamic.js corelib/dojo/cldr/nls/pt-pt/japanese.js corelib/dojo/cldr/nls/pt-pt/number.js corelib/dojo/cldr/nls/pt-pt/roc.js corelib/dojo/cldr/nls/pt/buddhist.js corelib/dojo/cldr/nls/pt/chinese.js corelib/dojo/cldr/nls/pt/coptic.js corelib/dojo/cldr/nls/pt/currency.js corelib/dojo/cldr/nls/pt/ethiopic.js corelib/dojo/cldr/nls/pt/generic.js corelib/dojo/cldr/nls/pt/gregorian.js corelib/dojo/cldr/nls/pt/hebrew.js corelib/dojo/cldr/nls/pt/indian.js corelib/dojo/cldr/nls/pt/islamic.js corelib/dojo/cldr/nls/pt/japanese.js corelib/dojo/cldr/nls/pt/number.js corelib/dojo/cldr/nls/pt/persian.js corelib/dojo/cldr/nls/pt/roc.js corelib/dojo/cldr/nls/ro/buddhist.js corelib/dojo/cldr/nls/ro/chinese.js corelib/dojo/cldr/nls/ro/coptic.js corelib/dojo/cldr/nls/ro/currency.js corelib/dojo/cldr/nls/ro/ethiopic.js corelib/dojo/cldr/nls/ro/generic.js corelib/dojo/cldr/nls/ro/gregorian.js corelib/dojo/cldr/nls/ro/hebrew.js corelib/dojo/cldr/nls/ro/islamic.js corelib/dojo/cldr/nls/ro/number.js corelib/dojo/cldr/nls/roc.js corelib/dojo/cldr/nls/ru/buddhist.js corelib/dojo/cldr/nls/ru/chinese.js corelib/dojo/cldr/nls/ru/coptic.js corelib/dojo/cldr/nls/ru/currency.js corelib/dojo/cldr/nls/ru/ethiopic.js corelib/dojo/cldr/nls/ru/generic.js corelib/dojo/cldr/nls/ru/gregorian.js corelib/dojo/cldr/nls/ru/hebrew.js corelib/dojo/cldr/nls/ru/indian.js corelib/dojo/cldr/nls/ru/islamic.js corelib/dojo/cldr/nls/ru/japanese.js corelib/dojo/cldr/nls/ru/number.js corelib/dojo/cldr/nls/ru/persian.js corelib/dojo/cldr/nls/ru/roc.js corelib/dojo/cldr/nls/sk/currency.js corelib/dojo/cldr/nls/sk/generic.js corelib/dojo/cldr/nls/sk/gregorian.js corelib/dojo/cldr/nls/sk/number.js corelib/dojo/cldr/nls/sl/currency.js corelib/dojo/cldr/nls/sl/generic.js corelib/dojo/cldr/nls/sl/gregorian.js corelib/dojo/cldr/nls/sl/number.js corelib/dojo/cldr/nls/sr/buddhist.js corelib/dojo/cldr/nls/sr/coptic.js corelib/dojo/cldr/nls/sr/currency.js corelib/dojo/cldr/nls/sr/ethiopic.js corelib/dojo/cldr/nls/sr/generic.js corelib/dojo/cldr/nls/sr/gregorian.js corelib/dojo/cldr/nls/sr/hebrew.js corelib/dojo/cldr/nls/sr/indian.js corelib/dojo/cldr/nls/sr/islamic.js corelib/dojo/cldr/nls/sr/japanese.js corelib/dojo/cldr/nls/sr/number.js corelib/dojo/cldr/nls/sr/persian.js corelib/dojo/cldr/nls/sr/roc.js corelib/dojo/cldr/nls/sv/buddhist.js corelib/dojo/cldr/nls/sv/coptic.js corelib/dojo/cldr/nls/sv/currency.js corelib/dojo/cldr/nls/sv/dangi.js corelib/dojo/cldr/nls/sv/ethiopic.js corelib/dojo/cldr/nls/sv/generic.js corelib/dojo/cldr/nls/sv/gregorian.js corelib/dojo/cldr/nls/sv/hebrew.js corelib/dojo/cldr/nls/sv/indian.js corelib/dojo/cldr/nls/sv/islamic.js corelib/dojo/cldr/nls/sv/japanese.js corelib/dojo/cldr/nls/sv/number.js corelib/dojo/cldr/nls/sv/persian.js corelib/dojo/cldr/nls/sv/roc.js corelib/dojo/cldr/nls/th/buddhist.js corelib/dojo/cldr/nls/th/chinese.js corelib/dojo/cldr/nls/th/coptic.js corelib/dojo/cldr/nls/th/currency.js corelib/dojo/cldr/nls/th/dangi.js corelib/dojo/cldr/nls/th/ethiopic.js corelib/dojo/cldr/nls/th/generic.js corelib/dojo/cldr/nls/th/gregorian.js corelib/dojo/cldr/nls/th/hebrew.js corelib/dojo/cldr/nls/th/indian.js corelib/dojo/cldr/nls/th/islamic.js corelib/dojo/cldr/nls/th/japanese.js corelib/dojo/cldr/nls/th/number.js corelib/dojo/cldr/nls/th/persian.js corelib/dojo/cldr/nls/th/roc.js corelib/dojo/cldr/nls/tr/buddhist.js corelib/dojo/cldr/nls/tr/coptic.js corelib/dojo/cldr/nls/tr/currency.js corelib/dojo/cldr/nls/tr/ethiopic.js corelib/dojo/cldr/nls/tr/generic.js corelib/dojo/cldr/nls/tr/gregorian.js corelib/dojo/cldr/nls/tr/hebrew.js corelib/dojo/cldr/nls/tr/islamic.js corelib/dojo/cldr/nls/tr/japanese.js corelib/dojo/cldr/nls/tr/number.js corelib/dojo/cldr/nls/tr/persian.js corelib/dojo/cldr/nls/tr/roc.js corelib/dojo/cldr/nls/vi/buddhist.js corelib/dojo/cldr/nls/vi/chinese.js corelib/dojo/cldr/nls/vi/coptic.js corelib/dojo/cldr/nls/vi/currency.js corelib/dojo/cldr/nls/vi/ethiopic.js corelib/dojo/cldr/nls/vi/generic.js corelib/dojo/cldr/nls/vi/gregorian.js corelib/dojo/cldr/nls/vi/hebrew.js corelib/dojo/cldr/nls/vi/indian.js corelib/dojo/cldr/nls/vi/islamic.js corelib/dojo/cldr/nls/vi/japanese.js corelib/dojo/cldr/nls/vi/number.js corelib/dojo/cldr/nls/vi/persian.js corelib/dojo/cldr/nls/vi/roc.js corelib/dojo/cldr/nls/zh-hant/buddhist.js corelib/dojo/cldr/nls/zh-hant/chinese.js corelib/dojo/cldr/nls/zh-hant/coptic.js corelib/dojo/cldr/nls/zh-hant/currency.js corelib/dojo/cldr/nls/zh-hant/dangi.js corelib/dojo/cldr/nls/zh-hant/ethiopic.js corelib/dojo/cldr/nls/zh-hant/generic.js corelib/dojo/cldr/nls/zh-hant/gregorian.js corelib/dojo/cldr/nls/zh-hant/hebrew.js corelib/dojo/cldr/nls/zh-hant/indian.js corelib/dojo/cldr/nls/zh-hant/islamic.js corelib/dojo/cldr/nls/zh-hant/japanese.js corelib/dojo/cldr/nls/zh-hant/number.js corelib/dojo/cldr/nls/zh-hant/persian.js corelib/dojo/cldr/nls/zh-hant/roc.js corelib/dojo/cldr/nls/zh-hk/currency.js corelib/dojo/cldr/nls/zh-hk/gregorian.js corelib/dojo/cldr/nls/zh-hk/number.js corelib/dojo/cldr/nls/zh-tw/currency.js corelib/dojo/cldr/nls/zh-tw/gregorian.js corelib/dojo/cldr/nls/zh-tw/number.js corelib/dojo/cldr/nls/zh/buddhist.js corelib/dojo/cldr/nls/zh/chinese.js corelib/dojo/cldr/nls/zh/coptic.js corelib/dojo/cldr/nls/zh/currency.js corelib/dojo/cldr/nls/zh/ethiopic.js corelib/dojo/cldr/nls/zh/generic.js corelib/dojo/cldr/nls/zh/gregorian.js corelib/dojo/cldr/nls/zh/hebrew.js corelib/dojo/cldr/nls/zh/indian.js corelib/dojo/cldr/nls/zh/islamic.js corelib/dojo/cldr/nls/zh/japanese.js corelib/dojo/cldr/nls/zh/number.js corelib/dojo/cldr/nls/zh/persian.js corelib/dojo/cldr/nls/zh/roc.js corelib/dojo/cldr/supplemental.js corelib/dojo/colors.js corelib/dojo/cookie.js corelib/dojo/currency.js corelib/dojo/data/ItemFileReadStore.js corelib/dojo/data/ItemFileWriteStore.js corelib/dojo/data/ObjectStore.js corelib/dojo/data/api/Identity.js corelib/dojo/data/api/Item.js corelib/dojo/data/api/Notification.js corelib/dojo/data/api/Read.js corelib/dojo/data/api/Request.js corelib/dojo/data/api/Write.js corelib/dojo/data/util/filter.js corelib/dojo/data/util/simpleFetch.js corelib/dojo/data/util/sorter.js corelib/dojo/date.js corelib/dojo/date/locale.js corelib/dojo/date/stamp.js corelib/dojo/debounce.js corelib/dojo/dnd/AutoSource.js corelib/dojo/dnd/Avatar.js corelib/dojo/dnd/Container.js corelib/dojo/dnd/Manager.js corelib/dojo/dnd/Moveable.js corelib/dojo/dnd/Mover.js corelib/dojo/dnd/Selector.js corelib/dojo/dnd/Source.js corelib/dojo/dnd/Target.js corelib/dojo/dnd/TimedMoveable.js corelib/dojo/dnd/autoscroll.js corelib/dojo/dnd/common.js corelib/dojo/dnd/move.js corelib/dojo/dojo-lite.js corelib/dojo/dojo.js corelib/dojo/dojo.profile.js corelib/dojo/dom-attr.js corelib/dojo/dom-class.js corelib/dojo/dom-construct.js corelib/dojo/dom-form.js corelib/dojo/dom-geometry.js corelib/dojo/dom-prop.js corelib/dojo/dom-style.js corelib/dojo/dom.js corelib/dojo/domReady.js corelib/dojo/errors/CancelError.js corelib/dojo/errors/RequestError.js corelib/dojo/errors/RequestTimeoutError.js corelib/dojo/errors/create.js corelib/dojo/fx.js corelib/dojo/fx/Toggler.js corelib/dojo/fx/easing.js corelib/dojo/gears.js corelib/dojo/global.js corelib/dojo/has.js corelib/dojo/hash.js corelib/dojo/hccss.js corelib/dojo/html.js corelib/dojo/i18n.js corelib/dojo/io-query.js corelib/dojo/io/iframe.js corelib/dojo/io/script.js corelib/dojo/jquery.js corelib/dojo/json.js corelib/dojo/keys.js corelib/dojo/loadInit.js corelib/dojo/main.js corelib/dojo/mouse.js corelib/dojo/nls/ar/colors.js corelib/dojo/nls/az/colors.js corelib/dojo/nls/bg/colors.js corelib/dojo/nls/bs/colors.js corelib/dojo/nls/ca/colors.js corelib/dojo/nls/colors.js corelib/dojo/nls/cs/colors.js corelib/dojo/nls/da/colors.js corelib/dojo/nls/de/colors.js corelib/dojo/nls/dojo_ROOT.js corelib/dojo/nls/dojo_ar.js corelib/dojo/nls/dojo_ca.js corelib/dojo/nls/dojo_cs.js corelib/dojo/nls/dojo_da.js corelib/dojo/nls/dojo_de.js corelib/dojo/nls/dojo_el.js corelib/dojo/nls/dojo_en-gb.js corelib/dojo/nls/dojo_en-us.js corelib/dojo/nls/dojo_es-es.js corelib/dojo/nls/dojo_fi-fi.js corelib/dojo/nls/dojo_fr-fr.js corelib/dojo/nls/dojo_he-il.js corelib/dojo/nls/dojo_hu.js corelib/dojo/nls/dojo_it-it.js corelib/dojo/nls/dojo_ja-jp.js corelib/dojo/nls/dojo_ko-kr.js corelib/dojo/nls/dojo_nb.js corelib/dojo/nls/dojo_nl-nl.js corelib/dojo/nls/dojo_pl.js corelib/dojo/nls/dojo_pt-br.js corelib/dojo/nls/dojo_pt-pt.js corelib/dojo/nls/dojo_ru.js corelib/dojo/nls/dojo_sk.js corelib/dojo/nls/dojo_sl.js corelib/dojo/nls/dojo_sv.js corelib/dojo/nls/dojo_th.js corelib/dojo/nls/dojo_tr.js corelib/dojo/nls/dojo_zh-cn.js corelib/dojo/nls/dojo_zh-tw.js corelib/dojo/nls/el/colors.js corelib/dojo/nls/es/colors.js corelib/dojo/nls/et/colors.js corelib/dojo/nls/eu/colors.js corelib/dojo/nls/fi/colors.js corelib/dojo/nls/fr/colors.js corelib/dojo/nls/he/colors.js corelib/dojo/nls/hi/colors.js corelib/dojo/nls/hr/colors.js corelib/dojo/nls/hu/colors.js corelib/dojo/nls/id/colors.js corelib/dojo/nls/it/colors.js corelib/dojo/nls/ja/colors.js corelib/dojo/nls/kk/colors.js corelib/dojo/nls/ko/colors.js corelib/dojo/nls/lt/colors.js corelib/dojo/nls/lv/colors.js corelib/dojo/nls/mk/colors.js corelib/dojo/nls/nb/colors.js corelib/dojo/nls/nl/colors.js corelib/dojo/nls/pl/colors.js corelib/dojo/nls/pt-pt/colors.js corelib/dojo/nls/pt/colors.js corelib/dojo/nls/ro/colors.js corelib/dojo/nls/ru/colors.js corelib/dojo/nls/sk/colors.js corelib/dojo/nls/sl/colors.js corelib/dojo/nls/sr/colors.js corelib/dojo/nls/sv/colors.js corelib/dojo/nls/th/colors.js corelib/dojo/nls/tr/colors.js corelib/dojo/nls/uk/colors.js corelib/dojo/nls/vi/colors.js corelib/dojo/nls/zh-hk/colors.js corelib/dojo/nls/zh-tw/colors.js corelib/dojo/nls/zh/colors.js corelib/dojo/node.js corelib/dojo/number.js corelib/dojo/on.js corelib/dojo/on/asyncEventListener.js corelib/dojo/on/debounce.js corelib/dojo/on/throttle.js corelib/dojo/package.json corelib/dojo/parser.js corelib/dojo/promise/Promise.js corelib/dojo/promise/all.js corelib/dojo/promise/first.js corelib/dojo/promise/instrumentation.js corelib/dojo/promise/tracer.js corelib/dojo/query.js corelib/dojo/ready.js corelib/dojo/regexp.js corelib/dojo/request.js corelib/dojo/request/default.js corelib/dojo/request/handlers.js corelib/dojo/request/iframe.js corelib/dojo/request/node.js corelib/dojo/request/notify.js corelib/dojo/request/registry.js corelib/dojo/request/script.js corelib/dojo/request/util.js corelib/dojo/request/watch.js corelib/dojo/request/xhr.js corelib/dojo/require.js corelib/dojo/resources/LICENSE corelib/dojo/resources/blank.gif corelib/dojo/resources/blank.html corelib/dojo/resources/dnd.css corelib/dojo/resources/dojo.css corelib/dojo/resources/iframe_history.html corelib/dojo/resources/images/dndCopy.png corelib/dojo/resources/images/dndMove.png corelib/dojo/resources/images/dndNoCopy.png corelib/dojo/resources/images/dndNoMove.png corelib/dojo/router.js corelib/dojo/router/RouterBase.js corelib/dojo/rpc/JsonService.js corelib/dojo/rpc/JsonpService.js corelib/dojo/rpc/RpcService.js corelib/dojo/selector/_loader.js corelib/dojo/selector/acme.js corelib/dojo/selector/lite.js corelib/dojo/sniff.js corelib/dojo/store/Cache.js corelib/dojo/store/DataStore.js corelib/dojo/store/JsonRest.js corelib/dojo/store/Memory.js corelib/dojo/store/Observable.js corelib/dojo/store/README corelib/dojo/store/api/Store.js corelib/dojo/store/util/QueryResults.js corelib/dojo/store/util/SimpleQueryEngine.js corelib/dojo/string.js corelib/dojo/tests.js corelib/dojo/text.js corelib/dojo/throttle.js corelib/dojo/topic.js corelib/dojo/touch.js corelib/dojo/uacss.js corelib/dojo/when.js corelib/dojo/window.js corelib/dojox/CONTRIBUTING.md corelib/dojox/LICENSE corelib/dojox/NodeList/README corelib/dojox/NodeList/delegate.js corelib/dojox/README.md corelib/dojox/analytics.js corelib/dojox/analytics/README corelib/dojox/analytics/Urchin.js corelib/dojox/analytics/_base.js corelib/dojox/analytics/logger/JSON.php corelib/dojox/analytics/logger/dojoxAnalytics.php corelib/dojox/analytics/plugins/consoleMessages.js corelib/dojox/analytics/plugins/dojo.js corelib/dojox/analytics/plugins/gestureEvents.js corelib/dojox/analytics/plugins/idle.js corelib/dojox/analytics/plugins/mouseClick.js corelib/dojox/analytics/plugins/mouseOver.js corelib/dojox/analytics/plugins/touchMove.js corelib/dojox/analytics/plugins/touchPress.js corelib/dojox/analytics/plugins/window.js corelib/dojox/analytics/profiles/analytics.profile.js corelib/dojox/analytics/profiles/analyticsInBase.profile.js corelib/dojox/app/CONTRIBUTING.md corelib/dojox/app/Controller.js corelib/dojox/app/LICENSE corelib/dojox/app/README.txt corelib/dojox/app/View.js corelib/dojox/app/ViewBase.js corelib/dojox/app/build/buildControlApp.js corelib/dojox/app/build/discoverAppConfig.js corelib/dojox/app/controllers/BorderLayout.js corelib/dojox/app/controllers/History.js corelib/dojox/app/controllers/HistoryHash.js corelib/dojox/app/controllers/Layout.js corelib/dojox/app/controllers/LayoutBase.js corelib/dojox/app/controllers/Load.js corelib/dojox/app/controllers/Transition.js corelib/dojox/app/main.js corelib/dojox/app/module/env.js corelib/dojox/app/module/lifecycle.js corelib/dojox/app/schema/README corelib/dojox/app/schema/application.json corelib/dojox/app/schema/model.json corelib/dojox/app/schema/scene.json corelib/dojox/app/schema/store.json corelib/dojox/app/schema/view.json corelib/dojox/app/utils/config.js corelib/dojox/app/utils/constraints.js corelib/dojox/app/utils/hash.js corelib/dojox/app/utils/layout.js corelib/dojox/app/utils/model.js corelib/dojox/app/utils/mvcModel.js corelib/dojox/app/utils/nls.js corelib/dojox/app/utils/simpleModel.js corelib/dojox/app/widgets/Container.js corelib/dojox/app/widgets/_ScrollableMixin.js corelib/dojox/atom/README corelib/dojox/atom/io/Connection.js corelib/dojox/atom/io/model.js corelib/dojox/atom/widget/FeedEntryEditor.js corelib/dojox/atom/widget/FeedEntryViewer.js corelib/dojox/atom/widget/FeedViewer.js corelib/dojox/atom/widget/nls/FeedEntryEditor.js corelib/dojox/atom/widget/nls/FeedEntryViewer.js corelib/dojox/atom/widget/nls/FeedViewerEntry.js corelib/dojox/atom/widget/nls/PeopleEditor.js corelib/dojox/atom/widget/nls/ar/FeedEntryEditor.js corelib/dojox/atom/widget/nls/ar/FeedEntryViewer.js corelib/dojox/atom/widget/nls/ar/FeedViewerEntry.js corelib/dojox/atom/widget/nls/ar/PeopleEditor.js corelib/dojox/atom/widget/nls/az/FeedEntryEditor.js corelib/dojox/atom/widget/nls/az/FeedEntryViewer.js corelib/dojox/atom/widget/nls/az/FeedViewerEntry.js corelib/dojox/atom/widget/nls/az/PeopleEditor.js corelib/dojox/atom/widget/nls/bg/FeedEntryEditor.js corelib/dojox/atom/widget/nls/bg/FeedEntryViewer.js corelib/dojox/atom/widget/nls/bg/FeedViewerEntry.js corelib/dojox/atom/widget/nls/bg/PeopleEditor.js corelib/dojox/atom/widget/nls/bs/FeedEntryEditor.js corelib/dojox/atom/widget/nls/bs/FeedEntryViewer.js corelib/dojox/atom/widget/nls/bs/FeedViewerEntry.js corelib/dojox/atom/widget/nls/bs/PeopleEditor.js corelib/dojox/atom/widget/nls/ca/FeedEntryEditor.js corelib/dojox/atom/widget/nls/ca/FeedEntryViewer.js corelib/dojox/atom/widget/nls/ca/FeedViewerEntry.js corelib/dojox/atom/widget/nls/ca/PeopleEditor.js corelib/dojox/atom/widget/nls/cs/FeedEntryEditor.js corelib/dojox/atom/widget/nls/cs/FeedEntryViewer.js corelib/dojox/atom/widget/nls/cs/FeedViewerEntry.js corelib/dojox/atom/widget/nls/cs/PeopleEditor.js corelib/dojox/atom/widget/nls/da/FeedEntryEditor.js corelib/dojox/atom/widget/nls/da/FeedEntryViewer.js corelib/dojox/atom/widget/nls/da/FeedViewerEntry.js corelib/dojox/atom/widget/nls/da/PeopleEditor.js corelib/dojox/atom/widget/nls/de/FeedEntryEditor.js corelib/dojox/atom/widget/nls/de/FeedEntryViewer.js corelib/dojox/atom/widget/nls/de/FeedViewerEntry.js corelib/dojox/atom/widget/nls/de/PeopleEditor.js corelib/dojox/atom/widget/nls/el/FeedEntryEditor.js corelib/dojox/atom/widget/nls/el/FeedEntryViewer.js corelib/dojox/atom/widget/nls/el/FeedViewerEntry.js corelib/dojox/atom/widget/nls/el/PeopleEditor.js corelib/dojox/atom/widget/nls/es/FeedEntryEditor.js corelib/dojox/atom/widget/nls/es/FeedEntryViewer.js corelib/dojox/atom/widget/nls/es/FeedViewerEntry.js corelib/dojox/atom/widget/nls/es/PeopleEditor.js corelib/dojox/atom/widget/nls/eu/FeedEntryEditor.js corelib/dojox/atom/widget/nls/eu/FeedEntryViewer.js corelib/dojox/atom/widget/nls/eu/FeedViewerEntry.js corelib/dojox/atom/widget/nls/eu/PeopleEditor.js corelib/dojox/atom/widget/nls/fi/FeedEntryEditor.js corelib/dojox/atom/widget/nls/fi/FeedEntryViewer.js corelib/dojox/atom/widget/nls/fi/FeedViewerEntry.js corelib/dojox/atom/widget/nls/fi/PeopleEditor.js corelib/dojox/atom/widget/nls/fr/FeedEntryEditor.js corelib/dojox/atom/widget/nls/fr/FeedEntryViewer.js corelib/dojox/atom/widget/nls/fr/FeedViewerEntry.js corelib/dojox/atom/widget/nls/fr/PeopleEditor.js corelib/dojox/atom/widget/nls/he/FeedEntryEditor.js corelib/dojox/atom/widget/nls/he/FeedEntryViewer.js corelib/dojox/atom/widget/nls/he/FeedViewerEntry.js corelib/dojox/atom/widget/nls/he/PeopleEditor.js corelib/dojox/atom/widget/nls/hi/FeedEntryEditor.js corelib/dojox/atom/widget/nls/hi/FeedEntryViewer.js corelib/dojox/atom/widget/nls/hi/FeedViewerEntry.js corelib/dojox/atom/widget/nls/hi/PeopleEditor.js corelib/dojox/atom/widget/nls/hr/FeedEntryEditor.js corelib/dojox/atom/widget/nls/hr/FeedEntryViewer.js corelib/dojox/atom/widget/nls/hr/FeedViewerEntry.js corelib/dojox/atom/widget/nls/hr/PeopleEditor.js corelib/dojox/atom/widget/nls/hu/FeedEntryEditor.js corelib/dojox/atom/widget/nls/hu/FeedEntryViewer.js corelib/dojox/atom/widget/nls/hu/FeedViewerEntry.js corelib/dojox/atom/widget/nls/hu/PeopleEditor.js corelib/dojox/atom/widget/nls/id/FeedEntryEditor.js corelib/dojox/atom/widget/nls/id/FeedEntryViewer.js corelib/dojox/atom/widget/nls/id/FeedViewerEntry.js corelib/dojox/atom/widget/nls/id/PeopleEditor.js corelib/dojox/atom/widget/nls/it/FeedEntryEditor.js corelib/dojox/atom/widget/nls/it/FeedEntryViewer.js corelib/dojox/atom/widget/nls/it/FeedViewerEntry.js corelib/dojox/atom/widget/nls/it/PeopleEditor.js corelib/dojox/atom/widget/nls/ja/FeedEntryEditor.js corelib/dojox/atom/widget/nls/ja/FeedEntryViewer.js corelib/dojox/atom/widget/nls/ja/FeedViewerEntry.js corelib/dojox/atom/widget/nls/ja/PeopleEditor.js corelib/dojox/atom/widget/nls/kk/FeedEntryEditor.js corelib/dojox/atom/widget/nls/kk/FeedEntryViewer.js corelib/dojox/atom/widget/nls/kk/FeedViewerEntry.js corelib/dojox/atom/widget/nls/kk/PeopleEditor.js corelib/dojox/atom/widget/nls/ko/FeedEntryEditor.js corelib/dojox/atom/widget/nls/ko/FeedEntryViewer.js corelib/dojox/atom/widget/nls/ko/FeedViewerEntry.js corelib/dojox/atom/widget/nls/ko/PeopleEditor.js corelib/dojox/atom/widget/nls/mk/FeedEntryEditor.js corelib/dojox/atom/widget/nls/mk/FeedEntryViewer.js corelib/dojox/atom/widget/nls/mk/FeedViewerEntry.js corelib/dojox/atom/widget/nls/mk/PeopleEditor.js corelib/dojox/atom/widget/nls/nb/FeedEntryEditor.js corelib/dojox/atom/widget/nls/nb/FeedEntryViewer.js corelib/dojox/atom/widget/nls/nb/FeedViewerEntry.js corelib/dojox/atom/widget/nls/nb/PeopleEditor.js corelib/dojox/atom/widget/nls/nl/FeedEntryEditor.js corelib/dojox/atom/widget/nls/nl/FeedEntryViewer.js corelib/dojox/atom/widget/nls/nl/FeedViewerEntry.js corelib/dojox/atom/widget/nls/nl/PeopleEditor.js corelib/dojox/atom/widget/nls/pl/FeedEntryEditor.js corelib/dojox/atom/widget/nls/pl/FeedEntryViewer.js corelib/dojox/atom/widget/nls/pl/FeedViewerEntry.js corelib/dojox/atom/widget/nls/pl/PeopleEditor.js corelib/dojox/atom/widget/nls/pt-pt/FeedEntryEditor.js corelib/dojox/atom/widget/nls/pt-pt/FeedEntryViewer.js corelib/dojox/atom/widget/nls/pt-pt/FeedViewerEntry.js corelib/dojox/atom/widget/nls/pt-pt/PeopleEditor.js corelib/dojox/atom/widget/nls/pt/FeedEntryEditor.js corelib/dojox/atom/widget/nls/pt/FeedEntryViewer.js corelib/dojox/atom/widget/nls/pt/FeedViewerEntry.js corelib/dojox/atom/widget/nls/pt/PeopleEditor.js corelib/dojox/atom/widget/nls/ro/FeedEntryEditor.js corelib/dojox/atom/widget/nls/ro/FeedEntryViewer.js corelib/dojox/atom/widget/nls/ro/FeedViewerEntry.js corelib/dojox/atom/widget/nls/ro/PeopleEditor.js corelib/dojox/atom/widget/nls/ru/FeedEntryEditor.js corelib/dojox/atom/widget/nls/ru/FeedEntryViewer.js corelib/dojox/atom/widget/nls/ru/FeedViewerEntry.js corelib/dojox/atom/widget/nls/ru/PeopleEditor.js corelib/dojox/atom/widget/nls/sk/FeedEntryEditor.js corelib/dojox/atom/widget/nls/sk/FeedEntryViewer.js corelib/dojox/atom/widget/nls/sk/FeedViewerEntry.js corelib/dojox/atom/widget/nls/sk/PeopleEditor.js corelib/dojox/atom/widget/nls/sl/FeedEntryEditor.js corelib/dojox/atom/widget/nls/sl/FeedEntryViewer.js corelib/dojox/atom/widget/nls/sl/FeedViewerEntry.js corelib/dojox/atom/widget/nls/sl/PeopleEditor.js corelib/dojox/atom/widget/nls/sr/FeedEntryEditor.js corelib/dojox/atom/widget/nls/sr/FeedEntryViewer.js corelib/dojox/atom/widget/nls/sr/FeedViewerEntry.js corelib/dojox/atom/widget/nls/sr/PeopleEditor.js corelib/dojox/atom/widget/nls/sv/FeedEntryEditor.js corelib/dojox/atom/widget/nls/sv/FeedEntryViewer.js corelib/dojox/atom/widget/nls/sv/FeedViewerEntry.js corelib/dojox/atom/widget/nls/sv/PeopleEditor.js corelib/dojox/atom/widget/nls/th/FeedEntryEditor.js corelib/dojox/atom/widget/nls/th/FeedEntryViewer.js corelib/dojox/atom/widget/nls/th/FeedViewerEntry.js corelib/dojox/atom/widget/nls/th/PeopleEditor.js corelib/dojox/atom/widget/nls/tr/FeedEntryEditor.js corelib/dojox/atom/widget/nls/tr/FeedEntryViewer.js corelib/dojox/atom/widget/nls/tr/FeedViewerEntry.js corelib/dojox/atom/widget/nls/tr/PeopleEditor.js corelib/dojox/atom/widget/nls/uk/FeedEntryEditor.js corelib/dojox/atom/widget/nls/uk/FeedEntryViewer.js corelib/dojox/atom/widget/nls/uk/FeedViewerEntry.js corelib/dojox/atom/widget/nls/uk/PeopleEditor.js corelib/dojox/atom/widget/nls/zh-hk/FeedEntryEditor.js corelib/dojox/atom/widget/nls/zh-hk/FeedEntryViewer.js corelib/dojox/atom/widget/nls/zh-hk/FeedViewerEntry.js corelib/dojox/atom/widget/nls/zh-hk/PeopleEditor.js corelib/dojox/atom/widget/nls/zh-tw/FeedEntryEditor.js corelib/dojox/atom/widget/nls/zh-tw/FeedEntryViewer.js corelib/dojox/atom/widget/nls/zh-tw/FeedViewerEntry.js corelib/dojox/atom/widget/nls/zh-tw/PeopleEditor.js corelib/dojox/atom/widget/nls/zh/FeedEntryEditor.js corelib/dojox/atom/widget/nls/zh/FeedEntryViewer.js corelib/dojox/atom/widget/nls/zh/FeedViewerEntry.js corelib/dojox/atom/widget/nls/zh/PeopleEditor.js corelib/dojox/atom/widget/templates/EntryHeader.html corelib/dojox/atom/widget/templates/FeedEntryEditor.html corelib/dojox/atom/widget/templates/FeedEntryViewer.html corelib/dojox/atom/widget/templates/FeedViewer.html corelib/dojox/atom/widget/templates/FeedViewerEntry.html corelib/dojox/atom/widget/templates/FeedViewerGrouping.html corelib/dojox/atom/widget/templates/PeopleEditor.html corelib/dojox/atom/widget/templates/css/EntryHeader.css corelib/dojox/atom/widget/templates/css/HtmlFeedEntryEditor.css corelib/dojox/atom/widget/templates/css/HtmlFeedEntryViewer.css corelib/dojox/atom/widget/templates/css/HtmlFeedViewer.css corelib/dojox/atom/widget/templates/css/HtmlFeedViewerEntry.css corelib/dojox/atom/widget/templates/css/HtmlFeedViewerGrouping.css corelib/dojox/av/FLAudio.js corelib/dojox/av/FLVideo.js corelib/dojox/av/README corelib/dojox/av/_Media.js corelib/dojox/av/resources/audio.swf corelib/dojox/av/resources/version.mov corelib/dojox/av/resources/video.swf corelib/dojox/av/widget/PlayButton.js corelib/dojox/av/widget/Player.js corelib/dojox/av/widget/ProgressSlider.js corelib/dojox/av/widget/Status.js corelib/dojox/av/widget/VolumeButton.js corelib/dojox/av/widget/resources/PlayButton.html corelib/dojox/av/widget/resources/Player.css corelib/dojox/av/widget/resources/Player.html corelib/dojox/av/widget/resources/ProgressSlider.html corelib/dojox/av/widget/resources/Status.html corelib/dojox/av/widget/resources/VolumeButton.html corelib/dojox/av/widget/resources/images/dojoPlayerIcons.png corelib/dojox/av/widget/resources/images/playerIcons corelib/dojox/av/widget/resources/images/player_sprite.png corelib/dojox/av/widget/resources/images/progressLoadedBk.png corelib/dojox/av/widget/resources/images/progressPositionBk.png corelib/dojox/av/widget/resources/images/sliderHandleNorm.png corelib/dojox/av/widget/resources/images/sliderHandleOver.png corelib/dojox/av/widget/resources/images/sliderHandleSprite.png corelib/dojox/bower.json corelib/dojox/calc/FuncGen.js corelib/dojox/calc/GraphPro.js corelib/dojox/calc/Grapher.js corelib/dojox/calc/Readme.txt corelib/dojox/calc/Standard.js corelib/dojox/calc/_Executor.js corelib/dojox/calc/_ExecutorIframe.html corelib/dojox/calc/resources/Common.css corelib/dojox/calc/resources/GraphPro.css corelib/dojox/calc/resources/Standard.css corelib/dojox/calc/templates/FuncGen.html corelib/dojox/calc/templates/GraphPro.html corelib/dojox/calc/templates/Grapher.html corelib/dojox/calc/templates/Standard.html corelib/dojox/calc/toFrac.js corelib/dojox/calendar/CONTRIBUTING.md corelib/dojox/calendar/Calendar.js corelib/dojox/calendar/CalendarBase.js corelib/dojox/calendar/ColumnView.js corelib/dojox/calendar/ColumnViewSecondarySheet.js corelib/dojox/calendar/DecorationRenderer.js corelib/dojox/calendar/ExpandRenderer.js corelib/dojox/calendar/HorizontalRenderer.js corelib/dojox/calendar/Keyboard.js corelib/dojox/calendar/LICENSE corelib/dojox/calendar/LabelRenderer.js corelib/dojox/calendar/MatrixView.js corelib/dojox/calendar/MobileCalendar.js corelib/dojox/calendar/MobileHorizontalRenderer.js corelib/dojox/calendar/MobileVerticalRenderer.js corelib/dojox/calendar/MonthColumnView.js corelib/dojox/calendar/Mouse.js corelib/dojox/calendar/README corelib/dojox/calendar/RendererManager.js corelib/dojox/calendar/SimpleColumnView.js corelib/dojox/calendar/StoreManager.js corelib/dojox/calendar/StoreMixin.js corelib/dojox/calendar/Touch.js corelib/dojox/calendar/VerticalRenderer.js corelib/dojox/calendar/ViewBase.js corelib/dojox/calendar/_RendererMixin.js corelib/dojox/calendar/_ScrollBarBase.js corelib/dojox/calendar/nls/ar/buttons.js corelib/dojox/calendar/nls/bg/buttons.js corelib/dojox/calendar/nls/bs/buttons.js corelib/dojox/calendar/nls/buttons.js corelib/dojox/calendar/nls/ca/buttons.js corelib/dojox/calendar/nls/cs/buttons.js corelib/dojox/calendar/nls/da/buttons.js corelib/dojox/calendar/nls/de/buttons.js corelib/dojox/calendar/nls/el/buttons.js corelib/dojox/calendar/nls/es/buttons.js corelib/dojox/calendar/nls/eu/buttons.js corelib/dojox/calendar/nls/fi/buttons.js corelib/dojox/calendar/nls/fr/buttons.js corelib/dojox/calendar/nls/he/buttons.js corelib/dojox/calendar/nls/hr/buttons.js corelib/dojox/calendar/nls/hu/buttons.js corelib/dojox/calendar/nls/id/buttons.js corelib/dojox/calendar/nls/it/buttons.js corelib/dojox/calendar/nls/ja/buttons.js corelib/dojox/calendar/nls/kk/buttons.js corelib/dojox/calendar/nls/ko/buttons.js corelib/dojox/calendar/nls/lt/buttons.js corelib/dojox/calendar/nls/mk/buttons.js corelib/dojox/calendar/nls/nb/buttons.js corelib/dojox/calendar/nls/nl/buttons.js corelib/dojox/calendar/nls/pl/buttons.js corelib/dojox/calendar/nls/pt-pt/buttons.js corelib/dojox/calendar/nls/pt/buttons.js corelib/dojox/calendar/nls/ro/buttons.js corelib/dojox/calendar/nls/ru/buttons.js corelib/dojox/calendar/nls/sk/buttons.js corelib/dojox/calendar/nls/sl/buttons.js corelib/dojox/calendar/nls/sr/buttons.js corelib/dojox/calendar/nls/sv/buttons.js corelib/dojox/calendar/nls/th/buttons.js corelib/dojox/calendar/nls/tr/buttons.js corelib/dojox/calendar/nls/uk/buttons.js corelib/dojox/calendar/nls/zh-tw/buttons.js corelib/dojox/calendar/nls/zh/buttons.js corelib/dojox/calendar/templates/Calendar.html corelib/dojox/calendar/templates/ColumnView.html corelib/dojox/calendar/templates/ColumnViewSecondarySheet.html corelib/dojox/calendar/templates/ExpandRenderer.html corelib/dojox/calendar/templates/HorizontalRenderer.html corelib/dojox/calendar/templates/LabelRenderer.html corelib/dojox/calendar/templates/MatrixView.html corelib/dojox/calendar/templates/MobileCalendar.html corelib/dojox/calendar/templates/MobileHorizontalRenderer.html corelib/dojox/calendar/templates/MobileVerticalRenderer.html corelib/dojox/calendar/templates/MonthColumnView.html corelib/dojox/calendar/templates/SimpleMatrixView.html corelib/dojox/calendar/templates/VerticalRenderer.html corelib/dojox/calendar/themes/Base.less corelib/dojox/calendar/themes/claro/Calendar.css corelib/dojox/calendar/themes/claro/Calendar.less corelib/dojox/calendar/themes/claro/Calendar_rtl.css corelib/dojox/calendar/themes/claro/Calendar_rtl.less corelib/dojox/calendar/themes/claro/ColumnView.css corelib/dojox/calendar/themes/claro/ColumnView.less corelib/dojox/calendar/themes/claro/ColumnViewCommon.less corelib/dojox/calendar/themes/claro/ColumnView_rtl.css corelib/dojox/calendar/themes/claro/ColumnView_rtl.less corelib/dojox/calendar/themes/claro/Common.less corelib/dojox/calendar/themes/claro/MatrixView.css corelib/dojox/calendar/themes/claro/MatrixView.less corelib/dojox/calendar/themes/claro/MatrixViewCommon.less corelib/dojox/calendar/themes/claro/MatrixView_rtl.css corelib/dojox/calendar/themes/claro/MatrixView_rtl.less corelib/dojox/calendar/themes/claro/MonthColumnView.css corelib/dojox/calendar/themes/claro/MonthColumnView.less corelib/dojox/calendar/themes/claro/MonthColumnViewCommon.less corelib/dojox/calendar/themes/claro/MonthColumnView_rtl.css corelib/dojox/calendar/themes/claro/MonthColumnView_rtl.less corelib/dojox/calendar/themes/claro/images/titlebar.png corelib/dojox/calendar/themes/iphone/Calendar.css corelib/dojox/calendar/themes/iphone/Calendar.less corelib/dojox/calendar/themes/iphone/Calendar_rtl.css corelib/dojox/calendar/themes/iphone/Calendar_rtl.less corelib/dojox/calendar/themes/iphone/ColumnView.css corelib/dojox/calendar/themes/iphone/ColumnView.less corelib/dojox/calendar/themes/iphone/ColumnViewCommon.less corelib/dojox/calendar/themes/iphone/ColumnView_rtl.css corelib/dojox/calendar/themes/iphone/ColumnView_rtl.less corelib/dojox/calendar/themes/iphone/Common.css corelib/dojox/calendar/themes/iphone/Common.less corelib/dojox/calendar/themes/iphone/MatrixView.css corelib/dojox/calendar/themes/iphone/MatrixView.less corelib/dojox/calendar/themes/iphone/MatrixViewCommon.less corelib/dojox/calendar/themes/iphone/MatrixView_rtl.css corelib/dojox/calendar/themes/iphone/MatrixView_rtl.less corelib/dojox/calendar/themes/iphone/MonthColumnView.css corelib/dojox/calendar/themes/iphone/MonthColumnView.less corelib/dojox/calendar/themes/iphone/MonthColumnViewCommon.less corelib/dojox/calendar/themes/iphone/MonthColumnView_rtl.css corelib/dojox/calendar/themes/iphone/MonthColumnView_rtl.less corelib/dojox/calendar/themes/nihilo/Calendar.css corelib/dojox/calendar/themes/nihilo/Calendar.less corelib/dojox/calendar/themes/nihilo/Calendar_rtl.css corelib/dojox/calendar/themes/nihilo/Calendar_rtl.less corelib/dojox/calendar/themes/nihilo/ColumnView.css corelib/dojox/calendar/themes/nihilo/ColumnView.less corelib/dojox/calendar/themes/nihilo/ColumnViewCommon.less corelib/dojox/calendar/themes/nihilo/ColumnView_rtl.css corelib/dojox/calendar/themes/nihilo/ColumnView_rtl.less corelib/dojox/calendar/themes/nihilo/Common.less corelib/dojox/calendar/themes/nihilo/MatrixView.css corelib/dojox/calendar/themes/nihilo/MatrixView.less corelib/dojox/calendar/themes/nihilo/MatrixViewCommon.less corelib/dojox/calendar/themes/nihilo/MatrixView_rtl.css corelib/dojox/calendar/themes/nihilo/MatrixView_rtl.less corelib/dojox/calendar/themes/nihilo/MonthColumnView.css corelib/dojox/calendar/themes/nihilo/MonthColumnView.less corelib/dojox/calendar/themes/nihilo/MonthColumnViewCommon.less corelib/dojox/calendar/themes/nihilo/MonthColumnView_rtl.css corelib/dojox/calendar/themes/nihilo/MonthColumnView_rtl.less corelib/dojox/calendar/themes/nihilo/images/accordionItemActive.png corelib/dojox/calendar/themes/nihilo/images/titleBar.png corelib/dojox/calendar/themes/soria/Calendar.css corelib/dojox/calendar/themes/soria/Calendar.less corelib/dojox/calendar/themes/soria/Calendar_rtl.css corelib/dojox/calendar/themes/soria/Calendar_rtl.less corelib/dojox/calendar/themes/soria/ColumnView.css corelib/dojox/calendar/themes/soria/ColumnView.less corelib/dojox/calendar/themes/soria/ColumnViewCommon.less corelib/dojox/calendar/themes/soria/ColumnView_rtl.css corelib/dojox/calendar/themes/soria/ColumnView_rtl.less corelib/dojox/calendar/themes/soria/Common.less corelib/dojox/calendar/themes/soria/MatrixView.css corelib/dojox/calendar/themes/soria/MatrixView.less corelib/dojox/calendar/themes/soria/MatrixViewCommon.less corelib/dojox/calendar/themes/soria/MatrixView_rtl.css corelib/dojox/calendar/themes/soria/MatrixView_rtl.less corelib/dojox/calendar/themes/soria/MonthColumnView.css corelib/dojox/calendar/themes/soria/MonthColumnView.less corelib/dojox/calendar/themes/soria/MonthColumnViewCommon.less corelib/dojox/calendar/themes/soria/MonthColumnView_rtl.css corelib/dojox/calendar/themes/soria/MonthColumnView_rtl.less corelib/dojox/calendar/themes/soria/images/accordionItemActive.png corelib/dojox/calendar/themes/soria/images/titleBar.png corelib/dojox/calendar/themes/tundra/Calendar.css corelib/dojox/calendar/themes/tundra/Calendar.less corelib/dojox/calendar/themes/tundra/Calendar_rtl.css corelib/dojox/calendar/themes/tundra/Calendar_rtl.less corelib/dojox/calendar/themes/tundra/ColumnView.css corelib/dojox/calendar/themes/tundra/ColumnView.less corelib/dojox/calendar/themes/tundra/ColumnViewCommon.less corelib/dojox/calendar/themes/tundra/ColumnView_rtl.css corelib/dojox/calendar/themes/tundra/ColumnView_rtl.less corelib/dojox/calendar/themes/tundra/Common.less corelib/dojox/calendar/themes/tundra/MatrixView.css corelib/dojox/calendar/themes/tundra/MatrixView.less corelib/dojox/calendar/themes/tundra/MatrixViewCommon.less corelib/dojox/calendar/themes/tundra/MatrixView_rtl.css corelib/dojox/calendar/themes/tundra/MatrixView_rtl.less corelib/dojox/calendar/themes/tundra/MonthColumnView.css corelib/dojox/calendar/themes/tundra/MonthColumnView.less corelib/dojox/calendar/themes/tundra/MonthColumnViewCommon.less corelib/dojox/calendar/themes/tundra/MonthColumnView_rtl.css corelib/dojox/calendar/themes/tundra/MonthColumnView_rtl.less corelib/dojox/calendar/themes/tundra/images/accordionItemHover.gif corelib/dojox/calendar/themes/tundra/images/titleBar.png corelib/dojox/calendar/time.js corelib/dojox/charting/BidiSupport.js corelib/dojox/charting/BidiSupport3D.js corelib/dojox/charting/Chart.js corelib/dojox/charting/Chart2D.js corelib/dojox/charting/Chart3D.js corelib/dojox/charting/DataChart.js corelib/dojox/charting/DataSeries.js corelib/dojox/charting/Element.js corelib/dojox/charting/README corelib/dojox/charting/Series.js corelib/dojox/charting/SimpleTheme.js corelib/dojox/charting/StoreSeries.js corelib/dojox/charting/Theme.js corelib/dojox/charting/action2d/Base.js corelib/dojox/charting/action2d/ChartAction.js corelib/dojox/charting/action2d/Highlight.js corelib/dojox/charting/action2d/Magnify.js corelib/dojox/charting/action2d/MouseIndicator.js corelib/dojox/charting/action2d/MouseZoomAndPan.js corelib/dojox/charting/action2d/MoveSlice.js corelib/dojox/charting/action2d/PlotAction.js corelib/dojox/charting/action2d/Shake.js corelib/dojox/charting/action2d/Tooltip.js corelib/dojox/charting/action2d/TouchIndicator.js corelib/dojox/charting/action2d/TouchZoomAndPan.js corelib/dojox/charting/action2d/_IndicatorElement.js corelib/dojox/charting/axis2d/Base.js corelib/dojox/charting/axis2d/Default.js corelib/dojox/charting/axis2d/Invisible.js corelib/dojox/charting/axis2d/Log.js corelib/dojox/charting/axis2d/common.js corelib/dojox/charting/bidi/Chart.js corelib/dojox/charting/bidi/Chart3D.js corelib/dojox/charting/bidi/_bidiutils.js corelib/dojox/charting/bidi/action2d/Tooltip.js corelib/dojox/charting/bidi/action2d/ZoomAndPan.js corelib/dojox/charting/bidi/axis2d/Default.js corelib/dojox/charting/bidi/widget/Chart.js corelib/dojox/charting/bidi/widget/Legend.js corelib/dojox/charting/plot2d/Areas.js corelib/dojox/charting/plot2d/Bars.js corelib/dojox/charting/plot2d/Base.js corelib/dojox/charting/plot2d/Bubble.js corelib/dojox/charting/plot2d/Candlesticks.js corelib/dojox/charting/plot2d/CartesianBase.js corelib/dojox/charting/plot2d/ClusteredBars.js corelib/dojox/charting/plot2d/ClusteredColumns.js corelib/dojox/charting/plot2d/Columns.js corelib/dojox/charting/plot2d/Default.js corelib/dojox/charting/plot2d/Grid.js corelib/dojox/charting/plot2d/Indicator.js corelib/dojox/charting/plot2d/Lines.js corelib/dojox/charting/plot2d/Markers.js corelib/dojox/charting/plot2d/MarkersOnly.js corelib/dojox/charting/plot2d/OHLC.js corelib/dojox/charting/plot2d/Pie.js corelib/dojox/charting/plot2d/Scatter.js corelib/dojox/charting/plot2d/Spider.js corelib/dojox/charting/plot2d/Stacked.js corelib/dojox/charting/plot2d/StackedAreas.js corelib/dojox/charting/plot2d/StackedBars.js corelib/dojox/charting/plot2d/StackedColumns.js corelib/dojox/charting/plot2d/StackedLines.js corelib/dojox/charting/plot2d/_PlotEvents.js corelib/dojox/charting/plot2d/common.js corelib/dojox/charting/plot2d/commonStacked.js corelib/dojox/charting/plot3d/Bars.js corelib/dojox/charting/plot3d/Base.js corelib/dojox/charting/plot3d/Cylinders.js corelib/dojox/charting/resources/Legend.css corelib/dojox/charting/scaler/common.js corelib/dojox/charting/scaler/linear.js corelib/dojox/charting/scaler/log.js corelib/dojox/charting/scaler/primitive.js corelib/dojox/charting/themes/Adobebricks.js corelib/dojox/charting/themes/Algae.js corelib/dojox/charting/themes/Bahamation.js corelib/dojox/charting/themes/BlueDusk.js corelib/dojox/charting/themes/Charged.js corelib/dojox/charting/themes/Chris.js corelib/dojox/charting/themes/Claro.js corelib/dojox/charting/themes/CubanShirts.js corelib/dojox/charting/themes/Desert.js corelib/dojox/charting/themes/Distinctive.js corelib/dojox/charting/themes/Dollar.js corelib/dojox/charting/themes/Electric.js corelib/dojox/charting/themes/Grasshopper.js corelib/dojox/charting/themes/Grasslands.js corelib/dojox/charting/themes/GreySkies.js corelib/dojox/charting/themes/Harmony.js corelib/dojox/charting/themes/IndigoNation.js corelib/dojox/charting/themes/Ireland.js corelib/dojox/charting/themes/Julie.js corelib/dojox/charting/themes/MiamiNice.js corelib/dojox/charting/themes/Midwest.js corelib/dojox/charting/themes/Minty.js corelib/dojox/charting/themes/PlotKit/README corelib/dojox/charting/themes/PlotKit/base.js corelib/dojox/charting/themes/PlotKit/blue.js corelib/dojox/charting/themes/PlotKit/cyan.js corelib/dojox/charting/themes/PlotKit/green.js corelib/dojox/charting/themes/PlotKit/orange.js corelib/dojox/charting/themes/PlotKit/purple.js corelib/dojox/charting/themes/PlotKit/red.js corelib/dojox/charting/themes/PrimaryColors.js corelib/dojox/charting/themes/PurpleRain.js corelib/dojox/charting/themes/README corelib/dojox/charting/themes/Renkoo.js corelib/dojox/charting/themes/RoyalPurples.js corelib/dojox/charting/themes/SageToLime.js corelib/dojox/charting/themes/Shrooms.js corelib/dojox/charting/themes/ThreeD.js corelib/dojox/charting/themes/Tom.js corelib/dojox/charting/themes/Tufte.js corelib/dojox/charting/themes/WatersEdge.js corelib/dojox/charting/themes/Wetland.js corelib/dojox/charting/themes/common.js corelib/dojox/charting/themes/gradientGenerator.js corelib/dojox/charting/widget/BidiSupport.js corelib/dojox/charting/widget/Chart.js corelib/dojox/charting/widget/Chart2D.js corelib/dojox/charting/widget/Legend.js corelib/dojox/charting/widget/SelectableLegend.js corelib/dojox/charting/widget/Sparkline.js corelib/dojox/collections.js corelib/dojox/collections/ArrayList.js corelib/dojox/collections/BinaryTree.js corelib/dojox/collections/Dictionary.js corelib/dojox/collections/Queue.js corelib/dojox/collections/README corelib/dojox/collections/Set.js corelib/dojox/collections/SortedList.js corelib/dojox/collections/Stack.js corelib/dojox/collections/_base.js corelib/dojox/color.js corelib/dojox/color/Colorspace.js corelib/dojox/color/MeanColorModel.js corelib/dojox/color/NeutralColorModel.js corelib/dojox/color/Palette.js corelib/dojox/color/README corelib/dojox/color/SimpleColorModel.js corelib/dojox/color/_base.js corelib/dojox/color/api/ColorModel.js corelib/dojox/commit-pseudo-changes.bat corelib/dojox/css3/README corelib/dojox/css3/fx.js corelib/dojox/css3/transit.js corelib/dojox/css3/transition.js corelib/dojox/data/AndOrReadStore.js corelib/dojox/data/AndOrWriteStore.js corelib/dojox/data/AppStore.js corelib/dojox/data/AtomReadStore.js corelib/dojox/data/CdfStore.js corelib/dojox/data/ClientFilter.js corelib/dojox/data/CouchDBRestStore.js corelib/dojox/data/CssClassStore.js corelib/dojox/data/CssRuleStore.js corelib/dojox/data/CsvStore.js corelib/dojox/data/FileStore.js corelib/dojox/data/FlickrRestStore.js corelib/dojox/data/FlickrStore.js corelib/dojox/data/GoogleFeedStore.js corelib/dojox/data/GoogleSearchStore.js corelib/dojox/data/HtmlStore.js corelib/dojox/data/HtmlTableStore.js corelib/dojox/data/ItemExplorer.js corelib/dojox/data/JsonQueryRestStore.js corelib/dojox/data/JsonRestStore.js corelib/dojox/data/KeyValueStore.js corelib/dojox/data/OpenSearchStore.js corelib/dojox/data/OpmlStore.js corelib/dojox/data/PersevereStore.js corelib/dojox/data/PicasaStore.js corelib/dojox/data/QueryReadStore.js corelib/dojox/data/README corelib/dojox/data/RailsStore.js corelib/dojox/data/S3Store.js corelib/dojox/data/ServiceStore.js corelib/dojox/data/SnapLogicStore.js corelib/dojox/data/StoreExplorer.js corelib/dojox/data/WikipediaStore.js corelib/dojox/data/XmlItem.js corelib/dojox/data/XmlStore.js corelib/dojox/data/css.js corelib/dojox/data/dom.js corelib/dojox/data/restListener.js corelib/dojox/data/s3/README corelib/dojox/data/s3/proxy.example-php corelib/dojox/data/util/JsonQuery.js corelib/dojox/date/README corelib/dojox/date/buddhist.js corelib/dojox/date/buddhist/Date.js corelib/dojox/date/buddhist/locale.js corelib/dojox/date/hebrew.js corelib/dojox/date/hebrew/Date.js corelib/dojox/date/hebrew/locale.js corelib/dojox/date/hebrew/numerals.js corelib/dojox/date/islamic.js corelib/dojox/date/islamic/Date.js corelib/dojox/date/islamic/locale.js corelib/dojox/date/persian.js corelib/dojox/date/persian/Date.js corelib/dojox/date/persian/locale.js corelib/dojox/date/php.js corelib/dojox/date/posix.js corelib/dojox/date/relative.js corelib/dojox/date/timezone.js corelib/dojox/date/umalqura.js corelib/dojox/date/umalqura/Date.js corelib/dojox/date/umalqura/locale.js corelib/dojox/date/zoneinfo/LICENSE corelib/dojox/date/zoneinfo/africa corelib/dojox/date/zoneinfo/antarctica corelib/dojox/date/zoneinfo/asia corelib/dojox/date/zoneinfo/australasia corelib/dojox/date/zoneinfo/backward corelib/dojox/date/zoneinfo/etcetera corelib/dojox/date/zoneinfo/europe corelib/dojox/date/zoneinfo/northamerica corelib/dojox/date/zoneinfo/pacificnew corelib/dojox/date/zoneinfo/southamerica corelib/dojox/dgauges/CONTRIBUTING.md corelib/dojox/dgauges/CircularGauge.js corelib/dojox/dgauges/CircularRangeIndicator.js corelib/dojox/dgauges/CircularScale.js corelib/dojox/dgauges/CircularValueIndicator.js corelib/dojox/dgauges/GaugeBase.js corelib/dojox/dgauges/IndicatorBase.js corelib/dojox/dgauges/LICENSE corelib/dojox/dgauges/LinearScaler.js corelib/dojox/dgauges/LogScaler.js corelib/dojox/dgauges/MultiLinearScaler.js corelib/dojox/dgauges/README corelib/dojox/dgauges/RectangularGauge.js corelib/dojox/dgauges/RectangularRangeIndicator.js corelib/dojox/dgauges/RectangularScale.js corelib/dojox/dgauges/RectangularSegmentedRangeIndicator.js corelib/dojox/dgauges/RectangularValueIndicator.js corelib/dojox/dgauges/ScaleBase.js corelib/dojox/dgauges/ScaleIndicatorBase.js corelib/dojox/dgauges/TextIndicator.js corelib/dojox/dgauges/_circularUtils.js corelib/dojox/dgauges/components/DefaultPropertiesMixin.js corelib/dojox/dgauges/components/black/CircularLinearGauge.js corelib/dojox/dgauges/components/black/HorizontalLinearGauge.js corelib/dojox/dgauges/components/black/SemiCircularLinearGauge.js corelib/dojox/dgauges/components/black/VerticalLinearGauge.js corelib/dojox/dgauges/components/classic/CircularLinearGauge.js corelib/dojox/dgauges/components/classic/HorizontalLinearGauge.js corelib/dojox/dgauges/components/classic/SemiCircularLinearGauge.js corelib/dojox/dgauges/components/classic/VerticalLinearGauge.js corelib/dojox/dgauges/components/default/CircularLinearGauge.js corelib/dojox/dgauges/components/default/HorizontalLinearGauge.js corelib/dojox/dgauges/components/default/SemiCircularLinearGauge.js corelib/dojox/dgauges/components/default/VerticalLinearGauge.js corelib/dojox/dgauges/components/green/CircularLinearGauge.js corelib/dojox/dgauges/components/green/HorizontalLinearGauge.js corelib/dojox/dgauges/components/green/SemiCircularLinearGauge.js corelib/dojox/dgauges/components/green/VerticalLinearGauge.js corelib/dojox/dgauges/components/grey/CircularLinearGauge.js corelib/dojox/dgauges/components/grey/HorizontalLinearGauge.js corelib/dojox/dgauges/components/grey/SemiCircularLinearGauge.js corelib/dojox/dgauges/components/grey/VerticalLinearGauge.js corelib/dojox/dgauges/components/utils.js corelib/dojox/dnd/BoundingBoxController.js corelib/dojox/dnd/README corelib/dojox/dnd/Selector.js corelib/dojox/dojox.profile.js corelib/dojox/drawing.js corelib/dojox/drawing/Drawing.js corelib/dojox/drawing/README corelib/dojox/drawing/_base.js corelib/dojox/drawing/annotations/Angle.js corelib/dojox/drawing/annotations/Arrow.js corelib/dojox/drawing/annotations/BoxShadow.js corelib/dojox/drawing/annotations/Label.js corelib/dojox/drawing/defaults.js corelib/dojox/drawing/library/greek.js corelib/dojox/drawing/library/icons.js corelib/dojox/drawing/manager/Anchors.js corelib/dojox/drawing/manager/Canvas.js corelib/dojox/drawing/manager/Mouse.js corelib/dojox/drawing/manager/Stencil.js corelib/dojox/drawing/manager/StencilUI.js corelib/dojox/drawing/manager/Undo.js corelib/dojox/drawing/manager/_registry.js corelib/dojox/drawing/manager/keys.js corelib/dojox/drawing/plugins/_Plugin.js corelib/dojox/drawing/plugins/drawing/GreekPalette.js corelib/dojox/drawing/plugins/drawing/Grid.js corelib/dojox/drawing/plugins/drawing/Silverlight.js corelib/dojox/drawing/plugins/tools/Iconize.js corelib/dojox/drawing/plugins/tools/Pan.js corelib/dojox/drawing/plugins/tools/Zoom.js corelib/dojox/drawing/resources/CrazyTruck.jpg corelib/dojox/drawing/resources/GreekPalette.css corelib/dojox/drawing/resources/drawing.css corelib/dojox/drawing/resources/images/tool_icons.png corelib/dojox/drawing/resources/images/tool_sprites.png corelib/dojox/drawing/resources/toolbar.css corelib/dojox/drawing/stencil/Ellipse.js corelib/dojox/drawing/stencil/Image.js corelib/dojox/drawing/stencil/Line.js corelib/dojox/drawing/stencil/Path.js corelib/dojox/drawing/stencil/Rect.js corelib/dojox/drawing/stencil/Text.js corelib/dojox/drawing/stencil/_Base.js corelib/dojox/drawing/tools/Arrow.js corelib/dojox/drawing/tools/Ellipse.js corelib/dojox/drawing/tools/Line.js corelib/dojox/drawing/tools/Path.js corelib/dojox/drawing/tools/Pencil.js corelib/dojox/drawing/tools/Rect.js corelib/dojox/drawing/tools/TextBlock.js corelib/dojox/drawing/tools/custom/Axes.js corelib/dojox/drawing/tools/custom/Equation.js corelib/dojox/drawing/tools/custom/Vector.js corelib/dojox/drawing/ui/Button.js corelib/dojox/drawing/ui/Toolbar.js corelib/dojox/drawing/ui/Tooltip.js corelib/dojox/drawing/ui/dom/Pan.js corelib/dojox/drawing/ui/dom/Toolbar.js corelib/dojox/drawing/ui/dom/Zoom.js corelib/dojox/drawing/util/common.js corelib/dojox/drawing/util/oo.js corelib/dojox/drawing/util/positioning.js corelib/dojox/drawing/util/typeset.js corelib/dojox/dtl.js corelib/dojox/dtl/Context.js corelib/dojox/dtl/DomInline.js corelib/dojox/dtl/Inline.js corelib/dojox/dtl/README corelib/dojox/dtl/_DomTemplated.js corelib/dojox/dtl/_Templated.js corelib/dojox/dtl/_base.js corelib/dojox/dtl/contrib/data.js corelib/dojox/dtl/contrib/dijit.js corelib/dojox/dtl/contrib/dom.js corelib/dojox/dtl/contrib/objects.js corelib/dojox/dtl/dom.js corelib/dojox/dtl/ext-dojo/NodeList.js corelib/dojox/dtl/filter/dates.js corelib/dojox/dtl/filter/htmlstrings.js corelib/dojox/dtl/filter/integers.js corelib/dojox/dtl/filter/lists.js corelib/dojox/dtl/filter/logic.js corelib/dojox/dtl/filter/misc.js corelib/dojox/dtl/filter/strings.js corelib/dojox/dtl/render/dom.js corelib/dojox/dtl/render/html.js corelib/dojox/dtl/tag/date.js corelib/dojox/dtl/tag/loader.js corelib/dojox/dtl/tag/logic.js corelib/dojox/dtl/tag/loop.js corelib/dojox/dtl/tag/misc.js corelib/dojox/dtl/utils/date.js corelib/dojox/editor/README corelib/dojox/editor/plugins/AutoSave.js corelib/dojox/editor/plugins/AutoUrlLink.js corelib/dojox/editor/plugins/BidiSupport.js corelib/dojox/editor/plugins/Blockquote.js corelib/dojox/editor/plugins/Breadcrumb.js corelib/dojox/editor/plugins/CollapsibleToolbar.js corelib/dojox/editor/plugins/EntityPalette.js corelib/dojox/editor/plugins/FindReplace.js corelib/dojox/editor/plugins/InsertAnchor.js corelib/dojox/editor/plugins/InsertEntity.js corelib/dojox/editor/plugins/LocalImage.js corelib/dojox/editor/plugins/NormalizeIndentOutdent.js corelib/dojox/editor/plugins/NormalizeStyle.js corelib/dojox/editor/plugins/PageBreak.js corelib/dojox/editor/plugins/PasteFromWord.js corelib/dojox/editor/plugins/PrettyPrint.js corelib/dojox/editor/plugins/Preview.js corelib/dojox/editor/plugins/ResizeTableColumn.js corelib/dojox/editor/plugins/SafePaste.js corelib/dojox/editor/plugins/Save.js corelib/dojox/editor/plugins/ShowBlockNodes.js corelib/dojox/editor/plugins/Smiley.js corelib/dojox/editor/plugins/SpellCheck.js corelib/dojox/editor/plugins/StatusBar.js corelib/dojox/editor/plugins/TablePlugins.js corelib/dojox/editor/plugins/TextColor.js corelib/dojox/editor/plugins/ToolbarLineBreak.js corelib/dojox/editor/plugins/UploadImage.js corelib/dojox/editor/plugins/_SmileyPalette.js corelib/dojox/editor/plugins/_SpellCheckParser.js corelib/dojox/editor/plugins/nls/AutoSave.js corelib/dojox/editor/plugins/nls/BidiSupport.js corelib/dojox/editor/plugins/nls/Blockquote.js corelib/dojox/editor/plugins/nls/Breadcrumb.js corelib/dojox/editor/plugins/nls/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/FindReplace.js corelib/dojox/editor/plugins/nls/InsertAnchor.js corelib/dojox/editor/plugins/nls/InsertEntity.js corelib/dojox/editor/plugins/nls/LocalImage.js corelib/dojox/editor/plugins/nls/PageBreak.js corelib/dojox/editor/plugins/nls/PasteFromWord.js corelib/dojox/editor/plugins/nls/Preview.js corelib/dojox/editor/plugins/nls/SafePaste.js corelib/dojox/editor/plugins/nls/Save.js corelib/dojox/editor/plugins/nls/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/Smiley.js corelib/dojox/editor/plugins/nls/SpellCheck.js corelib/dojox/editor/plugins/nls/TableDialog.js corelib/dojox/editor/plugins/nls/TextColor.js corelib/dojox/editor/plugins/nls/ar/AutoSave.js corelib/dojox/editor/plugins/nls/ar/BidiSupport.js corelib/dojox/editor/plugins/nls/ar/Blockquote.js corelib/dojox/editor/plugins/nls/ar/Breadcrumb.js corelib/dojox/editor/plugins/nls/ar/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/ar/FindReplace.js corelib/dojox/editor/plugins/nls/ar/InsertAnchor.js corelib/dojox/editor/plugins/nls/ar/InsertEntity.js corelib/dojox/editor/plugins/nls/ar/LocalImage.js corelib/dojox/editor/plugins/nls/ar/PageBreak.js corelib/dojox/editor/plugins/nls/ar/PasteFromWord.js corelib/dojox/editor/plugins/nls/ar/Preview.js corelib/dojox/editor/plugins/nls/ar/SafePaste.js corelib/dojox/editor/plugins/nls/ar/Save.js corelib/dojox/editor/plugins/nls/ar/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/ar/Smiley.js corelib/dojox/editor/plugins/nls/ar/SpellCheck.js corelib/dojox/editor/plugins/nls/ar/TableDialog.js corelib/dojox/editor/plugins/nls/ar/TextColor.js corelib/dojox/editor/plugins/nls/ar/latinEntities.js corelib/dojox/editor/plugins/nls/az/TableDialog.js corelib/dojox/editor/plugins/nls/bg/AutoSave.js corelib/dojox/editor/plugins/nls/bg/BidiSupport.js corelib/dojox/editor/plugins/nls/bg/Blockquote.js corelib/dojox/editor/plugins/nls/bg/Breadcrumb.js corelib/dojox/editor/plugins/nls/bg/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/bg/FindReplace.js corelib/dojox/editor/plugins/nls/bg/InsertAnchor.js corelib/dojox/editor/plugins/nls/bg/InsertEntity.js corelib/dojox/editor/plugins/nls/bg/LocalImage.js corelib/dojox/editor/plugins/nls/bg/PageBreak.js corelib/dojox/editor/plugins/nls/bg/PasteFromWord.js corelib/dojox/editor/plugins/nls/bg/Preview.js corelib/dojox/editor/plugins/nls/bg/SafePaste.js corelib/dojox/editor/plugins/nls/bg/Save.js corelib/dojox/editor/plugins/nls/bg/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/bg/Smiley.js corelib/dojox/editor/plugins/nls/bg/SpellCheck.js corelib/dojox/editor/plugins/nls/bg/TableDialog.js corelib/dojox/editor/plugins/nls/bg/TextColor.js corelib/dojox/editor/plugins/nls/bg/latinEntities.js corelib/dojox/editor/plugins/nls/bs/AutoSave.js corelib/dojox/editor/plugins/nls/bs/BidiSupport.js corelib/dojox/editor/plugins/nls/bs/Blockquote.js corelib/dojox/editor/plugins/nls/bs/Breadcrumb.js corelib/dojox/editor/plugins/nls/bs/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/bs/FindReplace.js corelib/dojox/editor/plugins/nls/bs/InsertAnchor.js corelib/dojox/editor/plugins/nls/bs/InsertEntity.js corelib/dojox/editor/plugins/nls/bs/LocalImage.js corelib/dojox/editor/plugins/nls/bs/PageBreak.js corelib/dojox/editor/plugins/nls/bs/PasteFromWord.js corelib/dojox/editor/plugins/nls/bs/Preview.js corelib/dojox/editor/plugins/nls/bs/SafePaste.js corelib/dojox/editor/plugins/nls/bs/Save.js corelib/dojox/editor/plugins/nls/bs/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/bs/Smiley.js corelib/dojox/editor/plugins/nls/bs/SpellCheck.js corelib/dojox/editor/plugins/nls/bs/TableDialog.js corelib/dojox/editor/plugins/nls/bs/TextColor.js corelib/dojox/editor/plugins/nls/bs/latinEntities.js corelib/dojox/editor/plugins/nls/ca/AutoSave.js corelib/dojox/editor/plugins/nls/ca/BidiSupport.js corelib/dojox/editor/plugins/nls/ca/Blockquote.js corelib/dojox/editor/plugins/nls/ca/Breadcrumb.js corelib/dojox/editor/plugins/nls/ca/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/ca/FindReplace.js corelib/dojox/editor/plugins/nls/ca/InsertAnchor.js corelib/dojox/editor/plugins/nls/ca/InsertEntity.js corelib/dojox/editor/plugins/nls/ca/LocalImage.js corelib/dojox/editor/plugins/nls/ca/PageBreak.js corelib/dojox/editor/plugins/nls/ca/PasteFromWord.js corelib/dojox/editor/plugins/nls/ca/Preview.js corelib/dojox/editor/plugins/nls/ca/SafePaste.js corelib/dojox/editor/plugins/nls/ca/Save.js corelib/dojox/editor/plugins/nls/ca/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/ca/Smiley.js corelib/dojox/editor/plugins/nls/ca/SpellCheck.js corelib/dojox/editor/plugins/nls/ca/TableDialog.js corelib/dojox/editor/plugins/nls/ca/TextColor.js corelib/dojox/editor/plugins/nls/ca/latinEntities.js corelib/dojox/editor/plugins/nls/cs/AutoSave.js corelib/dojox/editor/plugins/nls/cs/BidiSupport.js corelib/dojox/editor/plugins/nls/cs/Blockquote.js corelib/dojox/editor/plugins/nls/cs/Breadcrumb.js corelib/dojox/editor/plugins/nls/cs/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/cs/FindReplace.js corelib/dojox/editor/plugins/nls/cs/InsertAnchor.js corelib/dojox/editor/plugins/nls/cs/InsertEntity.js corelib/dojox/editor/plugins/nls/cs/LocalImage.js corelib/dojox/editor/plugins/nls/cs/PageBreak.js corelib/dojox/editor/plugins/nls/cs/PasteFromWord.js corelib/dojox/editor/plugins/nls/cs/Preview.js corelib/dojox/editor/plugins/nls/cs/SafePaste.js corelib/dojox/editor/plugins/nls/cs/Save.js corelib/dojox/editor/plugins/nls/cs/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/cs/Smiley.js corelib/dojox/editor/plugins/nls/cs/SpellCheck.js corelib/dojox/editor/plugins/nls/cs/TableDialog.js corelib/dojox/editor/plugins/nls/cs/TextColor.js corelib/dojox/editor/plugins/nls/cs/latinEntities.js corelib/dojox/editor/plugins/nls/da/AutoSave.js corelib/dojox/editor/plugins/nls/da/BidiSupport.js corelib/dojox/editor/plugins/nls/da/Blockquote.js corelib/dojox/editor/plugins/nls/da/Breadcrumb.js corelib/dojox/editor/plugins/nls/da/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/da/FindReplace.js corelib/dojox/editor/plugins/nls/da/InsertAnchor.js corelib/dojox/editor/plugins/nls/da/InsertEntity.js corelib/dojox/editor/plugins/nls/da/LocalImage.js corelib/dojox/editor/plugins/nls/da/PageBreak.js corelib/dojox/editor/plugins/nls/da/PasteFromWord.js corelib/dojox/editor/plugins/nls/da/Preview.js corelib/dojox/editor/plugins/nls/da/SafePaste.js corelib/dojox/editor/plugins/nls/da/Save.js corelib/dojox/editor/plugins/nls/da/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/da/Smiley.js corelib/dojox/editor/plugins/nls/da/SpellCheck.js corelib/dojox/editor/plugins/nls/da/TableDialog.js corelib/dojox/editor/plugins/nls/da/TextColor.js corelib/dojox/editor/plugins/nls/da/latinEntities.js corelib/dojox/editor/plugins/nls/de/AutoSave.js corelib/dojox/editor/plugins/nls/de/BidiSupport.js corelib/dojox/editor/plugins/nls/de/Blockquote.js corelib/dojox/editor/plugins/nls/de/Breadcrumb.js corelib/dojox/editor/plugins/nls/de/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/de/FindReplace.js corelib/dojox/editor/plugins/nls/de/InsertAnchor.js corelib/dojox/editor/plugins/nls/de/InsertEntity.js corelib/dojox/editor/plugins/nls/de/LocalImage.js corelib/dojox/editor/plugins/nls/de/PageBreak.js corelib/dojox/editor/plugins/nls/de/PasteFromWord.js corelib/dojox/editor/plugins/nls/de/Preview.js corelib/dojox/editor/plugins/nls/de/SafePaste.js corelib/dojox/editor/plugins/nls/de/Save.js corelib/dojox/editor/plugins/nls/de/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/de/Smiley.js corelib/dojox/editor/plugins/nls/de/SpellCheck.js corelib/dojox/editor/plugins/nls/de/TableDialog.js corelib/dojox/editor/plugins/nls/de/TextColor.js corelib/dojox/editor/plugins/nls/de/latinEntities.js corelib/dojox/editor/plugins/nls/el/AutoSave.js corelib/dojox/editor/plugins/nls/el/BidiSupport.js corelib/dojox/editor/plugins/nls/el/Blockquote.js corelib/dojox/editor/plugins/nls/el/Breadcrumb.js corelib/dojox/editor/plugins/nls/el/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/el/FindReplace.js corelib/dojox/editor/plugins/nls/el/InsertAnchor.js corelib/dojox/editor/plugins/nls/el/InsertEntity.js corelib/dojox/editor/plugins/nls/el/LocalImage.js corelib/dojox/editor/plugins/nls/el/PageBreak.js corelib/dojox/editor/plugins/nls/el/PasteFromWord.js corelib/dojox/editor/plugins/nls/el/Preview.js corelib/dojox/editor/plugins/nls/el/SafePaste.js corelib/dojox/editor/plugins/nls/el/Save.js corelib/dojox/editor/plugins/nls/el/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/el/Smiley.js corelib/dojox/editor/plugins/nls/el/SpellCheck.js corelib/dojox/editor/plugins/nls/el/TableDialog.js corelib/dojox/editor/plugins/nls/el/TextColor.js corelib/dojox/editor/plugins/nls/el/latinEntities.js corelib/dojox/editor/plugins/nls/es/AutoSave.js corelib/dojox/editor/plugins/nls/es/BidiSupport.js corelib/dojox/editor/plugins/nls/es/Blockquote.js corelib/dojox/editor/plugins/nls/es/Breadcrumb.js corelib/dojox/editor/plugins/nls/es/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/es/FindReplace.js corelib/dojox/editor/plugins/nls/es/InsertAnchor.js corelib/dojox/editor/plugins/nls/es/InsertEntity.js corelib/dojox/editor/plugins/nls/es/LocalImage.js corelib/dojox/editor/plugins/nls/es/PageBreak.js corelib/dojox/editor/plugins/nls/es/PasteFromWord.js corelib/dojox/editor/plugins/nls/es/Preview.js corelib/dojox/editor/plugins/nls/es/SafePaste.js corelib/dojox/editor/plugins/nls/es/Save.js corelib/dojox/editor/plugins/nls/es/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/es/Smiley.js corelib/dojox/editor/plugins/nls/es/SpellCheck.js corelib/dojox/editor/plugins/nls/es/TableDialog.js corelib/dojox/editor/plugins/nls/es/TextColor.js corelib/dojox/editor/plugins/nls/es/latinEntities.js corelib/dojox/editor/plugins/nls/eu/AutoSave.js corelib/dojox/editor/plugins/nls/eu/BidiSupport.js corelib/dojox/editor/plugins/nls/eu/Blockquote.js corelib/dojox/editor/plugins/nls/eu/Breadcrumb.js corelib/dojox/editor/plugins/nls/eu/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/eu/FindReplace.js corelib/dojox/editor/plugins/nls/eu/InsertAnchor.js corelib/dojox/editor/plugins/nls/eu/InsertEntity.js corelib/dojox/editor/plugins/nls/eu/LocalImage.js corelib/dojox/editor/plugins/nls/eu/PageBreak.js corelib/dojox/editor/plugins/nls/eu/PasteFromWord.js corelib/dojox/editor/plugins/nls/eu/Preview.js corelib/dojox/editor/plugins/nls/eu/SafePaste.js corelib/dojox/editor/plugins/nls/eu/Save.js corelib/dojox/editor/plugins/nls/eu/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/eu/Smiley.js corelib/dojox/editor/plugins/nls/eu/SpellCheck.js corelib/dojox/editor/plugins/nls/eu/TableDialog.js corelib/dojox/editor/plugins/nls/eu/TextColor.js corelib/dojox/editor/plugins/nls/eu/latinEntities.js corelib/dojox/editor/plugins/nls/fi/AutoSave.js corelib/dojox/editor/plugins/nls/fi/BidiSupport.js corelib/dojox/editor/plugins/nls/fi/Blockquote.js corelib/dojox/editor/plugins/nls/fi/Breadcrumb.js corelib/dojox/editor/plugins/nls/fi/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/fi/FindReplace.js corelib/dojox/editor/plugins/nls/fi/InsertAnchor.js corelib/dojox/editor/plugins/nls/fi/InsertEntity.js corelib/dojox/editor/plugins/nls/fi/LocalImage.js corelib/dojox/editor/plugins/nls/fi/PageBreak.js corelib/dojox/editor/plugins/nls/fi/PasteFromWord.js corelib/dojox/editor/plugins/nls/fi/Preview.js corelib/dojox/editor/plugins/nls/fi/SafePaste.js corelib/dojox/editor/plugins/nls/fi/Save.js corelib/dojox/editor/plugins/nls/fi/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/fi/Smiley.js corelib/dojox/editor/plugins/nls/fi/SpellCheck.js corelib/dojox/editor/plugins/nls/fi/TableDialog.js corelib/dojox/editor/plugins/nls/fi/TextColor.js corelib/dojox/editor/plugins/nls/fi/latinEntities.js corelib/dojox/editor/plugins/nls/fr/AutoSave.js corelib/dojox/editor/plugins/nls/fr/BidiSupport.js corelib/dojox/editor/plugins/nls/fr/Blockquote.js corelib/dojox/editor/plugins/nls/fr/Breadcrumb.js corelib/dojox/editor/plugins/nls/fr/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/fr/FindReplace.js corelib/dojox/editor/plugins/nls/fr/InsertAnchor.js corelib/dojox/editor/plugins/nls/fr/InsertEntity.js corelib/dojox/editor/plugins/nls/fr/LocalImage.js corelib/dojox/editor/plugins/nls/fr/PageBreak.js corelib/dojox/editor/plugins/nls/fr/PasteFromWord.js corelib/dojox/editor/plugins/nls/fr/Preview.js corelib/dojox/editor/plugins/nls/fr/SafePaste.js corelib/dojox/editor/plugins/nls/fr/Save.js corelib/dojox/editor/plugins/nls/fr/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/fr/Smiley.js corelib/dojox/editor/plugins/nls/fr/SpellCheck.js corelib/dojox/editor/plugins/nls/fr/TableDialog.js corelib/dojox/editor/plugins/nls/fr/TextColor.js corelib/dojox/editor/plugins/nls/fr/latinEntities.js corelib/dojox/editor/plugins/nls/he/AutoSave.js corelib/dojox/editor/plugins/nls/he/BidiSupport.js corelib/dojox/editor/plugins/nls/he/Blockquote.js corelib/dojox/editor/plugins/nls/he/Breadcrumb.js corelib/dojox/editor/plugins/nls/he/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/he/FindReplace.js corelib/dojox/editor/plugins/nls/he/InsertAnchor.js corelib/dojox/editor/plugins/nls/he/InsertEntity.js corelib/dojox/editor/plugins/nls/he/LocalImage.js corelib/dojox/editor/plugins/nls/he/PageBreak.js corelib/dojox/editor/plugins/nls/he/PasteFromWord.js corelib/dojox/editor/plugins/nls/he/Preview.js corelib/dojox/editor/plugins/nls/he/SafePaste.js corelib/dojox/editor/plugins/nls/he/Save.js corelib/dojox/editor/plugins/nls/he/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/he/Smiley.js corelib/dojox/editor/plugins/nls/he/SpellCheck.js corelib/dojox/editor/plugins/nls/he/TableDialog.js corelib/dojox/editor/plugins/nls/he/TextColor.js corelib/dojox/editor/plugins/nls/he/latinEntities.js corelib/dojox/editor/plugins/nls/hi/AutoSave.js corelib/dojox/editor/plugins/nls/hi/BidiSupport.js corelib/dojox/editor/plugins/nls/hi/Blockquote.js corelib/dojox/editor/plugins/nls/hi/Breadcrumb.js corelib/dojox/editor/plugins/nls/hi/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/hi/FindReplace.js corelib/dojox/editor/plugins/nls/hi/InsertAnchor.js corelib/dojox/editor/plugins/nls/hi/InsertEntity.js corelib/dojox/editor/plugins/nls/hi/LocalImage.js corelib/dojox/editor/plugins/nls/hi/PageBreak.js corelib/dojox/editor/plugins/nls/hi/PasteFromWord.js corelib/dojox/editor/plugins/nls/hi/Preview.js corelib/dojox/editor/plugins/nls/hi/SafePaste.js corelib/dojox/editor/plugins/nls/hi/Save.js corelib/dojox/editor/plugins/nls/hi/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/hi/Smiley.js corelib/dojox/editor/plugins/nls/hi/SpellCheck.js corelib/dojox/editor/plugins/nls/hi/TableDialog.js corelib/dojox/editor/plugins/nls/hi/TextColor.js corelib/dojox/editor/plugins/nls/hi/latinEntities.js corelib/dojox/editor/plugins/nls/hr/AutoSave.js corelib/dojox/editor/plugins/nls/hr/BidiSupport.js corelib/dojox/editor/plugins/nls/hr/Blockquote.js corelib/dojox/editor/plugins/nls/hr/Breadcrumb.js corelib/dojox/editor/plugins/nls/hr/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/hr/FindReplace.js corelib/dojox/editor/plugins/nls/hr/InsertAnchor.js corelib/dojox/editor/plugins/nls/hr/InsertEntity.js corelib/dojox/editor/plugins/nls/hr/LocalImage.js corelib/dojox/editor/plugins/nls/hr/PageBreak.js corelib/dojox/editor/plugins/nls/hr/PasteFromWord.js corelib/dojox/editor/plugins/nls/hr/Preview.js corelib/dojox/editor/plugins/nls/hr/SafePaste.js corelib/dojox/editor/plugins/nls/hr/Save.js corelib/dojox/editor/plugins/nls/hr/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/hr/Smiley.js corelib/dojox/editor/plugins/nls/hr/SpellCheck.js corelib/dojox/editor/plugins/nls/hr/TableDialog.js corelib/dojox/editor/plugins/nls/hr/TextColor.js corelib/dojox/editor/plugins/nls/hr/latinEntities.js corelib/dojox/editor/plugins/nls/hu/AutoSave.js corelib/dojox/editor/plugins/nls/hu/BidiSupport.js corelib/dojox/editor/plugins/nls/hu/Blockquote.js corelib/dojox/editor/plugins/nls/hu/Breadcrumb.js corelib/dojox/editor/plugins/nls/hu/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/hu/FindReplace.js corelib/dojox/editor/plugins/nls/hu/InsertAnchor.js corelib/dojox/editor/plugins/nls/hu/InsertEntity.js corelib/dojox/editor/plugins/nls/hu/LocalImage.js corelib/dojox/editor/plugins/nls/hu/PageBreak.js corelib/dojox/editor/plugins/nls/hu/PasteFromWord.js corelib/dojox/editor/plugins/nls/hu/Preview.js corelib/dojox/editor/plugins/nls/hu/SafePaste.js corelib/dojox/editor/plugins/nls/hu/Save.js corelib/dojox/editor/plugins/nls/hu/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/hu/Smiley.js corelib/dojox/editor/plugins/nls/hu/SpellCheck.js corelib/dojox/editor/plugins/nls/hu/TableDialog.js corelib/dojox/editor/plugins/nls/hu/TextColor.js corelib/dojox/editor/plugins/nls/hu/latinEntities.js corelib/dojox/editor/plugins/nls/id/AutoSave.js corelib/dojox/editor/plugins/nls/id/BidiSupport.js corelib/dojox/editor/plugins/nls/id/Blockquote.js corelib/dojox/editor/plugins/nls/id/Breadcrumb.js corelib/dojox/editor/plugins/nls/id/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/id/FindReplace.js corelib/dojox/editor/plugins/nls/id/InsertAnchor.js corelib/dojox/editor/plugins/nls/id/InsertEntity.js corelib/dojox/editor/plugins/nls/id/LocalImage.js corelib/dojox/editor/plugins/nls/id/PageBreak.js corelib/dojox/editor/plugins/nls/id/PasteFromWord.js corelib/dojox/editor/plugins/nls/id/Preview.js corelib/dojox/editor/plugins/nls/id/SafePaste.js corelib/dojox/editor/plugins/nls/id/Save.js corelib/dojox/editor/plugins/nls/id/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/id/Smiley.js corelib/dojox/editor/plugins/nls/id/SpellCheck.js corelib/dojox/editor/plugins/nls/id/TableDialog.js corelib/dojox/editor/plugins/nls/id/TextColor.js corelib/dojox/editor/plugins/nls/id/latinEntities.js corelib/dojox/editor/plugins/nls/it/AutoSave.js corelib/dojox/editor/plugins/nls/it/BidiSupport.js corelib/dojox/editor/plugins/nls/it/Blockquote.js corelib/dojox/editor/plugins/nls/it/Breadcrumb.js corelib/dojox/editor/plugins/nls/it/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/it/FindReplace.js corelib/dojox/editor/plugins/nls/it/InsertAnchor.js corelib/dojox/editor/plugins/nls/it/InsertEntity.js corelib/dojox/editor/plugins/nls/it/LocalImage.js corelib/dojox/editor/plugins/nls/it/PageBreak.js corelib/dojox/editor/plugins/nls/it/PasteFromWord.js corelib/dojox/editor/plugins/nls/it/Preview.js corelib/dojox/editor/plugins/nls/it/SafePaste.js corelib/dojox/editor/plugins/nls/it/Save.js corelib/dojox/editor/plugins/nls/it/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/it/Smiley.js corelib/dojox/editor/plugins/nls/it/SpellCheck.js corelib/dojox/editor/plugins/nls/it/TableDialog.js corelib/dojox/editor/plugins/nls/it/TextColor.js corelib/dojox/editor/plugins/nls/it/latinEntities.js corelib/dojox/editor/plugins/nls/ja/AutoSave.js corelib/dojox/editor/plugins/nls/ja/BidiSupport.js corelib/dojox/editor/plugins/nls/ja/Blockquote.js corelib/dojox/editor/plugins/nls/ja/Breadcrumb.js corelib/dojox/editor/plugins/nls/ja/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/ja/FindReplace.js corelib/dojox/editor/plugins/nls/ja/InsertAnchor.js corelib/dojox/editor/plugins/nls/ja/InsertEntity.js corelib/dojox/editor/plugins/nls/ja/LocalImage.js corelib/dojox/editor/plugins/nls/ja/PageBreak.js corelib/dojox/editor/plugins/nls/ja/PasteFromWord.js corelib/dojox/editor/plugins/nls/ja/Preview.js corelib/dojox/editor/plugins/nls/ja/SafePaste.js corelib/dojox/editor/plugins/nls/ja/Save.js corelib/dojox/editor/plugins/nls/ja/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/ja/Smiley.js corelib/dojox/editor/plugins/nls/ja/SpellCheck.js corelib/dojox/editor/plugins/nls/ja/TableDialog.js corelib/dojox/editor/plugins/nls/ja/TextColor.js corelib/dojox/editor/plugins/nls/ja/latinEntities.js corelib/dojox/editor/plugins/nls/kk/AutoSave.js corelib/dojox/editor/plugins/nls/kk/BidiSupport.js corelib/dojox/editor/plugins/nls/kk/Blockquote.js corelib/dojox/editor/plugins/nls/kk/Breadcrumb.js corelib/dojox/editor/plugins/nls/kk/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/kk/FindReplace.js corelib/dojox/editor/plugins/nls/kk/InsertAnchor.js corelib/dojox/editor/plugins/nls/kk/InsertEntity.js corelib/dojox/editor/plugins/nls/kk/LocalImage.js corelib/dojox/editor/plugins/nls/kk/PageBreak.js corelib/dojox/editor/plugins/nls/kk/PasteFromWord.js corelib/dojox/editor/plugins/nls/kk/Preview.js corelib/dojox/editor/plugins/nls/kk/SafePaste.js corelib/dojox/editor/plugins/nls/kk/Save.js corelib/dojox/editor/plugins/nls/kk/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/kk/Smiley.js corelib/dojox/editor/plugins/nls/kk/SpellCheck.js corelib/dojox/editor/plugins/nls/kk/TableDialog.js corelib/dojox/editor/plugins/nls/kk/TextColor.js corelib/dojox/editor/plugins/nls/kk/latinEntities.js corelib/dojox/editor/plugins/nls/ko/AutoSave.js corelib/dojox/editor/plugins/nls/ko/BidiSupport.js corelib/dojox/editor/plugins/nls/ko/Blockquote.js corelib/dojox/editor/plugins/nls/ko/Breadcrumb.js corelib/dojox/editor/plugins/nls/ko/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/ko/FindReplace.js corelib/dojox/editor/plugins/nls/ko/InsertAnchor.js corelib/dojox/editor/plugins/nls/ko/InsertEntity.js corelib/dojox/editor/plugins/nls/ko/LocalImage.js corelib/dojox/editor/plugins/nls/ko/PageBreak.js corelib/dojox/editor/plugins/nls/ko/PasteFromWord.js corelib/dojox/editor/plugins/nls/ko/Preview.js corelib/dojox/editor/plugins/nls/ko/SafePaste.js corelib/dojox/editor/plugins/nls/ko/Save.js corelib/dojox/editor/plugins/nls/ko/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/ko/Smiley.js corelib/dojox/editor/plugins/nls/ko/SpellCheck.js corelib/dojox/editor/plugins/nls/ko/TableDialog.js corelib/dojox/editor/plugins/nls/ko/TextColor.js corelib/dojox/editor/plugins/nls/ko/latinEntities.js corelib/dojox/editor/plugins/nls/latinEntities.js corelib/dojox/editor/plugins/nls/mk/AutoSave.js corelib/dojox/editor/plugins/nls/mk/BidiSupport.js corelib/dojox/editor/plugins/nls/mk/Blockquote.js corelib/dojox/editor/plugins/nls/mk/Breadcrumb.js corelib/dojox/editor/plugins/nls/mk/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/mk/FindReplace.js corelib/dojox/editor/plugins/nls/mk/InsertAnchor.js corelib/dojox/editor/plugins/nls/mk/InsertEntity.js corelib/dojox/editor/plugins/nls/mk/LocalImage.js corelib/dojox/editor/plugins/nls/mk/PageBreak.js corelib/dojox/editor/plugins/nls/mk/PasteFromWord.js corelib/dojox/editor/plugins/nls/mk/Preview.js corelib/dojox/editor/plugins/nls/mk/SafePaste.js corelib/dojox/editor/plugins/nls/mk/Save.js corelib/dojox/editor/plugins/nls/mk/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/mk/Smiley.js corelib/dojox/editor/plugins/nls/mk/SpellCheck.js corelib/dojox/editor/plugins/nls/mk/TableDialog.js corelib/dojox/editor/plugins/nls/mk/TextColor.js corelib/dojox/editor/plugins/nls/mk/latinEntities.js corelib/dojox/editor/plugins/nls/nb/AutoSave.js corelib/dojox/editor/plugins/nls/nb/BidiSupport.js corelib/dojox/editor/plugins/nls/nb/Blockquote.js corelib/dojox/editor/plugins/nls/nb/Breadcrumb.js corelib/dojox/editor/plugins/nls/nb/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/nb/FindReplace.js corelib/dojox/editor/plugins/nls/nb/InsertAnchor.js corelib/dojox/editor/plugins/nls/nb/InsertEntity.js corelib/dojox/editor/plugins/nls/nb/LocalImage.js corelib/dojox/editor/plugins/nls/nb/PageBreak.js corelib/dojox/editor/plugins/nls/nb/PasteFromWord.js corelib/dojox/editor/plugins/nls/nb/Preview.js corelib/dojox/editor/plugins/nls/nb/SafePaste.js corelib/dojox/editor/plugins/nls/nb/Save.js corelib/dojox/editor/plugins/nls/nb/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/nb/Smiley.js corelib/dojox/editor/plugins/nls/nb/SpellCheck.js corelib/dojox/editor/plugins/nls/nb/TableDialog.js corelib/dojox/editor/plugins/nls/nb/TextColor.js corelib/dojox/editor/plugins/nls/nb/latinEntities.js corelib/dojox/editor/plugins/nls/nl/AutoSave.js corelib/dojox/editor/plugins/nls/nl/BidiSupport.js corelib/dojox/editor/plugins/nls/nl/Blockquote.js corelib/dojox/editor/plugins/nls/nl/Breadcrumb.js corelib/dojox/editor/plugins/nls/nl/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/nl/FindReplace.js corelib/dojox/editor/plugins/nls/nl/InsertAnchor.js corelib/dojox/editor/plugins/nls/nl/InsertEntity.js corelib/dojox/editor/plugins/nls/nl/LocalImage.js corelib/dojox/editor/plugins/nls/nl/PageBreak.js corelib/dojox/editor/plugins/nls/nl/PasteFromWord.js corelib/dojox/editor/plugins/nls/nl/Preview.js corelib/dojox/editor/plugins/nls/nl/SafePaste.js corelib/dojox/editor/plugins/nls/nl/Save.js corelib/dojox/editor/plugins/nls/nl/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/nl/Smiley.js corelib/dojox/editor/plugins/nls/nl/SpellCheck.js corelib/dojox/editor/plugins/nls/nl/TableDialog.js corelib/dojox/editor/plugins/nls/nl/TextColor.js corelib/dojox/editor/plugins/nls/nl/latinEntities.js corelib/dojox/editor/plugins/nls/pl/AutoSave.js corelib/dojox/editor/plugins/nls/pl/BidiSupport.js corelib/dojox/editor/plugins/nls/pl/Blockquote.js corelib/dojox/editor/plugins/nls/pl/Breadcrumb.js corelib/dojox/editor/plugins/nls/pl/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/pl/FindReplace.js corelib/dojox/editor/plugins/nls/pl/InsertAnchor.js corelib/dojox/editor/plugins/nls/pl/InsertEntity.js corelib/dojox/editor/plugins/nls/pl/LocalImage.js corelib/dojox/editor/plugins/nls/pl/PageBreak.js corelib/dojox/editor/plugins/nls/pl/PasteFromWord.js corelib/dojox/editor/plugins/nls/pl/Preview.js corelib/dojox/editor/plugins/nls/pl/SafePaste.js corelib/dojox/editor/plugins/nls/pl/Save.js corelib/dojox/editor/plugins/nls/pl/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/pl/Smiley.js corelib/dojox/editor/plugins/nls/pl/SpellCheck.js corelib/dojox/editor/plugins/nls/pl/TableDialog.js corelib/dojox/editor/plugins/nls/pl/TextColor.js corelib/dojox/editor/plugins/nls/pl/latinEntities.js corelib/dojox/editor/plugins/nls/pt-pt/AutoSave.js corelib/dojox/editor/plugins/nls/pt-pt/BidiSupport.js corelib/dojox/editor/plugins/nls/pt-pt/Blockquote.js corelib/dojox/editor/plugins/nls/pt-pt/Breadcrumb.js corelib/dojox/editor/plugins/nls/pt-pt/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/pt-pt/FindReplace.js corelib/dojox/editor/plugins/nls/pt-pt/InsertAnchor.js corelib/dojox/editor/plugins/nls/pt-pt/InsertEntity.js corelib/dojox/editor/plugins/nls/pt-pt/LocalImage.js corelib/dojox/editor/plugins/nls/pt-pt/PageBreak.js corelib/dojox/editor/plugins/nls/pt-pt/PasteFromWord.js corelib/dojox/editor/plugins/nls/pt-pt/Preview.js corelib/dojox/editor/plugins/nls/pt-pt/SafePaste.js corelib/dojox/editor/plugins/nls/pt-pt/Save.js corelib/dojox/editor/plugins/nls/pt-pt/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/pt-pt/Smiley.js corelib/dojox/editor/plugins/nls/pt-pt/SpellCheck.js corelib/dojox/editor/plugins/nls/pt-pt/TableDialog.js corelib/dojox/editor/plugins/nls/pt-pt/TextColor.js corelib/dojox/editor/plugins/nls/pt-pt/latinEntities.js corelib/dojox/editor/plugins/nls/pt/AutoSave.js corelib/dojox/editor/plugins/nls/pt/BidiSupport.js corelib/dojox/editor/plugins/nls/pt/Blockquote.js corelib/dojox/editor/plugins/nls/pt/Breadcrumb.js corelib/dojox/editor/plugins/nls/pt/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/pt/FindReplace.js corelib/dojox/editor/plugins/nls/pt/InsertAnchor.js corelib/dojox/editor/plugins/nls/pt/InsertEntity.js corelib/dojox/editor/plugins/nls/pt/LocalImage.js corelib/dojox/editor/plugins/nls/pt/PageBreak.js corelib/dojox/editor/plugins/nls/pt/PasteFromWord.js corelib/dojox/editor/plugins/nls/pt/Preview.js corelib/dojox/editor/plugins/nls/pt/SafePaste.js corelib/dojox/editor/plugins/nls/pt/Save.js corelib/dojox/editor/plugins/nls/pt/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/pt/Smiley.js corelib/dojox/editor/plugins/nls/pt/SpellCheck.js corelib/dojox/editor/plugins/nls/pt/TableDialog.js corelib/dojox/editor/plugins/nls/pt/TextColor.js corelib/dojox/editor/plugins/nls/pt/latinEntities.js corelib/dojox/editor/plugins/nls/ro/AutoSave.js corelib/dojox/editor/plugins/nls/ro/BidiSupport.js corelib/dojox/editor/plugins/nls/ro/Blockquote.js corelib/dojox/editor/plugins/nls/ro/Breadcrumb.js corelib/dojox/editor/plugins/nls/ro/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/ro/FindReplace.js corelib/dojox/editor/plugins/nls/ro/InsertAnchor.js corelib/dojox/editor/plugins/nls/ro/InsertEntity.js corelib/dojox/editor/plugins/nls/ro/LocalImage.js corelib/dojox/editor/plugins/nls/ro/PageBreak.js corelib/dojox/editor/plugins/nls/ro/PasteFromWord.js corelib/dojox/editor/plugins/nls/ro/Preview.js corelib/dojox/editor/plugins/nls/ro/SafePaste.js corelib/dojox/editor/plugins/nls/ro/Save.js corelib/dojox/editor/plugins/nls/ro/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/ro/Smiley.js corelib/dojox/editor/plugins/nls/ro/SpellCheck.js corelib/dojox/editor/plugins/nls/ro/TableDialog.js corelib/dojox/editor/plugins/nls/ro/TextColor.js corelib/dojox/editor/plugins/nls/ro/latinEntities.js corelib/dojox/editor/plugins/nls/ru/AutoSave.js corelib/dojox/editor/plugins/nls/ru/BidiSupport.js corelib/dojox/editor/plugins/nls/ru/Blockquote.js corelib/dojox/editor/plugins/nls/ru/Breadcrumb.js corelib/dojox/editor/plugins/nls/ru/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/ru/FindReplace.js corelib/dojox/editor/plugins/nls/ru/InsertAnchor.js corelib/dojox/editor/plugins/nls/ru/InsertEntity.js corelib/dojox/editor/plugins/nls/ru/LocalImage.js corelib/dojox/editor/plugins/nls/ru/PageBreak.js corelib/dojox/editor/plugins/nls/ru/PasteFromWord.js corelib/dojox/editor/plugins/nls/ru/Preview.js corelib/dojox/editor/plugins/nls/ru/SafePaste.js corelib/dojox/editor/plugins/nls/ru/Save.js corelib/dojox/editor/plugins/nls/ru/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/ru/Smiley.js corelib/dojox/editor/plugins/nls/ru/SpellCheck.js corelib/dojox/editor/plugins/nls/ru/TableDialog.js corelib/dojox/editor/plugins/nls/ru/TextColor.js corelib/dojox/editor/plugins/nls/ru/latinEntities.js corelib/dojox/editor/plugins/nls/sk/AutoSave.js corelib/dojox/editor/plugins/nls/sk/BidiSupport.js corelib/dojox/editor/plugins/nls/sk/Blockquote.js corelib/dojox/editor/plugins/nls/sk/Breadcrumb.js corelib/dojox/editor/plugins/nls/sk/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/sk/FindReplace.js corelib/dojox/editor/plugins/nls/sk/InsertAnchor.js corelib/dojox/editor/plugins/nls/sk/InsertEntity.js corelib/dojox/editor/plugins/nls/sk/LocalImage.js corelib/dojox/editor/plugins/nls/sk/PageBreak.js corelib/dojox/editor/plugins/nls/sk/PasteFromWord.js corelib/dojox/editor/plugins/nls/sk/Preview.js corelib/dojox/editor/plugins/nls/sk/SafePaste.js corelib/dojox/editor/plugins/nls/sk/Save.js corelib/dojox/editor/plugins/nls/sk/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/sk/Smiley.js corelib/dojox/editor/plugins/nls/sk/SpellCheck.js corelib/dojox/editor/plugins/nls/sk/TableDialog.js corelib/dojox/editor/plugins/nls/sk/TextColor.js corelib/dojox/editor/plugins/nls/sk/latinEntities.js corelib/dojox/editor/plugins/nls/sl/AutoSave.js corelib/dojox/editor/plugins/nls/sl/BidiSupport.js corelib/dojox/editor/plugins/nls/sl/Blockquote.js corelib/dojox/editor/plugins/nls/sl/Breadcrumb.js corelib/dojox/editor/plugins/nls/sl/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/sl/FindReplace.js corelib/dojox/editor/plugins/nls/sl/InsertAnchor.js corelib/dojox/editor/plugins/nls/sl/InsertEntity.js corelib/dojox/editor/plugins/nls/sl/LocalImage.js corelib/dojox/editor/plugins/nls/sl/PageBreak.js corelib/dojox/editor/plugins/nls/sl/PasteFromWord.js corelib/dojox/editor/plugins/nls/sl/Preview.js corelib/dojox/editor/plugins/nls/sl/SafePaste.js corelib/dojox/editor/plugins/nls/sl/Save.js corelib/dojox/editor/plugins/nls/sl/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/sl/Smiley.js corelib/dojox/editor/plugins/nls/sl/SpellCheck.js corelib/dojox/editor/plugins/nls/sl/TableDialog.js corelib/dojox/editor/plugins/nls/sl/TextColor.js corelib/dojox/editor/plugins/nls/sl/latinEntities.js corelib/dojox/editor/plugins/nls/sr/AutoSave.js corelib/dojox/editor/plugins/nls/sr/BidiSupport.js corelib/dojox/editor/plugins/nls/sr/Blockquote.js corelib/dojox/editor/plugins/nls/sr/Breadcrumb.js corelib/dojox/editor/plugins/nls/sr/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/sr/FindReplace.js corelib/dojox/editor/plugins/nls/sr/InsertAnchor.js corelib/dojox/editor/plugins/nls/sr/InsertEntity.js corelib/dojox/editor/plugins/nls/sr/LocalImage.js corelib/dojox/editor/plugins/nls/sr/PageBreak.js corelib/dojox/editor/plugins/nls/sr/PasteFromWord.js corelib/dojox/editor/plugins/nls/sr/Preview.js corelib/dojox/editor/plugins/nls/sr/SafePaste.js corelib/dojox/editor/plugins/nls/sr/Save.js corelib/dojox/editor/plugins/nls/sr/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/sr/Smiley.js corelib/dojox/editor/plugins/nls/sr/SpellCheck.js corelib/dojox/editor/plugins/nls/sr/TableDialog.js corelib/dojox/editor/plugins/nls/sr/TextColor.js corelib/dojox/editor/plugins/nls/sr/latinEntities.js corelib/dojox/editor/plugins/nls/sv/AutoSave.js corelib/dojox/editor/plugins/nls/sv/BidiSupport.js corelib/dojox/editor/plugins/nls/sv/Blockquote.js corelib/dojox/editor/plugins/nls/sv/Breadcrumb.js corelib/dojox/editor/plugins/nls/sv/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/sv/FindReplace.js corelib/dojox/editor/plugins/nls/sv/InsertAnchor.js corelib/dojox/editor/plugins/nls/sv/InsertEntity.js corelib/dojox/editor/plugins/nls/sv/LocalImage.js corelib/dojox/editor/plugins/nls/sv/PageBreak.js corelib/dojox/editor/plugins/nls/sv/PasteFromWord.js corelib/dojox/editor/plugins/nls/sv/Preview.js corelib/dojox/editor/plugins/nls/sv/SafePaste.js corelib/dojox/editor/plugins/nls/sv/Save.js corelib/dojox/editor/plugins/nls/sv/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/sv/Smiley.js corelib/dojox/editor/plugins/nls/sv/SpellCheck.js corelib/dojox/editor/plugins/nls/sv/TableDialog.js corelib/dojox/editor/plugins/nls/sv/TextColor.js corelib/dojox/editor/plugins/nls/sv/latinEntities.js corelib/dojox/editor/plugins/nls/th/AutoSave.js corelib/dojox/editor/plugins/nls/th/BidiSupport.js corelib/dojox/editor/plugins/nls/th/Blockquote.js corelib/dojox/editor/plugins/nls/th/Breadcrumb.js corelib/dojox/editor/plugins/nls/th/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/th/FindReplace.js corelib/dojox/editor/plugins/nls/th/InsertAnchor.js corelib/dojox/editor/plugins/nls/th/InsertEntity.js corelib/dojox/editor/plugins/nls/th/LocalImage.js corelib/dojox/editor/plugins/nls/th/PageBreak.js corelib/dojox/editor/plugins/nls/th/PasteFromWord.js corelib/dojox/editor/plugins/nls/th/Preview.js corelib/dojox/editor/plugins/nls/th/SafePaste.js corelib/dojox/editor/plugins/nls/th/Save.js corelib/dojox/editor/plugins/nls/th/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/th/Smiley.js corelib/dojox/editor/plugins/nls/th/SpellCheck.js corelib/dojox/editor/plugins/nls/th/TableDialog.js corelib/dojox/editor/plugins/nls/th/TextColor.js corelib/dojox/editor/plugins/nls/th/latinEntities.js corelib/dojox/editor/plugins/nls/tr/AutoSave.js corelib/dojox/editor/plugins/nls/tr/BidiSupport.js corelib/dojox/editor/plugins/nls/tr/Blockquote.js corelib/dojox/editor/plugins/nls/tr/Breadcrumb.js corelib/dojox/editor/plugins/nls/tr/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/tr/FindReplace.js corelib/dojox/editor/plugins/nls/tr/InsertAnchor.js corelib/dojox/editor/plugins/nls/tr/InsertEntity.js corelib/dojox/editor/plugins/nls/tr/LocalImage.js corelib/dojox/editor/plugins/nls/tr/PageBreak.js corelib/dojox/editor/plugins/nls/tr/PasteFromWord.js corelib/dojox/editor/plugins/nls/tr/Preview.js corelib/dojox/editor/plugins/nls/tr/SafePaste.js corelib/dojox/editor/plugins/nls/tr/Save.js corelib/dojox/editor/plugins/nls/tr/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/tr/Smiley.js corelib/dojox/editor/plugins/nls/tr/SpellCheck.js corelib/dojox/editor/plugins/nls/tr/TableDialog.js corelib/dojox/editor/plugins/nls/tr/TextColor.js corelib/dojox/editor/plugins/nls/tr/latinEntities.js corelib/dojox/editor/plugins/nls/uk/AutoSave.js corelib/dojox/editor/plugins/nls/uk/BidiSupport.js corelib/dojox/editor/plugins/nls/uk/Blockquote.js corelib/dojox/editor/plugins/nls/uk/Breadcrumb.js corelib/dojox/editor/plugins/nls/uk/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/uk/FindReplace.js corelib/dojox/editor/plugins/nls/uk/InsertAnchor.js corelib/dojox/editor/plugins/nls/uk/InsertEntity.js corelib/dojox/editor/plugins/nls/uk/LocalImage.js corelib/dojox/editor/plugins/nls/uk/PageBreak.js corelib/dojox/editor/plugins/nls/uk/PasteFromWord.js corelib/dojox/editor/plugins/nls/uk/Preview.js corelib/dojox/editor/plugins/nls/uk/SafePaste.js corelib/dojox/editor/plugins/nls/uk/Save.js corelib/dojox/editor/plugins/nls/uk/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/uk/Smiley.js corelib/dojox/editor/plugins/nls/uk/SpellCheck.js corelib/dojox/editor/plugins/nls/uk/TableDialog.js corelib/dojox/editor/plugins/nls/uk/TextColor.js corelib/dojox/editor/plugins/nls/uk/latinEntities.js corelib/dojox/editor/plugins/nls/zh-hk/AutoSave.js corelib/dojox/editor/plugins/nls/zh-hk/BidiSupport.js corelib/dojox/editor/plugins/nls/zh-hk/Blockquote.js corelib/dojox/editor/plugins/nls/zh-hk/Breadcrumb.js corelib/dojox/editor/plugins/nls/zh-hk/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/zh-hk/FindReplace.js corelib/dojox/editor/plugins/nls/zh-hk/InsertAnchor.js corelib/dojox/editor/plugins/nls/zh-hk/InsertEntity.js corelib/dojox/editor/plugins/nls/zh-hk/LocalImage.js corelib/dojox/editor/plugins/nls/zh-hk/PageBreak.js corelib/dojox/editor/plugins/nls/zh-hk/PasteFromWord.js corelib/dojox/editor/plugins/nls/zh-hk/Preview.js corelib/dojox/editor/plugins/nls/zh-hk/SafePaste.js corelib/dojox/editor/plugins/nls/zh-hk/Save.js corelib/dojox/editor/plugins/nls/zh-hk/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/zh-hk/Smiley.js corelib/dojox/editor/plugins/nls/zh-hk/SpellCheck.js corelib/dojox/editor/plugins/nls/zh-hk/TableDialog.js corelib/dojox/editor/plugins/nls/zh-hk/TextColor.js corelib/dojox/editor/plugins/nls/zh-hk/latinEntities.js corelib/dojox/editor/plugins/nls/zh-tw/AutoSave.js corelib/dojox/editor/plugins/nls/zh-tw/BidiSupport.js corelib/dojox/editor/plugins/nls/zh-tw/Blockquote.js corelib/dojox/editor/plugins/nls/zh-tw/Breadcrumb.js corelib/dojox/editor/plugins/nls/zh-tw/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/zh-tw/FindReplace.js corelib/dojox/editor/plugins/nls/zh-tw/InsertAnchor.js corelib/dojox/editor/plugins/nls/zh-tw/InsertEntity.js corelib/dojox/editor/plugins/nls/zh-tw/LocalImage.js corelib/dojox/editor/plugins/nls/zh-tw/PageBreak.js corelib/dojox/editor/plugins/nls/zh-tw/PasteFromWord.js corelib/dojox/editor/plugins/nls/zh-tw/Preview.js corelib/dojox/editor/plugins/nls/zh-tw/SafePaste.js corelib/dojox/editor/plugins/nls/zh-tw/Save.js corelib/dojox/editor/plugins/nls/zh-tw/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/zh-tw/Smiley.js corelib/dojox/editor/plugins/nls/zh-tw/SpellCheck.js corelib/dojox/editor/plugins/nls/zh-tw/TableDialog.js corelib/dojox/editor/plugins/nls/zh-tw/TextColor.js corelib/dojox/editor/plugins/nls/zh-tw/latinEntities.js corelib/dojox/editor/plugins/nls/zh/AutoSave.js corelib/dojox/editor/plugins/nls/zh/BidiSupport.js corelib/dojox/editor/plugins/nls/zh/Blockquote.js corelib/dojox/editor/plugins/nls/zh/Breadcrumb.js corelib/dojox/editor/plugins/nls/zh/CollapsibleToolbar.js corelib/dojox/editor/plugins/nls/zh/FindReplace.js corelib/dojox/editor/plugins/nls/zh/InsertAnchor.js corelib/dojox/editor/plugins/nls/zh/InsertEntity.js corelib/dojox/editor/plugins/nls/zh/LocalImage.js corelib/dojox/editor/plugins/nls/zh/PageBreak.js corelib/dojox/editor/plugins/nls/zh/PasteFromWord.js corelib/dojox/editor/plugins/nls/zh/Preview.js corelib/dojox/editor/plugins/nls/zh/SafePaste.js corelib/dojox/editor/plugins/nls/zh/Save.js corelib/dojox/editor/plugins/nls/zh/ShowBlockNodes.js corelib/dojox/editor/plugins/nls/zh/Smiley.js corelib/dojox/editor/plugins/nls/zh/SpellCheck.js corelib/dojox/editor/plugins/nls/zh/TableDialog.js corelib/dojox/editor/plugins/nls/zh/TextColor.js corelib/dojox/editor/plugins/nls/zh/latinEntities.js corelib/dojox/editor/plugins/resources/css/AutoSave.css corelib/dojox/editor/plugins/resources/css/BidiSupport.css corelib/dojox/editor/plugins/resources/css/BidiSupport_rtl.css corelib/dojox/editor/plugins/resources/css/Blockquote.css corelib/dojox/editor/plugins/resources/css/Breadcrumb.css corelib/dojox/editor/plugins/resources/css/CollapsibleToolbar.css corelib/dojox/editor/plugins/resources/css/FindReplace.css corelib/dojox/editor/plugins/resources/css/InsertAnchor.css corelib/dojox/editor/plugins/resources/css/InsertEntity.css corelib/dojox/editor/plugins/resources/css/LocalImage.css corelib/dojox/editor/plugins/resources/css/PageBreak.css corelib/dojox/editor/plugins/resources/css/PasteFromWord.css corelib/dojox/editor/plugins/resources/css/Preview.css corelib/dojox/editor/plugins/resources/css/SafePaste.css corelib/dojox/editor/plugins/resources/css/Save.css corelib/dojox/editor/plugins/resources/css/ShowBlockNodes.css corelib/dojox/editor/plugins/resources/css/Smiley.css corelib/dojox/editor/plugins/resources/css/SpellCheck.css corelib/dojox/editor/plugins/resources/css/StatusBar.css corelib/dojox/editor/plugins/resources/css/TextColor.css corelib/dojox/editor/plugins/resources/editorPlugins.css corelib/dojox/editor/plugins/resources/emoticons/emoticonAngel.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonAngry.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonCool.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonCrying.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonEyebrow.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonFrown.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonGoofy.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonGrin.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonHalf.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonHappy.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonIdea.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonLaughing.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonNo.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonOops.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonShy.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonSmile.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonTongue.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonWink.gif corelib/dojox/editor/plugins/resources/emoticons/emoticonYes.gif corelib/dojox/editor/plugins/resources/icons/anchor.gif corelib/dojox/editor/plugins/resources/icons/anchorDisabled.gif corelib/dojox/editor/plugins/resources/icons/autoSave.png corelib/dojox/editor/plugins/resources/icons/blockquote.gif corelib/dojox/editor/plugins/resources/icons/blockquoteDisabled.gif corelib/dojox/editor/plugins/resources/icons/breadcrumbDown.gif corelib/dojox/editor/plugins/resources/icons/claro/close.gif corelib/dojox/editor/plugins/resources/icons/editorIconsFindReplaceDisabled.png corelib/dojox/editor/plugins/resources/icons/editorIconsFindReplaceEnabled.png corelib/dojox/editor/plugins/resources/icons/insertEntity.gif corelib/dojox/editor/plugins/resources/icons/insertEntityDisabled.gif corelib/dojox/editor/plugins/resources/icons/nihilo/close.gif corelib/dojox/editor/plugins/resources/icons/pageBreak.gif corelib/dojox/editor/plugins/resources/icons/pageBreakDisabled.gif corelib/dojox/editor/plugins/resources/icons/pasteFromWord.gif corelib/dojox/editor/plugins/resources/icons/pasteFromWordDisabled.gif corelib/dojox/editor/plugins/resources/icons/preview.gif corelib/dojox/editor/plugins/resources/icons/previewDisabled.gif corelib/dojox/editor/plugins/resources/icons/save.gif corelib/dojox/editor/plugins/resources/icons/saveDisabled.gif corelib/dojox/editor/plugins/resources/icons/showBlockNodes.gif corelib/dojox/editor/plugins/resources/icons/showBlockNodesDisabled.gif corelib/dojox/editor/plugins/resources/icons/smiley.gif corelib/dojox/editor/plugins/resources/icons/smileyDisabled.gif corelib/dojox/editor/plugins/resources/icons/soria/close.gif corelib/dojox/editor/plugins/resources/icons/spellcheck.gif corelib/dojox/editor/plugins/resources/icons/tundra/close.gif corelib/dojox/editor/plugins/resources/images/anchor.gif corelib/dojox/editor/plugins/resources/images/bidiIconsDisabled.png corelib/dojox/editor/plugins/resources/images/bidiIconsDisabled_rtl.png corelib/dojox/editor/plugins/resources/images/bidiIconsEnabled.png corelib/dojox/editor/plugins/resources/images/bidiIconsEnabled_rtl.png corelib/dojox/editor/plugins/resources/images/blockelems/address.gif corelib/dojox/editor/plugins/resources/images/blockelems/blockquote.gif corelib/dojox/editor/plugins/resources/images/blockelems/button.gif corelib/dojox/editor/plugins/resources/images/blockelems/center.gif corelib/dojox/editor/plugins/resources/images/blockelems/dd.gif corelib/dojox/editor/plugins/resources/images/blockelems/del.gif corelib/dojox/editor/plugins/resources/images/blockelems/div.gif corelib/dojox/editor/plugins/resources/images/blockelems/dt.gif corelib/dojox/editor/plugins/resources/images/blockelems/fieldset.gif corelib/dojox/editor/plugins/resources/images/blockelems/form.gif corelib/dojox/editor/plugins/resources/images/blockelems/h1.gif corelib/dojox/editor/plugins/resources/images/blockelems/h2.gif corelib/dojox/editor/plugins/resources/images/blockelems/h3.gif corelib/dojox/editor/plugins/resources/images/blockelems/h4.gif corelib/dojox/editor/plugins/resources/images/blockelems/h5.gif corelib/dojox/editor/plugins/resources/images/blockelems/h6.gif corelib/dojox/editor/plugins/resources/images/blockelems/hr.gif corelib/dojox/editor/plugins/resources/images/blockelems/iframe.gif corelib/dojox/editor/plugins/resources/images/blockelems/ins.gif corelib/dojox/editor/plugins/resources/images/blockelems/li.gif corelib/dojox/editor/plugins/resources/images/blockelems/map.gif corelib/dojox/editor/plugins/resources/images/blockelems/noscript.gif corelib/dojox/editor/plugins/resources/images/blockelems/object.gif corelib/dojox/editor/plugins/resources/images/blockelems/ol.gif corelib/dojox/editor/plugins/resources/images/blockelems/p.gif corelib/dojox/editor/plugins/resources/images/blockelems/pre.gif corelib/dojox/editor/plugins/resources/images/blockelems/script.gif corelib/dojox/editor/plugins/resources/images/blockelems/table.gif corelib/dojox/editor/plugins/resources/images/blockelems/ul.gif corelib/dojox/editor/plugins/resources/images/busy.gif corelib/dojox/editor/plugins/resources/images/cellpad.png corelib/dojox/editor/plugins/resources/images/cellspace.png corelib/dojox/editor/plugins/resources/images/checking.gif corelib/dojox/editor/plugins/resources/images/claro/collapse.gif corelib/dojox/editor/plugins/resources/images/claro/expand.gif corelib/dojox/editor/plugins/resources/images/nihilo/collapse.gif corelib/dojox/editor/plugins/resources/images/nihilo/expand.gif corelib/dojox/editor/plugins/resources/images/nihilo/sidebar.gif corelib/dojox/editor/plugins/resources/images/soria/collapse.gif corelib/dojox/editor/plugins/resources/images/soria/expand.gif corelib/dojox/editor/plugins/resources/images/soria/sidebar.gif corelib/dojox/editor/plugins/resources/images/tableIcons.png corelib/dojox/editor/plugins/resources/images/tableIcons_rtl.png corelib/dojox/editor/plugins/resources/images/tundra/collapse.gif corelib/dojox/editor/plugins/resources/images/tundra/expand.gif corelib/dojox/editor/plugins/resources/images/tundra/sidebar.gif corelib/dojox/editor/plugins/resources/images/uploadImageIcon.gif corelib/dojox/editor/plugins/resources/insertTable.html corelib/dojox/editor/plugins/resources/modifyTable.html corelib/dojox/embed/Flash.js corelib/dojox/embed/Object.js corelib/dojox/embed/Quicktime.js corelib/dojox/embed/README corelib/dojox/embed/flashVars.js corelib/dojox/embed/resources/version.mov corelib/dojox/encoding/LICENSE corelib/dojox/encoding/README corelib/dojox/encoding/_base.js corelib/dojox/encoding/ascii85.js corelib/dojox/encoding/base64.js corelib/dojox/encoding/bits.js corelib/dojox/encoding/compression/lzw.js corelib/dojox/encoding/compression/splay.js corelib/dojox/encoding/crypto/Blowfish.js corelib/dojox/encoding/crypto/RSAKey-ext.js corelib/dojox/encoding/crypto/RSAKey.js corelib/dojox/encoding/crypto/SimpleAES.js corelib/dojox/encoding/crypto/_base.js corelib/dojox/encoding/digests/MD5.js corelib/dojox/encoding/digests/SHA1.js corelib/dojox/encoding/digests/SHA224.js corelib/dojox/encoding/digests/SHA256.js corelib/dojox/encoding/digests/SHA384.js corelib/dojox/encoding/digests/SHA512.js corelib/dojox/encoding/digests/_base.js corelib/dojox/encoding/digests/_sha-32.js corelib/dojox/encoding/digests/_sha-64.js corelib/dojox/encoding/digests/_sha2.js corelib/dojox/encoding/easy64.js corelib/dojox/flash.js corelib/dojox/flash/DojoExternalInterface.as corelib/dojox/flash/ExpressInstall.as corelib/dojox/flash/README corelib/dojox/flash/_base.js corelib/dojox/form/BusyButton.js corelib/dojox/form/BusyComboButton.js corelib/dojox/form/BusyDropDownButton.js corelib/dojox/form/CheckedMultiSelect.js corelib/dojox/form/DateTextBox.js corelib/dojox/form/DayTextBox.js corelib/dojox/form/DropDownSelect.js corelib/dojox/form/DropDownStack.js corelib/dojox/form/FileInput.js corelib/dojox/form/FileInputAuto.js corelib/dojox/form/FileInputBlind.js corelib/dojox/form/FilePickerTextBox.js corelib/dojox/form/FileUploader.js corelib/dojox/form/HorizontalRangeSlider.js corelib/dojox/form/ListInput.js corelib/dojox/form/Manager.js corelib/dojox/form/MonthTextBox.js corelib/dojox/form/MultiComboBox.js corelib/dojox/form/PasswordValidator.js corelib/dojox/form/README corelib/dojox/form/RadioStack.js corelib/dojox/form/RangeSlider.js corelib/dojox/form/Rating.js corelib/dojox/form/TimeSpinner.js corelib/dojox/form/TriStateCheckBox.js corelib/dojox/form/Uploader.js corelib/dojox/form/VerticalRangeSlider.js corelib/dojox/form/YearTextBox.js corelib/dojox/form/_BusyButtonMixin.js corelib/dojox/form/_FormSelectWidget.js corelib/dojox/form/_HasDropDown.js corelib/dojox/form/_RangeSliderMixin.js corelib/dojox/form/_SelectStackMixin.js corelib/dojox/form/manager/_ClassMixin.js corelib/dojox/form/manager/_DisplayMixin.js corelib/dojox/form/manager/_EnableMixin.js corelib/dojox/form/manager/_FormMixin.js corelib/dojox/form/manager/_Mixin.js corelib/dojox/form/manager/_NodeMixin.js corelib/dojox/form/manager/_ValueMixin.js corelib/dojox/form/nls/CheckedMultiSelect.js corelib/dojox/form/nls/PasswordValidator.js corelib/dojox/form/nls/Uploader.js corelib/dojox/form/nls/ar/CheckedMultiSelect.js corelib/dojox/form/nls/ar/PasswordValidator.js corelib/dojox/form/nls/ar/Uploader.js corelib/dojox/form/nls/az/PasswordValidator.js corelib/dojox/form/nls/bg/CheckedMultiSelect.js corelib/dojox/form/nls/bg/PasswordValidator.js corelib/dojox/form/nls/bg/Uploader.js corelib/dojox/form/nls/bs/CheckedMultiSelect.js corelib/dojox/form/nls/bs/PasswordValidator.js corelib/dojox/form/nls/bs/Uploader.js corelib/dojox/form/nls/ca/CheckedMultiSelect.js corelib/dojox/form/nls/ca/PasswordValidator.js corelib/dojox/form/nls/ca/Uploader.js corelib/dojox/form/nls/cs/CheckedMultiSelect.js corelib/dojox/form/nls/cs/PasswordValidator.js corelib/dojox/form/nls/cs/Uploader.js corelib/dojox/form/nls/da/CheckedMultiSelect.js corelib/dojox/form/nls/da/PasswordValidator.js corelib/dojox/form/nls/da/Uploader.js corelib/dojox/form/nls/de/CheckedMultiSelect.js corelib/dojox/form/nls/de/PasswordValidator.js corelib/dojox/form/nls/de/Uploader.js corelib/dojox/form/nls/el/CheckedMultiSelect.js corelib/dojox/form/nls/el/PasswordValidator.js corelib/dojox/form/nls/el/Uploader.js corelib/dojox/form/nls/es/CheckedMultiSelect.js corelib/dojox/form/nls/es/PasswordValidator.js corelib/dojox/form/nls/es/Uploader.js corelib/dojox/form/nls/eu/CheckedMultiSelect.js corelib/dojox/form/nls/eu/PasswordValidator.js corelib/dojox/form/nls/eu/Uploader.js corelib/dojox/form/nls/fi/CheckedMultiSelect.js corelib/dojox/form/nls/fi/PasswordValidator.js corelib/dojox/form/nls/fi/Uploader.js corelib/dojox/form/nls/fr/CheckedMultiSelect.js corelib/dojox/form/nls/fr/PasswordValidator.js corelib/dojox/form/nls/fr/Uploader.js corelib/dojox/form/nls/he/CheckedMultiSelect.js corelib/dojox/form/nls/he/PasswordValidator.js corelib/dojox/form/nls/he/Uploader.js corelib/dojox/form/nls/hi/CheckedMultiSelect.js corelib/dojox/form/nls/hi/PasswordValidator.js corelib/dojox/form/nls/hi/Uploader.js corelib/dojox/form/nls/hr/CheckedMultiSelect.js corelib/dojox/form/nls/hr/PasswordValidator.js corelib/dojox/form/nls/hr/Uploader.js corelib/dojox/form/nls/hu/CheckedMultiSelect.js corelib/dojox/form/nls/hu/PasswordValidator.js corelib/dojox/form/nls/hu/Uploader.js corelib/dojox/form/nls/id/CheckedMultiSelect.js corelib/dojox/form/nls/id/PasswordValidator.js corelib/dojox/form/nls/id/Uploader.js corelib/dojox/form/nls/it/CheckedMultiSelect.js corelib/dojox/form/nls/it/PasswordValidator.js corelib/dojox/form/nls/it/Uploader.js corelib/dojox/form/nls/ja/CheckedMultiSelect.js corelib/dojox/form/nls/ja/PasswordValidator.js corelib/dojox/form/nls/ja/Uploader.js corelib/dojox/form/nls/kk/CheckedMultiSelect.js corelib/dojox/form/nls/kk/PasswordValidator.js corelib/dojox/form/nls/kk/Uploader.js corelib/dojox/form/nls/ko/CheckedMultiSelect.js corelib/dojox/form/nls/ko/PasswordValidator.js corelib/dojox/form/nls/ko/Uploader.js corelib/dojox/form/nls/mk/CheckedMultiSelect.js corelib/dojox/form/nls/mk/PasswordValidator.js corelib/dojox/form/nls/mk/Uploader.js corelib/dojox/form/nls/nb/CheckedMultiSelect.js corelib/dojox/form/nls/nb/PasswordValidator.js corelib/dojox/form/nls/nb/Uploader.js corelib/dojox/form/nls/nl/CheckedMultiSelect.js corelib/dojox/form/nls/nl/PasswordValidator.js corelib/dojox/form/nls/nl/Uploader.js corelib/dojox/form/nls/pl/CheckedMultiSelect.js corelib/dojox/form/nls/pl/PasswordValidator.js corelib/dojox/form/nls/pl/Uploader.js corelib/dojox/form/nls/pt-pt/CheckedMultiSelect.js corelib/dojox/form/nls/pt-pt/PasswordValidator.js corelib/dojox/form/nls/pt-pt/Uploader.js corelib/dojox/form/nls/pt/CheckedMultiSelect.js corelib/dojox/form/nls/pt/PasswordValidator.js corelib/dojox/form/nls/pt/Uploader.js corelib/dojox/form/nls/ro/CheckedMultiSelect.js corelib/dojox/form/nls/ro/PasswordValidator.js corelib/dojox/form/nls/ro/Uploader.js corelib/dojox/form/nls/ru/CheckedMultiSelect.js corelib/dojox/form/nls/ru/PasswordValidator.js corelib/dojox/form/nls/ru/Uploader.js corelib/dojox/form/nls/sk/CheckedMultiSelect.js corelib/dojox/form/nls/sk/PasswordValidator.js corelib/dojox/form/nls/sk/Uploader.js corelib/dojox/form/nls/sl/CheckedMultiSelect.js corelib/dojox/form/nls/sl/PasswordValidator.js corelib/dojox/form/nls/sl/Uploader.js corelib/dojox/form/nls/sr/CheckedMultiSelect.js corelib/dojox/form/nls/sr/PasswordValidator.js corelib/dojox/form/nls/sr/Uploader.js corelib/dojox/form/nls/sv/CheckedMultiSelect.js corelib/dojox/form/nls/sv/PasswordValidator.js corelib/dojox/form/nls/sv/Uploader.js corelib/dojox/form/nls/th/CheckedMultiSelect.js corelib/dojox/form/nls/th/PasswordValidator.js corelib/dojox/form/nls/th/Uploader.js corelib/dojox/form/nls/tr/CheckedMultiSelect.js corelib/dojox/form/nls/tr/PasswordValidator.js corelib/dojox/form/nls/tr/Uploader.js corelib/dojox/form/nls/uk/CheckedMultiSelect.js corelib/dojox/form/nls/uk/PasswordValidator.js corelib/dojox/form/nls/uk/Uploader.js corelib/dojox/form/nls/zh-hk/CheckedMultiSelect.js corelib/dojox/form/nls/zh-hk/PasswordValidator.js corelib/dojox/form/nls/zh-hk/Uploader.js corelib/dojox/form/nls/zh-tw/CheckedMultiSelect.js corelib/dojox/form/nls/zh-tw/PasswordValidator.js corelib/dojox/form/nls/zh-tw/Uploader.js corelib/dojox/form/nls/zh/CheckedMultiSelect.js corelib/dojox/form/nls/zh/PasswordValidator.js corelib/dojox/form/nls/zh/Uploader.js corelib/dojox/form/resources/BusyButton.css corelib/dojox/form/resources/CheckedMultiSelect.css corelib/dojox/form/resources/CheckedMultiSelect.html corelib/dojox/form/resources/FileInput.css corelib/dojox/form/resources/FileInput.html corelib/dojox/form/resources/FileInputAuto.html corelib/dojox/form/resources/FilePickerTextBox.css corelib/dojox/form/resources/FilePickerTextBox.html corelib/dojox/form/resources/FileUploader.css corelib/dojox/form/resources/HorizontalRangeSlider.html corelib/dojox/form/resources/ListInput.css corelib/dojox/form/resources/PasswordValidator.html corelib/dojox/form/resources/RangeSlider.css corelib/dojox/form/resources/Rating.css corelib/dojox/form/resources/ReceiveFile.php corelib/dojox/form/resources/TriStateCheckBox.css corelib/dojox/form/resources/TriStateCheckBox.html corelib/dojox/form/resources/Uploader.html corelib/dojox/form/resources/UploaderFileList.css corelib/dojox/form/resources/UploaderFileList.html corelib/dojox/form/resources/VerticalRangeSlider.html corelib/dojox/form/resources/_CheckedMultiSelectItem.html corelib/dojox/form/resources/_CheckedMultiSelectMenuItem.html corelib/dojox/form/resources/fileuploader.swf corelib/dojox/form/resources/images/loading_wheel.gif corelib/dojox/form/resources/images/nihiloFolderSprite.gif corelib/dojox/form/resources/images/rating_empty.gif corelib/dojox/form/resources/images/rating_full.gif corelib/dojox/form/resources/images/soriaFolderSprite.gif corelib/dojox/form/resources/images/tristatecheckboxStates.png corelib/dojox/form/resources/images/tundraFolderSprite.gif corelib/dojox/form/resources/uploader.swf corelib/dojox/form/uploader/FileList.js corelib/dojox/form/uploader/_Base.js corelib/dojox/form/uploader/_Flash.js corelib/dojox/form/uploader/_HTML5.js corelib/dojox/form/uploader/_IFrame.js corelib/dojox/form/uploader/plugins/Flash.js corelib/dojox/form/uploader/plugins/HTML5.js corelib/dojox/form/uploader/plugins/IFrame.js corelib/dojox/fx.js corelib/dojox/fx/README corelib/dojox/fx/Shadow.js corelib/dojox/fx/Timeline.js corelib/dojox/fx/_arg.js corelib/dojox/fx/_base.js corelib/dojox/fx/_core.js corelib/dojox/fx/easing.js corelib/dojox/fx/ext-dojo/NodeList-style.js corelib/dojox/fx/ext-dojo/NodeList.js corelib/dojox/fx/ext-dojo/complex.js corelib/dojox/fx/ext-dojo/reverse.js corelib/dojox/fx/flip.js corelib/dojox/fx/resources/shadowB.png corelib/dojox/fx/resources/shadowBL.png corelib/dojox/fx/resources/shadowBR.png corelib/dojox/fx/resources/shadowL.png corelib/dojox/fx/resources/shadowR.png corelib/dojox/fx/resources/shadowT.png corelib/dojox/fx/resources/shadowTL.png corelib/dojox/fx/resources/shadowTR.png corelib/dojox/fx/scroll.js corelib/dojox/fx/split.js corelib/dojox/fx/style.js corelib/dojox/fx/text.js corelib/dojox/gantt/GanttChart.js corelib/dojox/gantt/GanttProjectControl.js corelib/dojox/gantt/GanttProjectItem.js corelib/dojox/gantt/GanttResourceItem.js corelib/dojox/gantt/GanttTaskControl.js corelib/dojox/gantt/GanttTaskItem.js corelib/dojox/gantt/README corelib/dojox/gantt/TabMenu.js corelib/dojox/gantt/contextMenuTab.js corelib/dojox/gantt/resources/gantt.css corelib/dojox/gantt/resources/images/am.png corelib/dojox/gantt/resources/images/arrow.gif corelib/dojox/gantt/resources/images/bg.png corelib/dojox/gantt/resources/images/collapse.png corelib/dojox/gantt/resources/images/expand.png corelib/dojox/gantt/resources/images/load.png corelib/dojox/gantt/resources/images/menuHighlight.png corelib/dojox/gantt/resources/images/minus.gif corelib/dojox/gantt/resources/images/ownerBar.png corelib/dojox/gantt/resources/images/parentnode_bg.png corelib/dojox/gantt/resources/images/parentnode_filled.png corelib/dojox/gantt/resources/images/plus.gif corelib/dojox/gantt/resources/images/pm.png corelib/dojox/gantt/resources/images/progress_bg.png corelib/dojox/gantt/resources/images/progress_filled.png corelib/dojox/gantt/resources/images/projProgressBg.png corelib/dojox/gantt/resources/images/projProgressFilled.png corelib/dojox/gantt/resources/images/rbg.png corelib/dojox/gantt/resources/images/resourceBg.png corelib/dojox/gantt/resources/images/resourceHeader.png corelib/dojox/gantt/resources/images/rheader.png corelib/dojox/gantt/resources/images/rowHighlight.png corelib/dojox/gantt/resources/images/save.png corelib/dojox/gantt/resources/images/taskArrow.gif corelib/dojox/gantt/resources/images/taskBar.png corelib/dojox/gantt/resources/images/taskProgressBg.png corelib/dojox/gantt/resources/images/taskProgressFilled.png corelib/dojox/gantt/resources/images/zoomin.png corelib/dojox/gantt/resources/images/zoomintime.png corelib/dojox/gantt/resources/images/zoomout.png corelib/dojox/gantt/resources/images/zoomouttime.png corelib/dojox/gauges/AnalogArcIndicator.js corelib/dojox/gauges/AnalogArrowIndicator.js corelib/dojox/gauges/AnalogCircleIndicator.js corelib/dojox/gauges/AnalogGauge.js corelib/dojox/gauges/AnalogIndicatorBase.js corelib/dojox/gauges/AnalogLineIndicator.js corelib/dojox/gauges/AnalogNeedleIndicator.js corelib/dojox/gauges/BarCircleIndicator.js corelib/dojox/gauges/BarGauge.js corelib/dojox/gauges/BarIndicator.js corelib/dojox/gauges/BarLineIndicator.js corelib/dojox/gauges/GlossyCircularGauge.js corelib/dojox/gauges/GlossyCircularGaugeBase.js corelib/dojox/gauges/GlossyCircularGaugeNeedle.js corelib/dojox/gauges/GlossyHorizontalGauge.js corelib/dojox/gauges/GlossyHorizontalGaugeMarker.js corelib/dojox/gauges/GlossySemiCircularGauge.js corelib/dojox/gauges/Range.js corelib/dojox/gauges/TextIndicator.js corelib/dojox/gauges/_Gauge.css corelib/dojox/gauges/_Gauge.js corelib/dojox/gauges/_Indicator.js corelib/dojox/geo/README corelib/dojox/geo/charting/Feature.js corelib/dojox/geo/charting/KeyboardInteractionSupport.js corelib/dojox/geo/charting/Map.js corelib/dojox/geo/charting/MouseInteractionSupport.js corelib/dojox/geo/charting/TouchInteractionSupport.js corelib/dojox/geo/charting/_Marker.js corelib/dojox/geo/charting/_base.js corelib/dojox/geo/charting/resources/Map.css corelib/dojox/geo/charting/resources/data/Americas.json corelib/dojox/geo/charting/resources/data/AsiaPacific.json corelib/dojox/geo/charting/resources/data/ContinentalEurope.json corelib/dojox/geo/charting/resources/data/EuropeMiddleEastAfrica.json corelib/dojox/geo/charting/resources/data/NOTICES corelib/dojox/geo/charting/resources/data/USStates.json corelib/dojox/geo/charting/resources/data/WorldCountries.json corelib/dojox/geo/charting/resources/data/WorldCountriesMercator.json corelib/dojox/geo/charting/resources/img/zoomin.gif corelib/dojox/geo/charting/resources/img/zoomin.png corelib/dojox/geo/charting/resources/img/zoomout.gif corelib/dojox/geo/charting/resources/img/zoomout.png corelib/dojox/geo/charting/resources/markers/USStates.json corelib/dojox/geo/charting/widget/Legend.js corelib/dojox/geo/charting/widget/Map.js corelib/dojox/geo/openlayers/Collection.js corelib/dojox/geo/openlayers/Feature.js corelib/dojox/geo/openlayers/Geometry.js corelib/dojox/geo/openlayers/GeometryFeature.js corelib/dojox/geo/openlayers/GfxLayer.js corelib/dojox/geo/openlayers/GreatCircle.js corelib/dojox/geo/openlayers/JsonImport.js corelib/dojox/geo/openlayers/Layer.js corelib/dojox/geo/openlayers/LineString.js corelib/dojox/geo/openlayers/Map.js corelib/dojox/geo/openlayers/Patch.js corelib/dojox/geo/openlayers/Point.js corelib/dojox/geo/openlayers/TouchInteractionSupport.js corelib/dojox/geo/openlayers/WidgetFeature.js corelib/dojox/geo/openlayers/_base.js corelib/dojox/geo/openlayers/widget/Map.js corelib/dojox/gesture/Base.js corelib/dojox/gesture/README corelib/dojox/gesture/swipe.js corelib/dojox/gesture/tap.js corelib/dojox/gfx.js corelib/dojox/gfx/Moveable.js corelib/dojox/gfx/Mover.js corelib/dojox/gfx/README corelib/dojox/gfx/README-svgweb corelib/dojox/gfx/VectorText.js corelib/dojox/gfx/_base.js corelib/dojox/gfx/_gfxBidiSupport.js corelib/dojox/gfx/arc.js corelib/dojox/gfx/attach.js corelib/dojox/gfx/bezierutils.js corelib/dojox/gfx/canvas.js corelib/dojox/gfx/canvasWithEvents.js corelib/dojox/gfx/canvas_attach.js corelib/dojox/gfx/canvasext.js corelib/dojox/gfx/decompose.js corelib/dojox/gfx/filters.js corelib/dojox/gfx/fx.js corelib/dojox/gfx/gradient.js corelib/dojox/gfx/gradutils.js corelib/dojox/gfx/matrix.js corelib/dojox/gfx/move.js corelib/dojox/gfx/path.js corelib/dojox/gfx/registry.js corelib/dojox/gfx/renderer.js corelib/dojox/gfx/resources/Gillius.svg corelib/dojox/gfx/resources/README corelib/dojox/gfx/resources/gfxSvgProxyFrame.html corelib/dojox/gfx/resources/svg2gfx-simple.xsl corelib/dojox/gfx/resources/svg2gfx.xsl corelib/dojox/gfx/shape.js corelib/dojox/gfx/silverlight.js corelib/dojox/gfx/silverlight_attach.js corelib/dojox/gfx/svg.js corelib/dojox/gfx/svg_attach.js corelib/dojox/gfx/svg_mask.js corelib/dojox/gfx/svgext.js corelib/dojox/gfx/utils.js corelib/dojox/gfx/vml.js corelib/dojox/gfx/vml_attach.js corelib/dojox/gfx3d.js corelib/dojox/gfx3d/README corelib/dojox/gfx3d/_base.js corelib/dojox/gfx3d/gradient.js corelib/dojox/gfx3d/lighting.js corelib/dojox/gfx3d/matrix.js corelib/dojox/gfx3d/object.js corelib/dojox/gfx3d/scheduler.js corelib/dojox/gfx3d/vector.js corelib/dojox/grid/BidiSupport.js corelib/dojox/grid/DataGrid.js corelib/dojox/grid/DataSelection.js corelib/dojox/grid/EnhancedGrid.js corelib/dojox/grid/LazyTreeGrid.js corelib/dojox/grid/LazyTreeGridStoreModel.js corelib/dojox/grid/README corelib/dojox/grid/Selection.js corelib/dojox/grid/TreeGrid.js corelib/dojox/grid/TreeSelection.js corelib/dojox/grid/_Builder.js corelib/dojox/grid/_CheckBoxSelector.js corelib/dojox/grid/_EditManager.js corelib/dojox/grid/_Events.js corelib/dojox/grid/_FocusManager.js corelib/dojox/grid/_Grid.js corelib/dojox/grid/_Layout.js corelib/dojox/grid/_RadioSelector.js corelib/dojox/grid/_RowManager.js corelib/dojox/grid/_RowSelector.js corelib/dojox/grid/_Scroller.js corelib/dojox/grid/_SelectionPreserver.js corelib/dojox/grid/_Selector.js corelib/dojox/grid/_TreeView.js corelib/dojox/grid/_View.js corelib/dojox/grid/_ViewManager.js corelib/dojox/grid/bidi/_BidiMixin.js corelib/dojox/grid/cells.js corelib/dojox/grid/cells/_base.js corelib/dojox/grid/cells/dijit.js corelib/dojox/grid/cells/tree.js corelib/dojox/grid/compatGrid.tar.gz corelib/dojox/grid/enhanced/_Events.js corelib/dojox/grid/enhanced/_FocusManager.js corelib/dojox/grid/enhanced/_Plugin.js corelib/dojox/grid/enhanced/_PluginManager.js corelib/dojox/grid/enhanced/nls/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/Filter.js corelib/dojox/grid/enhanced/nls/Pagination.js corelib/dojox/grid/enhanced/nls/ar/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/ar/Filter.js corelib/dojox/grid/enhanced/nls/ar/Pagination.js corelib/dojox/grid/enhanced/nls/bg/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/bg/Filter.js corelib/dojox/grid/enhanced/nls/bg/Pagination.js corelib/dojox/grid/enhanced/nls/bs/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/bs/Filter.js corelib/dojox/grid/enhanced/nls/bs/Pagination.js corelib/dojox/grid/enhanced/nls/ca/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/ca/Filter.js corelib/dojox/grid/enhanced/nls/ca/Pagination.js corelib/dojox/grid/enhanced/nls/cs/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/cs/Filter.js corelib/dojox/grid/enhanced/nls/cs/Pagination.js corelib/dojox/grid/enhanced/nls/da/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/da/Filter.js corelib/dojox/grid/enhanced/nls/da/Pagination.js corelib/dojox/grid/enhanced/nls/de/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/de/Filter.js corelib/dojox/grid/enhanced/nls/de/Pagination.js corelib/dojox/grid/enhanced/nls/el/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/el/Filter.js corelib/dojox/grid/enhanced/nls/el/Pagination.js corelib/dojox/grid/enhanced/nls/es/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/es/Filter.js corelib/dojox/grid/enhanced/nls/es/Pagination.js corelib/dojox/grid/enhanced/nls/eu/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/eu/Filter.js corelib/dojox/grid/enhanced/nls/eu/Pagination.js corelib/dojox/grid/enhanced/nls/fi/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/fi/Filter.js corelib/dojox/grid/enhanced/nls/fi/Pagination.js corelib/dojox/grid/enhanced/nls/fr/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/fr/Filter.js corelib/dojox/grid/enhanced/nls/fr/Pagination.js corelib/dojox/grid/enhanced/nls/he/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/he/Filter.js corelib/dojox/grid/enhanced/nls/he/Pagination.js corelib/dojox/grid/enhanced/nls/hr/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/hr/Filter.js corelib/dojox/grid/enhanced/nls/hr/Pagination.js corelib/dojox/grid/enhanced/nls/hu/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/hu/Filter.js corelib/dojox/grid/enhanced/nls/hu/Pagination.js corelib/dojox/grid/enhanced/nls/id/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/id/Filter.js corelib/dojox/grid/enhanced/nls/id/Pagination.js corelib/dojox/grid/enhanced/nls/it/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/it/Filter.js corelib/dojox/grid/enhanced/nls/it/Pagination.js corelib/dojox/grid/enhanced/nls/ja/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/ja/Filter.js corelib/dojox/grid/enhanced/nls/ja/Pagination.js corelib/dojox/grid/enhanced/nls/kk/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/kk/Filter.js corelib/dojox/grid/enhanced/nls/kk/Pagination.js corelib/dojox/grid/enhanced/nls/ko/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/ko/Filter.js corelib/dojox/grid/enhanced/nls/ko/Pagination.js corelib/dojox/grid/enhanced/nls/mk/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/mk/Filter.js corelib/dojox/grid/enhanced/nls/mk/Pagination.js corelib/dojox/grid/enhanced/nls/nb/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/nb/Filter.js corelib/dojox/grid/enhanced/nls/nb/Pagination.js corelib/dojox/grid/enhanced/nls/nl/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/nl/Filter.js corelib/dojox/grid/enhanced/nls/nl/Pagination.js corelib/dojox/grid/enhanced/nls/pl/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/pl/Filter.js corelib/dojox/grid/enhanced/nls/pl/Pagination.js corelib/dojox/grid/enhanced/nls/pt-pt/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/pt-pt/Filter.js corelib/dojox/grid/enhanced/nls/pt-pt/Pagination.js corelib/dojox/grid/enhanced/nls/pt/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/pt/Filter.js corelib/dojox/grid/enhanced/nls/pt/Pagination.js corelib/dojox/grid/enhanced/nls/ro/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/ro/Filter.js corelib/dojox/grid/enhanced/nls/ro/Pagination.js corelib/dojox/grid/enhanced/nls/ru/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/ru/Filter.js corelib/dojox/grid/enhanced/nls/ru/Pagination.js corelib/dojox/grid/enhanced/nls/sk/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/sk/Filter.js corelib/dojox/grid/enhanced/nls/sk/Pagination.js corelib/dojox/grid/enhanced/nls/sl/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/sl/Filter.js corelib/dojox/grid/enhanced/nls/sl/Pagination.js corelib/dojox/grid/enhanced/nls/sr/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/sr/Filter.js corelib/dojox/grid/enhanced/nls/sr/Pagination.js corelib/dojox/grid/enhanced/nls/sv/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/sv/Filter.js corelib/dojox/grid/enhanced/nls/sv/Pagination.js corelib/dojox/grid/enhanced/nls/th/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/th/Filter.js corelib/dojox/grid/enhanced/nls/th/Pagination.js corelib/dojox/grid/enhanced/nls/tr/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/tr/Filter.js corelib/dojox/grid/enhanced/nls/tr/Pagination.js corelib/dojox/grid/enhanced/nls/uk/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/uk/Filter.js corelib/dojox/grid/enhanced/nls/uk/Pagination.js corelib/dojox/grid/enhanced/nls/zh-hk/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/zh-hk/Filter.js corelib/dojox/grid/enhanced/nls/zh-hk/Pagination.js corelib/dojox/grid/enhanced/nls/zh-tw/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/zh-tw/Filter.js corelib/dojox/grid/enhanced/nls/zh-tw/Pagination.js corelib/dojox/grid/enhanced/nls/zh/EnhancedGrid.js corelib/dojox/grid/enhanced/nls/zh/Filter.js corelib/dojox/grid/enhanced/nls/zh/Pagination.js corelib/dojox/grid/enhanced/plugins/AutoScroll.js corelib/dojox/grid/enhanced/plugins/CellMerge.js corelib/dojox/grid/enhanced/plugins/Cookie.js corelib/dojox/grid/enhanced/plugins/Dialog.js corelib/dojox/grid/enhanced/plugins/DnD.js corelib/dojox/grid/enhanced/plugins/Exporter.js corelib/dojox/grid/enhanced/plugins/Filter.js corelib/dojox/grid/enhanced/plugins/GridSource.js corelib/dojox/grid/enhanced/plugins/IndirectSelection.js corelib/dojox/grid/enhanced/plugins/Menu.js corelib/dojox/grid/enhanced/plugins/NestedSorting.js corelib/dojox/grid/enhanced/plugins/Pagination.js corelib/dojox/grid/enhanced/plugins/Printer.js corelib/dojox/grid/enhanced/plugins/Rearrange.js corelib/dojox/grid/enhanced/plugins/Search.js corelib/dojox/grid/enhanced/plugins/Selector.js corelib/dojox/grid/enhanced/plugins/_RowMapLayer.js corelib/dojox/grid/enhanced/plugins/_SelectionPreserver.js corelib/dojox/grid/enhanced/plugins/_StoreLayer.js corelib/dojox/grid/enhanced/plugins/exporter/CSVWriter.js corelib/dojox/grid/enhanced/plugins/exporter/TableWriter.js corelib/dojox/grid/enhanced/plugins/exporter/_ExportWriter.js corelib/dojox/grid/enhanced/plugins/filter/ClearFilterConfirm.js corelib/dojox/grid/enhanced/plugins/filter/FilterBar.js corelib/dojox/grid/enhanced/plugins/filter/FilterBuilder.js corelib/dojox/grid/enhanced/plugins/filter/FilterDefDialog.js corelib/dojox/grid/enhanced/plugins/filter/FilterLayer.js corelib/dojox/grid/enhanced/plugins/filter/FilterStatusTip.js corelib/dojox/grid/enhanced/plugins/filter/_ConditionExpr.js corelib/dojox/grid/enhanced/plugins/filter/_DataExprs.js corelib/dojox/grid/enhanced/plugins/filter/_FilterExpr.js corelib/dojox/grid/enhanced/resources/Common.css corelib/dojox/grid/enhanced/resources/Common_rtl.css corelib/dojox/grid/enhanced/resources/DnD.css corelib/dojox/grid/enhanced/resources/DnD_rtl.css corelib/dojox/grid/enhanced/resources/EnhancedGrid.css corelib/dojox/grid/enhanced/resources/EnhancedGrid_rtl.css corelib/dojox/grid/enhanced/resources/Filter.css corelib/dojox/grid/enhanced/resources/Filter_rtl.css corelib/dojox/grid/enhanced/resources/Pagination.css corelib/dojox/grid/enhanced/resources/Pagination_rtl.css corelib/dojox/grid/enhanced/resources/Sorter.css corelib/dojox/grid/enhanced/resources/Sorter_rtl.css corelib/dojox/grid/enhanced/resources/claro/Common.css corelib/dojox/grid/enhanced/resources/claro/EnhancedGrid.css corelib/dojox/grid/enhanced/resources/claro/Filter.css corelib/dojox/grid/enhanced/resources/claroEnhancedGrid.css corelib/dojox/grid/enhanced/resources/images/sprite_icons.png corelib/dojox/grid/enhanced/resources/tundra/Common.css corelib/dojox/grid/enhanced/resources/tundra/EnhancedGrid.css corelib/dojox/grid/enhanced/resources/tundra/Filter.css corelib/dojox/grid/enhanced/resources/tundra/Sorter.css corelib/dojox/grid/enhanced/resources/tundraEnhancedGrid.css corelib/dojox/grid/enhanced/templates/ClearFilterConfirmPane.html corelib/dojox/grid/enhanced/templates/CriteriaBox.html corelib/dojox/grid/enhanced/templates/FilterBar.html corelib/dojox/grid/enhanced/templates/FilterBoolValueBox.html corelib/dojox/grid/enhanced/templates/FilterDefPane.html corelib/dojox/grid/enhanced/templates/FilterStatusPane.html corelib/dojox/grid/enhanced/templates/Pagination.html corelib/dojox/grid/resources/Expando.html corelib/dojox/grid/resources/Grid.css corelib/dojox/grid/resources/Grid_rtl.css corelib/dojox/grid/resources/View.html corelib/dojox/grid/resources/_Grid.html corelib/dojox/grid/resources/claroGrid.css corelib/dojox/grid/resources/images/grid_dx_gradient.gif corelib/dojox/grid/resources/images/grid_sort_down.gif corelib/dojox/grid/resources/images/grid_sort_up.gif corelib/dojox/grid/resources/images/header.png corelib/dojox/grid/resources/images/header_shadow.png corelib/dojox/grid/resources/images/row_back.png corelib/dojox/grid/resources/images/tabEnabled_rotated.png corelib/dojox/grid/resources/images/tabHover_rotated.png corelib/dojox/grid/resources/images/td_button_down.png corelib/dojox/grid/resources/nihiloGrid.css corelib/dojox/grid/resources/soriaGrid.css corelib/dojox/grid/resources/tundraGrid.css corelib/dojox/grid/util.js corelib/dojox/help/README corelib/dojox/help/_base.js corelib/dojox/help/console.js corelib/dojox/highlight.js corelib/dojox/highlight/README corelib/dojox/highlight/_base.js corelib/dojox/highlight/languages/_all.js corelib/dojox/highlight/languages/_dynamic.js corelib/dojox/highlight/languages/_static.js corelib/dojox/highlight/languages/_www.js corelib/dojox/highlight/languages/cpp.js corelib/dojox/highlight/languages/css.js corelib/dojox/highlight/languages/delphi.js corelib/dojox/highlight/languages/django.js corelib/dojox/highlight/languages/groovy.js corelib/dojox/highlight/languages/html.js corelib/dojox/highlight/languages/java.js corelib/dojox/highlight/languages/javascript.js corelib/dojox/highlight/languages/pygments/_html.js corelib/dojox/highlight/languages/pygments/_www.js corelib/dojox/highlight/languages/pygments/css.js corelib/dojox/highlight/languages/pygments/html.js corelib/dojox/highlight/languages/pygments/javascript.js corelib/dojox/highlight/languages/pygments/xml.js corelib/dojox/highlight/languages/python.js corelib/dojox/highlight/languages/sql.js corelib/dojox/highlight/languages/xml.js corelib/dojox/highlight/languages/xquery.js corelib/dojox/highlight/resources/highlight.css corelib/dojox/highlight/resources/pygments/autumn.css corelib/dojox/highlight/resources/pygments/borland.css corelib/dojox/highlight/resources/pygments/colorful.css corelib/dojox/highlight/resources/pygments/default.css corelib/dojox/highlight/resources/pygments/emacs.css corelib/dojox/highlight/resources/pygments/friendly.css corelib/dojox/highlight/resources/pygments/fruity.css corelib/dojox/highlight/resources/pygments/manni.css corelib/dojox/highlight/resources/pygments/murphy.css corelib/dojox/highlight/resources/pygments/native.css corelib/dojox/highlight/resources/pygments/pastie.css corelib/dojox/highlight/resources/pygments/perldoc.css corelib/dojox/highlight/resources/pygments/trac.css corelib/dojox/highlight/widget/Code.js corelib/dojox/html.js corelib/dojox/html/README corelib/dojox/html/_base.js corelib/dojox/html/ellipsis.js corelib/dojox/html/entities.js corelib/dojox/html/ext-dojo/style.js corelib/dojox/html/format.js corelib/dojox/html/metrics.js corelib/dojox/html/resources/ellipsis.css corelib/dojox/html/styles.js corelib/dojox/image.js corelib/dojox/image/Badge.js corelib/dojox/image/FlickrBadge.js corelib/dojox/image/Gallery.js corelib/dojox/image/Lightbox.js corelib/dojox/image/LightboxNano.js corelib/dojox/image/Magnifier.js corelib/dojox/image/MagnifierLite.js corelib/dojox/image/README corelib/dojox/image/SlideShow.js corelib/dojox/image/ThumbnailPicker.js corelib/dojox/image/_base.js corelib/dojox/image/resources/Badge.css corelib/dojox/image/resources/Gallery.css corelib/dojox/image/resources/Gallery.html corelib/dojox/image/resources/Lightbox.css corelib/dojox/image/resources/Lightbox.html corelib/dojox/image/resources/LightboxNano.css corelib/dojox/image/resources/Magnifier.css corelib/dojox/image/resources/SlideShow.css corelib/dojox/image/resources/SlideShow.html corelib/dojox/image/resources/ThumbnailPicker.css corelib/dojox/image/resources/ThumbnailPicker.html corelib/dojox/image/resources/image.css corelib/dojox/image/resources/images/buttons.gif corelib/dojox/image/resources/images/buttons.png corelib/dojox/image/resources/images/close.gif corelib/dojox/image/resources/images/close.png corelib/dojox/image/resources/images/close_dark.png corelib/dojox/image/resources/images/left.gif corelib/dojox/image/resources/images/left.png corelib/dojox/image/resources/images/loading.gif corelib/dojox/image/resources/images/right.gif corelib/dojox/image/resources/images/right.png corelib/dojox/image/resources/images/warning.png corelib/dojox/io/OAuth.js corelib/dojox/io/README corelib/dojox/io/httpParse.js corelib/dojox/io/proxy/README corelib/dojox/io/proxy/xip.js corelib/dojox/io/proxy/xip_client.html corelib/dojox/io/proxy/xip_server.html corelib/dojox/io/scriptFrame.js corelib/dojox/io/windowName.js corelib/dojox/io/xhrMultiPart.js corelib/dojox/io/xhrPlugins.js corelib/dojox/io/xhrScriptPlugin.js corelib/dojox/io/xhrWindowNamePlugin.js corelib/dojox/jq.js corelib/dojox/jq/README corelib/dojox/json/README corelib/dojox/json/query.js corelib/dojox/json/ref.js corelib/dojox/json/schema.js corelib/dojox/jsonPath.js corelib/dojox/jsonPath/README corelib/dojox/jsonPath/query.js corelib/dojox/lang/LICENSE corelib/dojox/lang/README corelib/dojox/lang/aspect.js corelib/dojox/lang/aspect/cflow.js corelib/dojox/lang/aspect/counter.js corelib/dojox/lang/aspect/memoizer.js corelib/dojox/lang/aspect/memoizerGuard.js corelib/dojox/lang/aspect/profiler.js corelib/dojox/lang/aspect/timer.js corelib/dojox/lang/aspect/tracer.js corelib/dojox/lang/async.js corelib/dojox/lang/async/event.js corelib/dojox/lang/async/timeout.js corelib/dojox/lang/async/topic.js corelib/dojox/lang/docs.js corelib/dojox/lang/functional.js corelib/dojox/lang/functional/array.js corelib/dojox/lang/functional/binrec.js corelib/dojox/lang/functional/curry.js corelib/dojox/lang/functional/fold.js corelib/dojox/lang/functional/lambda.js corelib/dojox/lang/functional/linrec.js corelib/dojox/lang/functional/listcomp.js corelib/dojox/lang/functional/multirec.js corelib/dojox/lang/functional/numrec.js corelib/dojox/lang/functional/object.js corelib/dojox/lang/functional/reversed.js corelib/dojox/lang/functional/scan.js corelib/dojox/lang/functional/sequence.js corelib/dojox/lang/functional/tailrec.js corelib/dojox/lang/functional/util.js corelib/dojox/lang/functional/zip.js corelib/dojox/lang/observable.js corelib/dojox/lang/oo/Decorator.js corelib/dojox/lang/oo/Filter.js corelib/dojox/lang/oo/aop.js corelib/dojox/lang/oo/general.js corelib/dojox/lang/oo/mixin.js corelib/dojox/lang/oo/rearrange.js corelib/dojox/lang/typed.js corelib/dojox/lang/utils.js corelib/dojox/layout/BorderContainer.js corelib/dojox/layout/ContentPane.js corelib/dojox/layout/Dock.js corelib/dojox/layout/DragPane.js corelib/dojox/layout/ExpandoPane.js corelib/dojox/layout/FloatingPane.js corelib/dojox/layout/GridContainer.js corelib/dojox/layout/GridContainerLite.js corelib/dojox/layout/README corelib/dojox/layout/RadioGroup.js corelib/dojox/layout/ResizeHandle.js corelib/dojox/layout/RotatorContainer.js corelib/dojox/layout/ScrollPane.js corelib/dojox/layout/TableContainer.js corelib/dojox/layout/ToggleSplitter.js corelib/dojox/layout/dnd/Avatar.js corelib/dojox/layout/dnd/PlottedDnd.js corelib/dojox/layout/ext-dijit/layout/StackContainer-touch.js corelib/dojox/layout/resources/DndGridContainer.css corelib/dojox/layout/resources/ExpandoPane.css corelib/dojox/layout/resources/ExpandoPane.html corelib/dojox/layout/resources/FloatingPane.css corelib/dojox/layout/resources/FloatingPane.html corelib/dojox/layout/resources/GridContainer.css corelib/dojox/layout/resources/GridContainer.html corelib/dojox/layout/resources/RadioGroup.css corelib/dojox/layout/resources/ResizeHandle.css corelib/dojox/layout/resources/RotatorContainer.css corelib/dojox/layout/resources/ScrollPane.css corelib/dojox/layout/resources/ScrollPane.html corelib/dojox/layout/resources/ToggleSplitter.css corelib/dojox/layout/resources/icons/gridcontainer_grip.gif corelib/dojox/layout/resources/icons/grip_bg.gif corelib/dojox/layout/resources/icons/pixel.gif corelib/dojox/layout/resources/icons/resize.png corelib/dojox/layout/resources/icons/resizeRtl.png corelib/dojox/layout/resources/icons/rotator.png corelib/dojox/layout/resources/icons/splitterToggleH.png corelib/dojox/layout/resources/icons/splitterToggleV.png corelib/dojox/main.js corelib/dojox/math.js corelib/dojox/math/BigInteger-ext.js corelib/dojox/math/BigInteger.js corelib/dojox/math/README corelib/dojox/math/_base.js corelib/dojox/math/curves.js corelib/dojox/math/matrix.js corelib/dojox/math/random/Secure.js corelib/dojox/math/random/Simple.js corelib/dojox/math/random/prng4.js corelib/dojox/math/round.js corelib/dojox/math/stats.js corelib/dojox/mdnd/AreaManager.js corelib/dojox/mdnd/AutoScroll.js corelib/dojox/mdnd/DropIndicator.js corelib/dojox/mdnd/LazyManager.js corelib/dojox/mdnd/Moveable.js corelib/dojox/mdnd/PureSource.js corelib/dojox/mdnd/README corelib/dojox/mdnd/adapter/DndFromDojo.js corelib/dojox/mdnd/adapter/DndToDojo.js corelib/dojox/mdnd/dropMode/DefaultDropMode.js corelib/dojox/mdnd/dropMode/OverDropMode.js corelib/dojox/mdnd/dropMode/VerticalDropMode.js corelib/dojox/mdnd/resources/dnd.css corelib/dojox/mobile.js corelib/dojox/mobile/Accordion.js corelib/dojox/mobile/Audio.js corelib/dojox/mobile/Badge.js corelib/dojox/mobile/Button.js corelib/dojox/mobile/Carousel.js corelib/dojox/mobile/CarouselItem.js corelib/dojox/mobile/CheckBox.js corelib/dojox/mobile/ComboBox.js corelib/dojox/mobile/Container.js corelib/dojox/mobile/ContentPane.js corelib/dojox/mobile/DataCarousel.js corelib/dojox/mobile/DatePicker.js corelib/dojox/mobile/EdgeToEdgeCategory.js corelib/dojox/mobile/EdgeToEdgeDataList.js corelib/dojox/mobile/EdgeToEdgeList.js corelib/dojox/mobile/EdgeToEdgeStoreList.js corelib/dojox/mobile/ExpandingTextArea.js corelib/dojox/mobile/FilteredListMixin.js corelib/dojox/mobile/FixedSplitter.js corelib/dojox/mobile/FixedSplitterPane.js corelib/dojox/mobile/FormLayout.js corelib/dojox/mobile/GridLayout.js corelib/dojox/mobile/Heading.js corelib/dojox/mobile/Icon.js corelib/dojox/mobile/IconContainer.js corelib/dojox/mobile/IconItem.js corelib/dojox/mobile/IconMenu.js corelib/dojox/mobile/IconMenuItem.js corelib/dojox/mobile/ListItem.js corelib/dojox/mobile/LongListMixin.js corelib/dojox/mobile/Opener.js corelib/dojox/mobile/Overlay.js corelib/dojox/mobile/PageIndicator.js corelib/dojox/mobile/Pane.js corelib/dojox/mobile/ProgressBar.js corelib/dojox/mobile/ProgressIndicator.js corelib/dojox/mobile/README corelib/dojox/mobile/RadioButton.js corelib/dojox/mobile/Rating.js corelib/dojox/mobile/RoundRect.js corelib/dojox/mobile/RoundRectCategory.js corelib/dojox/mobile/RoundRectDataList.js corelib/dojox/mobile/RoundRectList.js corelib/dojox/mobile/RoundRectStoreList.js corelib/dojox/mobile/ScreenSizeAware.js corelib/dojox/mobile/ScrollablePane.js corelib/dojox/mobile/ScrollableView.js corelib/dojox/mobile/SearchBox.js corelib/dojox/mobile/SimpleDialog.js corelib/dojox/mobile/Slider.js corelib/dojox/mobile/SpinWheel.js corelib/dojox/mobile/SpinWheelDatePicker.js corelib/dojox/mobile/SpinWheelSlot.js corelib/dojox/mobile/SpinWheelTimePicker.js corelib/dojox/mobile/StoreCarousel.js corelib/dojox/mobile/SwapView.js corelib/dojox/mobile/Switch.js corelib/dojox/mobile/TabBar.js corelib/dojox/mobile/TabBarButton.js corelib/dojox/mobile/TextArea.js corelib/dojox/mobile/TextBox.js corelib/dojox/mobile/TimePicker.js corelib/dojox/mobile/ToggleButton.js corelib/dojox/mobile/ToolBarButton.js corelib/dojox/mobile/Tooltip.js corelib/dojox/mobile/TransitionEvent.js corelib/dojox/mobile/TreeView.js corelib/dojox/mobile/ValuePicker.js corelib/dojox/mobile/ValuePickerDatePicker.js corelib/dojox/mobile/ValuePickerSlot.js corelib/dojox/mobile/ValuePickerTimePicker.js corelib/dojox/mobile/Video.js corelib/dojox/mobile/View.js corelib/dojox/mobile/ViewController.js corelib/dojox/mobile/_ComboBoxMenu.js corelib/dojox/mobile/_ContentPaneMixin.js corelib/dojox/mobile/_DataListMixin.js corelib/dojox/mobile/_DataMixin.js corelib/dojox/mobile/_DatePickerMixin.js corelib/dojox/mobile/_EditableIconMixin.js corelib/dojox/mobile/_EditableListMixin.js corelib/dojox/mobile/_ExecScriptMixin.js corelib/dojox/mobile/_IconItemPane.js corelib/dojox/mobile/_ItemBase.js corelib/dojox/mobile/_ListTouchMixin.js corelib/dojox/mobile/_PickerBase.js corelib/dojox/mobile/_PickerChooser.js corelib/dojox/mobile/_ScrollableMixin.js corelib/dojox/mobile/_StoreListMixin.js corelib/dojox/mobile/_StoreMixin.js corelib/dojox/mobile/_TimePickerMixin.js corelib/dojox/mobile/_base.js corelib/dojox/mobile/_compat.js corelib/dojox/mobile/_css3.js corelib/dojox/mobile/_maskUtils.js corelib/dojox/mobile/app.js corelib/dojox/mobile/app/AlertDialog.js corelib/dojox/mobile/app/ImageThumbView.js corelib/dojox/mobile/app/ImageView.js corelib/dojox/mobile/app/List.js corelib/dojox/mobile/app/ListSelector.js corelib/dojox/mobile/app/SceneAssistant.js corelib/dojox/mobile/app/SceneController.js corelib/dojox/mobile/app/StageController.js corelib/dojox/mobile/app/TextBox.js corelib/dojox/mobile/app/_FormWidget.js corelib/dojox/mobile/app/_Widget.js corelib/dojox/mobile/app/_base.js corelib/dojox/mobile/app/_event.js corelib/dojox/mobile/app/compat.js corelib/dojox/mobile/bidi/Accordion.js corelib/dojox/mobile/bidi/Badge.js corelib/dojox/mobile/bidi/Button.js corelib/dojox/mobile/bidi/Carousel.js corelib/dojox/mobile/bidi/CarouselItem.js corelib/dojox/mobile/bidi/FormLayout.js corelib/dojox/mobile/bidi/Heading.js corelib/dojox/mobile/bidi/Icon.js corelib/dojox/mobile/bidi/IconItem.js corelib/dojox/mobile/bidi/IconMenu.js corelib/dojox/mobile/bidi/ListItem.js corelib/dojox/mobile/bidi/ProgressIndicator.js corelib/dojox/mobile/bidi/Rating.js corelib/dojox/mobile/bidi/RoundRectCategory.js corelib/dojox/mobile/bidi/Scrollable.js corelib/dojox/mobile/bidi/SimpleDialog.js corelib/dojox/mobile/bidi/SpinWheelSlot.js corelib/dojox/mobile/bidi/SwapView.js corelib/dojox/mobile/bidi/Switch.js corelib/dojox/mobile/bidi/TabBar.js corelib/dojox/mobile/bidi/TabBarButton.js corelib/dojox/mobile/bidi/TextBox.js corelib/dojox/mobile/bidi/ToolBarButton.js corelib/dojox/mobile/bidi/Tooltip.js corelib/dojox/mobile/bidi/TreeView.js corelib/dojox/mobile/bidi/ValuePickerSlot.js corelib/dojox/mobile/bidi/_ComboBoxMenu.js corelib/dojox/mobile/bidi/_ItemBase.js corelib/dojox/mobile/bidi/_PickerBase.js corelib/dojox/mobile/bidi/_StoreListMixin.js corelib/dojox/mobile/bidi/common.js corelib/dojox/mobile/bookmarkable.js corelib/dojox/mobile/build/build.bat corelib/dojox/mobile/build/build.sh corelib/dojox/mobile/common.js corelib/dojox/mobile/compat.js corelib/dojox/mobile/deviceTheme.js corelib/dojox/mobile/dh/ContentTypeMap.js corelib/dojox/mobile/dh/DataHandler.js corelib/dojox/mobile/dh/HtmlContentHandler.js corelib/dojox/mobile/dh/HtmlScriptContentHandler.js corelib/dojox/mobile/dh/JsonContentHandler.js corelib/dojox/mobile/dh/PatternFileTypeMap.js corelib/dojox/mobile/dh/StringDataSource.js corelib/dojox/mobile/dh/SuffixFileTypeMap.js corelib/dojox/mobile/dh/UrlDataSource.js corelib/dojox/mobile/i18n.js corelib/dojox/mobile/iconUtils.js corelib/dojox/mobile/lazyLoadUtils.js corelib/dojox/mobile/migrationAssist.js corelib/dojox/mobile/mobile-all.js corelib/dojox/mobile/nls/ar/messages.js corelib/dojox/mobile/nls/bg/messages.js corelib/dojox/mobile/nls/bs/messages.js corelib/dojox/mobile/nls/ca/messages.js corelib/dojox/mobile/nls/cs/messages.js corelib/dojox/mobile/nls/da/messages.js corelib/dojox/mobile/nls/de/messages.js corelib/dojox/mobile/nls/el/messages.js corelib/dojox/mobile/nls/es/messages.js corelib/dojox/mobile/nls/eu/messages.js corelib/dojox/mobile/nls/fi/messages.js corelib/dojox/mobile/nls/fr/messages.js corelib/dojox/mobile/nls/he/messages.js corelib/dojox/mobile/nls/hr/messages.js corelib/dojox/mobile/nls/hu/messages.js corelib/dojox/mobile/nls/id/messages.js corelib/dojox/mobile/nls/it/messages.js corelib/dojox/mobile/nls/ja/messages.js corelib/dojox/mobile/nls/kk/messages.js corelib/dojox/mobile/nls/ko/messages.js corelib/dojox/mobile/nls/messages.js corelib/dojox/mobile/nls/mk/messages.js corelib/dojox/mobile/nls/nb/messages.js corelib/dojox/mobile/nls/nl/messages.js corelib/dojox/mobile/nls/pl/messages.js corelib/dojox/mobile/nls/pt-pt/messages.js corelib/dojox/mobile/nls/pt/messages.js corelib/dojox/mobile/nls/ro/messages.js corelib/dojox/mobile/nls/ru/messages.js corelib/dojox/mobile/nls/sk/messages.js corelib/dojox/mobile/nls/sl/messages.js corelib/dojox/mobile/nls/sr/messages.js corelib/dojox/mobile/nls/sv/messages.js corelib/dojox/mobile/nls/th/messages.js corelib/dojox/mobile/nls/tr/messages.js corelib/dojox/mobile/nls/uk/messages.js corelib/dojox/mobile/nls/zh-hk/messages.js corelib/dojox/mobile/nls/zh-tw/messages.js corelib/dojox/mobile/nls/zh/messages.js corelib/dojox/mobile/pageTurningUtils.js corelib/dojox/mobile/parser.js corelib/dojox/mobile/scrollable.js corelib/dojox/mobile/sniff.js corelib/dojox/mobile/themes/android/Accordion-compat.css corelib/dojox/mobile/themes/android/Accordion.css corelib/dojox/mobile/themes/android/Accordion_rtl.css corelib/dojox/mobile/themes/android/Button-compat.css corelib/dojox/mobile/themes/android/Button.css corelib/dojox/mobile/themes/android/Carousel.css corelib/dojox/mobile/themes/android/Carousel_rtl.css corelib/dojox/mobile/themes/android/CheckBox-compat.css corelib/dojox/mobile/themes/android/CheckBox.css corelib/dojox/mobile/themes/android/ComboBox-compat.css corelib/dojox/mobile/themes/android/ComboBox.css corelib/dojox/mobile/themes/android/ComboBox_rtl.css corelib/dojox/mobile/themes/android/DatePicker.css corelib/dojox/mobile/themes/android/EdgeToEdgeCategory.css corelib/dojox/mobile/themes/android/EdgeToEdgeList.css corelib/dojox/mobile/themes/android/FixedSplitter.css corelib/dojox/mobile/themes/android/FormLayout.css corelib/dojox/mobile/themes/android/FormLayout_rtl.css corelib/dojox/mobile/themes/android/GridLayout.css corelib/dojox/mobile/themes/android/GridLayout_rtl.css corelib/dojox/mobile/themes/android/Heading-compat.css corelib/dojox/mobile/themes/android/Heading.css corelib/dojox/mobile/themes/android/IconContainer-compat.css corelib/dojox/mobile/themes/android/IconContainer-compat.less corelib/dojox/mobile/themes/android/IconContainer.css corelib/dojox/mobile/themes/android/IconContainer.less corelib/dojox/mobile/themes/android/IconContainer_rtl.css corelib/dojox/mobile/themes/android/IconMenu-compat.css corelib/dojox/mobile/themes/android/IconMenu.css corelib/dojox/mobile/themes/android/IconMenu_rtl-compat.css corelib/dojox/mobile/themes/android/IconMenu_rtl.css corelib/dojox/mobile/themes/android/ListItem-compat.css corelib/dojox/mobile/themes/android/ListItem-compat.less corelib/dojox/mobile/themes/android/ListItem.css corelib/dojox/mobile/themes/android/ListItem.less corelib/dojox/mobile/themes/android/ListItem_rtl-compat.css corelib/dojox/mobile/themes/android/ListItem_rtl.css corelib/dojox/mobile/themes/android/ListItem_rtl.less corelib/dojox/mobile/themes/android/Opener-compat.css corelib/dojox/mobile/themes/android/Opener.css corelib/dojox/mobile/themes/android/Overlay-compat.css corelib/dojox/mobile/themes/android/Overlay.css corelib/dojox/mobile/themes/android/Overlay.less corelib/dojox/mobile/themes/android/PageIndicator-compat.css corelib/dojox/mobile/themes/android/PageIndicator.css corelib/dojox/mobile/themes/android/ProgressBar-compat.css corelib/dojox/mobile/themes/android/ProgressBar.css corelib/dojox/mobile/themes/android/ProgressIndicator-compat.css corelib/dojox/mobile/themes/android/ProgressIndicator.css corelib/dojox/mobile/themes/android/ProgressIndicator_rtl.css corelib/dojox/mobile/themes/android/RadioButton-compat.css corelib/dojox/mobile/themes/android/RadioButton.css corelib/dojox/mobile/themes/android/RoundRect-compat.css corelib/dojox/mobile/themes/android/RoundRect.css corelib/dojox/mobile/themes/android/RoundRectCategory.css corelib/dojox/mobile/themes/android/RoundRectCategory_rtl.css corelib/dojox/mobile/themes/android/RoundRectList-compat.css corelib/dojox/mobile/themes/android/RoundRectList.css corelib/dojox/mobile/themes/android/ScrollablePane.css corelib/dojox/mobile/themes/android/SearchBox-compat.css corelib/dojox/mobile/themes/android/SearchBox.css corelib/dojox/mobile/themes/android/SimpleDialog-compat.css corelib/dojox/mobile/themes/android/SimpleDialog.css corelib/dojox/mobile/themes/android/Slider-compat.css corelib/dojox/mobile/themes/android/Slider.css corelib/dojox/mobile/themes/android/SpinWheel-compat.css corelib/dojox/mobile/themes/android/SpinWheel.css corelib/dojox/mobile/themes/android/SpinWheel_rtl-compat.css corelib/dojox/mobile/themes/android/SpinWheel_rtl.css corelib/dojox/mobile/themes/android/Switch-compat.css corelib/dojox/mobile/themes/android/Switch-compat.less corelib/dojox/mobile/themes/android/Switch.css corelib/dojox/mobile/themes/android/Switch.less corelib/dojox/mobile/themes/android/Switch_rtl-compat.css corelib/dojox/mobile/themes/android/Switch_rtl.css corelib/dojox/mobile/themes/android/TabBar-compat.css corelib/dojox/mobile/themes/android/TabBar-compat.less corelib/dojox/mobile/themes/android/TabBar.css corelib/dojox/mobile/themes/android/TabBar.less corelib/dojox/mobile/themes/android/TabBar_rtl-compat.css corelib/dojox/mobile/themes/android/TabBar_rtl.css corelib/dojox/mobile/themes/android/TextArea-compat.css corelib/dojox/mobile/themes/android/TextArea.css corelib/dojox/mobile/themes/android/TextBox-compat.css corelib/dojox/mobile/themes/android/TextBox.css corelib/dojox/mobile/themes/android/TimePicker.css corelib/dojox/mobile/themes/android/ToggleButton-compat.css corelib/dojox/mobile/themes/android/ToggleButton.css corelib/dojox/mobile/themes/android/ToggleButton_rtl.css corelib/dojox/mobile/themes/android/ToolBarButton-compat.css corelib/dojox/mobile/themes/android/ToolBarButton.css corelib/dojox/mobile/themes/android/ToolBarButton_rtl.css corelib/dojox/mobile/themes/android/Tooltip-compat.css corelib/dojox/mobile/themes/android/Tooltip.css corelib/dojox/mobile/themes/android/ValuePicker-compat.css corelib/dojox/mobile/themes/android/ValuePicker.css corelib/dojox/mobile/themes/android/ValuePicker.less corelib/dojox/mobile/themes/android/View.css corelib/dojox/mobile/themes/android/View.less corelib/dojox/mobile/themes/android/android-app-compat.css corelib/dojox/mobile/themes/android/android-app.css corelib/dojox/mobile/themes/android/android-compat.css corelib/dojox/mobile/themes/android/android.css corelib/dojox/mobile/themes/android/android_rtl-compat.css corelib/dojox/mobile/themes/android/android_rtl.css corelib/dojox/mobile/themes/android/base-compat.css corelib/dojox/mobile/themes/android/base.css corelib/dojox/mobile/themes/android/base_rtl-compat.css corelib/dojox/mobile/themes/android/base_rtl.css corelib/dojox/mobile/themes/android/common-compat.css corelib/dojox/mobile/themes/android/common.css corelib/dojox/mobile/themes/android/compat/arrow-button-bg-sel.png corelib/dojox/mobile/themes/android/compat/arrow-button-bg.png corelib/dojox/mobile/themes/android/compat/arrow-button-head-sel.png corelib/dojox/mobile/themes/android/compat/arrow-button-head.png corelib/dojox/mobile/themes/android/compat/arrow-button-right-head-sel.png corelib/dojox/mobile/themes/android/compat/arrow-button-right-head.png corelib/dojox/mobile/themes/android/compat/blue-button-bg.png corelib/dojox/mobile/themes/android/compat/blue-button-sel-bg.png corelib/dojox/mobile/themes/android/compat/button-arrow-head-bg.gif corelib/dojox/mobile/themes/android/compat/button-bg.png corelib/dojox/mobile/themes/android/compat/button-chk-bg.png corelib/dojox/mobile/themes/android/compat/button-sel-bg.png corelib/dojox/mobile/themes/android/compat/button-unsel-bg.png corelib/dojox/mobile/themes/android/compat/gray-arrow.png corelib/dojox/mobile/themes/android/compat/heading-bg.png corelib/dojox/mobile/themes/android/compat/icon-content-heading-bg.png corelib/dojox/mobile/themes/android/compat/red-button-bg.png corelib/dojox/mobile/themes/android/compat/red-button-sel-bg.png corelib/dojox/mobile/themes/android/compat/slider-h-bar-bg.png corelib/dojox/mobile/themes/android/compat/slider-h-bg.png corelib/dojox/mobile/themes/android/compat/slider-handle-bg.png corelib/dojox/mobile/themes/android/compat/switch-arc1-k.gif corelib/dojox/mobile/themes/android/compat/switch-arc1-l.gif corelib/dojox/mobile/themes/android/compat/switch-arc1-r.gif corelib/dojox/mobile/themes/android/compat/switch-arc2-k.gif corelib/dojox/mobile/themes/android/compat/switch-arc2-l.gif corelib/dojox/mobile/themes/android/compat/switch-arc2-r.gif corelib/dojox/mobile/themes/android/compat/switch-round1-k.gif corelib/dojox/mobile/themes/android/compat/switch-round1-l.gif corelib/dojox/mobile/themes/android/compat/switch-round1-r.gif corelib/dojox/mobile/themes/android/compat/switch-round2-k.gif corelib/dojox/mobile/themes/android/compat/switch-round2-l.gif corelib/dojox/mobile/themes/android/compat/switch-round2-r.gif corelib/dojox/mobile/themes/android/compat/switch-square-k.gif corelib/dojox/mobile/themes/android/compat/switch-square-l.gif corelib/dojox/mobile/themes/android/compat/switch-square-r.gif corelib/dojox/mobile/themes/android/compat/tab-button-bg.png corelib/dojox/mobile/themes/android/compat/tab-orange-button-bg.png corelib/dojox/mobile/themes/android/compat/tab-seg-button-bg.png corelib/dojox/mobile/themes/android/compat/tab-seg-sel-button-bg.png corelib/dojox/mobile/themes/android/compat/tab-sel-button-bg.png corelib/dojox/mobile/themes/android/compat/tab-slim-bar-bg.png corelib/dojox/mobile/themes/android/compat/tab-tall-bar-bg.png corelib/dojox/mobile/themes/android/compat/togglebutton-chk-bg.png corelib/dojox/mobile/themes/android/compat/togglebutton-chk-mark-bg.png corelib/dojox/mobile/themes/android/compat/valuepicker-button-bg.png corelib/dojox/mobile/themes/android/dijit/Calendar-compat.css corelib/dojox/mobile/themes/android/dijit/Calendar-compat.less corelib/dojox/mobile/themes/android/dijit/Calendar.css corelib/dojox/mobile/themes/android/dijit/Calendar.less corelib/dojox/mobile/themes/android/dijit/compat/calendar-datelabel-act-bg.png corelib/dojox/mobile/themes/android/dijit/compat/calendar-datelabel-sel-bg.png corelib/dojox/mobile/themes/android/dijit/compat/calendar-month-bg.png corelib/dojox/mobile/themes/android/dijit/compat/calendar-year-bg.png corelib/dojox/mobile/themes/android/images/thumb-overlay-large.png corelib/dojox/mobile/themes/android/images/thumb-overlay-small.png corelib/dojox/mobile/themes/android/images/thumb-overlay.png corelib/dojox/mobile/themes/android/variables.less corelib/dojox/mobile/themes/android/variables_rtl.less corelib/dojox/mobile/themes/blackberry/Accordion-compat.css corelib/dojox/mobile/themes/blackberry/Accordion.css corelib/dojox/mobile/themes/blackberry/Accordion_rtl.css corelib/dojox/mobile/themes/blackberry/Button-compat.css corelib/dojox/mobile/themes/blackberry/Button.css corelib/dojox/mobile/themes/blackberry/Carousel.css corelib/dojox/mobile/themes/blackberry/Carousel_rtl.css corelib/dojox/mobile/themes/blackberry/CheckBox-compat.css corelib/dojox/mobile/themes/blackberry/CheckBox.css corelib/dojox/mobile/themes/blackberry/ComboBox-compat.css corelib/dojox/mobile/themes/blackberry/ComboBox-compat.less corelib/dojox/mobile/themes/blackberry/ComboBox.css corelib/dojox/mobile/themes/blackberry/ComboBox_rtl.css corelib/dojox/mobile/themes/blackberry/DatePicker.css corelib/dojox/mobile/themes/blackberry/EdgeToEdgeCategory.css corelib/dojox/mobile/themes/blackberry/EdgeToEdgeList.css corelib/dojox/mobile/themes/blackberry/FixedSplitter.css corelib/dojox/mobile/themes/blackberry/FormLayout.css corelib/dojox/mobile/themes/blackberry/FormLayout_rtl.css corelib/dojox/mobile/themes/blackberry/GridLayout.css corelib/dojox/mobile/themes/blackberry/GridLayout_rtl.css corelib/dojox/mobile/themes/blackberry/Heading-compat.css corelib/dojox/mobile/themes/blackberry/Heading.css corelib/dojox/mobile/themes/blackberry/IconContainer-compat.css corelib/dojox/mobile/themes/blackberry/IconContainer-compat.less corelib/dojox/mobile/themes/blackberry/IconContainer.css corelib/dojox/mobile/themes/blackberry/IconContainer.less corelib/dojox/mobile/themes/blackberry/IconContainer_rtl.css corelib/dojox/mobile/themes/blackberry/IconMenu-compat.css corelib/dojox/mobile/themes/blackberry/IconMenu.css corelib/dojox/mobile/themes/blackberry/IconMenu_rtl-compat.css corelib/dojox/mobile/themes/blackberry/IconMenu_rtl.css corelib/dojox/mobile/themes/blackberry/ListItem-compat.css corelib/dojox/mobile/themes/blackberry/ListItem-compat.less corelib/dojox/mobile/themes/blackberry/ListItem.css corelib/dojox/mobile/themes/blackberry/ListItem.less corelib/dojox/mobile/themes/blackberry/ListItem_rtl-compat.css corelib/dojox/mobile/themes/blackberry/ListItem_rtl.css corelib/dojox/mobile/themes/blackberry/ListItem_rtl.less corelib/dojox/mobile/themes/blackberry/Opener-compat.css corelib/dojox/mobile/themes/blackberry/Opener.css corelib/dojox/mobile/themes/blackberry/Overlay-compat.css corelib/dojox/mobile/themes/blackberry/Overlay.css corelib/dojox/mobile/themes/blackberry/Overlay.less corelib/dojox/mobile/themes/blackberry/PageIndicator-compat.css corelib/dojox/mobile/themes/blackberry/PageIndicator.css corelib/dojox/mobile/themes/blackberry/ProgressBar-compat.css corelib/dojox/mobile/themes/blackberry/ProgressBar.css corelib/dojox/mobile/themes/blackberry/ProgressIndicator-compat.css corelib/dojox/mobile/themes/blackberry/ProgressIndicator.css corelib/dojox/mobile/themes/blackberry/ProgressIndicator_rtl.css corelib/dojox/mobile/themes/blackberry/RadioButton-compat.css corelib/dojox/mobile/themes/blackberry/RadioButton.css corelib/dojox/mobile/themes/blackberry/RoundRect-compat.css corelib/dojox/mobile/themes/blackberry/RoundRect.css corelib/dojox/mobile/themes/blackberry/RoundRectCategory-compat.css corelib/dojox/mobile/themes/blackberry/RoundRectCategory.css corelib/dojox/mobile/themes/blackberry/RoundRectCategory_rtl.css corelib/dojox/mobile/themes/blackberry/RoundRectList-compat.css corelib/dojox/mobile/themes/blackberry/RoundRectList.css corelib/dojox/mobile/themes/blackberry/ScrollablePane.css corelib/dojox/mobile/themes/blackberry/SearchBox-compat.css corelib/dojox/mobile/themes/blackberry/SearchBox.css corelib/dojox/mobile/themes/blackberry/SimpleDialog-compat.css corelib/dojox/mobile/themes/blackberry/SimpleDialog.css corelib/dojox/mobile/themes/blackberry/Slider-compat.css corelib/dojox/mobile/themes/blackberry/Slider.css corelib/dojox/mobile/themes/blackberry/SpinWheel-compat.css corelib/dojox/mobile/themes/blackberry/SpinWheel.css corelib/dojox/mobile/themes/blackberry/SpinWheel_rtl-compat.css corelib/dojox/mobile/themes/blackberry/SpinWheel_rtl.css corelib/dojox/mobile/themes/blackberry/Switch-compat.css corelib/dojox/mobile/themes/blackberry/Switch-compat.less corelib/dojox/mobile/themes/blackberry/Switch.css corelib/dojox/mobile/themes/blackberry/Switch.less corelib/dojox/mobile/themes/blackberry/Switch_rtl-compat.css corelib/dojox/mobile/themes/blackberry/Switch_rtl.css corelib/dojox/mobile/themes/blackberry/TabBar-compat.css corelib/dojox/mobile/themes/blackberry/TabBar-compat.less corelib/dojox/mobile/themes/blackberry/TabBar.css corelib/dojox/mobile/themes/blackberry/TabBar.less corelib/dojox/mobile/themes/blackberry/TabBar_rtl-compat.css corelib/dojox/mobile/themes/blackberry/TabBar_rtl.css corelib/dojox/mobile/themes/blackberry/TextArea-compat.css corelib/dojox/mobile/themes/blackberry/TextArea.css corelib/dojox/mobile/themes/blackberry/TextBox-compat.css corelib/dojox/mobile/themes/blackberry/TextBox.css corelib/dojox/mobile/themes/blackberry/TimePicker.css corelib/dojox/mobile/themes/blackberry/ToggleButton-compat.css corelib/dojox/mobile/themes/blackberry/ToggleButton.css corelib/dojox/mobile/themes/blackberry/ToggleButton_rtl.css corelib/dojox/mobile/themes/blackberry/ToolBarButton-compat.css corelib/dojox/mobile/themes/blackberry/ToolBarButton.css corelib/dojox/mobile/themes/blackberry/ToolBarButton_rtl.css corelib/dojox/mobile/themes/blackberry/Tooltip-compat.css corelib/dojox/mobile/themes/blackberry/Tooltip.css corelib/dojox/mobile/themes/blackberry/ValuePicker-compat.css corelib/dojox/mobile/themes/blackberry/ValuePicker.css corelib/dojox/mobile/themes/blackberry/ValuePicker.less corelib/dojox/mobile/themes/blackberry/View.css corelib/dojox/mobile/themes/blackberry/View.less corelib/dojox/mobile/themes/blackberry/base-compat.css corelib/dojox/mobile/themes/blackberry/base.css corelib/dojox/mobile/themes/blackberry/base_rtl-compat.css corelib/dojox/mobile/themes/blackberry/base_rtl.css corelib/dojox/mobile/themes/blackberry/blackberry-compat.css corelib/dojox/mobile/themes/blackberry/blackberry.css corelib/dojox/mobile/themes/blackberry/blackberry_rtl-compat.css corelib/dojox/mobile/themes/blackberry/blackberry_rtl.css corelib/dojox/mobile/themes/blackberry/common-compat.css corelib/dojox/mobile/themes/blackberry/common.css corelib/dojox/mobile/themes/blackberry/compat/arrow-button-bg-sel.png corelib/dojox/mobile/themes/blackberry/compat/arrow-button-bg.png corelib/dojox/mobile/themes/blackberry/compat/arrow-button-head-sel.png corelib/dojox/mobile/themes/blackberry/compat/arrow-button-head.gif corelib/dojox/mobile/themes/blackberry/compat/arrow-button-head.png corelib/dojox/mobile/themes/blackberry/compat/arrow-button-right-head-sel.png corelib/dojox/mobile/themes/blackberry/compat/arrow-button-right-head.png corelib/dojox/mobile/themes/blackberry/compat/blue-button-bg.png corelib/dojox/mobile/themes/blackberry/compat/blue-button-sel-bg.png corelib/dojox/mobile/themes/blackberry/compat/button-arrow-head-bg.gif corelib/dojox/mobile/themes/blackberry/compat/button-bg.png corelib/dojox/mobile/themes/blackberry/compat/button-chk-bg.png corelib/dojox/mobile/themes/blackberry/compat/button-sel-bg.png corelib/dojox/mobile/themes/blackberry/compat/button-unsel-bg.png corelib/dojox/mobile/themes/blackberry/compat/gray-arrow.png corelib/dojox/mobile/themes/blackberry/compat/heading-bg.png corelib/dojox/mobile/themes/blackberry/compat/icon-content-heading-bg.png corelib/dojox/mobile/themes/blackberry/compat/red-button-bg.png corelib/dojox/mobile/themes/blackberry/compat/red-button-sel-bg.png corelib/dojox/mobile/themes/blackberry/compat/slider-h-bar-bg.png corelib/dojox/mobile/themes/blackberry/compat/slider-h-bg.png corelib/dojox/mobile/themes/blackberry/compat/slider-handle-bg.png corelib/dojox/mobile/themes/blackberry/compat/switch-arc1-k.gif corelib/dojox/mobile/themes/blackberry/compat/switch-arc1-l.gif corelib/dojox/mobile/themes/blackberry/compat/switch-arc1-r.gif corelib/dojox/mobile/themes/blackberry/compat/switch-arc2-k.gif corelib/dojox/mobile/themes/blackberry/compat/switch-arc2-l.gif corelib/dojox/mobile/themes/blackberry/compat/switch-arc2-r.gif corelib/dojox/mobile/themes/blackberry/compat/switch-round1-k.gif corelib/dojox/mobile/themes/blackberry/compat/switch-round1-l.gif corelib/dojox/mobile/themes/blackberry/compat/switch-round1-r.gif corelib/dojox/mobile/themes/blackberry/compat/switch-round2-k.gif corelib/dojox/mobile/themes/blackberry/compat/switch-round2-l.gif corelib/dojox/mobile/themes/blackberry/compat/switch-round2-r.gif corelib/dojox/mobile/themes/blackberry/compat/switch-square-k.gif corelib/dojox/mobile/themes/blackberry/compat/switch-square-l.gif corelib/dojox/mobile/themes/blackberry/compat/switch-square-r.gif corelib/dojox/mobile/themes/blackberry/compat/tab-button-bg.png corelib/dojox/mobile/themes/blackberry/compat/tab-orange-button-bg.png corelib/dojox/mobile/themes/blackberry/compat/tab-seg-button-bg.png corelib/dojox/mobile/themes/blackberry/compat/tab-seg-sel-button-bg.png corelib/dojox/mobile/themes/blackberry/compat/tab-sel-button-bg.png corelib/dojox/mobile/themes/blackberry/compat/tab-slim-bar-bg.png corelib/dojox/mobile/themes/blackberry/compat/tab-tall-bar-bg.png corelib/dojox/mobile/themes/blackberry/compat/togglebutton-chk-mark-bg.png corelib/dojox/mobile/themes/blackberry/compat/valuepicker-button-bg.png corelib/dojox/mobile/themes/blackberry/dijit/Calendar-compat.css corelib/dojox/mobile/themes/blackberry/dijit/Calendar-compat.less corelib/dojox/mobile/themes/blackberry/dijit/Calendar.css corelib/dojox/mobile/themes/blackberry/dijit/Calendar.less corelib/dojox/mobile/themes/blackberry/dijit/compat/calendar-datelabel-sel-bg.png corelib/dojox/mobile/themes/blackberry/dijit/compat/calendar-month-bg.png corelib/dojox/mobile/themes/blackberry/dijit/compat/calendar-year-bg.png corelib/dojox/mobile/themes/blackberry/images/thumb-overlay-large.png corelib/dojox/mobile/themes/blackberry/images/thumb-overlay-small.png corelib/dojox/mobile/themes/blackberry/images/thumb-overlay.png corelib/dojox/mobile/themes/blackberry/variables.less corelib/dojox/mobile/themes/blackberry/variables_rtl.less corelib/dojox/mobile/themes/common/Accordion-compat.less corelib/dojox/mobile/themes/common/Accordion.less corelib/dojox/mobile/themes/common/Accordion_rtl.less corelib/dojox/mobile/themes/common/Button-compat.less corelib/dojox/mobile/themes/common/Button.less corelib/dojox/mobile/themes/common/Carousel.less corelib/dojox/mobile/themes/common/Carousel_rtl.less corelib/dojox/mobile/themes/common/CheckBox-compat.less corelib/dojox/mobile/themes/common/CheckBox.less corelib/dojox/mobile/themes/common/ComboBox-compat.less corelib/dojox/mobile/themes/common/ComboBox.less corelib/dojox/mobile/themes/common/ComboBox_rtl.less corelib/dojox/mobile/themes/common/EdgeToEdgeCategory.less corelib/dojox/mobile/themes/common/EdgeToEdgeList.less corelib/dojox/mobile/themes/common/FixedSplitter.less corelib/dojox/mobile/themes/common/FormLayout.less corelib/dojox/mobile/themes/common/FormLayout_rtl.less corelib/dojox/mobile/themes/common/GridLayout.less corelib/dojox/mobile/themes/common/GridLayout_rtl.less corelib/dojox/mobile/themes/common/Heading-compat.less corelib/dojox/mobile/themes/common/Heading.less corelib/dojox/mobile/themes/common/IconContainer-compat.less corelib/dojox/mobile/themes/common/IconContainer.less corelib/dojox/mobile/themes/common/IconContainer_keyframes.css corelib/dojox/mobile/themes/common/IconContainer_rtl.less corelib/dojox/mobile/themes/common/IconMenu-compat.less corelib/dojox/mobile/themes/common/IconMenu.less corelib/dojox/mobile/themes/common/IconMenu_rtl-compat.less corelib/dojox/mobile/themes/common/IconMenu_rtl.less corelib/dojox/mobile/themes/common/ListItem-compat.less corelib/dojox/mobile/themes/common/ListItem.less corelib/dojox/mobile/themes/common/ListItem_rtl.less corelib/dojox/mobile/themes/common/Overlay-compat.less corelib/dojox/mobile/themes/common/Overlay.less corelib/dojox/mobile/themes/common/PageIndicator.less corelib/dojox/mobile/themes/common/PageTurning.css corelib/dojox/mobile/themes/common/ProgressBar-compat.less corelib/dojox/mobile/themes/common/ProgressBar.less corelib/dojox/mobile/themes/common/ProgressIndicator-compat.less corelib/dojox/mobile/themes/common/ProgressIndicator.less corelib/dojox/mobile/themes/common/ProgressIndicator_rtl.less corelib/dojox/mobile/themes/common/RadioButton-compat.less corelib/dojox/mobile/themes/common/RadioButton.less corelib/dojox/mobile/themes/common/RoundRect-compat.less corelib/dojox/mobile/themes/common/RoundRect.less corelib/dojox/mobile/themes/common/RoundRectCategory.less corelib/dojox/mobile/themes/common/RoundRectCategory_rtl.less corelib/dojox/mobile/themes/common/RoundRectList-compat.less corelib/dojox/mobile/themes/common/RoundRectList.less corelib/dojox/mobile/themes/common/ScrollablePane.less corelib/dojox/mobile/themes/common/SearchBox-compat.less corelib/dojox/mobile/themes/common/SearchBox.less corelib/dojox/mobile/themes/common/SimpleDialog-compat.less corelib/dojox/mobile/themes/common/SimpleDialog.less corelib/dojox/mobile/themes/common/Slider-compat.less corelib/dojox/mobile/themes/common/Slider.less corelib/dojox/mobile/themes/common/SpinWheel-compat.less corelib/dojox/mobile/themes/common/SpinWheel.less corelib/dojox/mobile/themes/common/SpinWheel_rtl-compat.less corelib/dojox/mobile/themes/common/SpinWheel_rtl.less corelib/dojox/mobile/themes/common/Switch-compat.less corelib/dojox/mobile/themes/common/Switch.less corelib/dojox/mobile/themes/common/Switch_rtl-compat.less corelib/dojox/mobile/themes/common/Switch_rtl.less corelib/dojox/mobile/themes/common/TabBar-compat.less corelib/dojox/mobile/themes/common/TabBar.less corelib/dojox/mobile/themes/common/TabBar_rtl-compat.less corelib/dojox/mobile/themes/common/TabBar_rtl.less corelib/dojox/mobile/themes/common/TextArea-compat.less corelib/dojox/mobile/themes/common/TextArea.less corelib/dojox/mobile/themes/common/TextBox-compat.less corelib/dojox/mobile/themes/common/TextBox.less corelib/dojox/mobile/themes/common/ToggleButton-compat.less corelib/dojox/mobile/themes/common/ToggleButton.less corelib/dojox/mobile/themes/common/ToggleButton_rtl.less corelib/dojox/mobile/themes/common/ToolBarButton-compat.less corelib/dojox/mobile/themes/common/ToolBarButton.less corelib/dojox/mobile/themes/common/ToolBarButton_rtl.less corelib/dojox/mobile/themes/common/Tooltip-compat.less corelib/dojox/mobile/themes/common/Tooltip.less corelib/dojox/mobile/themes/common/ValuePicker-compat.less corelib/dojox/mobile/themes/common/ValuePicker.less corelib/dojox/mobile/themes/common/View.less corelib/dojox/mobile/themes/common/common-compat.less corelib/dojox/mobile/themes/common/common.less corelib/dojox/mobile/themes/common/compat/spinwheel-bar.png corelib/dojox/mobile/themes/common/compat/spinwheel-bg.png corelib/dojox/mobile/themes/common/css3.less corelib/dojox/mobile/themes/common/dijit/Calendar-compat.less corelib/dojox/mobile/themes/common/dijit/Calendar.less corelib/dojox/mobile/themes/common/dijit/ColorPalette.css corelib/dojox/mobile/themes/common/dijit/ColorPicker.css corelib/dojox/mobile/themes/common/dijit/base.css corelib/dojox/mobile/themes/common/dijit/dijit.css corelib/dojox/mobile/themes/common/domButtons-compat.css corelib/dojox/mobile/themes/common/domButtons.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackCircleCross-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackCircleCross.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackCircleCross.less corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackDownArrow16-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackDownArrow16.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackDownArrow16.less corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackLeftArrow16-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackLeftArrow16.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackLeftArrow16.less corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackRightArrow16-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackRightArrow16.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackRightArrow16.less corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackUpArrow16-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackUpArrow16.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlackUpArrow16.less corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueBadge-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueBadge.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueBadge.less corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueBall-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueBall.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueBall.less corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleArrow-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleArrow.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleArrow.less corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleMinus-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleMinus.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueCircleMinus.less corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueCirclePlus-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueCirclePlus.css corelib/dojox/mobile/themes/common/domButtons/DomButtonBlueCirclePlus.less corelib/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOff-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOff.css corelib/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOff.less corelib/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOn-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOn.css corelib/dojox/mobile/themes/common/domButtons/DomButtonCheckboxOn.less corelib/dojox/mobile/themes/common/domButtons/DomButtonColorButtons-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonColorButtons.css corelib/dojox/mobile/themes/common/domButtons/DomButtonColorButtons.less corelib/dojox/mobile/themes/common/domButtons/DomButtonDarkBlueCheck-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonDarkBlueCheck.css corelib/dojox/mobile/themes/common/domButtons/DomButtonDarkBlueCheck.less corelib/dojox/mobile/themes/common/domButtons/DomButtonDarkBlueCheck_rtl.css corelib/dojox/mobile/themes/common/domButtons/DomButtonDarkBlueCheck_rtl.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow_rtl-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow_rtl.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayArrow_rtl.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayCross-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayCross.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayCross.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayKnob-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayKnob.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayKnob.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayMinus-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayMinus.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayMinus.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayPlus-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayPlus.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayPlus.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayRoundRect-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayRoundRect.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayRoundRect.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayStar-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayStar.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGrayStar.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenBadge-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenBadge.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenBadge.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenBall-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenBall.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenBall.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleArrow-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleArrow.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleArrow.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleMinus-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleMinus.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenCircleMinus.less corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenCirclePlus-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenCirclePlus.css corelib/dojox/mobile/themes/common/domButtons/DomButtonGreenCirclePlus.less corelib/dojox/mobile/themes/common/domButtons/DomButtonOrangeBall-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonOrangeBall.css corelib/dojox/mobile/themes/common/domButtons/DomButtonOrangeBall.less corelib/dojox/mobile/themes/common/domButtons/DomButtonRedBadge-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedBadge.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedBadge.less corelib/dojox/mobile/themes/common/domButtons/DomButtonRedBall-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedBall.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedBall.less corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCircleArrow-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCircleArrow.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCircleArrow.less corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCircleMinus-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCircleMinus.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCircleMinus.less corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCirclePlus-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCirclePlus.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCirclePlus.less corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCross-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCross.css corelib/dojox/mobile/themes/common/domButtons/DomButtonRedCross.less corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleDownArrow-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleDownArrow.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleDownArrow.less corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGrayButton-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGrayButton.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGrayButton.less corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenButton-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenButton.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenButton.less corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenPlus-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenPlus.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleGreenPlus.less corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleOrangeButton-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleOrangeButton.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleOrangeButton.less corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleRedCross-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleRedCross.css corelib/dojox/mobile/themes/common/domButtons/DomButtonSilverCircleRedCross.less corelib/dojox/mobile/themes/common/domButtons/DomButtonTransparent19.css corelib/dojox/mobile/themes/common/domButtons/DomButtonTransparent19.less corelib/dojox/mobile/themes/common/domButtons/DomButtonTransparent29.css corelib/dojox/mobile/themes/common/domButtons/DomButtonTransparent29.less corelib/dojox/mobile/themes/common/domButtons/DomButtonTransparent30.css corelib/dojox/mobile/themes/common/domButtons/DomButtonTransparent30.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteArrow-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteArrow.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteArrow.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteCheck-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteCheck.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteCheck.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteCheck_rtl.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteCheck_rtl.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteCross-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteCross.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteCross.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow16-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow16.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteDownArrow16.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteLeftArrow16-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteLeftArrow16.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteLeftArrow16.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteMinus-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteMinus.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteMinus.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhitePlus-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhitePlus.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhitePlus.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteRightArrow16-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteRightArrow16.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteRightArrow16.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteSearch-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteSearch.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteSearch.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow.less corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow16-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow16.css corelib/dojox/mobile/themes/common/domButtons/DomButtonWhiteUpArrow16.less corelib/dojox/mobile/themes/common/domButtons/DomButtonYellowStar-compat.css corelib/dojox/mobile/themes/common/domButtons/DomButtonYellowStar.css corelib/dojox/mobile/themes/common/domButtons/DomButtonYellowStar.less corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonArrow.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlackCircleCross.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlackDownArrow16.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlackLeftArrow16.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlackRightArrow16.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlackUpArrow16.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueBall.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCircleArrow.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCircleMinus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueCirclePlus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBlueMinus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonBluePlus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheck.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheckboxOff.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonCheckboxOn.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBlueCheck.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBlueMinus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonDarkBluePlus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayArrow.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayArrow_rtl.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayCross.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayKnob.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayMinus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayPlus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGrayStar.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenBall.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCircleArrow.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCircleMinus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonGreenCirclePlus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonOrangeBall.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedBall.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCircleArrow.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCircleMinus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCirclePlus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedCross.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedMinus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonRedPlus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleDownArrow.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGrayButton.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGreenButton.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleGreenPlus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleOrangeButton.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonSilverCircleRedCross.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteArrow.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteCheck.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteCross.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteDownArrow.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteDownArrow16.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteLeftArrow16.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteMinus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhitePlus.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteRightArrow16.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteSearch.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteUpArrow.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonWhiteUpArrow16.png corelib/dojox/mobile/themes/common/domButtons/compat/mblDomButtonYellowStar.png corelib/dojox/mobile/themes/common/transitions.css corelib/dojox/mobile/themes/common/transitions/cover.css corelib/dojox/mobile/themes/common/transitions/cover.less corelib/dojox/mobile/themes/common/transitions/coverv.css corelib/dojox/mobile/themes/common/transitions/coverv.less corelib/dojox/mobile/themes/common/transitions/cube.css corelib/dojox/mobile/themes/common/transitions/cube.less corelib/dojox/mobile/themes/common/transitions/dissolve.css corelib/dojox/mobile/themes/common/transitions/dissolve.less corelib/dojox/mobile/themes/common/transitions/fade.css corelib/dojox/mobile/themes/common/transitions/fade.less corelib/dojox/mobile/themes/common/transitions/flip.css corelib/dojox/mobile/themes/common/transitions/flip.less corelib/dojox/mobile/themes/common/transitions/reveal.css corelib/dojox/mobile/themes/common/transitions/reveal.less corelib/dojox/mobile/themes/common/transitions/revealv.css corelib/dojox/mobile/themes/common/transitions/revealv.less corelib/dojox/mobile/themes/common/transitions/scaleIn.css corelib/dojox/mobile/themes/common/transitions/scaleIn.less corelib/dojox/mobile/themes/common/transitions/scaleOut.css corelib/dojox/mobile/themes/common/transitions/scaleOut.less corelib/dojox/mobile/themes/common/transitions/slide.css corelib/dojox/mobile/themes/common/transitions/slide.less corelib/dojox/mobile/themes/common/transitions/slidev.css corelib/dojox/mobile/themes/common/transitions/slidev.less corelib/dojox/mobile/themes/common/transitions/swap.css corelib/dojox/mobile/themes/common/transitions/swap.less corelib/dojox/mobile/themes/common/transitions/swirl.css corelib/dojox/mobile/themes/common/transitions/swirl.less corelib/dojox/mobile/themes/common/transitions/zoomIn.css corelib/dojox/mobile/themes/common/transitions/zoomIn.less corelib/dojox/mobile/themes/common/transitions/zoomOut.css corelib/dojox/mobile/themes/common/transitions/zoomOut.less corelib/dojox/mobile/themes/custom/Accordion-compat.css corelib/dojox/mobile/themes/custom/Accordion.css corelib/dojox/mobile/themes/custom/Accordion_rtl.css corelib/dojox/mobile/themes/custom/Button-compat.css corelib/dojox/mobile/themes/custom/Button.css corelib/dojox/mobile/themes/custom/Carousel.css corelib/dojox/mobile/themes/custom/Carousel_rtl.css corelib/dojox/mobile/themes/custom/CheckBox-compat.css corelib/dojox/mobile/themes/custom/CheckBox.css corelib/dojox/mobile/themes/custom/ComboBox-compat.css corelib/dojox/mobile/themes/custom/ComboBox.css corelib/dojox/mobile/themes/custom/ComboBox_rtl.css corelib/dojox/mobile/themes/custom/DatePicker.css corelib/dojox/mobile/themes/custom/EdgeToEdgeCategory.css corelib/dojox/mobile/themes/custom/EdgeToEdgeList.css corelib/dojox/mobile/themes/custom/FixedSplitter.css corelib/dojox/mobile/themes/custom/FormLayout.css corelib/dojox/mobile/themes/custom/FormLayout_rtl.css corelib/dojox/mobile/themes/custom/GridLayout.css corelib/dojox/mobile/themes/custom/GridLayout_rtl.css corelib/dojox/mobile/themes/custom/Heading-compat.css corelib/dojox/mobile/themes/custom/Heading.css corelib/dojox/mobile/themes/custom/IconContainer-compat.css corelib/dojox/mobile/themes/custom/IconContainer-compat.less corelib/dojox/mobile/themes/custom/IconContainer.css corelib/dojox/mobile/themes/custom/IconContainer.less corelib/dojox/mobile/themes/custom/IconContainer_rtl.css corelib/dojox/mobile/themes/custom/IconMenu-compat.css corelib/dojox/mobile/themes/custom/IconMenu.css corelib/dojox/mobile/themes/custom/IconMenu_rtl-compat.css corelib/dojox/mobile/themes/custom/IconMenu_rtl.css corelib/dojox/mobile/themes/custom/ListItem-compat.css corelib/dojox/mobile/themes/custom/ListItem-compat.less corelib/dojox/mobile/themes/custom/ListItem.css corelib/dojox/mobile/themes/custom/ListItem.less corelib/dojox/mobile/themes/custom/ListItem_rtl-compat.css corelib/dojox/mobile/themes/custom/ListItem_rtl.css corelib/dojox/mobile/themes/custom/ListItem_rtl.less corelib/dojox/mobile/themes/custom/Opener-compat.css corelib/dojox/mobile/themes/custom/Opener.css corelib/dojox/mobile/themes/custom/Overlay-compat.css corelib/dojox/mobile/themes/custom/Overlay.css corelib/dojox/mobile/themes/custom/Overlay.less corelib/dojox/mobile/themes/custom/PageIndicator-compat.css corelib/dojox/mobile/themes/custom/PageIndicator.css corelib/dojox/mobile/themes/custom/ProgressBar-compat.css corelib/dojox/mobile/themes/custom/ProgressBar.css corelib/dojox/mobile/themes/custom/ProgressIndicator-compat.css corelib/dojox/mobile/themes/custom/ProgressIndicator.css corelib/dojox/mobile/themes/custom/ProgressIndicator_rtl.css corelib/dojox/mobile/themes/custom/RadioButton-compat.css corelib/dojox/mobile/themes/custom/RadioButton.css corelib/dojox/mobile/themes/custom/RoundRect-compat.css corelib/dojox/mobile/themes/custom/RoundRect.css corelib/dojox/mobile/themes/custom/RoundRectCategory.css corelib/dojox/mobile/themes/custom/RoundRectCategory_rtl.css corelib/dojox/mobile/themes/custom/RoundRectList-compat.css corelib/dojox/mobile/themes/custom/RoundRectList.css corelib/dojox/mobile/themes/custom/ScrollablePane.css corelib/dojox/mobile/themes/custom/SearchBox-compat.css corelib/dojox/mobile/themes/custom/SearchBox.css corelib/dojox/mobile/themes/custom/SimpleDialog-compat.css corelib/dojox/mobile/themes/custom/SimpleDialog.css corelib/dojox/mobile/themes/custom/Slider-compat.css corelib/dojox/mobile/themes/custom/Slider.css corelib/dojox/mobile/themes/custom/SpinWheel-compat.css corelib/dojox/mobile/themes/custom/SpinWheel.css corelib/dojox/mobile/themes/custom/SpinWheel_rtl-compat.css corelib/dojox/mobile/themes/custom/SpinWheel_rtl.css corelib/dojox/mobile/themes/custom/Switch-compat.css corelib/dojox/mobile/themes/custom/Switch-compat.less corelib/dojox/mobile/themes/custom/Switch.css corelib/dojox/mobile/themes/custom/Switch.less corelib/dojox/mobile/themes/custom/Switch_rtl-compat.css corelib/dojox/mobile/themes/custom/Switch_rtl.css corelib/dojox/mobile/themes/custom/TabBar-compat.css corelib/dojox/mobile/themes/custom/TabBar-compat.less corelib/dojox/mobile/themes/custom/TabBar.css corelib/dojox/mobile/themes/custom/TabBar.less corelib/dojox/mobile/themes/custom/TabBar_rtl-compat.css corelib/dojox/mobile/themes/custom/TabBar_rtl.css corelib/dojox/mobile/themes/custom/TextArea-compat.css corelib/dojox/mobile/themes/custom/TextArea.css corelib/dojox/mobile/themes/custom/TextBox-compat.css corelib/dojox/mobile/themes/custom/TextBox.css corelib/dojox/mobile/themes/custom/TimePicker.css corelib/dojox/mobile/themes/custom/ToggleButton-compat.css corelib/dojox/mobile/themes/custom/ToggleButton.css corelib/dojox/mobile/themes/custom/ToggleButton_rtl.css corelib/dojox/mobile/themes/custom/ToolBarButton-compat.css corelib/dojox/mobile/themes/custom/ToolBarButton.css corelib/dojox/mobile/themes/custom/ToolBarButton_rtl.css corelib/dojox/mobile/themes/custom/Tooltip-compat.css corelib/dojox/mobile/themes/custom/Tooltip.css corelib/dojox/mobile/themes/custom/ValuePicker-compat.css corelib/dojox/mobile/themes/custom/ValuePicker.css corelib/dojox/mobile/themes/custom/ValuePicker.less corelib/dojox/mobile/themes/custom/View.css corelib/dojox/mobile/themes/custom/View.less corelib/dojox/mobile/themes/custom/base-compat.css corelib/dojox/mobile/themes/custom/base.css corelib/dojox/mobile/themes/custom/base_rtl-compat.css corelib/dojox/mobile/themes/custom/base_rtl.css corelib/dojox/mobile/themes/custom/common-compat.css corelib/dojox/mobile/themes/custom/common.css corelib/dojox/mobile/themes/custom/common.less corelib/dojox/mobile/themes/custom/compat/arrow-button-bg-sel.png corelib/dojox/mobile/themes/custom/compat/arrow-button-bg.png corelib/dojox/mobile/themes/custom/compat/arrow-button-head-sel.png corelib/dojox/mobile/themes/custom/compat/arrow-button-head.png corelib/dojox/mobile/themes/custom/compat/arrow-button-right-head-sel.png corelib/dojox/mobile/themes/custom/compat/arrow-button-right-head.png corelib/dojox/mobile/themes/custom/compat/blue-button-bg.png corelib/dojox/mobile/themes/custom/compat/blue-button-sel-bg.png corelib/dojox/mobile/themes/custom/compat/button-arrow-head-bg.gif corelib/dojox/mobile/themes/custom/compat/button-bg.png corelib/dojox/mobile/themes/custom/compat/button-chk-bg.png corelib/dojox/mobile/themes/custom/compat/button-sel-bg.png corelib/dojox/mobile/themes/custom/compat/button-unsel-bg.png corelib/dojox/mobile/themes/custom/compat/heading-bg.png corelib/dojox/mobile/themes/custom/compat/icon-content-heading-bg.png corelib/dojox/mobile/themes/custom/compat/red-button-bg.png corelib/dojox/mobile/themes/custom/compat/red-button-sel-bg.png corelib/dojox/mobile/themes/custom/compat/slider-h-bar-bg.png corelib/dojox/mobile/themes/custom/compat/slider-h-bg.png corelib/dojox/mobile/themes/custom/compat/slider-handle-bg.png corelib/dojox/mobile/themes/custom/compat/switch-arc1-k.gif corelib/dojox/mobile/themes/custom/compat/switch-arc1-l.gif corelib/dojox/mobile/themes/custom/compat/switch-arc1-r.gif corelib/dojox/mobile/themes/custom/compat/switch-arc2-k.gif corelib/dojox/mobile/themes/custom/compat/switch-arc2-l.gif corelib/dojox/mobile/themes/custom/compat/switch-arc2-r.gif corelib/dojox/mobile/themes/custom/compat/switch-round1-k.gif corelib/dojox/mobile/themes/custom/compat/switch-round1-l.gif corelib/dojox/mobile/themes/custom/compat/switch-round1-r.gif corelib/dojox/mobile/themes/custom/compat/switch-round2-k.gif corelib/dojox/mobile/themes/custom/compat/switch-round2-l.gif corelib/dojox/mobile/themes/custom/compat/switch-round2-r.gif corelib/dojox/mobile/themes/custom/compat/switch-square-k.gif corelib/dojox/mobile/themes/custom/compat/switch-square-l.gif corelib/dojox/mobile/themes/custom/compat/switch-square-r.gif corelib/dojox/mobile/themes/custom/compat/tab-seg-button-bg.png corelib/dojox/mobile/themes/custom/compat/tab-seg-sel-button-bg.png corelib/dojox/mobile/themes/custom/compat/tab-slim-bar-bg.png corelib/dojox/mobile/themes/custom/compat/tab-tall-bar-bg.png corelib/dojox/mobile/themes/custom/compat/togglebutton-chk-mark-bg.png corelib/dojox/mobile/themes/custom/compat/valuepicker-button-bg.png corelib/dojox/mobile/themes/custom/custom-compat.css corelib/dojox/mobile/themes/custom/custom.css corelib/dojox/mobile/themes/custom/custom_rtl-compat.css corelib/dojox/mobile/themes/custom/custom_rtl.css corelib/dojox/mobile/themes/custom/dijit/Calendar-compat.css corelib/dojox/mobile/themes/custom/dijit/Calendar-compat.less corelib/dojox/mobile/themes/custom/dijit/Calendar.css corelib/dojox/mobile/themes/custom/dijit/Calendar.less corelib/dojox/mobile/themes/custom/dijit/compat/calendar-datelabel-act-bg.png corelib/dojox/mobile/themes/custom/dijit/compat/calendar-datelabel-sel-bg.png corelib/dojox/mobile/themes/custom/dijit/compat/calendar-month-bg.png corelib/dojox/mobile/themes/custom/dijit/compat/calendar-year-bg.png corelib/dojox/mobile/themes/custom/images/thumb-overlay-large.png corelib/dojox/mobile/themes/custom/images/thumb-overlay-small.png corelib/dojox/mobile/themes/custom/images/thumb-overlay.png corelib/dojox/mobile/themes/custom/variables.less corelib/dojox/mobile/themes/custom/variables_rtl.less corelib/dojox/mobile/themes/holodark/Accordion-compat.css corelib/dojox/mobile/themes/holodark/Accordion.css corelib/dojox/mobile/themes/holodark/Accordion_rtl.css corelib/dojox/mobile/themes/holodark/Button-compat.css corelib/dojox/mobile/themes/holodark/Button-compat.less corelib/dojox/mobile/themes/holodark/Button.css corelib/dojox/mobile/themes/holodark/Button.less corelib/dojox/mobile/themes/holodark/Carousel.css corelib/dojox/mobile/themes/holodark/Carousel_rtl.css corelib/dojox/mobile/themes/holodark/CheckBox-compat.css corelib/dojox/mobile/themes/holodark/CheckBox.css corelib/dojox/mobile/themes/holodark/CheckBox.less corelib/dojox/mobile/themes/holodark/ComboBox-compat.css corelib/dojox/mobile/themes/holodark/ComboBox.css corelib/dojox/mobile/themes/holodark/ComboBox_rtl.css corelib/dojox/mobile/themes/holodark/DatePicker.css corelib/dojox/mobile/themes/holodark/EdgeToEdgeCategory.css corelib/dojox/mobile/themes/holodark/EdgeToEdgeList.css corelib/dojox/mobile/themes/holodark/FixedSplitter.css corelib/dojox/mobile/themes/holodark/FormLayout.css corelib/dojox/mobile/themes/holodark/FormLayout_rtl.css corelib/dojox/mobile/themes/holodark/GridLayout.css corelib/dojox/mobile/themes/holodark/GridLayout_rtl.css corelib/dojox/mobile/themes/holodark/Heading-compat.css corelib/dojox/mobile/themes/holodark/Heading-compat.less corelib/dojox/mobile/themes/holodark/Heading.css corelib/dojox/mobile/themes/holodark/IconContainer-compat.css corelib/dojox/mobile/themes/holodark/IconContainer-compat.less corelib/dojox/mobile/themes/holodark/IconContainer.css corelib/dojox/mobile/themes/holodark/IconContainer.less corelib/dojox/mobile/themes/holodark/IconContainer_rtl.css corelib/dojox/mobile/themes/holodark/IconMenu-compat.css corelib/dojox/mobile/themes/holodark/IconMenu.css corelib/dojox/mobile/themes/holodark/IconMenu_rtl-compat.css corelib/dojox/mobile/themes/holodark/IconMenu_rtl.css corelib/dojox/mobile/themes/holodark/ListItem-compat.css corelib/dojox/mobile/themes/holodark/ListItem-compat.less corelib/dojox/mobile/themes/holodark/ListItem.css corelib/dojox/mobile/themes/holodark/ListItem.less corelib/dojox/mobile/themes/holodark/ListItem_rtl-compat.css corelib/dojox/mobile/themes/holodark/ListItem_rtl.css corelib/dojox/mobile/themes/holodark/ListItem_rtl.less corelib/dojox/mobile/themes/holodark/Opener-compat.css corelib/dojox/mobile/themes/holodark/Opener.css corelib/dojox/mobile/themes/holodark/Overlay-compat.css corelib/dojox/mobile/themes/holodark/Overlay.css corelib/dojox/mobile/themes/holodark/Overlay.less corelib/dojox/mobile/themes/holodark/PageIndicator-compat.css corelib/dojox/mobile/themes/holodark/PageIndicator.css corelib/dojox/mobile/themes/holodark/ProgressBar-compat.css corelib/dojox/mobile/themes/holodark/ProgressBar.css corelib/dojox/mobile/themes/holodark/ProgressBar.less corelib/dojox/mobile/themes/holodark/ProgressIndicator-compat.css corelib/dojox/mobile/themes/holodark/ProgressIndicator.css corelib/dojox/mobile/themes/holodark/ProgressIndicator_rtl.css corelib/dojox/mobile/themes/holodark/RadioButton-compat.css corelib/dojox/mobile/themes/holodark/RadioButton.css corelib/dojox/mobile/themes/holodark/RadioButton.less corelib/dojox/mobile/themes/holodark/RoundRect-compat.css corelib/dojox/mobile/themes/holodark/RoundRect.css corelib/dojox/mobile/themes/holodark/RoundRectCategory.css corelib/dojox/mobile/themes/holodark/RoundRectCategory_rtl.css corelib/dojox/mobile/themes/holodark/RoundRectList-compat.css corelib/dojox/mobile/themes/holodark/RoundRectList.css corelib/dojox/mobile/themes/holodark/ScrollablePane.css corelib/dojox/mobile/themes/holodark/SearchBox-compat.css corelib/dojox/mobile/themes/holodark/SearchBox.css corelib/dojox/mobile/themes/holodark/SimpleDialog-compat.css corelib/dojox/mobile/themes/holodark/SimpleDialog.css corelib/dojox/mobile/themes/holodark/Slider-compat.css corelib/dojox/mobile/themes/holodark/Slider.css corelib/dojox/mobile/themes/holodark/Slider.less corelib/dojox/mobile/themes/holodark/SpinWheel-compat.css corelib/dojox/mobile/themes/holodark/SpinWheel.css corelib/dojox/mobile/themes/holodark/SpinWheel_rtl-compat.css corelib/dojox/mobile/themes/holodark/SpinWheel_rtl.css corelib/dojox/mobile/themes/holodark/Switch-compat.css corelib/dojox/mobile/themes/holodark/Switch-compat.less corelib/dojox/mobile/themes/holodark/Switch.css corelib/dojox/mobile/themes/holodark/Switch.less corelib/dojox/mobile/themes/holodark/Switch_rtl-compat.css corelib/dojox/mobile/themes/holodark/Switch_rtl.css corelib/dojox/mobile/themes/holodark/TabBar-compat.css corelib/dojox/mobile/themes/holodark/TabBar-compat.less corelib/dojox/mobile/themes/holodark/TabBar.css corelib/dojox/mobile/themes/holodark/TabBar.less corelib/dojox/mobile/themes/holodark/TabBar_rtl-compat.css corelib/dojox/mobile/themes/holodark/TabBar_rtl.css corelib/dojox/mobile/themes/holodark/TextArea-compat.css corelib/dojox/mobile/themes/holodark/TextArea.css corelib/dojox/mobile/themes/holodark/TextBox-compat.css corelib/dojox/mobile/themes/holodark/TextBox.css corelib/dojox/mobile/themes/holodark/TextBox.less corelib/dojox/mobile/themes/holodark/TimePicker.css corelib/dojox/mobile/themes/holodark/ToggleButton-compat.css corelib/dojox/mobile/themes/holodark/ToggleButton.css corelib/dojox/mobile/themes/holodark/ToggleButton_rtl.css corelib/dojox/mobile/themes/holodark/ToolBarButton-compat.css corelib/dojox/mobile/themes/holodark/ToolBarButton.css corelib/dojox/mobile/themes/holodark/ToolBarButton_rtl.css corelib/dojox/mobile/themes/holodark/Tooltip-compat.css corelib/dojox/mobile/themes/holodark/Tooltip.css corelib/dojox/mobile/themes/holodark/ValuePicker-compat.css corelib/dojox/mobile/themes/holodark/ValuePicker-compat.less corelib/dojox/mobile/themes/holodark/ValuePicker.css corelib/dojox/mobile/themes/holodark/ValuePicker.less corelib/dojox/mobile/themes/holodark/View.css corelib/dojox/mobile/themes/holodark/View.less corelib/dojox/mobile/themes/holodark/android-compat.css corelib/dojox/mobile/themes/holodark/android_rtl-compat.css corelib/dojox/mobile/themes/holodark/base-compat.css corelib/dojox/mobile/themes/holodark/base.css corelib/dojox/mobile/themes/holodark/base_rtl-compat.css corelib/dojox/mobile/themes/holodark/base_rtl.css corelib/dojox/mobile/themes/holodark/common-compat.css corelib/dojox/mobile/themes/holodark/common.css corelib/dojox/mobile/themes/holodark/compat/arrow-button-bg-sel.png corelib/dojox/mobile/themes/holodark/compat/arrow-button-bg.png corelib/dojox/mobile/themes/holodark/compat/arrow-button-head-sel.png corelib/dojox/mobile/themes/holodark/compat/arrow-button-head.png corelib/dojox/mobile/themes/holodark/compat/arrow-button-right-head-sel.png corelib/dojox/mobile/themes/holodark/compat/arrow-button-right-head.png corelib/dojox/mobile/themes/holodark/compat/blue-button-bg.png corelib/dojox/mobile/themes/holodark/compat/blue-button-sel-bg.png corelib/dojox/mobile/themes/holodark/compat/button-arrow-head-bg.gif corelib/dojox/mobile/themes/holodark/compat/button-bg.png corelib/dojox/mobile/themes/holodark/compat/button-chk-bg.png corelib/dojox/mobile/themes/holodark/compat/button-sel-bg.png corelib/dojox/mobile/themes/holodark/compat/button-unsel-bg.png corelib/dojox/mobile/themes/holodark/compat/gray-arrow.png corelib/dojox/mobile/themes/holodark/compat/heading-bg.png corelib/dojox/mobile/themes/holodark/compat/icon-content-heading-bg.png corelib/dojox/mobile/themes/holodark/compat/red-button-bg.png corelib/dojox/mobile/themes/holodark/compat/red-button-sel-bg.png corelib/dojox/mobile/themes/holodark/compat/slider-h-bar-bg.png corelib/dojox/mobile/themes/holodark/compat/slider-h-bg.png corelib/dojox/mobile/themes/holodark/compat/slider-handle-bg.png corelib/dojox/mobile/themes/holodark/compat/switch-arc1-k.gif corelib/dojox/mobile/themes/holodark/compat/switch-arc1-l.gif corelib/dojox/mobile/themes/holodark/compat/switch-arc1-r.gif corelib/dojox/mobile/themes/holodark/compat/switch-arc2-k.gif corelib/dojox/mobile/themes/holodark/compat/switch-arc2-l.gif corelib/dojox/mobile/themes/holodark/compat/switch-arc2-r.gif corelib/dojox/mobile/themes/holodark/compat/switch-round1-k.gif corelib/dojox/mobile/themes/holodark/compat/switch-round1-l.gif corelib/dojox/mobile/themes/holodark/compat/switch-round1-r.gif corelib/dojox/mobile/themes/holodark/compat/switch-round2-k.gif corelib/dojox/mobile/themes/holodark/compat/switch-round2-l.gif corelib/dojox/mobile/themes/holodark/compat/switch-round2-r.gif corelib/dojox/mobile/themes/holodark/compat/switch-square-k.gif corelib/dojox/mobile/themes/holodark/compat/switch-square-l.gif corelib/dojox/mobile/themes/holodark/compat/switch-square-r.gif corelib/dojox/mobile/themes/holodark/compat/tab-button-bg.png corelib/dojox/mobile/themes/holodark/compat/tab-orange-button-bg.png corelib/dojox/mobile/themes/holodark/compat/tab-seg-button-bg.png corelib/dojox/mobile/themes/holodark/compat/tab-seg-sel-button-bg.png corelib/dojox/mobile/themes/holodark/compat/tab-sel-button-bg.png corelib/dojox/mobile/themes/holodark/compat/tab-slim-bar-bg.png corelib/dojox/mobile/themes/holodark/compat/tab-tall-bar-bg.png corelib/dojox/mobile/themes/holodark/compat/togglebutton-chk-bg.png corelib/dojox/mobile/themes/holodark/compat/togglebutton-chk-mark-bg.png corelib/dojox/mobile/themes/holodark/compat/valuepicker-button-bg.png corelib/dojox/mobile/themes/holodark/dijit/Calendar-compat.css corelib/dojox/mobile/themes/holodark/dijit/Calendar-compat.less corelib/dojox/mobile/themes/holodark/dijit/Calendar.css corelib/dojox/mobile/themes/holodark/dijit/Calendar.less corelib/dojox/mobile/themes/holodark/dijit/compat/calendar-datelabel-act-bg.png corelib/dojox/mobile/themes/holodark/dijit/compat/calendar-datelabel-sel-bg.png corelib/dojox/mobile/themes/holodark/dijit/compat/calendar-month-bg.png corelib/dojox/mobile/themes/holodark/dijit/compat/calendar-year-bg.png corelib/dojox/mobile/themes/holodark/holodark.css corelib/dojox/mobile/themes/holodark/holodark_rtl.css corelib/dojox/mobile/themes/holodark/images/thumb-overlay-large.png corelib/dojox/mobile/themes/holodark/images/thumb-overlay-small.png corelib/dojox/mobile/themes/holodark/images/thumb-overlay.png corelib/dojox/mobile/themes/holodark/images/vseparator.png corelib/dojox/mobile/themes/holodark/variables.less corelib/dojox/mobile/themes/holodark/variables_rtl.less corelib/dojox/mobile/themes/ios7/Accordion-compat.css corelib/dojox/mobile/themes/ios7/Accordion.css corelib/dojox/mobile/themes/ios7/Accordion_rtl.css corelib/dojox/mobile/themes/ios7/Button-compat.css corelib/dojox/mobile/themes/ios7/Button-compat.less corelib/dojox/mobile/themes/ios7/Button.css corelib/dojox/mobile/themes/ios7/Button.less corelib/dojox/mobile/themes/ios7/Carousel.css corelib/dojox/mobile/themes/ios7/Carousel_rtl.css corelib/dojox/mobile/themes/ios7/CheckBox-compat.css corelib/dojox/mobile/themes/ios7/CheckBox.css corelib/dojox/mobile/themes/ios7/CheckBox.less corelib/dojox/mobile/themes/ios7/ComboBox-compat.css corelib/dojox/mobile/themes/ios7/ComboBox.css corelib/dojox/mobile/themes/ios7/ComboBox_rtl.css corelib/dojox/mobile/themes/ios7/DatePicker.css corelib/dojox/mobile/themes/ios7/EdgeToEdgeCategory.css corelib/dojox/mobile/themes/ios7/EdgeToEdgeList.css corelib/dojox/mobile/themes/ios7/FixedSplitter.css corelib/dojox/mobile/themes/ios7/FormLayout.css corelib/dojox/mobile/themes/ios7/FormLayout_rtl.css corelib/dojox/mobile/themes/ios7/GridLayout.css corelib/dojox/mobile/themes/ios7/GridLayout_rtl.css corelib/dojox/mobile/themes/ios7/Heading-compat.css corelib/dojox/mobile/themes/ios7/Heading-compat.less corelib/dojox/mobile/themes/ios7/Heading.css corelib/dojox/mobile/themes/ios7/IconContainer-compat.css corelib/dojox/mobile/themes/ios7/IconContainer-compat.less corelib/dojox/mobile/themes/ios7/IconContainer.css corelib/dojox/mobile/themes/ios7/IconContainer.less corelib/dojox/mobile/themes/ios7/IconContainer_rtl.css corelib/dojox/mobile/themes/ios7/IconMenu-compat.css corelib/dojox/mobile/themes/ios7/IconMenu.css corelib/dojox/mobile/themes/ios7/IconMenu_rtl-compat.css corelib/dojox/mobile/themes/ios7/IconMenu_rtl.css corelib/dojox/mobile/themes/ios7/ListItem-compat.css corelib/dojox/mobile/themes/ios7/ListItem-compat.less corelib/dojox/mobile/themes/ios7/ListItem.css corelib/dojox/mobile/themes/ios7/ListItem.less corelib/dojox/mobile/themes/ios7/ListItem_rtl-compat.css corelib/dojox/mobile/themes/ios7/ListItem_rtl.css corelib/dojox/mobile/themes/ios7/ListItem_rtl.less corelib/dojox/mobile/themes/ios7/Opener-compat.css corelib/dojox/mobile/themes/ios7/Opener.css corelib/dojox/mobile/themes/ios7/Overlay-compat.css corelib/dojox/mobile/themes/ios7/Overlay.css corelib/dojox/mobile/themes/ios7/Overlay.less corelib/dojox/mobile/themes/ios7/PageIndicator-compat.css corelib/dojox/mobile/themes/ios7/PageIndicator.css corelib/dojox/mobile/themes/ios7/PageIndicator.less corelib/dojox/mobile/themes/ios7/ProgressBar-compat.css corelib/dojox/mobile/themes/ios7/ProgressBar.css corelib/dojox/mobile/themes/ios7/ProgressIndicator-compat.css corelib/dojox/mobile/themes/ios7/ProgressIndicator.css corelib/dojox/mobile/themes/ios7/ProgressIndicator_rtl.css corelib/dojox/mobile/themes/ios7/RadioButton-compat.css corelib/dojox/mobile/themes/ios7/RadioButton.css corelib/dojox/mobile/themes/ios7/RadioButton.less corelib/dojox/mobile/themes/ios7/RoundRect-compat.css corelib/dojox/mobile/themes/ios7/RoundRect.css corelib/dojox/mobile/themes/ios7/RoundRectCategory.css corelib/dojox/mobile/themes/ios7/RoundRectCategory_rtl.css corelib/dojox/mobile/themes/ios7/RoundRectList-compat.css corelib/dojox/mobile/themes/ios7/RoundRectList.css corelib/dojox/mobile/themes/ios7/ScrollablePane.css corelib/dojox/mobile/themes/ios7/SearchBox-compat.css corelib/dojox/mobile/themes/ios7/SearchBox.css corelib/dojox/mobile/themes/ios7/SimpleDialog-compat.css corelib/dojox/mobile/themes/ios7/SimpleDialog.css corelib/dojox/mobile/themes/ios7/Slider-compat.css corelib/dojox/mobile/themes/ios7/Slider.css corelib/dojox/mobile/themes/ios7/Slider.less corelib/dojox/mobile/themes/ios7/SpinWheel-compat.css corelib/dojox/mobile/themes/ios7/SpinWheel-compat.less corelib/dojox/mobile/themes/ios7/SpinWheel.css corelib/dojox/mobile/themes/ios7/SpinWheel.less corelib/dojox/mobile/themes/ios7/SpinWheel_rtl-compat.css corelib/dojox/mobile/themes/ios7/SpinWheel_rtl.css corelib/dojox/mobile/themes/ios7/Switch-compat.css corelib/dojox/mobile/themes/ios7/Switch-compat.less corelib/dojox/mobile/themes/ios7/Switch.css corelib/dojox/mobile/themes/ios7/Switch.less corelib/dojox/mobile/themes/ios7/Switch_rtl-compat.css corelib/dojox/mobile/themes/ios7/Switch_rtl.css corelib/dojox/mobile/themes/ios7/TabBar-compat.css corelib/dojox/mobile/themes/ios7/TabBar-compat.less corelib/dojox/mobile/themes/ios7/TabBar.css corelib/dojox/mobile/themes/ios7/TabBar.less corelib/dojox/mobile/themes/ios7/TabBar_rtl-compat.css corelib/dojox/mobile/themes/ios7/TabBar_rtl.css corelib/dojox/mobile/themes/ios7/TextArea-compat.css corelib/dojox/mobile/themes/ios7/TextArea.css corelib/dojox/mobile/themes/ios7/TextBox-compat.css corelib/dojox/mobile/themes/ios7/TextBox.css corelib/dojox/mobile/themes/ios7/TextBox.less corelib/dojox/mobile/themes/ios7/TimePicker.css corelib/dojox/mobile/themes/ios7/ToggleButton-compat.css corelib/dojox/mobile/themes/ios7/ToggleButton.css corelib/dojox/mobile/themes/ios7/ToggleButton.less corelib/dojox/mobile/themes/ios7/ToggleButton_rtl.css corelib/dojox/mobile/themes/ios7/ToolBarButton-compat.css corelib/dojox/mobile/themes/ios7/ToolBarButton.css corelib/dojox/mobile/themes/ios7/ToolBarButton.less corelib/dojox/mobile/themes/ios7/ToolBarButton_rtl.css corelib/dojox/mobile/themes/ios7/Tooltip-compat.css corelib/dojox/mobile/themes/ios7/Tooltip.css corelib/dojox/mobile/themes/ios7/ValuePicker-compat.css corelib/dojox/mobile/themes/ios7/ValuePicker-compat.less corelib/dojox/mobile/themes/ios7/ValuePicker.css corelib/dojox/mobile/themes/ios7/ValuePicker.less corelib/dojox/mobile/themes/ios7/View.css corelib/dojox/mobile/themes/ios7/View.less corelib/dojox/mobile/themes/ios7/android-compat.css corelib/dojox/mobile/themes/ios7/android_rtl-compat.css corelib/dojox/mobile/themes/ios7/base-compat.css corelib/dojox/mobile/themes/ios7/base.css corelib/dojox/mobile/themes/ios7/base_rtl-compat.css corelib/dojox/mobile/themes/ios7/base_rtl.css corelib/dojox/mobile/themes/ios7/common-compat.css corelib/dojox/mobile/themes/ios7/common.css corelib/dojox/mobile/themes/ios7/compat/arrow-button-bg-sel.png corelib/dojox/mobile/themes/ios7/compat/arrow-button-bg.png corelib/dojox/mobile/themes/ios7/compat/arrow-button-head-sel.png corelib/dojox/mobile/themes/ios7/compat/arrow-button-head.png corelib/dojox/mobile/themes/ios7/compat/arrow-button-right-head-sel.png corelib/dojox/mobile/themes/ios7/compat/arrow-button-right-head.png corelib/dojox/mobile/themes/ios7/compat/blue-button-bg.png corelib/dojox/mobile/themes/ios7/compat/blue-button-sel-bg.png corelib/dojox/mobile/themes/ios7/compat/button-arrow-head-bg.gif corelib/dojox/mobile/themes/ios7/compat/button-bg.png corelib/dojox/mobile/themes/ios7/compat/button-chk-bg.png corelib/dojox/mobile/themes/ios7/compat/button-sel-bg.png corelib/dojox/mobile/themes/ios7/compat/button-unsel-bg.png corelib/dojox/mobile/themes/ios7/compat/gray-arrow.png corelib/dojox/mobile/themes/ios7/compat/heading-bg.png corelib/dojox/mobile/themes/ios7/compat/icon-content-heading-bg.png corelib/dojox/mobile/themes/ios7/compat/red-button-bg.png corelib/dojox/mobile/themes/ios7/compat/red-button-sel-bg.png corelib/dojox/mobile/themes/ios7/compat/slider-h-bar-bg.png corelib/dojox/mobile/themes/ios7/compat/slider-h-bg.png corelib/dojox/mobile/themes/ios7/compat/slider-handle-bg.png corelib/dojox/mobile/themes/ios7/compat/switch-arc1-k.gif corelib/dojox/mobile/themes/ios7/compat/switch-arc1-l.gif corelib/dojox/mobile/themes/ios7/compat/switch-arc1-r.gif corelib/dojox/mobile/themes/ios7/compat/switch-arc2-k.gif corelib/dojox/mobile/themes/ios7/compat/switch-arc2-l.gif corelib/dojox/mobile/themes/ios7/compat/switch-arc2-r.gif corelib/dojox/mobile/themes/ios7/compat/switch-round1-k.gif corelib/dojox/mobile/themes/ios7/compat/switch-round1-l.gif corelib/dojox/mobile/themes/ios7/compat/switch-round1-r.gif corelib/dojox/mobile/themes/ios7/compat/switch-round2-k.gif corelib/dojox/mobile/themes/ios7/compat/switch-round2-l.gif corelib/dojox/mobile/themes/ios7/compat/switch-round2-r.gif corelib/dojox/mobile/themes/ios7/compat/switch-square-k.gif corelib/dojox/mobile/themes/ios7/compat/switch-square-l.gif corelib/dojox/mobile/themes/ios7/compat/switch-square-r.gif corelib/dojox/mobile/themes/ios7/compat/tab-button-bg.png corelib/dojox/mobile/themes/ios7/compat/tab-orange-button-bg.png corelib/dojox/mobile/themes/ios7/compat/tab-seg-button-bg.png corelib/dojox/mobile/themes/ios7/compat/tab-seg-sel-button-bg.png corelib/dojox/mobile/themes/ios7/compat/tab-sel-button-bg.png corelib/dojox/mobile/themes/ios7/compat/tab-slim-bar-bg.png corelib/dojox/mobile/themes/ios7/compat/tab-tall-bar-bg.png corelib/dojox/mobile/themes/ios7/compat/togglebutton-chk-bg.png corelib/dojox/mobile/themes/ios7/compat/togglebutton-chk-mark-bg.png corelib/dojox/mobile/themes/ios7/compat/valuepicker-button-bg.png corelib/dojox/mobile/themes/ios7/dijit/Calendar-compat.css corelib/dojox/mobile/themes/ios7/dijit/Calendar-compat.less corelib/dojox/mobile/themes/ios7/dijit/Calendar.css corelib/dojox/mobile/themes/ios7/dijit/Calendar.less corelib/dojox/mobile/themes/ios7/dijit/compat/calendar-datelabel-act-bg.png corelib/dojox/mobile/themes/ios7/dijit/compat/calendar-datelabel-sel-bg.png corelib/dojox/mobile/themes/ios7/dijit/compat/calendar-month-bg.png corelib/dojox/mobile/themes/ios7/dijit/compat/calendar-year-bg.png corelib/dojox/mobile/themes/ios7/images/thumb-overlay-large.png corelib/dojox/mobile/themes/ios7/images/thumb-overlay-small.png corelib/dojox/mobile/themes/ios7/images/thumb-overlay.png corelib/dojox/mobile/themes/ios7/images/vseparator.png corelib/dojox/mobile/themes/ios7/ios7.css corelib/dojox/mobile/themes/ios7/ios7_rtl.css corelib/dojox/mobile/themes/ios7/variables.less corelib/dojox/mobile/themes/ios7/variables_rtl.less corelib/dojox/mobile/themes/iphone/Accordion-compat.css corelib/dojox/mobile/themes/iphone/Accordion.css corelib/dojox/mobile/themes/iphone/Accordion_rtl.css corelib/dojox/mobile/themes/iphone/Button-compat.css corelib/dojox/mobile/themes/iphone/Button.css corelib/dojox/mobile/themes/iphone/Carousel.css corelib/dojox/mobile/themes/iphone/Carousel_rtl.css corelib/dojox/mobile/themes/iphone/CheckBox-compat.css corelib/dojox/mobile/themes/iphone/CheckBox.css corelib/dojox/mobile/themes/iphone/ComboBox-compat.css corelib/dojox/mobile/themes/iphone/ComboBox.css corelib/dojox/mobile/themes/iphone/ComboBox_rtl.css corelib/dojox/mobile/themes/iphone/DatePicker.css corelib/dojox/mobile/themes/iphone/EdgeToEdgeCategory-compat.css corelib/dojox/mobile/themes/iphone/EdgeToEdgeCategory.css corelib/dojox/mobile/themes/iphone/EdgeToEdgeList.css corelib/dojox/mobile/themes/iphone/FixedSplitter.css corelib/dojox/mobile/themes/iphone/FormLayout.css corelib/dojox/mobile/themes/iphone/FormLayout_rtl.css corelib/dojox/mobile/themes/iphone/GridLayout.css corelib/dojox/mobile/themes/iphone/GridLayout_rtl.css corelib/dojox/mobile/themes/iphone/Heading-compat.css corelib/dojox/mobile/themes/iphone/Heading.css corelib/dojox/mobile/themes/iphone/Heading.less corelib/dojox/mobile/themes/iphone/IconContainer-compat.css corelib/dojox/mobile/themes/iphone/IconContainer-compat.less corelib/dojox/mobile/themes/iphone/IconContainer.css corelib/dojox/mobile/themes/iphone/IconContainer.less corelib/dojox/mobile/themes/iphone/IconContainer_rtl.css corelib/dojox/mobile/themes/iphone/IconMenu-compat.css corelib/dojox/mobile/themes/iphone/IconMenu.css corelib/dojox/mobile/themes/iphone/IconMenu_rtl-compat.css corelib/dojox/mobile/themes/iphone/IconMenu_rtl.css corelib/dojox/mobile/themes/iphone/ListItem-compat.css corelib/dojox/mobile/themes/iphone/ListItem-compat.less corelib/dojox/mobile/themes/iphone/ListItem.css corelib/dojox/mobile/themes/iphone/ListItem.less corelib/dojox/mobile/themes/iphone/ListItem_rtl-compat.css corelib/dojox/mobile/themes/iphone/ListItem_rtl.css corelib/dojox/mobile/themes/iphone/ListItem_rtl.less corelib/dojox/mobile/themes/iphone/Opener-compat.css corelib/dojox/mobile/themes/iphone/Opener.css corelib/dojox/mobile/themes/iphone/Overlay-compat.css corelib/dojox/mobile/themes/iphone/Overlay.css corelib/dojox/mobile/themes/iphone/Overlay.less corelib/dojox/mobile/themes/iphone/PageIndicator-compat.css corelib/dojox/mobile/themes/iphone/PageIndicator.css corelib/dojox/mobile/themes/iphone/ProgressBar-compat.css corelib/dojox/mobile/themes/iphone/ProgressBar.css corelib/dojox/mobile/themes/iphone/ProgressIndicator-compat.css corelib/dojox/mobile/themes/iphone/ProgressIndicator.css corelib/dojox/mobile/themes/iphone/ProgressIndicator_rtl.css corelib/dojox/mobile/themes/iphone/RadioButton-compat.css corelib/dojox/mobile/themes/iphone/RadioButton.css corelib/dojox/mobile/themes/iphone/RoundRect-compat.css corelib/dojox/mobile/themes/iphone/RoundRect.css corelib/dojox/mobile/themes/iphone/RoundRectCategory.css corelib/dojox/mobile/themes/iphone/RoundRectCategory_rtl.css corelib/dojox/mobile/themes/iphone/RoundRectList-compat.css corelib/dojox/mobile/themes/iphone/RoundRectList.css corelib/dojox/mobile/themes/iphone/ScrollablePane.css corelib/dojox/mobile/themes/iphone/SearchBox-compat.css corelib/dojox/mobile/themes/iphone/SearchBox.css corelib/dojox/mobile/themes/iphone/SimpleDialog-compat.css corelib/dojox/mobile/themes/iphone/SimpleDialog.css corelib/dojox/mobile/themes/iphone/SimpleDialog.less corelib/dojox/mobile/themes/iphone/Slider-compat.css corelib/dojox/mobile/themes/iphone/Slider.css corelib/dojox/mobile/themes/iphone/SpinWheel-compat.css corelib/dojox/mobile/themes/iphone/SpinWheel.css corelib/dojox/mobile/themes/iphone/SpinWheel.less corelib/dojox/mobile/themes/iphone/SpinWheel_rtl-compat.css corelib/dojox/mobile/themes/iphone/SpinWheel_rtl.css corelib/dojox/mobile/themes/iphone/Switch-compat.css corelib/dojox/mobile/themes/iphone/Switch-compat.less corelib/dojox/mobile/themes/iphone/Switch.css corelib/dojox/mobile/themes/iphone/Switch.less corelib/dojox/mobile/themes/iphone/Switch_rtl-compat.css corelib/dojox/mobile/themes/iphone/Switch_rtl.css corelib/dojox/mobile/themes/iphone/TabBar-compat.css corelib/dojox/mobile/themes/iphone/TabBar-compat.less corelib/dojox/mobile/themes/iphone/TabBar.css corelib/dojox/mobile/themes/iphone/TabBar.less corelib/dojox/mobile/themes/iphone/TabBar_rtl-compat.css corelib/dojox/mobile/themes/iphone/TabBar_rtl.css corelib/dojox/mobile/themes/iphone/TextArea-compat.css corelib/dojox/mobile/themes/iphone/TextArea.css corelib/dojox/mobile/themes/iphone/TextBox-compat.css corelib/dojox/mobile/themes/iphone/TextBox.css corelib/dojox/mobile/themes/iphone/TimePicker.css corelib/dojox/mobile/themes/iphone/ToggleButton-compat.css corelib/dojox/mobile/themes/iphone/ToggleButton.css corelib/dojox/mobile/themes/iphone/ToggleButton_rtl.css corelib/dojox/mobile/themes/iphone/ToolBarButton-compat.css corelib/dojox/mobile/themes/iphone/ToolBarButton.css corelib/dojox/mobile/themes/iphone/ToolBarButton.less corelib/dojox/mobile/themes/iphone/ToolBarButton_rtl.css corelib/dojox/mobile/themes/iphone/Tooltip-compat.css corelib/dojox/mobile/themes/iphone/Tooltip.css corelib/dojox/mobile/themes/iphone/ValuePicker-compat.css corelib/dojox/mobile/themes/iphone/ValuePicker.css corelib/dojox/mobile/themes/iphone/ValuePicker.less corelib/dojox/mobile/themes/iphone/View.css corelib/dojox/mobile/themes/iphone/View.less corelib/dojox/mobile/themes/iphone/base-compat.css corelib/dojox/mobile/themes/iphone/base.css corelib/dojox/mobile/themes/iphone/base_rtl-compat.css corelib/dojox/mobile/themes/iphone/base_rtl.css corelib/dojox/mobile/themes/iphone/common-compat.css corelib/dojox/mobile/themes/iphone/common.css corelib/dojox/mobile/themes/iphone/common.less corelib/dojox/mobile/themes/iphone/compat/arrow-button-bg-sel.png corelib/dojox/mobile/themes/iphone/compat/arrow-button-bg.png corelib/dojox/mobile/themes/iphone/compat/arrow-button-head-sel.png corelib/dojox/mobile/themes/iphone/compat/arrow-button-head.png corelib/dojox/mobile/themes/iphone/compat/arrow-button-right-head-sel.png corelib/dojox/mobile/themes/iphone/compat/arrow-button-right-head.png corelib/dojox/mobile/themes/iphone/compat/blue-button-bg.png corelib/dojox/mobile/themes/iphone/compat/blue-button-sel-bg.png corelib/dojox/mobile/themes/iphone/compat/button-arrow-head-bg.gif corelib/dojox/mobile/themes/iphone/compat/button-bg.png corelib/dojox/mobile/themes/iphone/compat/button-chk-bg.png corelib/dojox/mobile/themes/iphone/compat/button-sel-bg.png corelib/dojox/mobile/themes/iphone/compat/button-unsel-bg.png corelib/dojox/mobile/themes/iphone/compat/edge-categ-bg.png corelib/dojox/mobile/themes/iphone/compat/gray-arrow.png corelib/dojox/mobile/themes/iphone/compat/heading-bg.png corelib/dojox/mobile/themes/iphone/compat/icon-content-heading-bg.png corelib/dojox/mobile/themes/iphone/compat/ipad-arrow-button-bg.png corelib/dojox/mobile/themes/iphone/compat/ipad-arrow-button-head-sel.png corelib/dojox/mobile/themes/iphone/compat/ipad-arrow-button-head.png corelib/dojox/mobile/themes/iphone/compat/ipad-arrow-button-right-head-sel.png corelib/dojox/mobile/themes/iphone/compat/ipad-arrow-button-right-head.png corelib/dojox/mobile/themes/iphone/compat/ipad-arrow-button-sel-bg.png corelib/dojox/mobile/themes/iphone/compat/ipad-heading-bg.png corelib/dojox/mobile/themes/iphone/compat/red-button-bg.png corelib/dojox/mobile/themes/iphone/compat/red-button-sel-bg.png corelib/dojox/mobile/themes/iphone/compat/slider-h-bar-bg.png corelib/dojox/mobile/themes/iphone/compat/slider-h-bg.png corelib/dojox/mobile/themes/iphone/compat/slider-handle-bg.png corelib/dojox/mobile/themes/iphone/compat/switch-arc-l.gif corelib/dojox/mobile/themes/iphone/compat/switch-arc-r.gif corelib/dojox/mobile/themes/iphone/compat/switch-arc1-k.gif corelib/dojox/mobile/themes/iphone/compat/switch-arc1-l.gif corelib/dojox/mobile/themes/iphone/compat/switch-arc1-r.gif corelib/dojox/mobile/themes/iphone/compat/switch-arc2-k.gif corelib/dojox/mobile/themes/iphone/compat/switch-arc2-l.gif corelib/dojox/mobile/themes/iphone/compat/switch-arc2-r.gif corelib/dojox/mobile/themes/iphone/compat/switch-default-k.gif corelib/dojox/mobile/themes/iphone/compat/switch-default-l.gif corelib/dojox/mobile/themes/iphone/compat/switch-default-r.gif corelib/dojox/mobile/themes/iphone/compat/switch-round-l.gif corelib/dojox/mobile/themes/iphone/compat/switch-round-r.gif corelib/dojox/mobile/themes/iphone/compat/switch-round1-k.gif corelib/dojox/mobile/themes/iphone/compat/switch-round1-l.gif corelib/dojox/mobile/themes/iphone/compat/switch-round1-r.gif corelib/dojox/mobile/themes/iphone/compat/switch-round2-k.gif corelib/dojox/mobile/themes/iphone/compat/switch-round2-l.gif corelib/dojox/mobile/themes/iphone/compat/switch-round2-r.gif corelib/dojox/mobile/themes/iphone/compat/switch-square-k.gif corelib/dojox/mobile/themes/iphone/compat/switch-square-l.gif corelib/dojox/mobile/themes/iphone/compat/switch-square-r.gif corelib/dojox/mobile/themes/iphone/compat/tab-button-bg.png corelib/dojox/mobile/themes/iphone/compat/tab-seg-button-bg.png corelib/dojox/mobile/themes/iphone/compat/tab-seg-sel-button-bg.png corelib/dojox/mobile/themes/iphone/compat/tab-sel-button-bg.png corelib/dojox/mobile/themes/iphone/compat/tab-slim-bar-bg.png corelib/dojox/mobile/themes/iphone/compat/tab-tall-bar-bg.png corelib/dojox/mobile/themes/iphone/compat/togglebutton-chk-mark-bg.png corelib/dojox/mobile/themes/iphone/compat/tooltip-button-bg.png corelib/dojox/mobile/themes/iphone/compat/tooltip-heading-bg.png corelib/dojox/mobile/themes/iphone/compat/valuepicker-button-bg.png corelib/dojox/mobile/themes/iphone/compat/white-arrow.png corelib/dojox/mobile/themes/iphone/dijit/Calendar-compat.css corelib/dojox/mobile/themes/iphone/dijit/Calendar-compat.less corelib/dojox/mobile/themes/iphone/dijit/Calendar.css corelib/dojox/mobile/themes/iphone/dijit/Calendar.less corelib/dojox/mobile/themes/iphone/dijit/compat/calendar-daylabel-bg.png corelib/dojox/mobile/themes/iphone/dijit/compat/calendar-month-bg.png corelib/dojox/mobile/themes/iphone/dijit/compat/calendar-year-bg.png corelib/dojox/mobile/themes/iphone/images/thumb-overlay-large.png corelib/dojox/mobile/themes/iphone/images/thumb-overlay-small.png corelib/dojox/mobile/themes/iphone/images/thumb-overlay.png corelib/dojox/mobile/themes/iphone/ipad-compat.css corelib/dojox/mobile/themes/iphone/ipad.css corelib/dojox/mobile/themes/iphone/iphone-app-compat.css corelib/dojox/mobile/themes/iphone/iphone-app.css corelib/dojox/mobile/themes/iphone/iphone-compat.css corelib/dojox/mobile/themes/iphone/iphone.css corelib/dojox/mobile/themes/iphone/iphone_rtl-compat.css corelib/dojox/mobile/themes/iphone/iphone_rtl.css corelib/dojox/mobile/themes/iphone/variables.less corelib/dojox/mobile/themes/iphone/variables_rtl.less corelib/dojox/mobile/themes/utils/README corelib/dojox/mobile/themes/utils/cleanup.bat corelib/dojox/mobile/themes/utils/cleanup.js corelib/dojox/mobile/themes/utils/cleanup.sh corelib/dojox/mobile/themes/utils/compile.bat corelib/dojox/mobile/themes/utils/compile.js corelib/dojox/mobile/themes/utils/compile.sh corelib/dojox/mobile/themes/windows/Accordion-compat.css corelib/dojox/mobile/themes/windows/Accordion.css corelib/dojox/mobile/themes/windows/Accordion.less corelib/dojox/mobile/themes/windows/Accordion_rtl.css corelib/dojox/mobile/themes/windows/Button-compat.css corelib/dojox/mobile/themes/windows/Button.css corelib/dojox/mobile/themes/windows/Button.less corelib/dojox/mobile/themes/windows/Carousel.css corelib/dojox/mobile/themes/windows/Carousel_rtl.css corelib/dojox/mobile/themes/windows/CheckBox-compat.css corelib/dojox/mobile/themes/windows/CheckBox.css corelib/dojox/mobile/themes/windows/CheckBox.less corelib/dojox/mobile/themes/windows/ComboBox-compat.css corelib/dojox/mobile/themes/windows/ComboBox.css corelib/dojox/mobile/themes/windows/ComboBox.less corelib/dojox/mobile/themes/windows/ComboBox_rtl.css corelib/dojox/mobile/themes/windows/DatePicker.css corelib/dojox/mobile/themes/windows/EdgeToEdgeCategory.css corelib/dojox/mobile/themes/windows/EdgeToEdgeCategory.less corelib/dojox/mobile/themes/windows/EdgeToEdgeList.css corelib/dojox/mobile/themes/windows/EdgeToEdgeList.less corelib/dojox/mobile/themes/windows/FixedSplitter.css corelib/dojox/mobile/themes/windows/FormLayout.css corelib/dojox/mobile/themes/windows/FormLayout_rtl.css corelib/dojox/mobile/themes/windows/GridLayout.css corelib/dojox/mobile/themes/windows/GridLayout_rtl.css corelib/dojox/mobile/themes/windows/Heading-compat.css corelib/dojox/mobile/themes/windows/Heading.css corelib/dojox/mobile/themes/windows/Heading.less corelib/dojox/mobile/themes/windows/IconContainer-compat.css corelib/dojox/mobile/themes/windows/IconContainer-compat.less corelib/dojox/mobile/themes/windows/IconContainer.css corelib/dojox/mobile/themes/windows/IconContainer.less corelib/dojox/mobile/themes/windows/IconContainer_rtl.css corelib/dojox/mobile/themes/windows/IconMenu-compat.css corelib/dojox/mobile/themes/windows/IconMenu.css corelib/dojox/mobile/themes/windows/IconMenu_rtl-compat.css corelib/dojox/mobile/themes/windows/IconMenu_rtl.css corelib/dojox/mobile/themes/windows/ListItem-compat.css corelib/dojox/mobile/themes/windows/ListItem-compat.less corelib/dojox/mobile/themes/windows/ListItem.css corelib/dojox/mobile/themes/windows/ListItem.less corelib/dojox/mobile/themes/windows/ListItem_rtl.css corelib/dojox/mobile/themes/windows/Opener-compat.css corelib/dojox/mobile/themes/windows/Opener.css corelib/dojox/mobile/themes/windows/Overlay-compat.css corelib/dojox/mobile/themes/windows/Overlay.css corelib/dojox/mobile/themes/windows/Overlay.less corelib/dojox/mobile/themes/windows/PageIndicator-compat.css corelib/dojox/mobile/themes/windows/PageIndicator.css corelib/dojox/mobile/themes/windows/ProgressBar-compat.css corelib/dojox/mobile/themes/windows/ProgressBar.css corelib/dojox/mobile/themes/windows/ProgressBar.less corelib/dojox/mobile/themes/windows/ProgressIndicator-compat.css corelib/dojox/mobile/themes/windows/ProgressIndicator.css corelib/dojox/mobile/themes/windows/ProgressIndicator.less corelib/dojox/mobile/themes/windows/ProgressIndicator_rtl.css corelib/dojox/mobile/themes/windows/RadioButton-compat.css corelib/dojox/mobile/themes/windows/RadioButton.css corelib/dojox/mobile/themes/windows/RadioButton.less corelib/dojox/mobile/themes/windows/RoundRect-compat.css corelib/dojox/mobile/themes/windows/RoundRect.css corelib/dojox/mobile/themes/windows/RoundRectCategory.css corelib/dojox/mobile/themes/windows/RoundRectCategory_rtl.css corelib/dojox/mobile/themes/windows/RoundRectList-compat.css corelib/dojox/mobile/themes/windows/RoundRectList.css corelib/dojox/mobile/themes/windows/RoundRectList.less corelib/dojox/mobile/themes/windows/ScrollablePane.css corelib/dojox/mobile/themes/windows/ScrollablePane.less corelib/dojox/mobile/themes/windows/SearchBox-compat.css corelib/dojox/mobile/themes/windows/SearchBox.css corelib/dojox/mobile/themes/windows/SearchBox.less corelib/dojox/mobile/themes/windows/SimpleDialog-compat.css corelib/dojox/mobile/themes/windows/SimpleDialog.css corelib/dojox/mobile/themes/windows/SimpleDialog.less corelib/dojox/mobile/themes/windows/Slider-compat.css corelib/dojox/mobile/themes/windows/Slider.css corelib/dojox/mobile/themes/windows/Slider.less corelib/dojox/mobile/themes/windows/SpinWheel-compat.css corelib/dojox/mobile/themes/windows/SpinWheel.css corelib/dojox/mobile/themes/windows/SpinWheel.less corelib/dojox/mobile/themes/windows/SpinWheel_rtl-compat.css corelib/dojox/mobile/themes/windows/SpinWheel_rtl.css corelib/dojox/mobile/themes/windows/Switch-compat.css corelib/dojox/mobile/themes/windows/Switch-compat.less corelib/dojox/mobile/themes/windows/Switch.css corelib/dojox/mobile/themes/windows/Switch.less corelib/dojox/mobile/themes/windows/Switch_rtl-compat.css corelib/dojox/mobile/themes/windows/Switch_rtl.css corelib/dojox/mobile/themes/windows/TabBar-compat.css corelib/dojox/mobile/themes/windows/TabBar-compat.less corelib/dojox/mobile/themes/windows/TabBar.css corelib/dojox/mobile/themes/windows/TabBar.less corelib/dojox/mobile/themes/windows/TabBar_rtl-compat.css corelib/dojox/mobile/themes/windows/TabBar_rtl.css corelib/dojox/mobile/themes/windows/TextArea-compat.css corelib/dojox/mobile/themes/windows/TextArea.css corelib/dojox/mobile/themes/windows/TextArea.less corelib/dojox/mobile/themes/windows/TextBox-compat.css corelib/dojox/mobile/themes/windows/TextBox.css corelib/dojox/mobile/themes/windows/TextBox.less corelib/dojox/mobile/themes/windows/TimePicker.css corelib/dojox/mobile/themes/windows/ToggleButton-compat.css corelib/dojox/mobile/themes/windows/ToggleButton.css corelib/dojox/mobile/themes/windows/ToggleButton.less corelib/dojox/mobile/themes/windows/ToggleButton_rtl.css corelib/dojox/mobile/themes/windows/ToolBarButton-compat.css corelib/dojox/mobile/themes/windows/ToolBarButton.css corelib/dojox/mobile/themes/windows/ToolBarButton.less corelib/dojox/mobile/themes/windows/ToolBarButton_rtl.css corelib/dojox/mobile/themes/windows/Tooltip-compat.css corelib/dojox/mobile/themes/windows/Tooltip.css corelib/dojox/mobile/themes/windows/Tooltip.less corelib/dojox/mobile/themes/windows/ValuePicker-compat.css corelib/dojox/mobile/themes/windows/ValuePicker.css corelib/dojox/mobile/themes/windows/ValuePicker.less corelib/dojox/mobile/themes/windows/View.css corelib/dojox/mobile/themes/windows/View.less corelib/dojox/mobile/themes/windows/base-compat.css corelib/dojox/mobile/themes/windows/base.css corelib/dojox/mobile/themes/windows/base_rtl.css corelib/dojox/mobile/themes/windows/common-compat.css corelib/dojox/mobile/themes/windows/common.css corelib/dojox/mobile/themes/windows/common.less corelib/dojox/mobile/themes/windows/compat/arrow-button-bg-sel.png corelib/dojox/mobile/themes/windows/compat/arrow-button-bg.png corelib/dojox/mobile/themes/windows/compat/arrow-button-head-sel.png corelib/dojox/mobile/themes/windows/compat/arrow-button-head.png corelib/dojox/mobile/themes/windows/compat/arrow-button-right-head-sel.png corelib/dojox/mobile/themes/windows/compat/arrow-button-right-head.png corelib/dojox/mobile/themes/windows/compat/blue-button-bg.png corelib/dojox/mobile/themes/windows/compat/blue-button-sel-bg.png corelib/dojox/mobile/themes/windows/compat/button-arrow-head-bg.gif corelib/dojox/mobile/themes/windows/compat/button-bg.png corelib/dojox/mobile/themes/windows/compat/button-chk-bg.png corelib/dojox/mobile/themes/windows/compat/button-sel-bg.png corelib/dojox/mobile/themes/windows/compat/button-unsel-bg.png corelib/dojox/mobile/themes/windows/compat/gray-arrow.png corelib/dojox/mobile/themes/windows/compat/heading-bg.png corelib/dojox/mobile/themes/windows/compat/icon-content-heading-bg.png corelib/dojox/mobile/themes/windows/compat/red-button-bg.png corelib/dojox/mobile/themes/windows/compat/red-button-sel-bg.png corelib/dojox/mobile/themes/windows/compat/slider-h-bar-bg.png corelib/dojox/mobile/themes/windows/compat/slider-h-bg.png corelib/dojox/mobile/themes/windows/compat/slider-handle-bg.png corelib/dojox/mobile/themes/windows/compat/switch-arc1-k.gif corelib/dojox/mobile/themes/windows/compat/switch-arc1-l.gif corelib/dojox/mobile/themes/windows/compat/switch-arc1-r.gif corelib/dojox/mobile/themes/windows/compat/switch-arc2-k.gif corelib/dojox/mobile/themes/windows/compat/switch-arc2-l.gif corelib/dojox/mobile/themes/windows/compat/switch-arc2-r.gif corelib/dojox/mobile/themes/windows/compat/switch-round1-k.gif corelib/dojox/mobile/themes/windows/compat/switch-round1-l.gif corelib/dojox/mobile/themes/windows/compat/switch-round1-r.gif corelib/dojox/mobile/themes/windows/compat/switch-round2-k.gif corelib/dojox/mobile/themes/windows/compat/switch-round2-l.gif corelib/dojox/mobile/themes/windows/compat/switch-round2-r.gif corelib/dojox/mobile/themes/windows/compat/switch-square-k.gif corelib/dojox/mobile/themes/windows/compat/switch-square-l.gif corelib/dojox/mobile/themes/windows/compat/switch-square-r.gif corelib/dojox/mobile/themes/windows/compat/tab-button-bg.png corelib/dojox/mobile/themes/windows/compat/tab-orange-button-bg.png corelib/dojox/mobile/themes/windows/compat/tab-seg-button-bg.png corelib/dojox/mobile/themes/windows/compat/tab-seg-sel-button-bg.png corelib/dojox/mobile/themes/windows/compat/tab-sel-button-bg.png corelib/dojox/mobile/themes/windows/compat/tab-slim-bar-bg.png corelib/dojox/mobile/themes/windows/compat/tab-tall-bar-bg.png corelib/dojox/mobile/themes/windows/compat/togglebutton-chk-bg.png corelib/dojox/mobile/themes/windows/compat/togglebutton-chk-mark-bg.png corelib/dojox/mobile/themes/windows/compat/valuepicker-button-bg.png corelib/dojox/mobile/themes/windows/dijit/Calendar-compat.css corelib/dojox/mobile/themes/windows/dijit/Calendar-compat.less corelib/dojox/mobile/themes/windows/dijit/Calendar.css corelib/dojox/mobile/themes/windows/dijit/Calendar.less corelib/dojox/mobile/themes/windows/images/check-disabled.png corelib/dojox/mobile/themes/windows/images/dark/back.png corelib/dojox/mobile/themes/windows/images/dark/check.png corelib/dojox/mobile/themes/windows/images/dark/radiobtn.png corelib/dojox/mobile/themes/windows/images/light/back.png corelib/dojox/mobile/themes/windows/images/light/check.png corelib/dojox/mobile/themes/windows/images/light/radiobtn.png corelib/dojox/mobile/themes/windows/images/radiobtn-disabled.png corelib/dojox/mobile/themes/windows/variables.less corelib/dojox/mobile/themes/windows/variables_rtl.less corelib/dojox/mobile/themes/windows/windows-compat.css corelib/dojox/mobile/themes/windows/windows.css corelib/dojox/mobile/themes/windows/windows_rtl.css corelib/dojox/mobile/transition.js corelib/dojox/mobile/uacss.js corelib/dojox/mobile/viewRegistry.js corelib/dojox/mvc.js corelib/dojox/mvc/Bind.js corelib/dojox/mvc/EditModelRefController.js corelib/dojox/mvc/EditStoreRefController.js corelib/dojox/mvc/EditStoreRefListController.js corelib/dojox/mvc/Element.js corelib/dojox/mvc/Generate.js corelib/dojox/mvc/Group.js corelib/dojox/mvc/ListController.js corelib/dojox/mvc/ModelRefController.js corelib/dojox/mvc/Output.js corelib/dojox/mvc/README corelib/dojox/mvc/Repeat.js corelib/dojox/mvc/StatefulArray.js corelib/dojox/mvc/StatefulModel.js corelib/dojox/mvc/StatefulSeries.js corelib/dojox/mvc/StoreRefController.js corelib/dojox/mvc/Templated.js corelib/dojox/mvc/WidgetList.js corelib/dojox/mvc/_Container.js corelib/dojox/mvc/_Controller.js corelib/dojox/mvc/_DataBindingExtension.js corelib/dojox/mvc/_DataBindingMixin.js corelib/dojox/mvc/_InlineTemplateMixin.js corelib/dojox/mvc/_TextBoxExtensions.js corelib/dojox/mvc/_atBindingExtension.js corelib/dojox/mvc/_atBindingMixin.js corelib/dojox/mvc/_base.js corelib/dojox/mvc/_patches.js corelib/dojox/mvc/at.js corelib/dojox/mvc/atBindingExtension.js corelib/dojox/mvc/computed.js corelib/dojox/mvc/equals.js corelib/dojox/mvc/getPlainValue.js corelib/dojox/mvc/getStateful.js corelib/dojox/mvc/parserExtension.js corelib/dojox/mvc/resolve.js corelib/dojox/mvc/sync.js corelib/dojox/package.json corelib/dojox/rails.js corelib/dojox/rails/README corelib/dojox/resources/README.template corelib/dojox/resources/explore.php corelib/dojox/robot/README corelib/dojox/robot/recorder.js corelib/dojox/rpc/Client.js corelib/dojox/rpc/JsonRPC.js corelib/dojox/rpc/JsonRest.js corelib/dojox/rpc/OfflineRest.js corelib/dojox/rpc/ProxiedPath.js corelib/dojox/rpc/README corelib/dojox/rpc/Rest.js corelib/dojox/rpc/SMDLibrary/dojo-api.smd corelib/dojox/rpc/SMDLibrary/friendfeed.smd corelib/dojox/rpc/SMDLibrary/geonames.smd corelib/dojox/rpc/SMDLibrary/google.smd corelib/dojox/rpc/SMDLibrary/twitter.smd corelib/dojox/rpc/SMDLibrary/wikipedia.smd corelib/dojox/rpc/SMDLibrary/yahoo.smd corelib/dojox/rpc/Service.js corelib/dojox/secure/DOM.js corelib/dojox/secure/README corelib/dojox/secure/capability.js corelib/dojox/secure/fromJson.js corelib/dojox/secure/sandbox.js corelib/dojox/sketch.js corelib/dojox/sketch/Anchor.js corelib/dojox/sketch/Annotation.js corelib/dojox/sketch/DoubleArrowAnnotation.js corelib/dojox/sketch/Figure.js corelib/dojox/sketch/LeadAnnotation.js corelib/dojox/sketch/PreexistingAnnotation.js corelib/dojox/sketch/README corelib/dojox/sketch/SingleArrowAnnotation.js corelib/dojox/sketch/Slider.js corelib/dojox/sketch/Toolbar.js corelib/dojox/sketch/UnderlineAnnotation.js corelib/dojox/sketch/UndoStack.js corelib/dojox/sketch/_Plugin.js corelib/dojox/sketch/resources/images/icons.gif corelib/dojox/sketch/resources/sketch.css corelib/dojox/socket.js corelib/dojox/socket/README corelib/dojox/socket/Reconnect.js corelib/dojox/sql.js corelib/dojox/sql/LICENSE corelib/dojox/sql/README corelib/dojox/sql/_base.js corelib/dojox/sql/_crypto.js corelib/dojox/storage.js corelib/dojox/storage/AirDBStorageProvider.js corelib/dojox/storage/AirEncryptedLocalStorageProvider.js corelib/dojox/storage/AirFileStorageProvider.js corelib/dojox/storage/BehaviorStorageProvider.js corelib/dojox/storage/CookieStorageProvider.js corelib/dojox/storage/FlashStorageProvider.js corelib/dojox/storage/GearsStorageProvider.js corelib/dojox/storage/LocalStorageProvider.js corelib/dojox/storage/Provider.js corelib/dojox/storage/README corelib/dojox/storage/Storage.as corelib/dojox/storage/Storage.swf corelib/dojox/storage/WhatWGStorageProvider.js corelib/dojox/storage/_common.js corelib/dojox/storage/buildFlashStorage.sh corelib/dojox/storage/manager.js corelib/dojox/storage/storage_dialog.fla corelib/dojox/storage/storage_dialog.swf corelib/dojox/store/DynamoDB.js corelib/dojox/store/LocalDB.js corelib/dojox/store/OData.js corelib/dojox/store/README corelib/dojox/store/db/IndexedDB.js corelib/dojox/store/db/SQL.js corelib/dojox/store/db/has.js corelib/dojox/store/priority.js corelib/dojox/store/transaction.js corelib/dojox/string/BidiComplex.js corelib/dojox/string/BidiEngine.js corelib/dojox/string/Builder.js corelib/dojox/string/README corelib/dojox/string/sprintf.js corelib/dojox/string/tokenize.js corelib/dojox/testing/DocTest.js corelib/dojox/testing/README corelib/dojox/timing.js corelib/dojox/timing/README corelib/dojox/timing/Sequence.js corelib/dojox/timing/Streamer.js corelib/dojox/timing/ThreadPool.js corelib/dojox/timing/_base.js corelib/dojox/timing/doLater.js corelib/dojox/treemap/DrillDownUp.js corelib/dojox/treemap/GroupLabel.js corelib/dojox/treemap/Keyboard.js corelib/dojox/treemap/README corelib/dojox/treemap/ScaledLabel.js corelib/dojox/treemap/TreeMap.js corelib/dojox/treemap/_utils.js corelib/dojox/treemap/themes/DrillDownUp.css corelib/dojox/treemap/themes/GroupLabel.css corelib/dojox/treemap/themes/MobileTreeMap.css corelib/dojox/treemap/themes/TreeMap.css corelib/dojox/uuid.js corelib/dojox/uuid/README corelib/dojox/uuid/Uuid.js corelib/dojox/uuid/_base.js corelib/dojox/uuid/generateRandomUuid.js corelib/dojox/uuid/generateTimeBasedUuid.js corelib/dojox/validate.js corelib/dojox/validate/README corelib/dojox/validate/_base.js corelib/dojox/validate/br.js corelib/dojox/validate/ca.js corelib/dojox/validate/check.js corelib/dojox/validate/creditCard.js corelib/dojox/validate/isbn.js corelib/dojox/validate/regexp.js corelib/dojox/validate/us.js corelib/dojox/validate/web.js corelib/dojox/widget/AnalogGauge.js corelib/dojox/widget/AutoRotator.js corelib/dojox/widget/BarGauge.js corelib/dojox/widget/Calendar.js corelib/dojox/widget/Calendar/Calendar.css corelib/dojox/widget/Calendar/Calendar.html corelib/dojox/widget/Calendar/CalendarDay.html corelib/dojox/widget/Calendar/CalendarMonth.html corelib/dojox/widget/Calendar/CalendarMonthYear.html corelib/dojox/widget/Calendar/CalendarYear.html corelib/dojox/widget/Calendar2Pane.js corelib/dojox/widget/Calendar3Pane.js corelib/dojox/widget/CalendarFisheye.js corelib/dojox/widget/CalendarFx.js corelib/dojox/widget/CalendarViews.js corelib/dojox/widget/ColorPicker.js corelib/dojox/widget/ColorPicker/ColorPicker.css corelib/dojox/widget/ColorPicker/ColorPicker.html corelib/dojox/widget/ColorPicker/images/hue.png corelib/dojox/widget/ColorPicker/images/hueHandle.png corelib/dojox/widget/ColorPicker/images/hueHandleA11y.png corelib/dojox/widget/ColorPicker/images/pickerPointer.png corelib/dojox/widget/ColorPicker/images/underlay.png corelib/dojox/widget/DailyCalendar.js corelib/dojox/widget/DataPresentation.js corelib/dojox/widget/Dialog.js corelib/dojox/widget/Dialog/Dialog.css corelib/dojox/widget/Dialog/Dialog.html corelib/dojox/widget/Dialog/images/dialogCloseButton.gif corelib/dojox/widget/Dialog/images/dialogCloseButton.png corelib/dojox/widget/DialogSimple.js corelib/dojox/widget/DocTester.js corelib/dojox/widget/DocTester/DocTester.css corelib/dojox/widget/DocTester/DocTester.html corelib/dojox/widget/DynamicTooltip.js corelib/dojox/widget/FeedPortlet.js corelib/dojox/widget/FilePicker.js corelib/dojox/widget/FilePicker/FilePicker.css corelib/dojox/widget/FilePicker/_FileInfoPane.html corelib/dojox/widget/FilePicker/images/nihiloFileIcons.gif corelib/dojox/widget/FilePicker/images/soriaFileIcons.gif corelib/dojox/widget/FilePicker/images/tundraFileIcons.gif corelib/dojox/widget/FisheyeList.js corelib/dojox/widget/FisheyeList/FisheyeList.css corelib/dojox/widget/FisheyeListItem.js corelib/dojox/widget/FisheyeLite.js corelib/dojox/widget/Iterator.js corelib/dojox/widget/Loader.js corelib/dojox/widget/Loader/Loader.css corelib/dojox/widget/Loader/icons/loading.gif corelib/dojox/widget/MonthAndYearlyCalendar.js corelib/dojox/widget/MonthlyCalendar.js corelib/dojox/widget/MultiSelectCalendar.js corelib/dojox/widget/MultiSelectCalendar/MultiSelectCalendar.html corelib/dojox/widget/Pager.js corelib/dojox/widget/Pager/Pager.css corelib/dojox/widget/Pager/Pager.html corelib/dojox/widget/Pager/images/hNext.png corelib/dojox/widget/Pager/images/hPrevious.png corelib/dojox/widget/Pager/images/pageActive.png corelib/dojox/widget/Pager/images/pageInactive.png corelib/dojox/widget/Pager/images/vNext.png corelib/dojox/widget/Pager/images/vPrevious.png corelib/dojox/widget/PagerItem.js corelib/dojox/widget/PlaceholderMenuItem.js corelib/dojox/widget/Portlet.js corelib/dojox/widget/Portlet/Portlet.css corelib/dojox/widget/Portlet/images/icons.gif corelib/dojox/widget/Portlet/images/icons.png corelib/dojox/widget/PortletDialogSettings.js corelib/dojox/widget/PortletSettings.js corelib/dojox/widget/README corelib/dojox/widget/Roller.js corelib/dojox/widget/RollingList.js corelib/dojox/widget/RollingList/RollingList.css corelib/dojox/widget/RollingList/RollingList.html corelib/dojox/widget/Rotator.js corelib/dojox/widget/Selection.js corelib/dojox/widget/SortList.js corelib/dojox/widget/SortList/SortList.css corelib/dojox/widget/SortList/SortList.html corelib/dojox/widget/Standby.js corelib/dojox/widget/Standby/images/loading.gif corelib/dojox/widget/TitleGroup.js corelib/dojox/widget/TitleGroup/TitleGroup.css corelib/dojox/widget/Toaster.js corelib/dojox/widget/Toaster/Toaster.css corelib/dojox/widget/UpgradeBar.js corelib/dojox/widget/UpgradeBar/UpgradeBar.css corelib/dojox/widget/UpgradeBar/UpgradeBar.html corelib/dojox/widget/Wizard.js corelib/dojox/widget/Wizard/Wizard.css corelib/dojox/widget/Wizard/Wizard.html corelib/dojox/widget/WizardPane.js corelib/dojox/widget/YearlyCalendar.js corelib/dojox/widget/_CalendarBase.js corelib/dojox/widget/_CalendarDay.js corelib/dojox/widget/_CalendarDayView.js corelib/dojox/widget/_CalendarMonth.js corelib/dojox/widget/_CalendarMonthView.js corelib/dojox/widget/_CalendarMonthYear.js corelib/dojox/widget/_CalendarMonthYearView.js corelib/dojox/widget/_CalendarView.js corelib/dojox/widget/_CalendarYear.js corelib/dojox/widget/_CalendarYearView.js corelib/dojox/widget/_FisheyeFX.js corelib/dojox/widget/_Invalidating.js corelib/dojox/widget/gauge/AnalogArcIndicator.js corelib/dojox/widget/gauge/AnalogArrowIndicator.js corelib/dojox/widget/gauge/AnalogNeedleIndicator.js corelib/dojox/widget/gauge/BarIndicator.js corelib/dojox/widget/gauge/_Gauge.js corelib/dojox/widget/nls/ColorPicker.js corelib/dojox/widget/nls/FilePicker.js corelib/dojox/widget/nls/Wizard.js corelib/dojox/widget/nls/ar/ColorPicker.js corelib/dojox/widget/nls/ar/FilePicker.js corelib/dojox/widget/nls/ar/Wizard.js corelib/dojox/widget/nls/az/ColorPicker.js corelib/dojox/widget/nls/az/FilePicker.js corelib/dojox/widget/nls/az/Wizard.js corelib/dojox/widget/nls/bg/ColorPicker.js corelib/dojox/widget/nls/bg/FilePicker.js corelib/dojox/widget/nls/bg/Wizard.js corelib/dojox/widget/nls/bs/ColorPicker.js corelib/dojox/widget/nls/bs/FilePicker.js corelib/dojox/widget/nls/bs/Wizard.js corelib/dojox/widget/nls/ca/ColorPicker.js corelib/dojox/widget/nls/ca/FilePicker.js corelib/dojox/widget/nls/ca/Wizard.js corelib/dojox/widget/nls/cs/ColorPicker.js corelib/dojox/widget/nls/cs/FilePicker.js corelib/dojox/widget/nls/cs/Wizard.js corelib/dojox/widget/nls/da/ColorPicker.js corelib/dojox/widget/nls/da/FilePicker.js corelib/dojox/widget/nls/da/Wizard.js corelib/dojox/widget/nls/de/ColorPicker.js corelib/dojox/widget/nls/de/FilePicker.js corelib/dojox/widget/nls/de/Wizard.js corelib/dojox/widget/nls/el/ColorPicker.js corelib/dojox/widget/nls/el/FilePicker.js corelib/dojox/widget/nls/el/Wizard.js corelib/dojox/widget/nls/es/ColorPicker.js corelib/dojox/widget/nls/es/FilePicker.js corelib/dojox/widget/nls/es/Wizard.js corelib/dojox/widget/nls/eu/ColorPicker.js corelib/dojox/widget/nls/eu/FilePicker.js corelib/dojox/widget/nls/eu/Wizard.js corelib/dojox/widget/nls/fi/ColorPicker.js corelib/dojox/widget/nls/fi/FilePicker.js corelib/dojox/widget/nls/fi/Wizard.js corelib/dojox/widget/nls/fr/ColorPicker.js corelib/dojox/widget/nls/fr/FilePicker.js corelib/dojox/widget/nls/fr/Wizard.js corelib/dojox/widget/nls/he/ColorPicker.js corelib/dojox/widget/nls/he/FilePicker.js corelib/dojox/widget/nls/he/Wizard.js corelib/dojox/widget/nls/hi/ColorPicker.js corelib/dojox/widget/nls/hi/FilePicker.js corelib/dojox/widget/nls/hi/Wizard.js corelib/dojox/widget/nls/hr/ColorPicker.js corelib/dojox/widget/nls/hr/FilePicker.js corelib/dojox/widget/nls/hr/Wizard.js corelib/dojox/widget/nls/hu/ColorPicker.js corelib/dojox/widget/nls/hu/FilePicker.js corelib/dojox/widget/nls/hu/Wizard.js corelib/dojox/widget/nls/id/ColorPicker.js corelib/dojox/widget/nls/id/FilePicker.js corelib/dojox/widget/nls/id/Wizard.js corelib/dojox/widget/nls/it/ColorPicker.js corelib/dojox/widget/nls/it/FilePicker.js corelib/dojox/widget/nls/it/Wizard.js corelib/dojox/widget/nls/ja/ColorPicker.js corelib/dojox/widget/nls/ja/FilePicker.js corelib/dojox/widget/nls/ja/Wizard.js corelib/dojox/widget/nls/kk/ColorPicker.js corelib/dojox/widget/nls/kk/FilePicker.js corelib/dojox/widget/nls/kk/Wizard.js corelib/dojox/widget/nls/ko/ColorPicker.js corelib/dojox/widget/nls/ko/FilePicker.js corelib/dojox/widget/nls/ko/Wizard.js corelib/dojox/widget/nls/mk/ColorPicker.js corelib/dojox/widget/nls/mk/FilePicker.js corelib/dojox/widget/nls/mk/Wizard.js corelib/dojox/widget/nls/nb/ColorPicker.js corelib/dojox/widget/nls/nb/FilePicker.js corelib/dojox/widget/nls/nb/Wizard.js corelib/dojox/widget/nls/nl/ColorPicker.js corelib/dojox/widget/nls/nl/FilePicker.js corelib/dojox/widget/nls/nl/Wizard.js corelib/dojox/widget/nls/pl/ColorPicker.js corelib/dojox/widget/nls/pl/FilePicker.js corelib/dojox/widget/nls/pl/Wizard.js corelib/dojox/widget/nls/pt-pt/ColorPicker.js corelib/dojox/widget/nls/pt-pt/FilePicker.js corelib/dojox/widget/nls/pt-pt/Wizard.js corelib/dojox/widget/nls/pt/ColorPicker.js corelib/dojox/widget/nls/pt/FilePicker.js corelib/dojox/widget/nls/pt/Wizard.js corelib/dojox/widget/nls/ro/ColorPicker.js corelib/dojox/widget/nls/ro/FilePicker.js corelib/dojox/widget/nls/ro/Wizard.js corelib/dojox/widget/nls/ru/ColorPicker.js corelib/dojox/widget/nls/ru/FilePicker.js corelib/dojox/widget/nls/ru/Wizard.js corelib/dojox/widget/nls/sk/ColorPicker.js corelib/dojox/widget/nls/sk/FilePicker.js corelib/dojox/widget/nls/sk/Wizard.js corelib/dojox/widget/nls/sl/ColorPicker.js corelib/dojox/widget/nls/sl/FilePicker.js corelib/dojox/widget/nls/sl/Wizard.js corelib/dojox/widget/nls/sr/ColorPicker.js corelib/dojox/widget/nls/sr/FilePicker.js corelib/dojox/widget/nls/sr/Wizard.js corelib/dojox/widget/nls/sv/ColorPicker.js corelib/dojox/widget/nls/sv/FilePicker.js corelib/dojox/widget/nls/sv/Wizard.js corelib/dojox/widget/nls/th/ColorPicker.js corelib/dojox/widget/nls/th/FilePicker.js corelib/dojox/widget/nls/th/Wizard.js corelib/dojox/widget/nls/tr/ColorPicker.js corelib/dojox/widget/nls/tr/FilePicker.js corelib/dojox/widget/nls/tr/Wizard.js corelib/dojox/widget/nls/uk/ColorPicker.js corelib/dojox/widget/nls/uk/FilePicker.js corelib/dojox/widget/nls/uk/Wizard.js corelib/dojox/widget/nls/zh-hk/ColorPicker.js corelib/dojox/widget/nls/zh-hk/FilePicker.js corelib/dojox/widget/nls/zh-hk/Wizard.js corelib/dojox/widget/nls/zh-tw/ColorPicker.js corelib/dojox/widget/nls/zh-tw/FilePicker.js corelib/dojox/widget/nls/zh-tw/Wizard.js corelib/dojox/widget/nls/zh/ColorPicker.js corelib/dojox/widget/nls/zh/FilePicker.js corelib/dojox/widget/nls/zh/Wizard.js corelib/dojox/widget/rotator/Controller.js corelib/dojox/widget/rotator/Fade.js corelib/dojox/widget/rotator/Pan.js corelib/dojox/widget/rotator/PanFade.js corelib/dojox/widget/rotator/Slide.js corelib/dojox/widget/rotator/ThumbnailController.js corelib/dojox/widget/rotator/Wipe.js corelib/dojox/wire.js corelib/dojox/wire/CompositeWire.js corelib/dojox/wire/DataWire.js corelib/dojox/wire/README corelib/dojox/wire/TableAdapter.js corelib/dojox/wire/TextAdapter.js corelib/dojox/wire/TreeAdapter.js corelib/dojox/wire/Wire.js corelib/dojox/wire/XmlWire.js corelib/dojox/wire/_base.js corelib/dojox/wire/ml/Action.js corelib/dojox/wire/ml/Data.js corelib/dojox/wire/ml/DataStore.js corelib/dojox/wire/ml/Invocation.js corelib/dojox/wire/ml/JsonHandler.js corelib/dojox/wire/ml/RestHandler.js corelib/dojox/wire/ml/Service.js corelib/dojox/wire/ml/Transfer.js corelib/dojox/wire/ml/XmlHandler.js corelib/dojox/wire/ml/util.js corelib/dojox/xml/DomParser.js corelib/dojox/xml/README corelib/dojox/xml/Script.js corelib/dojox/xml/parser.js corelib/dojox/xml/widgetParser.js corelib/dojox/xmpp/ChatService.js corelib/dojox/xmpp/PresenceService.js corelib/dojox/xmpp/README corelib/dojox/xmpp/RosterService.js corelib/dojox/xmpp/TransportSession.js corelib/dojox/xmpp/UserService.js corelib/dojox/xmpp/bosh.js corelib/dojox/xmpp/sasl.js corelib/dojox/xmpp/util.js corelib/dojox/xmpp/widget/ChatSession.js corelib/dojox/xmpp/widget/templates/ChatSession.html corelib/dojox/xmpp/xmppSession.js corelib/dstore/Cache.js corelib/dstore/Csv.js corelib/dstore/Filter.js corelib/dstore/LICENSE corelib/dstore/LocalDB.js corelib/dstore/Memory.js corelib/dstore/Promised.js corelib/dstore/QueryMethod.js corelib/dstore/QueryResults.js corelib/dstore/Request.js corelib/dstore/RequestMemory.js corelib/dstore/Rest.js corelib/dstore/SimpleQuery.js corelib/dstore/Store.js corelib/dstore/Trackable.js corelib/dstore/Tree.js corelib/dstore/bower.json corelib/dstore/charting/StoreSeries.js corelib/dstore/db/IndexedDB.js corelib/dstore/db/LocalStorage.js corelib/dstore/db/SQL.js corelib/dstore/db/has.js corelib/dstore/extensions/RqlQuery.js corelib/dstore/legacy/DstoreAdapter.js corelib/dstore/legacy/StoreAdapter.js corelib/dstore/package.json corelib/put-selector/LICENSE corelib/put-selector/node-html.js corelib/put-selector/package.json corelib/put-selector/put.js corelib/xstyle/LICENSE corelib/xstyle/build.js corelib/xstyle/build/amd-css.js corelib/xstyle/build/base64.js corelib/xstyle/build/build-xstyle.bat corelib/xstyle/build/sample-dojo-profile.js corelib/xstyle/core/Definition.js corelib/xstyle/core/Rule.js corelib/xstyle/core/amdLoader.js corelib/xstyle/core/base.js corelib/xstyle/core/elemental.js corelib/xstyle/core/es6.js corelib/xstyle/core/expression.js corelib/xstyle/core/generate.js corelib/xstyle/core/load-css.js corelib/xstyle/core/load-imports.js corelib/xstyle/core/parser.js corelib/xstyle/core/put.js corelib/xstyle/core/utils.js corelib/xstyle/css.js corelib/xstyle/ext/dgrid.css corelib/xstyle/ext/dgrid.js corelib/xstyle/ext/meta.js corelib/xstyle/ext/scrollbar.js corelib/xstyle/ext/supported.js corelib/xstyle/ext/widget.js corelib/xstyle/has-class.js corelib/xstyle/main.js corelib/xstyle/package.json corelib/xstyle/page.js corelib/xstyle/shim/gradient.js corelib/xstyle/shim/ie-filter.js corelib/xstyle/shim/inlineBlock.js corelib/xstyle/shim/pseudo.js corelib/xstyle/shim/transition.js corelib/xstyle/shims.css corelib/xstyle/util/getComputedStyle.js corelib/xstyle/xstyle.js css/style.css dynamic-modules/postload.js dynamic-modules/preload.js env.js images/-shanglajiantou.png images/-xialajiantou.png images/1.png images/2.png images/3.png images/4.png images/5.png images/6.png images/Context_menu11.png images/DrawHelper/dragIcon.png images/DrawHelper/dragIconLight.png images/DrawHelper/flypath.png images/DrawHelper/glyphicons_067_cleaning.png images/DrawHelper/glyphicons_094_vector_path_square.png images/DrawHelper/glyphicons_095_vector_path_circle.png images/DrawHelper/glyphicons_096_vector_path_polygon.png images/DrawHelper/glyphicons_097_vector_path_line.png images/DrawHelper/glyphicons_242_google_maps.png images/Introi-img.png images/Reservoir-Station.png images/River-Station-blue-triangle.png images/River-Station-green-triangle.png images/River-Station-grey-triangle.png images/River-Station-orange-triangle.png images/River-Station-red-triangle.png images/River-Station-yellow-triangle.png images/River-Station.png images/X.png images/app-logo.png images/app-name.svg images/baseMapSmall.png images/basemaps/1588843656(1).jpg images/basemaps/2googleimage.png images/basemaps/2googlemap.png images/basemaps/2googletrain.png images/basemaps/2mapabc.png images/basemaps/TerrainEllipsoid.png images/basemaps/TerrainSTK.png images/basemaps/arcgis.png images/basemaps/arcgis.svg images/basemaps/baiduimage.png images/basemaps/baidumap.png images/basemaps/bingimage.png images/basemaps/bingmap.png images/basemaps/city.svg images/basemaps/googleearth.png images/basemaps/googleimage.png images/basemaps/googleimage.svg images/basemaps/googlemap.png images/basemaps/googlemap.svg images/basemaps/googletrain.png images/basemaps/googletrain.svg images/basemaps/gzyx.png images/basemaps/mapabc.png images/basemaps/maplayer.png images/basemaps/reset.svg images/basemaps/search.svg images/basemaps/sogouimage.png images/basemaps/sogoumap.png images/basemaps/tianditudem.png images/basemaps/tiandituimage.png images/basemaps/tianditumap.png images/basemaps/tianditushiliang.png images/basemaps/toolBox.svg images/basemaps/zoomIn.svg images/basemaps/zoomOut.svg images/bg_right.png images/cover-icon.png images/cva.png images/cwj.png images/dakaiwenjian.png images/dakaiwenjian_1.png images/dingwei.png images/diqiu.png images/dk.png images/dongDraw.png images/dt.png images/dxs.png images/dynamicRiver-see.png images/early-warning.png images/fxyj-rainwater-query.png images/hedao_sq.png images/hedaoz.png images/higher.png images/hint.png images/hy0.png images/hy1.png images/hy2.png images/hy4.png images/hy5.png images/hy6.png images/hy7.png images/hy8.png images/hy9.png images/hydro-fault.png images/hydro-normal.png images/hydrology-1.png images/hydrology-10.png images/hydrology-2.png images/hydrology-3.png images/hydrology-4.png images/hydrology-5.png images/hydrology-6.png images/hydrology-7.png images/hydrology-8.png images/hydrology-9.png images/hydrology.png images/ie.png images/jiangshui_sq.png images/jiesuo.png images/js.png images/jw.png images/kantanriji.png images/landslideDam.png images/layer.png images/leftjiantou.png images/legend-close.png images/link-address.png images/ll.png images/loading.gif images/log-2.png images/log.png images/login.jpg images/logo.png images/lyctrl.png images/marker_green.png images/measure_imgs/1.svg images/measure_imgs/2.svg images/measure_imgs/4.svg images/measure_imgs/9.svg images/measure_imgs/changdu.svg images/measure_imgs/changdutie.svg images/measure_imgs/gaodu.svg images/measure_imgs/gaodufu.svg images/measure_imgs/mianji.svg images/measure_imgs/toolbox.png images/menu.png images/monitor.png images/mountain-in.png images/mountain-on.png images/nav-li-bg.png images/navigation_0h.png images/navigation_1.png images/navigation_2.png images/navigation_3.png images/navigation_4.png images/navigation_4h.png images/navigation_5.png images/navigation_6.png images/navigation_7.png images/navigation_8.png images/net-work-1.jpg images/net-work-10.jpg images/net-work-11.jpg images/net-work-12.jpg images/net-work-13.jpg images/net-work-14.jpg images/net-work-15.jpg images/net-work-16.jpg images/net-work-17.jpg images/net-work-18.jpg images/net-work-19.jpg images/net-work-2.jpg images/net-work-20.jpg images/net-work-21.jpg images/net-work-22.jpg images/net-work-23.jpg images/net-work-24.jpg images/net-work-25.jpg images/net-work-26.jpg images/net-work-27.jpg images/net-work-28.jpg images/net-work-29.jpg images/net-work-3.jpg images/net-work-30.jpg images/net-work-31.jpg images/net-work-32.jpg images/net-work-33.jpg images/net-work-34.jpg images/net-work-35.jpg images/net-work-36.jpg images/net-work-37.jpg images/net-work-38.jpg images/net-work-39.jpg images/net-work-4.jpg images/net-work-40.jpg images/net-work-41.jpg images/net-work-42.jpg images/net-work-43.jpg images/net-work-44.jpg images/net-work-5.jpg images/net-work-6.jpg images/net-work-7.jpg images/net-work-8.jpg images/net-work-9.jpg images/net-work-big.png images/net-work-swenz.png images/net-work-swz.png images/net-work-ylz.png images/net-work-zxhlz.png images/next-down.png images/nextBtn.jpg images/notes.png images/ns.png images/parameter-img.png images/patrol-duty.png images/plan-img.png images/polygon.png images/prev-up.png images/prevBtn.jpg images/qaqqaq.png images/qidian.png images/quan_j.png images/rain-warning-rote.png images/rightjiantou.png images/rote.jpg images/rotundity.png images/sc.png images/scene.png images/searchMap.png images/sel-icon.png images/shanchu.png images/shangsuo.png images/shanhong.png images/shortcut.ico images/shuiku_sq.png images/sidersj.png images/sign1.png images/sign2.png images/sp_action_AH.jpg images/sp_action_BS.jpg images/sp_action_CX.jpg images/sp_action_CY.jpg images/sp_action_DT.jpg images/sp_action_FK.jpg images/sp_action_GG.jpg images/sp_action_GH.jpg images/sp_action_GZ.jpg images/sp_action_HLG.jpg images/sp_action_HQ.jpg images/sp_action_HS.jpg images/sp_action_LR.jpg images/sp_action_MZ.jpg images/sp_action_NJ.jpg images/sp_action_PS.jpg images/sp_action_PT.jpg images/sp_action_RJ.jpg images/sp_action_SB.jpg images/sp_action_SC.jpg images/sp_action_SL.jpg images/sp_action_SQ.jpg images/sp_action_TJ.jpg images/sp_action_TT.jpg images/sp_action_XF.jpg images/sp_action_XG.jpg images/sp_action_XML.jpg images/sp_action_YXB.jpg images/sp_action_ZF.jpg images/sprite-navigator.png images/sq.png images/suo.png images/surveillance-entity.png images/sw.png images/swei.png images/swhdz.png images/sz.png images/tabcontainer.png images/thumbnail.png images/tj.png images/tool-icon.png images/toolback.png images/toolbottom.png images/toolbox.png images/topbg_jr3g.png images/transparent.png images/video-playback.png images/video-surveillance.png images/video.png images/wenjian.png images/yanmo.png images/yuan.png images/yx.png images/zf.png images/zhongdian.png images/地球.png index.html init.js simpleLoader.js themes/BillboardTheme/common.css themes/BillboardTheme/images/icon.png themes/BillboardTheme/layouts/default/config.json themes/BillboardTheme/layouts/default/icon.png themes/BillboardTheme/layouts/default/icon_rtl.png themes/BillboardTheme/layouts/layout1/config.json themes/BillboardTheme/layouts/layout1/icon.png themes/BillboardTheme/layouts/layout1/icon_rtl.png themes/BillboardTheme/layouts/layout2/config.json themes/BillboardTheme/layouts/layout2/icon.png themes/BillboardTheme/layouts/layout2/icon_rtl.png themes/BillboardTheme/layouts/layout3/config.json themes/BillboardTheme/layouts/layout3/icon.png themes/BillboardTheme/layouts/layout3/icon_rtl.png themes/BillboardTheme/main.js themes/BillboardTheme/manifest.json themes/BillboardTheme/nls/es/strings.js themes/BillboardTheme/nls/strings.js themes/BillboardTheme/nls/zh-cn/strings.js themes/BillboardTheme/styles/blue/style.css themes/BillboardTheme/styles/default/style.css themes/BillboardTheme/styles/green/style.css themes/BillboardTheme/styles/orange/style.css themes/BillboardTheme/styles/pink/style.css themes/BillboardTheme/styles/purple/style.css themes/BillboardTheme/styles/red/style.css themes/BillboardTheme/styles/turquoise/style.css themes/BoxTheme/common.css themes/BoxTheme/fonts/helvetica_neue/helveticaneue.eot themes/BoxTheme/fonts/helvetica_neue/helveticaneue.svg themes/BoxTheme/fonts/helvetica_neue/helveticaneue.ttf themes/BoxTheme/fonts/helvetica_neue/helveticaneue.woff themes/BoxTheme/fonts/helvetica_neue/helveticaneue.woff2 themes/BoxTheme/fonts/helvetica_neue/helveticaneueultralight.eot themes/BoxTheme/fonts/helvetica_neue/helveticaneueultralight.svg themes/BoxTheme/fonts/helvetica_neue/helveticaneueultralight.ttf themes/BoxTheme/fonts/helvetica_neue/helveticaneueultralight.woff themes/BoxTheme/fonts/helvetica_neue/helveticaneueultralight.woff2 themes/BoxTheme/fonts/helvetica_neue/style.css themes/BoxTheme/fonts/liberation_sans/liberationsans-bold-webfont.eot themes/BoxTheme/fonts/liberation_sans/liberationsans-bold-webfont.svg themes/BoxTheme/fonts/liberation_sans/liberationsans-bold-webfont.ttf themes/BoxTheme/fonts/liberation_sans/liberationsans-bold-webfont.woff themes/BoxTheme/fonts/liberation_sans/liberationsans-bold-webfont.woff2 themes/BoxTheme/fonts/liberation_sans/liberationsans-regular-webfont.eot themes/BoxTheme/fonts/liberation_sans/liberationsans-regular-webfont.svg themes/BoxTheme/fonts/liberation_sans/liberationsans-regular-webfont.ttf themes/BoxTheme/fonts/liberation_sans/liberationsans-regular-webfont.woff themes/BoxTheme/fonts/liberation_sans/liberationsans-regular-webfont.woff2 themes/BoxTheme/fonts/liberation_sans/style.css themes/BoxTheme/images/cancel.png themes/BoxTheme/images/close.png themes/BoxTheme/images/icon.png themes/BoxTheme/layouts/default/config.json themes/BoxTheme/layouts/default/icon.png themes/BoxTheme/layouts/default/icon_rtl.png themes/BoxTheme/layouts/top/config.json themes/BoxTheme/layouts/top/icon.png themes/BoxTheme/layouts/top/icon_rtl.png themes/BoxTheme/main.js themes/BoxTheme/manifest.json themes/BoxTheme/nls/es/strings.js themes/BoxTheme/nls/strings.js themes/BoxTheme/nls/zh-cn/strings.js themes/BoxTheme/panels/BoxPanel/BoxFrame.js themes/BoxTheme/panels/BoxPanel/Panel.js themes/BoxTheme/panels/BoxPanel/images/minus.png themes/BoxTheme/panels/BoxPanel/images/plus.png themes/BoxTheme/panels/BoxPanel/style.css themes/BoxTheme/styles/blue/style.css themes/BoxTheme/styles/default/style.css themes/BoxTheme/styles/green/style.css themes/BoxTheme/styles/orange/style.css themes/BoxTheme/styles/pink/style.css themes/BoxTheme/styles/purple/style.css themes/BoxTheme/styles/red/style.css themes/BoxTheme/styles/turquoise/style.css themes/BoxTheme/widgets/BoxController/Widget.html themes/BoxTheme/widgets/BoxController/Widget.js themes/BoxTheme/widgets/BoxController/config.json themes/BoxTheme/widgets/BoxController/css/images/dot.png themes/BoxTheme/widgets/BoxController/css/images/doton.png themes/BoxTheme/widgets/BoxController/css/images/menu.png themes/BoxTheme/widgets/BoxController/css/images/toggle.png themes/BoxTheme/widgets/BoxController/css/style.css themes/BoxTheme/widgets/BoxController/images/icon.png themes/BoxTheme/widgets/BoxController/manifest.json themes/BoxTheme/widgets/BoxController/nls/ar/strings.js themes/BoxTheme/widgets/BoxController/nls/bs/strings.js themes/BoxTheme/widgets/BoxController/nls/ca/strings.js themes/BoxTheme/widgets/BoxController/nls/cs/strings.js themes/BoxTheme/widgets/BoxController/nls/da/strings.js themes/BoxTheme/widgets/BoxController/nls/de/strings.js themes/BoxTheme/widgets/BoxController/nls/el/strings.js themes/BoxTheme/widgets/BoxController/nls/es/strings.js themes/BoxTheme/widgets/BoxController/nls/et/strings.js themes/BoxTheme/widgets/BoxController/nls/fi/strings.js themes/BoxTheme/widgets/BoxController/nls/fr/strings.js themes/BoxTheme/widgets/BoxController/nls/he/strings.js themes/BoxTheme/widgets/BoxController/nls/hi/strings.js themes/BoxTheme/widgets/BoxController/nls/hr/strings.js themes/BoxTheme/widgets/BoxController/nls/hu/strings.js themes/BoxTheme/widgets/BoxController/nls/id/strings.js themes/BoxTheme/widgets/BoxController/nls/it/strings.js themes/BoxTheme/widgets/BoxController/nls/ja/strings.js themes/BoxTheme/widgets/BoxController/nls/ko/strings.js themes/BoxTheme/widgets/BoxController/nls/lt/strings.js themes/BoxTheme/widgets/BoxController/nls/lv/strings.js themes/BoxTheme/widgets/BoxController/nls/nb/strings.js themes/BoxTheme/widgets/BoxController/nls/nl/strings.js themes/BoxTheme/widgets/BoxController/nls/pl/strings.js themes/BoxTheme/widgets/BoxController/nls/pt-br/strings.js themes/BoxTheme/widgets/BoxController/nls/pt-pt/strings.js themes/BoxTheme/widgets/BoxController/nls/ro/strings.js themes/BoxTheme/widgets/BoxController/nls/ru/strings.js themes/BoxTheme/widgets/BoxController/nls/sl/strings.js themes/BoxTheme/widgets/BoxController/nls/sr/strings.js themes/BoxTheme/widgets/BoxController/nls/strings.js themes/BoxTheme/widgets/BoxController/nls/sv/strings.js themes/BoxTheme/widgets/BoxController/nls/th/strings.js themes/BoxTheme/widgets/BoxController/nls/tr/strings.js themes/BoxTheme/widgets/BoxController/nls/vi/strings.js themes/BoxTheme/widgets/BoxController/nls/zh-cn/strings.js themes/BoxTheme/widgets/BoxController/nls/zh-hk/strings.js themes/BoxTheme/widgets/BoxController/nls/zh-tw/strings.js themes/DartTheme/common.css themes/DartTheme/dijit-css/Button.css themes/DartTheme/dijit-css/Checkbox.css themes/DartTheme/dijit-css/Common.css themes/DartTheme/dijit-css/Menu.css themes/DartTheme/dijit-css/Select.css themes/DartTheme/dijit-css/Slider.css themes/DartTheme/dijit-css/icons/Icon_Area_16.png themes/DartTheme/dijit-css/icons/Icon_Checkmark_16.png themes/DartTheme/dijit-css/icons/Icon_Close_16.png themes/DartTheme/dijit-css/icons/Icon_Dropdown_16.png themes/DartTheme/dijit-css/icons/Icon_Left_16.png themes/DartTheme/dijit-css/icons/Icon_Measure_Area_16.png themes/DartTheme/dijit-css/icons/Icon_Measure_Distance_16.png themes/DartTheme/dijit-css/icons/Icon_Measure_Point_16.png themes/DartTheme/dijit-css/icons/Icon_More_24.png themes/DartTheme/dijit-css/icons/Icon_Right_16.png themes/DartTheme/dijit-css/icons/warning.png themes/DartTheme/dijit-css/variables.css themes/DartTheme/fonts/helvetica_neue/helveticaneue.eot themes/DartTheme/fonts/helvetica_neue/helveticaneue.svg themes/DartTheme/fonts/helvetica_neue/helveticaneue.ttf themes/DartTheme/fonts/helvetica_neue/helveticaneue.woff themes/DartTheme/fonts/helvetica_neue/helveticaneue.woff2 themes/DartTheme/fonts/helvetica_neue/helveticaneueultralight.eot themes/DartTheme/fonts/helvetica_neue/helveticaneueultralight.svg themes/DartTheme/fonts/helvetica_neue/helveticaneueultralight.ttf themes/DartTheme/fonts/helvetica_neue/helveticaneueultralight.woff themes/DartTheme/fonts/helvetica_neue/helveticaneueultralight.woff2 themes/DartTheme/fonts/helvetica_neue/style.css themes/DartTheme/fonts/liberation_sans/liberationsans-bold-webfont.eot themes/DartTheme/fonts/liberation_sans/liberationsans-bold-webfont.svg themes/DartTheme/fonts/liberation_sans/liberationsans-bold-webfont.ttf themes/DartTheme/fonts/liberation_sans/liberationsans-bold-webfont.woff themes/DartTheme/fonts/liberation_sans/liberationsans-bold-webfont.woff2 themes/DartTheme/fonts/liberation_sans/liberationsans-regular-webfont.eot themes/DartTheme/fonts/liberation_sans/liberationsans-regular-webfont.svg themes/DartTheme/fonts/liberation_sans/liberationsans-regular-webfont.ttf themes/DartTheme/fonts/liberation_sans/liberationsans-regular-webfont.woff themes/DartTheme/fonts/liberation_sans/liberationsans-regular-webfont.woff2 themes/DartTheme/fonts/liberation_sans/style.css themes/DartTheme/images/Infographic/toggle_off_dart.svg themes/DartTheme/images/Infographic/toggle_on_dart.svg themes/DartTheme/images/RadioButton_normal.svg themes/DartTheme/images/RadioButton_selected.svg themes/DartTheme/images/chart-setting-dart.svg themes/DartTheme/images/checked.png themes/DartTheme/images/checked_disabled.png themes/DartTheme/images/checked_hover.png themes/DartTheme/images/clear_white.svg themes/DartTheme/images/clear_white_hover.svg themes/DartTheme/images/coordinateControl/arrow-down_white.png themes/DartTheme/images/coordinateControl/arrow-down_white_hover.png themes/DartTheme/images/coordinateControl/arrow-right_white.png themes/DartTheme/images/coordinateControl/arrow-right_white_hover.png themes/DartTheme/images/coordinateControl/copy_white.png themes/DartTheme/images/coordinateControl/copy_white_hover.png themes/DartTheme/images/coordinateControl/draw_white.png themes/DartTheme/images/coordinateControl/draw_white_hover.png themes/DartTheme/images/coordinateControl/settings_white.png themes/DartTheme/images/coordinateControl/settings_white_hover.png themes/DartTheme/images/coordinateControl/zoom_to_white.png themes/DartTheme/images/coordinateControl/zoom_to_white_hover.png themes/DartTheme/images/done.svg themes/DartTheme/images/filter_done.svg themes/DartTheme/images/filter_setting_default.svg themes/DartTheme/images/filter_setting_hover.svg themes/DartTheme/images/icon.png themes/DartTheme/images/more_dark_disabled.svg themes/DartTheme/images/more_dark_hover.svg themes/DartTheme/images/more_dark_normal.svg themes/DartTheme/images/more_disabled.svg themes/DartTheme/images/more_hover.svg themes/DartTheme/images/more_normal.svg themes/DartTheme/images/share/arrow-back.svg themes/DartTheme/images/share/arrow-back_hover.svg themes/DartTheme/images/share/email.svg themes/DartTheme/images/share/email_hover.svg themes/DartTheme/images/share/facebook.svg themes/DartTheme/images/share/facebook_hover.svg themes/DartTheme/images/share/gplus.svg themes/DartTheme/images/share/gplus_hover.svg themes/DartTheme/images/share/marker.svg themes/DartTheme/images/share/marker_hover.svg themes/DartTheme/images/share/marker_selected.svg themes/DartTheme/images/share/twitter.svg themes/DartTheme/images/share/twitter_hover.svg themes/DartTheme/images/showAllHover.svg themes/DartTheme/images/showAllNormal.svg themes/DartTheme/images/showSelectedHover.svg themes/DartTheme/images/showSelectedNormal.svg themes/DartTheme/images/sprite.css themes/DartTheme/images/sprite.png themes/DartTheme/images/unchecked.png themes/DartTheme/images/unchecked_disabled.png themes/DartTheme/images/unchecked_hover.png themes/DartTheme/images/v-white.png themes/DartTheme/layouts/default/config.json themes/DartTheme/layouts/default/icon.png themes/DartTheme/layouts/default/icon_rtl.png themes/DartTheme/main.js themes/DartTheme/manifest.json themes/DartTheme/nls/es/strings.js themes/DartTheme/nls/strings.js themes/DartTheme/nls/zh-cn/strings.js themes/DartTheme/panels/DartPanel/Panel.html themes/DartTheme/panels/DartPanel/Panel.js themes/DartTheme/panels/DartPanel/images/blur.png themes/DartTheme/panels/DartPanel/images/fold_down.png themes/DartTheme/panels/DartPanel/images/fold_up.png themes/DartTheme/panels/DartPanel/images/shadow.png themes/DartTheme/panels/DartPanel/images/x.png themes/DartTheme/panels/DartPanel/style.css themes/DartTheme/styles/blue/style.css themes/DartTheme/styles/default/style.css themes/DartTheme/styles/green/style.css themes/DartTheme/styles/orange/style.css themes/DartTheme/styles/pink/style.css themes/DartTheme/styles/purple/style.css themes/DartTheme/styles/red/style.css themes/DartTheme/styles/turquoise/style.css themes/DartTheme/widgets/DartController/Widget.html themes/DartTheme/widgets/DartController/Widget.js themes/DartTheme/widgets/DartController/config.json themes/DartTheme/widgets/DartController/css/images/collapse.png themes/DartTheme/widgets/DartController/css/images/dot.png themes/DartTheme/widgets/DartController/css/images/doton.png themes/DartTheme/widgets/DartController/css/images/home.png themes/DartTheme/widgets/DartController/css/images/locate.png themes/DartTheme/widgets/DartController/css/images/stop.png themes/DartTheme/widgets/DartController/css/images/toggle.png themes/DartTheme/widgets/DartController/css/images/zoomin.png themes/DartTheme/widgets/DartController/css/images/zoomout.png themes/DartTheme/widgets/DartController/css/style.css themes/DartTheme/widgets/DartController/images/icon.png themes/DartTheme/widgets/DartController/manifest.json themes/DartTheme/widgets/DartController/nls/ar/strings.js themes/DartTheme/widgets/DartController/nls/bs/strings.js themes/DartTheme/widgets/DartController/nls/ca/strings.js themes/DartTheme/widgets/DartController/nls/cs/strings.js themes/DartTheme/widgets/DartController/nls/da/strings.js themes/DartTheme/widgets/DartController/nls/de/strings.js themes/DartTheme/widgets/DartController/nls/el/strings.js themes/DartTheme/widgets/DartController/nls/es/strings.js themes/DartTheme/widgets/DartController/nls/et/strings.js themes/DartTheme/widgets/DartController/nls/fi/strings.js themes/DartTheme/widgets/DartController/nls/fr/strings.js themes/DartTheme/widgets/DartController/nls/he/strings.js themes/DartTheme/widgets/DartController/nls/hi/strings.js themes/DartTheme/widgets/DartController/nls/hr/strings.js themes/DartTheme/widgets/DartController/nls/hu/strings.js themes/DartTheme/widgets/DartController/nls/id/strings.js themes/DartTheme/widgets/DartController/nls/it/strings.js themes/DartTheme/widgets/DartController/nls/ja/strings.js themes/DartTheme/widgets/DartController/nls/ko/strings.js themes/DartTheme/widgets/DartController/nls/lt/strings.js themes/DartTheme/widgets/DartController/nls/lv/strings.js themes/DartTheme/widgets/DartController/nls/nb/strings.js themes/DartTheme/widgets/DartController/nls/nl/strings.js themes/DartTheme/widgets/DartController/nls/pl/strings.js themes/DartTheme/widgets/DartController/nls/pt-br/strings.js themes/DartTheme/widgets/DartController/nls/pt-pt/strings.js themes/DartTheme/widgets/DartController/nls/ro/strings.js themes/DartTheme/widgets/DartController/nls/ru/strings.js themes/DartTheme/widgets/DartController/nls/sl/strings.js themes/DartTheme/widgets/DartController/nls/sr/strings.js themes/DartTheme/widgets/DartController/nls/strings.js themes/DartTheme/widgets/DartController/nls/sv/strings.js themes/DartTheme/widgets/DartController/nls/th/strings.js themes/DartTheme/widgets/DartController/nls/tr/strings.js themes/DartTheme/widgets/DartController/nls/vi/strings.js themes/DartTheme/widgets/DartController/nls/zh-cn/strings.js themes/DartTheme/widgets/DartController/nls/zh-hk/strings.js themes/DartTheme/widgets/DartController/nls/zh-tw/strings.js themes/DashboardTheme/common.css themes/DashboardTheme/images/icon.png themes/DashboardTheme/layouts/default/config.json themes/DashboardTheme/layouts/default/icon.png themes/DashboardTheme/layouts/default/icon_rtl.png themes/DashboardTheme/layouts/layout1/config.json themes/DashboardTheme/layouts/layout1/icon.png themes/DashboardTheme/layouts/layout1/icon_rtl.png themes/DashboardTheme/layouts/layout2/config.json themes/DashboardTheme/layouts/layout2/icon.png themes/DashboardTheme/layouts/layout2/icon_rtl.png themes/DashboardTheme/main.js themes/DashboardTheme/manifest.json themes/DashboardTheme/nls/ar/strings.js themes/DashboardTheme/nls/bs/strings.js themes/DashboardTheme/nls/ca/strings.js themes/DashboardTheme/nls/cs/strings.js themes/DashboardTheme/nls/da/strings.js themes/DashboardTheme/nls/de/strings.js themes/DashboardTheme/nls/el/strings.js themes/DashboardTheme/nls/es/strings.js themes/DashboardTheme/nls/et/strings.js themes/DashboardTheme/nls/fi/strings.js themes/DashboardTheme/nls/fr/strings.js themes/DashboardTheme/nls/he/strings.js themes/DashboardTheme/nls/hi/strings.js themes/DashboardTheme/nls/hr/strings.js themes/DashboardTheme/nls/hu/strings.js themes/DashboardTheme/nls/id/strings.js themes/DashboardTheme/nls/it/strings.js themes/DashboardTheme/nls/ja/strings.js themes/DashboardTheme/nls/ko/strings.js themes/DashboardTheme/nls/lt/strings.js themes/DashboardTheme/nls/lv/strings.js themes/DashboardTheme/nls/nb/strings.js themes/DashboardTheme/nls/nl/strings.js themes/DashboardTheme/nls/pl/strings.js themes/DashboardTheme/nls/pt-br/strings.js themes/DashboardTheme/nls/pt-pt/strings.js themes/DashboardTheme/nls/ro/strings.js themes/DashboardTheme/nls/ru/strings.js themes/DashboardTheme/nls/sl/strings.js themes/DashboardTheme/nls/sr/strings.js themes/DashboardTheme/nls/strings.js themes/DashboardTheme/nls/sv/strings.js themes/DashboardTheme/nls/th/strings.js themes/DashboardTheme/nls/tr/strings.js themes/DashboardTheme/nls/vi/strings.js themes/DashboardTheme/nls/zh-cn/strings.js themes/DashboardTheme/nls/zh-hk/strings.js themes/DashboardTheme/nls/zh-tw/strings.js themes/DashboardTheme/panels/MobilePanel/Panel.html themes/DashboardTheme/panels/MobilePanel/Panel.js themes/DashboardTheme/panels/MobilePanel/images/chevron-left-disable.svg themes/DashboardTheme/panels/MobilePanel/images/chevron-left.svg themes/DashboardTheme/panels/MobilePanel/images/chevron-right-disable.svg themes/DashboardTheme/panels/MobilePanel/images/chevron-right.svg themes/DashboardTheme/panels/MobilePanel/images/grid_dot.png themes/DashboardTheme/panels/MobilePanel/images/moveup.svg themes/DashboardTheme/panels/MobilePanel/style.css themes/DashboardTheme/panels/MobilePanel/style.css.map themes/DashboardTheme/panels/OnScreenPanel/Panel.html themes/DashboardTheme/panels/OnScreenPanel/Panel.js themes/DashboardTheme/panels/OnScreenPanel/images/x.png themes/DashboardTheme/panels/OnScreenPanel/style.css themes/DashboardTheme/styles/dark-styles/api-override.css themes/DashboardTheme/styles/dark-styles/dojo-override.css themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/add_white.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/add_white_hover.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/arrow-down_white.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/arrow-down_white_hover.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/arrow-right_white.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/arrow-right_white_hover.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/copy_white.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/copy_white_hover.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/edit_white.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/edit_white_hover.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/settings_white.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/settings_white_hover.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/zoom_to_white.png themes/DashboardTheme/styles/dark-styles/images/CoordinateConversion/zoom_to_white_hover.png themes/DashboardTheme/styles/dark-styles/images/DistanceDirection/commonFormArrows.png themes/DashboardTheme/styles/dark-styles/images/DistanceDirection/draw_white.png themes/DashboardTheme/styles/dark-styles/images/DistanceDirection/draw_white_hover.png themes/DashboardTheme/styles/dark-styles/images/DistanceDirection/settings_white.png themes/DashboardTheme/styles/dark-styles/images/DistanceDirection/settings_white_hover.png themes/DashboardTheme/styles/dark-styles/images/DistanceDirection/spriteArrows.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/arrow-down_black.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/arrow-down_black_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/arrow-down_white.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/arrow-down_white_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/arrow-right_black.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/arrow-right_black_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/arrow-right_white.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/arrow-right_white_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/arrow-up_black.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/arrow-up_black_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/draw_black.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/draw_black_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/draw_default.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/draw_gray_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/draw_white.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/draw_white_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/extent_default.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/extent_gray_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/extent_white.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/extent_white_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/help_black.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/help_black_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/help_default.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/help_white.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/help_white_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/left-arrow_black.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/left-arrow_black_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/left-arrow_white.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/left-arrow_white_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/loading.gif themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/polygon_default.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/polygon_gray_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/polygon_white.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/polygon_white_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/settings_black.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/settings_black_hover_black.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/settings_white.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/settings_white_hover.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/sliderball_white.svg themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/sprite.png themes/DashboardTheme/styles/dark-styles/images/EmergencyResponseGuide/tooltip.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/arrow-down_black.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/arrow-down_black_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/arrow-down_white.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/arrow-down_white_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/arrow-right_black.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/arrow-right_black_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/arrow-right_white.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/arrow-right_white_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/byDimension.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/byReferenceSystem.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/byTime.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/draw_default.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/draw_gray_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/draw_white.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/draw_white_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/extent_default.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/extent_gray_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/extent_white.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/extent_white_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_B.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_B_selected.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_B_white.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_B_white_selected.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_I.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_I_selected.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_I_white.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_I_white_selected.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_U.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_U_selected.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_U_white.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/font_U_white_selected.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/help_black.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/help_black_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/help_default.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/help_white.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/help_white_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/left-arrow_black.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/left-arrow_black_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/left-arrow_white.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/left-arrow_white_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/polygon_default.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/polygon_gray_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/polygon_white.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/polygon_white_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/settings_black.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/settings_black_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/settings_locked.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/settings_white.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/settings_white_hover.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/settings_white_locked.png themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/sliderball.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/sliderball_white.svg themes/DashboardTheme/styles/dark-styles/images/GriddedReferenceGraphic/tooltip.png themes/DashboardTheme/styles/dark-styles/images/Infographic/toggle_off_dart.svg themes/DashboardTheme/styles/dark-styles/images/Infographic/toggle_on_dart.svg themes/DashboardTheme/styles/dark-styles/images/RadioButton_normal.svg themes/DashboardTheme/styles/dark-styles/images/RadioButton_selected.svg themes/DashboardTheme/styles/dark-styles/images/SuitabilityModeler/sliders_hover_white.png themes/DashboardTheme/styles/dark-styles/images/SuitabilityModeler/sliders_hover_white@2x.png themes/DashboardTheme/styles/dark-styles/images/add_gray.png themes/DashboardTheme/styles/dark-styles/images/add_normal.svg themes/DashboardTheme/styles/dark-styles/images/arrow-back-white_hover.svg themes/DashboardTheme/styles/dark-styles/images/arrow-back-white_normal.svg themes/DashboardTheme/styles/dark-styles/images/arrow_left_hover.svg themes/DashboardTheme/styles/dark-styles/images/arrow_left_normal.svg themes/DashboardTheme/styles/dark-styles/images/chart-setting-dart.svg themes/DashboardTheme/styles/dark-styles/images/checked.png themes/DashboardTheme/styles/dark-styles/images/checked_disabled.png themes/DashboardTheme/styles/dark-styles/images/clear_white.svg themes/DashboardTheme/styles/dark-styles/images/clear_white_hover.svg themes/DashboardTheme/styles/dark-styles/images/coordinateControl/arrow-down_white.png themes/DashboardTheme/styles/dark-styles/images/coordinateControl/arrow-down_white_hover.png themes/DashboardTheme/styles/dark-styles/images/coordinateControl/arrow-right_white.png themes/DashboardTheme/styles/dark-styles/images/coordinateControl/arrow-right_white_hover.png themes/DashboardTheme/styles/dark-styles/images/coordinateControl/copy_white.png themes/DashboardTheme/styles/dark-styles/images/coordinateControl/copy_white_hover.png themes/DashboardTheme/styles/dark-styles/images/coordinateControl/draw_white.png themes/DashboardTheme/styles/dark-styles/images/coordinateControl/draw_white_hover.png themes/DashboardTheme/styles/dark-styles/images/coordinateControl/settings_white.png themes/DashboardTheme/styles/dark-styles/images/coordinateControl/settings_white_hover.png themes/DashboardTheme/styles/dark-styles/images/coordinateControl/zoom_to_white.png themes/DashboardTheme/styles/dark-styles/images/coordinateControl/zoom_to_white_hover.png themes/DashboardTheme/styles/dark-styles/images/done.svg themes/DashboardTheme/styles/dark-styles/images/dot1.png themes/DashboardTheme/styles/dark-styles/images/dot2.png themes/DashboardTheme/styles/dark-styles/images/download-disable.png themes/DashboardTheme/styles/dark-styles/images/download.png themes/DashboardTheme/styles/dark-styles/images/dropdown.svg themes/DashboardTheme/styles/dark-styles/images/dropdown_hover.svg themes/DashboardTheme/styles/dark-styles/images/icon-clear.png themes/DashboardTheme/styles/dark-styles/images/layer-field-disable.png themes/DashboardTheme/styles/dark-styles/images/layer-field.png themes/DashboardTheme/styles/dark-styles/images/left-arrow-dart-theme.png themes/DashboardTheme/styles/dark-styles/images/locate-selected.png themes/DashboardTheme/styles/dark-styles/images/menu.svg themes/DashboardTheme/styles/dark-styles/images/more-horiz.svg themes/DashboardTheme/styles/dark-styles/images/more_disabled.svg themes/DashboardTheme/styles/dark-styles/images/more_hover.svg themes/DashboardTheme/styles/dark-styles/images/more_normal.svg themes/DashboardTheme/styles/dark-styles/images/print-disable.png themes/DashboardTheme/styles/dark-styles/images/print.png themes/DashboardTheme/styles/dark-styles/images/right-arrow-dart-theme.png themes/DashboardTheme/styles/dark-styles/images/select-tool-white.png themes/DashboardTheme/styles/dark-styles/images/settings_white.svg themes/DashboardTheme/styles/dark-styles/images/settings_white_hover.svg themes/DashboardTheme/styles/dark-styles/images/share/arrow-back.svg themes/DashboardTheme/styles/dark-styles/images/share/arrow-back_hover.svg themes/DashboardTheme/styles/dark-styles/images/share/email.svg themes/DashboardTheme/styles/dark-styles/images/share/email_hover.svg themes/DashboardTheme/styles/dark-styles/images/share/facebook.svg themes/DashboardTheme/styles/dark-styles/images/share/facebook_hover.svg themes/DashboardTheme/styles/dark-styles/images/share/gplus.svg themes/DashboardTheme/styles/dark-styles/images/share/gplus_hover.svg themes/DashboardTheme/styles/dark-styles/images/share/marker.svg themes/DashboardTheme/styles/dark-styles/images/share/marker_hover.svg themes/DashboardTheme/styles/dark-styles/images/share/marker_selected.svg themes/DashboardTheme/styles/dark-styles/images/share/twitter.svg themes/DashboardTheme/styles/dark-styles/images/share/twitter_hover.svg themes/DashboardTheme/styles/dark-styles/images/showAllHover.svg themes/DashboardTheme/styles/dark-styles/images/showAllNormal.svg themes/DashboardTheme/styles/dark-styles/images/showSelectedHover.svg themes/DashboardTheme/styles/dark-styles/images/showSelectedNormal.svg themes/DashboardTheme/styles/dark-styles/images/sprite.png themes/DashboardTheme/styles/dark-styles/images/togglebutton_check_black.svg themes/DashboardTheme/styles/dark-styles/images/togglebutton_uncheck_black.svg themes/DashboardTheme/styles/dark-styles/images/tooltip_dark.png themes/DashboardTheme/styles/dark-styles/images/unchecked.png themes/DashboardTheme/styles/dark-styles/images/v-white.png themes/DashboardTheme/styles/dark-styles/images/zoom-dart-theme.png themes/DashboardTheme/styles/dark-styles/jimu-theme-override.css themes/DashboardTheme/styles/dark-styles/sprite-icons/add_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/add_disabled.png themes/DashboardTheme/styles/dark-styles/sprite-icons/add_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/checkbox_deafult.png themes/DashboardTheme/styles/dark-styles/sprite-icons/checkbox_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/checkbox_disabled.png themes/DashboardTheme/styles/dark-styles/sprite-icons/checkbox_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/checked_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/checked_disabled.png themes/DashboardTheme/styles/dark-styles/sprite-icons/checked_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/close_8_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/close_8_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/close_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/close_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/delete_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/delete_disabled.png themes/DashboardTheme/styles/dark-styles/sprite-icons/delete_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/down_arrow_8_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/down_arrow_8_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/down_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/down_disabled.png themes/DashboardTheme/styles/dark-styles/sprite-icons/down_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/edit_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/edit_disabled.png themes/DashboardTheme/styles/dark-styles/sprite-icons/edit_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/error_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/folder_close_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/folder_close_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/folder_open_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/folder_open_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/left_arrow_8_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/right_arrow_8_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/right_arrow_8_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/search_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/search_disabled.png themes/DashboardTheme/styles/dark-styles/sprite-icons/search_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/setting_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/setting_disabled.png themes/DashboardTheme/styles/dark-styles/sprite-icons/setting_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/up_default.png themes/DashboardTheme/styles/dark-styles/sprite-icons/up_disabled.png themes/DashboardTheme/styles/dark-styles/sprite-icons/up_hover.png themes/DashboardTheme/styles/dark-styles/sprite-icons/white_close_default.png themes/DashboardTheme/styles/dark-styles/sprite.css themes/DashboardTheme/styles/dark-styles/sprite.png themes/DashboardTheme/styles/dark-styles/style.css themes/DashboardTheme/styles/dark-styles/widgets/add-data.css themes/DashboardTheme/styles/dark-styles/widgets/analysis.css themes/DashboardTheme/styles/dark-styles/widgets/at.css themes/DashboardTheme/styles/dark-styles/widgets/batch-edit.css themes/DashboardTheme/styles/dark-styles/widgets/bookmark.css themes/DashboardTheme/styles/dark-styles/widgets/chart.css themes/DashboardTheme/styles/dark-styles/widgets/coordinate-conversion.css themes/DashboardTheme/styles/dark-styles/widgets/distance-direction.css themes/DashboardTheme/styles/dark-styles/widgets/draw.css themes/DashboardTheme/styles/dark-styles/widgets/edit.css themes/DashboardTheme/styles/dark-styles/widgets/emergency-response-guide.css themes/DashboardTheme/styles/dark-styles/widgets/extent-navi.css themes/DashboardTheme/styles/dark-styles/widgets/filter.css themes/DashboardTheme/styles/dark-styles/widgets/fullscreen.css themes/DashboardTheme/styles/dark-styles/widgets/geolookup.css themes/DashboardTheme/styles/dark-styles/widgets/gp.css themes/DashboardTheme/styles/dark-styles/widgets/grid-overlay.css themes/DashboardTheme/styles/dark-styles/widgets/grided-reference-graphic.css themes/DashboardTheme/styles/dark-styles/widgets/group-filter.css themes/DashboardTheme/styles/dark-styles/widgets/home-button.css themes/DashboardTheme/styles/dark-styles/widgets/ig.css themes/DashboardTheme/styles/dark-styles/widgets/info-summary.css themes/DashboardTheme/styles/dark-styles/widgets/infographic.css themes/DashboardTheme/styles/dark-styles/widgets/layer-list.css themes/DashboardTheme/styles/dark-styles/widgets/measurement.css themes/DashboardTheme/styles/dark-styles/widgets/my-location.css themes/DashboardTheme/styles/dark-styles/widgets/nearme.css themes/DashboardTheme/styles/dark-styles/widgets/oblique-viewer.css themes/DashboardTheme/styles/dark-styles/widgets/parcel-drafter.css themes/DashboardTheme/styles/dark-styles/widgets/print.css themes/DashboardTheme/styles/dark-styles/widgets/query.css themes/DashboardTheme/styles/dark-styles/widgets/related-table-chart.css themes/DashboardTheme/styles/dark-styles/widgets/review-dashboard.css themes/DashboardTheme/styles/dark-styles/widgets/screening.css themes/DashboardTheme/styles/dark-styles/widgets/search.css themes/DashboardTheme/styles/dark-styles/widgets/select.css themes/DashboardTheme/styles/dark-styles/widgets/share.css themes/DashboardTheme/styles/dark-styles/widgets/stream.css themes/DashboardTheme/styles/dark-styles/widgets/suitability-modeler.css themes/DashboardTheme/styles/dark-styles/widgets/swipe.css themes/DashboardTheme/styles/dark-styles/widgets/zoomslider.css themes/DashboardTheme/styles/default/style.css themes/DashboardTheme/styles/light/images/chevron-left-disable.svg themes/DashboardTheme/styles/light/images/chevron-left.svg themes/DashboardTheme/styles/light/images/chevron-right-disable.svg themes/DashboardTheme/styles/light/images/chevron-right.svg themes/DashboardTheme/styles/light/images/menu.svg themes/DashboardTheme/styles/light/images/more-horiz.svg themes/DashboardTheme/styles/light/images/moveup.svg themes/DashboardTheme/styles/light/jimu-theme-override.css themes/DashboardTheme/styles/light/style.css themes/DashboardTheme/styles/light/widgets/extent-navi.css themes/DashboardTheme/styles/light/widgets/zoomslider.css themes/DashboardTheme/styles/style3/style.css themes/DashboardTheme/widgets/Header/Widget.html themes/DashboardTheme/widgets/Header/Widget.js themes/DashboardTheme/widgets/Header/css/style.css themes/DashboardTheme/widgets/Header/images/icon.png themes/DashboardTheme/widgets/Header/manifest.json themes/DashboardTheme/widgets/Header/nls/es/strings.js themes/DashboardTheme/widgets/Header/nls/strings.js themes/DashboardTheme/widgets/Header/nls/zh-cn/strings.js themes/DemoTheme/common.css themes/DemoTheme/images/icon.png themes/DemoTheme/layouts/default/config.json themes/DemoTheme/layouts/default/icon.png themes/DemoTheme/layouts/default/icon_rtl.png themes/DemoTheme/layouts/right/config.json themes/DemoTheme/layouts/right/icon-rtl.png themes/DemoTheme/layouts/right/icon.png themes/DemoTheme/main.js themes/DemoTheme/manifest.json themes/DemoTheme/nls/strings.js themes/DemoTheme/panels/SimpleBorderPanel/Panel.js themes/DemoTheme/styles/black/style.css themes/DemoTheme/styles/default/style.css themes/FoldableTheme/common.css themes/FoldableTheme/images/cancel.png themes/FoldableTheme/images/close.png themes/FoldableTheme/images/icon.png themes/FoldableTheme/layouts/default/config.json themes/FoldableTheme/layouts/default/icon.png themes/FoldableTheme/layouts/default/icon_rtl.png themes/FoldableTheme/layouts/layout1/config.json themes/FoldableTheme/layouts/layout1/icon.png themes/FoldableTheme/layouts/layout1/icon_rtl.png themes/FoldableTheme/layouts/layout2/config.json themes/FoldableTheme/layouts/layout2/icon.png themes/FoldableTheme/layouts/layout2/icon_rtl.png themes/FoldableTheme/layouts/layout3/config.json themes/FoldableTheme/layouts/layout3/icon.png themes/FoldableTheme/layouts/layout3/icon_rtl.png themes/FoldableTheme/layouts/layout4/config.json themes/FoldableTheme/layouts/layout4/icon.png themes/FoldableTheme/layouts/layout4/icon_rtl.png themes/FoldableTheme/main.js themes/FoldableTheme/manifest.json themes/FoldableTheme/nls/ar/strings.js themes/FoldableTheme/nls/bs/strings.js themes/FoldableTheme/nls/ca/strings.js themes/FoldableTheme/nls/cs/strings.js themes/FoldableTheme/nls/da/strings.js themes/FoldableTheme/nls/de/strings.js themes/FoldableTheme/nls/el/strings.js themes/FoldableTheme/nls/es/strings.js themes/FoldableTheme/nls/et/strings.js themes/FoldableTheme/nls/fi/strings.js themes/FoldableTheme/nls/fr/strings.js themes/FoldableTheme/nls/he/strings.js themes/FoldableTheme/nls/hi/strings.js themes/FoldableTheme/nls/hr/strings.js themes/FoldableTheme/nls/hu/strings.js themes/FoldableTheme/nls/id/strings.js themes/FoldableTheme/nls/it/strings.js themes/FoldableTheme/nls/ja/strings.js themes/FoldableTheme/nls/ko/strings.js themes/FoldableTheme/nls/lt/strings.js themes/FoldableTheme/nls/lv/strings.js themes/FoldableTheme/nls/nb/strings.js themes/FoldableTheme/nls/nl/strings.js themes/FoldableTheme/nls/pl/strings.js themes/FoldableTheme/nls/pt-br/strings.js themes/FoldableTheme/nls/pt-pt/strings.js themes/FoldableTheme/nls/ro/strings.js themes/FoldableTheme/nls/ru/strings.js themes/FoldableTheme/nls/sl/strings.js themes/FoldableTheme/nls/sr/strings.js themes/FoldableTheme/nls/strings.js themes/FoldableTheme/nls/sv/strings.js themes/FoldableTheme/nls/th/strings.js themes/FoldableTheme/nls/tr/strings.js themes/FoldableTheme/nls/vi/strings.js themes/FoldableTheme/nls/zh-cn/strings.js themes/FoldableTheme/nls/zh-hk/strings.js themes/FoldableTheme/nls/zh-tw/strings.js themes/FoldableTheme/panels/DockablePanel/Panel.html themes/FoldableTheme/panels/DockablePanel/Panel.js themes/FoldableTheme/panels/DockablePanel/images/bar_down.png themes/FoldableTheme/panels/DockablePanel/images/bar_left.png themes/FoldableTheme/panels/DockablePanel/images/bar_right.png themes/FoldableTheme/panels/DockablePanel/images/bar_up.png themes/FoldableTheme/panels/DockablePanel/images/nav_down.png themes/FoldableTheme/panels/DockablePanel/images/nav_left.png themes/FoldableTheme/panels/DockablePanel/images/nav_right.png themes/FoldableTheme/panels/DockablePanel/images/nav_up.png themes/FoldableTheme/panels/DockablePanel/style.css themes/FoldableTheme/panels/FoldablePanel/FoldableDijit.js themes/FoldableTheme/panels/FoldablePanel/FoldableWidgetFrame.js themes/FoldableTheme/panels/FoldablePanel/Panel.js themes/FoldableTheme/panels/FoldablePanel/images/fold_down.png themes/FoldableTheme/panels/FoldablePanel/images/fold_up.png themes/FoldableTheme/panels/FoldablePanel/images/max.png themes/FoldableTheme/panels/FoldablePanel/images/minus.png themes/FoldableTheme/panels/FoldablePanel/images/normal.png themes/FoldableTheme/panels/FoldablePanel/images/plus.png themes/FoldableTheme/panels/FoldablePanel/images/x.png themes/FoldableTheme/panels/FoldablePanel/style.css themes/FoldableTheme/styles/black/style.css themes/FoldableTheme/styles/blue/style.css themes/FoldableTheme/styles/cyan/style.css themes/FoldableTheme/styles/default/style.css themes/FoldableTheme/styles/green/style.css themes/FoldableTheme/styles/purple/style.css themes/FoldableTheme/styles/red/style.css themes/FoldableTheme/styles/yellow/style.css themes/FoldableTheme/widgets/HeaderController/PopupTileNodes.js themes/FoldableTheme/widgets/HeaderController/Widget.html themes/FoldableTheme/widgets/HeaderController/Widget.js themes/FoldableTheme/widgets/HeaderController/config.json themes/FoldableTheme/widgets/HeaderController/css/images/arrow.png themes/FoldableTheme/widgets/HeaderController/css/images/close.png themes/FoldableTheme/widgets/HeaderController/css/style.css themes/FoldableTheme/widgets/HeaderController/id/strings.js themes/FoldableTheme/widgets/HeaderController/images/app-logo.png themes/FoldableTheme/widgets/HeaderController/images/group_icon.png themes/FoldableTheme/widgets/HeaderController/images/icon.png themes/FoldableTheme/widgets/HeaderController/images/more_icon.png themes/FoldableTheme/widgets/HeaderController/manifest.json themes/FoldableTheme/widgets/HeaderController/nls/ar/strings.js themes/FoldableTheme/widgets/HeaderController/nls/bs/strings.js themes/FoldableTheme/widgets/HeaderController/nls/ca/strings.js themes/FoldableTheme/widgets/HeaderController/nls/cs/strings.js themes/FoldableTheme/widgets/HeaderController/nls/da/strings.js themes/FoldableTheme/widgets/HeaderController/nls/de/strings.js themes/FoldableTheme/widgets/HeaderController/nls/el/strings.js themes/FoldableTheme/widgets/HeaderController/nls/es/strings.js themes/FoldableTheme/widgets/HeaderController/nls/et/strings.js themes/FoldableTheme/widgets/HeaderController/nls/fi/strings.js themes/FoldableTheme/widgets/HeaderController/nls/fr/strings.js themes/FoldableTheme/widgets/HeaderController/nls/he/strings.js themes/FoldableTheme/widgets/HeaderController/nls/hi/strings.js themes/FoldableTheme/widgets/HeaderController/nls/hr/strings.js themes/FoldableTheme/widgets/HeaderController/nls/hu/strings.js themes/FoldableTheme/widgets/HeaderController/nls/id/strings.js themes/FoldableTheme/widgets/HeaderController/nls/it/strings.js themes/FoldableTheme/widgets/HeaderController/nls/ja/strings.js themes/FoldableTheme/widgets/HeaderController/nls/ko/strings.js themes/FoldableTheme/widgets/HeaderController/nls/lt/strings.js themes/FoldableTheme/widgets/HeaderController/nls/lv/strings.js themes/FoldableTheme/widgets/HeaderController/nls/nb/strings.js themes/FoldableTheme/widgets/HeaderController/nls/nl/strings.js themes/FoldableTheme/widgets/HeaderController/nls/pl/strings.js themes/FoldableTheme/widgets/HeaderController/nls/pt-br/strings.js themes/FoldableTheme/widgets/HeaderController/nls/pt-pt/strings.js themes/FoldableTheme/widgets/HeaderController/nls/ro/strings.js themes/FoldableTheme/widgets/HeaderController/nls/ru/strings.js themes/FoldableTheme/widgets/HeaderController/nls/sl/strings.js themes/FoldableTheme/widgets/HeaderController/nls/sr/strings.js themes/FoldableTheme/widgets/HeaderController/nls/strings.js themes/FoldableTheme/widgets/HeaderController/nls/sv/strings.js themes/FoldableTheme/widgets/HeaderController/nls/th/strings.js themes/FoldableTheme/widgets/HeaderController/nls/tr/strings.js themes/FoldableTheme/widgets/HeaderController/nls/vi/strings.js themes/FoldableTheme/widgets/HeaderController/nls/zh-cn/strings.js themes/FoldableTheme/widgets/HeaderController/nls/zh-hk/strings.js themes/FoldableTheme/widgets/HeaderController/nls/zh-tw/strings.js themes/FoldableTheme/widgets/HeaderController/setting/Setting.html themes/FoldableTheme/widgets/HeaderController/setting/Setting.js themes/FoldableTheme/widgets/HeaderController/setting/css/style.css themes/FoldableTheme/widgets/HeaderController/setting/nls/ar/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/bs/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/ca/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/cs/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/da/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/de/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/el/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/es/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/et/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/fi/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/fr/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/he/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/hi/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/hr/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/hu/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/id/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/it/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/ja/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/ko/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/lt/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/lv/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/nb/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/nl/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/pl/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/pt-br/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/pt-pt/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/ro/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/ru/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/sl/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/sr/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/sv/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/th/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/tr/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/vi/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/zh-cn/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/zh-hk/strings.js themes/FoldableTheme/widgets/HeaderController/setting/nls/zh-tw/strings.js themes/JewelryBoxTheme/common.css themes/JewelryBoxTheme/images/cancel.png themes/JewelryBoxTheme/images/close.png themes/JewelryBoxTheme/images/icon.png themes/JewelryBoxTheme/layouts/default/config.json themes/JewelryBoxTheme/layouts/default/icon.png themes/JewelryBoxTheme/layouts/default/icon_rtl.png themes/JewelryBoxTheme/layouts/layout1/config.json themes/JewelryBoxTheme/layouts/layout1/icon.png themes/JewelryBoxTheme/layouts/layout1/icon_rtl.png themes/JewelryBoxTheme/layouts/layout2/config.json themes/JewelryBoxTheme/layouts/layout2/icon.png themes/JewelryBoxTheme/layouts/layout2/icon_rtl.png themes/JewelryBoxTheme/main.js themes/JewelryBoxTheme/manifest.json themes/JewelryBoxTheme/nls/es/strings.js themes/JewelryBoxTheme/nls/strings.js themes/JewelryBoxTheme/nls/zh-cn/strings.js themes/JewelryBoxTheme/nls/zh-hk/strings.js themes/JewelryBoxTheme/nls/zh-tw/strings.js themes/JewelryBoxTheme/panels/FoldablePanel/FoldableDijit.js themes/JewelryBoxTheme/panels/FoldablePanel/FoldableWidgetFrame.js themes/JewelryBoxTheme/panels/FoldablePanel/Panel.js themes/JewelryBoxTheme/panels/FoldablePanel/images/fold_down.png themes/JewelryBoxTheme/panels/FoldablePanel/images/fold_up.png themes/JewelryBoxTheme/panels/FoldablePanel/images/max.png themes/JewelryBoxTheme/panels/FoldablePanel/images/minus.png themes/JewelryBoxTheme/panels/FoldablePanel/images/normal.png themes/JewelryBoxTheme/panels/FoldablePanel/images/plus.png themes/JewelryBoxTheme/panels/FoldablePanel/images/x.png themes/JewelryBoxTheme/panels/FoldablePanel/style.css themes/JewelryBoxTheme/panels/LDockablePanel/Panel.html themes/JewelryBoxTheme/panels/LDockablePanel/Panel.js themes/JewelryBoxTheme/panels/LDockablePanel/images/close_default.png themes/JewelryBoxTheme/panels/LDockablePanel/images/close_hover.png themes/JewelryBoxTheme/panels/LDockablePanel/images/open_default.png themes/JewelryBoxTheme/panels/LDockablePanel/images/open_hover.png themes/JewelryBoxTheme/panels/LDockablePanel/style.css themes/JewelryBoxTheme/styles/black/style.css themes/JewelryBoxTheme/styles/blue/style.css themes/JewelryBoxTheme/styles/cyan/style.css themes/JewelryBoxTheme/styles/default/style.css themes/JewelryBoxTheme/styles/green/style.css themes/JewelryBoxTheme/styles/purple/style.css themes/JewelryBoxTheme/styles/red/style.css themes/JewelryBoxTheme/styles/yellow/style.css themes/JewelryBoxTheme/widgets/HeaderController/PopupTileNodes.js themes/JewelryBoxTheme/widgets/HeaderController/Widget.html themes/JewelryBoxTheme/widgets/HeaderController/Widget.js themes/JewelryBoxTheme/widgets/HeaderController/config.json themes/JewelryBoxTheme/widgets/HeaderController/css/images/arrow.png themes/JewelryBoxTheme/widgets/HeaderController/css/images/close.png themes/JewelryBoxTheme/widgets/HeaderController/css/style.css themes/JewelryBoxTheme/widgets/HeaderController/images/app-logo.png themes/JewelryBoxTheme/widgets/HeaderController/images/group_icon.png themes/JewelryBoxTheme/widgets/HeaderController/images/icon.png themes/JewelryBoxTheme/widgets/HeaderController/images/more_icon.png themes/JewelryBoxTheme/widgets/HeaderController/manifest.json themes/JewelryBoxTheme/widgets/HeaderController/nls/ar/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/bs/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/ca/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/cs/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/da/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/de/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/el/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/es/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/et/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/fi/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/fr/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/he/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/hi/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/hr/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/hu/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/id/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/it/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/ja/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/ko/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/lt/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/lv/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/nb/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/nl/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/pl/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/pt-br/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/pt-pt/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/ro/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/ru/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/sl/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/sr/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/sv/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/th/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/tr/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/vi/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/zh-cn/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/zh-hk/strings.js themes/JewelryBoxTheme/widgets/HeaderController/nls/zh-tw/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/Setting.html themes/JewelryBoxTheme/widgets/HeaderController/setting/Setting.js themes/JewelryBoxTheme/widgets/HeaderController/setting/css/style.css themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/ar/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/bs/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/ca/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/cs/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/da/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/de/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/el/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/es/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/et/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/fi/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/fr/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/he/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/hi/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/hr/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/hu/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/id/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/it/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/ja/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/ko/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/lt/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/lv/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/nb/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/nl/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/pl/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/pt-br/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/pt-pt/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/ro/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/ru/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/sl/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/sr/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/sv/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/th/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/tr/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/vi/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/zh-cn/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/zh-hk/strings.js themes/JewelryBoxTheme/widgets/HeaderController/setting/nls/zh-tw/strings.js themes/LaunchpadTheme/common.css themes/LaunchpadTheme/images/icon.png themes/LaunchpadTheme/layouts/default/config.json themes/LaunchpadTheme/layouts/default/icon.png themes/LaunchpadTheme/layouts/default/icon_rtl.png themes/LaunchpadTheme/layouts/layout2/config.json themes/LaunchpadTheme/layouts/layout2/icon.png themes/LaunchpadTheme/layouts/layout2/icon_rtl.png themes/LaunchpadTheme/main.js themes/LaunchpadTheme/manifest.json themes/LaunchpadTheme/nls/ar/strings.js themes/LaunchpadTheme/nls/bs/strings.js themes/LaunchpadTheme/nls/ca/strings.js themes/LaunchpadTheme/nls/cs/strings.js themes/LaunchpadTheme/nls/da/strings.js themes/LaunchpadTheme/nls/de/strings.js themes/LaunchpadTheme/nls/el/strings.js themes/LaunchpadTheme/nls/es/strings.js themes/LaunchpadTheme/nls/et/strings.js themes/LaunchpadTheme/nls/fi/strings.js themes/LaunchpadTheme/nls/fr/strings.js themes/LaunchpadTheme/nls/he/strings.js themes/LaunchpadTheme/nls/hi/strings.js themes/LaunchpadTheme/nls/hr/strings.js themes/LaunchpadTheme/nls/hu/strings.js themes/LaunchpadTheme/nls/id/strings.js themes/LaunchpadTheme/nls/it/strings.js themes/LaunchpadTheme/nls/ja/strings.js themes/LaunchpadTheme/nls/ko/strings.js themes/LaunchpadTheme/nls/lt/strings.js themes/LaunchpadTheme/nls/lv/strings.js themes/LaunchpadTheme/nls/nb/strings.js themes/LaunchpadTheme/nls/nl/strings.js themes/LaunchpadTheme/nls/pl/strings.js themes/LaunchpadTheme/nls/pt-br/strings.js themes/LaunchpadTheme/nls/pt-pt/strings.js themes/LaunchpadTheme/nls/ro/strings.js themes/LaunchpadTheme/nls/ru/strings.js themes/LaunchpadTheme/nls/sl/strings.js themes/LaunchpadTheme/nls/sr/strings.js themes/LaunchpadTheme/nls/strings.js themes/LaunchpadTheme/nls/sv/strings.js themes/LaunchpadTheme/nls/th/strings.js themes/LaunchpadTheme/nls/tr/strings.js themes/LaunchpadTheme/nls/vi/strings.js themes/LaunchpadTheme/nls/zh-cn/strings.js themes/LaunchpadTheme/nls/zh-hk/strings.js themes/LaunchpadTheme/nls/zh-tw/strings.js themes/LaunchpadTheme/panels/LaunchpadPanel/Panel.html themes/LaunchpadTheme/panels/LaunchpadPanel/Panel.js themes/LaunchpadTheme/panels/LaunchpadPanel/images/fold_down.png themes/LaunchpadTheme/panels/LaunchpadPanel/images/fold_up.png themes/LaunchpadTheme/panels/LaunchpadPanel/images/max.png themes/LaunchpadTheme/panels/LaunchpadPanel/images/minus.png themes/LaunchpadTheme/panels/LaunchpadPanel/images/normal.png themes/LaunchpadTheme/panels/LaunchpadPanel/images/plus.png themes/LaunchpadTheme/panels/LaunchpadPanel/images/x.png themes/LaunchpadTheme/panels/LaunchpadPanel/style.css themes/LaunchpadTheme/styles/default/css/dojo-override.css themes/LaunchpadTheme/styles/default/css/images/circle.png themes/LaunchpadTheme/styles/default/css/images/ellipse.png themes/LaunchpadTheme/styles/default/css/images/extent.png themes/LaunchpadTheme/styles/default/css/images/freehand_polygon.png themes/LaunchpadTheme/styles/default/css/images/freehand_polyline.png themes/LaunchpadTheme/styles/default/css/images/line.png themes/LaunchpadTheme/styles/default/css/images/loadingAnimation.gif themes/LaunchpadTheme/styles/default/css/images/point.png themes/LaunchpadTheme/styles/default/css/images/polygon.png themes/LaunchpadTheme/styles/default/css/images/polyline.png themes/LaunchpadTheme/styles/default/css/images/progressBarStrips.png themes/LaunchpadTheme/styles/default/css/images/text.png themes/LaunchpadTheme/styles/default/css/images/toolbar_icons.png themes/LaunchpadTheme/styles/default/css/images/triangle.png themes/LaunchpadTheme/styles/default/css/jimu-override.css themes/LaunchpadTheme/styles/default/css/jimu-theme.css themes/LaunchpadTheme/styles/default/css/launchpad.css themes/LaunchpadTheme/styles/default/icons/fonts/launchpad-icons.eot themes/LaunchpadTheme/styles/default/icons/fonts/launchpad-icons.svg themes/LaunchpadTheme/styles/default/icons/fonts/launchpad-icons.ttf themes/LaunchpadTheme/styles/default/icons/fonts/launchpad-icons.woff themes/LaunchpadTheme/styles/default/icons/icons-reference.html themes/LaunchpadTheme/styles/default/icons/styles.css themes/LaunchpadTheme/styles/default/style.css themes/LaunchpadTheme/styles/style2/css/dojo-override.css themes/LaunchpadTheme/styles/style2/css/images/circle.png themes/LaunchpadTheme/styles/style2/css/images/ellipse.png themes/LaunchpadTheme/styles/style2/css/images/extent.png themes/LaunchpadTheme/styles/style2/css/images/freehand_polygon.png themes/LaunchpadTheme/styles/style2/css/images/freehand_polyline.png themes/LaunchpadTheme/styles/style2/css/images/line.png themes/LaunchpadTheme/styles/style2/css/images/loadingAnimation.gif themes/LaunchpadTheme/styles/style2/css/images/point.png themes/LaunchpadTheme/styles/style2/css/images/polygon.png themes/LaunchpadTheme/styles/style2/css/images/polyline.png themes/LaunchpadTheme/styles/style2/css/images/progressBarStrips.png themes/LaunchpadTheme/styles/style2/css/images/text.png themes/LaunchpadTheme/styles/style2/css/images/toolbar_icons.png themes/LaunchpadTheme/styles/style2/css/images/triangle.png themes/LaunchpadTheme/styles/style2/css/jimu-override.css themes/LaunchpadTheme/styles/style2/css/jimu-theme.css themes/LaunchpadTheme/styles/style2/css/launchpad.css themes/LaunchpadTheme/styles/style2/icons/fonts/launchpad-icons.eot themes/LaunchpadTheme/styles/style2/icons/fonts/launchpad-icons.svg themes/LaunchpadTheme/styles/style2/icons/fonts/launchpad-icons.ttf themes/LaunchpadTheme/styles/style2/icons/fonts/launchpad-icons.woff themes/LaunchpadTheme/styles/style2/icons/icons-reference.html themes/LaunchpadTheme/styles/style2/icons/styles.css themes/LaunchpadTheme/styles/style2/style.css themes/LaunchpadTheme/styles/style3/css/dojo-override.css themes/LaunchpadTheme/styles/style3/css/images/circle.png themes/LaunchpadTheme/styles/style3/css/images/ellipse.png themes/LaunchpadTheme/styles/style3/css/images/extent.png themes/LaunchpadTheme/styles/style3/css/images/freehand_polygon.png themes/LaunchpadTheme/styles/style3/css/images/freehand_polyline.png themes/LaunchpadTheme/styles/style3/css/images/line.png themes/LaunchpadTheme/styles/style3/css/images/loadingAnimation.gif themes/LaunchpadTheme/styles/style3/css/images/point.png themes/LaunchpadTheme/styles/style3/css/images/polygon.png themes/LaunchpadTheme/styles/style3/css/images/polyline.png themes/LaunchpadTheme/styles/style3/css/images/progressBarStrips.png themes/LaunchpadTheme/styles/style3/css/images/text.png themes/LaunchpadTheme/styles/style3/css/images/toolbar_icons.png themes/LaunchpadTheme/styles/style3/css/images/triangle.png themes/LaunchpadTheme/styles/style3/css/jimu-override.css themes/LaunchpadTheme/styles/style3/css/jimu-theme.css themes/LaunchpadTheme/styles/style3/css/launchpad.css themes/LaunchpadTheme/styles/style3/icons/fonts/launchpad-icons.eot themes/LaunchpadTheme/styles/style3/icons/fonts/launchpad-icons.svg themes/LaunchpadTheme/styles/style3/icons/fonts/launchpad-icons.ttf themes/LaunchpadTheme/styles/style3/icons/fonts/launchpad-icons.woff themes/LaunchpadTheme/styles/style3/icons/icons-reference.html themes/LaunchpadTheme/styles/style3/icons/styles.css themes/LaunchpadTheme/styles/style3/style.css themes/LaunchpadTheme/widgets/AnchorBarController/BaseIconItem.html themes/LaunchpadTheme/widgets/AnchorBarController/BaseIconItem.js themes/LaunchpadTheme/widgets/AnchorBarController/DockableItem.js themes/LaunchpadTheme/widgets/AnchorBarController/GroupItems.html themes/LaunchpadTheme/widgets/AnchorBarController/GroupItems.js themes/LaunchpadTheme/widgets/AnchorBarController/PopupMoreNodes.js themes/LaunchpadTheme/widgets/AnchorBarController/Widget.html themes/LaunchpadTheme/widgets/AnchorBarController/Widget.js themes/LaunchpadTheme/widgets/AnchorBarController/config.json themes/LaunchpadTheme/widgets/AnchorBarController/css/images/close.png themes/LaunchpadTheme/widgets/AnchorBarController/css/images/x.png themes/LaunchpadTheme/widgets/AnchorBarController/css/style.css themes/LaunchpadTheme/widgets/AnchorBarController/images/group_icon.png themes/LaunchpadTheme/widgets/AnchorBarController/images/icon.png themes/LaunchpadTheme/widgets/AnchorBarController/images/more_icon.png themes/LaunchpadTheme/widgets/AnchorBarController/manifest.json themes/LaunchpadTheme/widgets/AnchorBarController/nls/ar/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/bs/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/ca/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/cs/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/da/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/de/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/el/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/es/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/et/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/fi/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/fr/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/he/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/hi/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/hr/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/hu/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/id/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/it/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/ja/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/ko/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/lt/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/lv/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/nb/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/nl/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/pl/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/pt-br/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/pt-pt/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/ro/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/ru/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/sl/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/sr/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/sv/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/th/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/tr/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/vi/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/zh-cn/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/zh-hk/strings.js themes/LaunchpadTheme/widgets/AnchorBarController/nls/zh-tw/strings.js themes/LaunchpadTheme/widgets/Header/Widget.html themes/LaunchpadTheme/widgets/Header/Widget.js themes/LaunchpadTheme/widgets/Header/css/images/arrow.png themes/LaunchpadTheme/widgets/Header/css/style.css themes/LaunchpadTheme/widgets/Header/images/app-logo.png themes/LaunchpadTheme/widgets/Header/images/icon.png themes/LaunchpadTheme/widgets/Header/images/link_icon.png themes/LaunchpadTheme/widgets/Header/manifest.json themes/LaunchpadTheme/widgets/Header/nls/ar/strings.js themes/LaunchpadTheme/widgets/Header/nls/bs/strings.js themes/LaunchpadTheme/widgets/Header/nls/ca/strings.js themes/LaunchpadTheme/widgets/Header/nls/cs/strings.js themes/LaunchpadTheme/widgets/Header/nls/da/strings.js themes/LaunchpadTheme/widgets/Header/nls/de/strings.js themes/LaunchpadTheme/widgets/Header/nls/el/strings.js themes/LaunchpadTheme/widgets/Header/nls/es/strings.js themes/LaunchpadTheme/widgets/Header/nls/et/strings.js themes/LaunchpadTheme/widgets/Header/nls/fi/strings.js themes/LaunchpadTheme/widgets/Header/nls/fr/strings.js themes/LaunchpadTheme/widgets/Header/nls/he/strings.js themes/LaunchpadTheme/widgets/Header/nls/hi/strings.js themes/LaunchpadTheme/widgets/Header/nls/hr/strings.js themes/LaunchpadTheme/widgets/Header/nls/hu/strings.js themes/LaunchpadTheme/widgets/Header/nls/id/strings.js themes/LaunchpadTheme/widgets/Header/nls/it/strings.js themes/LaunchpadTheme/widgets/Header/nls/ja/strings.js themes/LaunchpadTheme/widgets/Header/nls/ko/strings.js themes/LaunchpadTheme/widgets/Header/nls/lt/strings.js themes/LaunchpadTheme/widgets/Header/nls/lv/strings.js themes/LaunchpadTheme/widgets/Header/nls/nb/strings.js themes/LaunchpadTheme/widgets/Header/nls/nl/strings.js themes/LaunchpadTheme/widgets/Header/nls/pl/strings.js themes/LaunchpadTheme/widgets/Header/nls/pt-br/strings.js themes/LaunchpadTheme/widgets/Header/nls/pt-pt/strings.js themes/LaunchpadTheme/widgets/Header/nls/ro/strings.js themes/LaunchpadTheme/widgets/Header/nls/ru/strings.js themes/LaunchpadTheme/widgets/Header/nls/sl/strings.js themes/LaunchpadTheme/widgets/Header/nls/sr/strings.js themes/LaunchpadTheme/widgets/Header/nls/strings.js themes/LaunchpadTheme/widgets/Header/nls/sv/strings.js themes/LaunchpadTheme/widgets/Header/nls/th/strings.js themes/LaunchpadTheme/widgets/Header/nls/tr/strings.js themes/LaunchpadTheme/widgets/Header/nls/vi/strings.js themes/LaunchpadTheme/widgets/Header/nls/zh-cn/strings.js themes/LaunchpadTheme/widgets/Header/nls/zh-hk/strings.js themes/LaunchpadTheme/widgets/Header/nls/zh-tw/strings.js themes/PlateauTheme/common.css themes/PlateauTheme/images/cancel.png themes/PlateauTheme/images/close.png themes/PlateauTheme/images/home-spinner.gif themes/PlateauTheme/images/home.png themes/PlateauTheme/images/icon.png themes/PlateauTheme/images/locate.png themes/PlateauTheme/layouts/default/config.json themes/PlateauTheme/layouts/default/icon.png themes/PlateauTheme/layouts/default/icon_rtl.png themes/PlateauTheme/layouts/layout1/config.json themes/PlateauTheme/layouts/layout1/icon.png themes/PlateauTheme/layouts/layout1/icon_rtl.png themes/PlateauTheme/main.js themes/PlateauTheme/manifest.json themes/PlateauTheme/nls/ar/strings.js themes/PlateauTheme/nls/bs/strings.js themes/PlateauTheme/nls/ca/strings.js themes/PlateauTheme/nls/cs/strings.js themes/PlateauTheme/nls/da/strings.js themes/PlateauTheme/nls/de/strings.js themes/PlateauTheme/nls/el/strings.js themes/PlateauTheme/nls/es/strings.js themes/PlateauTheme/nls/et/strings.js themes/PlateauTheme/nls/fi/strings.js themes/PlateauTheme/nls/fr/strings.js themes/PlateauTheme/nls/he/strings.js themes/PlateauTheme/nls/hi/strings.js themes/PlateauTheme/nls/hr/strings.js themes/PlateauTheme/nls/hu/strings.js themes/PlateauTheme/nls/id/strings.js themes/PlateauTheme/nls/it/strings.js themes/PlateauTheme/nls/ja/strings.js themes/PlateauTheme/nls/ko/strings.js themes/PlateauTheme/nls/lt/strings.js themes/PlateauTheme/nls/lv/strings.js themes/PlateauTheme/nls/nb/strings.js themes/PlateauTheme/nls/nl/strings.js themes/PlateauTheme/nls/pl/strings.js themes/PlateauTheme/nls/pt-br/strings.js themes/PlateauTheme/nls/pt-pt/strings.js themes/PlateauTheme/nls/ro/strings.js themes/PlateauTheme/nls/ru/strings.js themes/PlateauTheme/nls/sl/strings.js themes/PlateauTheme/nls/sr/strings.js themes/PlateauTheme/nls/strings.js themes/PlateauTheme/nls/sv/strings.js themes/PlateauTheme/nls/th/strings.js themes/PlateauTheme/nls/tr/strings.js themes/PlateauTheme/nls/vi/strings.js themes/PlateauTheme/nls/zh-cn/strings.js themes/PlateauTheme/nls/zh-hk/strings.js themes/PlateauTheme/nls/zh-tw/strings.js themes/PlateauTheme/panels/DockablePanel/Panel.html themes/PlateauTheme/panels/DockablePanel/Panel.js themes/PlateauTheme/panels/DockablePanel/images/bar_down.png themes/PlateauTheme/panels/DockablePanel/images/bar_left.png themes/PlateauTheme/panels/DockablePanel/images/bar_right.png themes/PlateauTheme/panels/DockablePanel/images/bar_up.png themes/PlateauTheme/panels/DockablePanel/images/nav_down.png themes/PlateauTheme/panels/DockablePanel/images/nav_left.png themes/PlateauTheme/panels/DockablePanel/images/nav_right.png themes/PlateauTheme/panels/DockablePanel/images/nav_up.png themes/PlateauTheme/panels/DockablePanel/style.css themes/PlateauTheme/panels/FoldablePanel/FoldableDijit.js themes/PlateauTheme/panels/FoldablePanel/FoldableWidgetFrame.js themes/PlateauTheme/panels/FoldablePanel/Panel.js themes/PlateauTheme/panels/FoldablePanel/images/fold_down.png themes/PlateauTheme/panels/FoldablePanel/images/fold_up.png themes/PlateauTheme/panels/FoldablePanel/images/max.png themes/PlateauTheme/panels/FoldablePanel/images/minus.png themes/PlateauTheme/panels/FoldablePanel/images/normal.png themes/PlateauTheme/panels/FoldablePanel/images/plus.png themes/PlateauTheme/panels/FoldablePanel/images/x.png themes/PlateauTheme/panels/FoldablePanel/style.css themes/PlateauTheme/styles/black/style.css themes/PlateauTheme/styles/dark-blue/style.css themes/PlateauTheme/styles/dark-green/style.css themes/PlateauTheme/styles/default/style.css themes/PlateauTheme/styles/esri-blue/style.css themes/PlateauTheme/styles/esri-green/style.css themes/PlateauTheme/styles/medium-grey/style.css themes/PlateauTheme/styles/orange/style.css themes/PlateauTheme/widgets/HeaderController/PopupTileNodes.js themes/PlateauTheme/widgets/HeaderController/Widget.html themes/PlateauTheme/widgets/HeaderController/Widget.js themes/PlateauTheme/widgets/HeaderController/config.json themes/PlateauTheme/widgets/HeaderController/css/images/arrow.png themes/PlateauTheme/widgets/HeaderController/css/images/close.png themes/PlateauTheme/widgets/HeaderController/css/style.css themes/PlateauTheme/widgets/HeaderController/images/app-logo.png themes/PlateauTheme/widgets/HeaderController/images/group_icon.png themes/PlateauTheme/widgets/HeaderController/images/icon.png themes/PlateauTheme/widgets/HeaderController/images/more_icon.png themes/PlateauTheme/widgets/HeaderController/manifest.json themes/PlateauTheme/widgets/HeaderController/nls/ar/strings.js themes/PlateauTheme/widgets/HeaderController/nls/bs/strings.js themes/PlateauTheme/widgets/HeaderController/nls/ca/strings.js themes/PlateauTheme/widgets/HeaderController/nls/cs/strings.js themes/PlateauTheme/widgets/HeaderController/nls/da/strings.js themes/PlateauTheme/widgets/HeaderController/nls/de/strings.js themes/PlateauTheme/widgets/HeaderController/nls/el/strings.js themes/PlateauTheme/widgets/HeaderController/nls/es/strings.js themes/PlateauTheme/widgets/HeaderController/nls/et/strings.js themes/PlateauTheme/widgets/HeaderController/nls/fi/strings.js themes/PlateauTheme/widgets/HeaderController/nls/fr/strings.js themes/PlateauTheme/widgets/HeaderController/nls/he/strings.js themes/PlateauTheme/widgets/HeaderController/nls/hi/strings.js themes/PlateauTheme/widgets/HeaderController/nls/hr/strings.js themes/PlateauTheme/widgets/HeaderController/nls/hu/strings.js themes/PlateauTheme/widgets/HeaderController/nls/id/strings.js themes/PlateauTheme/widgets/HeaderController/nls/it/strings.js themes/PlateauTheme/widgets/HeaderController/nls/ja/strings.js themes/PlateauTheme/widgets/HeaderController/nls/ko/strings.js themes/PlateauTheme/widgets/HeaderController/nls/lt/strings.js themes/PlateauTheme/widgets/HeaderController/nls/lv/strings.js themes/PlateauTheme/widgets/HeaderController/nls/nb/strings.js themes/PlateauTheme/widgets/HeaderController/nls/nl/strings.js themes/PlateauTheme/widgets/HeaderController/nls/pl/strings.js themes/PlateauTheme/widgets/HeaderController/nls/pt-br/strings.js themes/PlateauTheme/widgets/HeaderController/nls/pt-pt/strings.js themes/PlateauTheme/widgets/HeaderController/nls/ro/strings.js themes/PlateauTheme/widgets/HeaderController/nls/ru/strings.js themes/PlateauTheme/widgets/HeaderController/nls/sl/strings.js themes/PlateauTheme/widgets/HeaderController/nls/sr/strings.js themes/PlateauTheme/widgets/HeaderController/nls/strings.js themes/PlateauTheme/widgets/HeaderController/nls/sv/strings.js themes/PlateauTheme/widgets/HeaderController/nls/th/strings.js themes/PlateauTheme/widgets/HeaderController/nls/tr/strings.js themes/PlateauTheme/widgets/HeaderController/nls/vi/strings.js themes/PlateauTheme/widgets/HeaderController/nls/zh-cn/strings.js themes/PlateauTheme/widgets/HeaderController/nls/zh-hk/strings.js themes/PlateauTheme/widgets/HeaderController/nls/zh-tw/strings.js themes/PlateauTheme/widgets/HeaderController/setting/Setting.html themes/PlateauTheme/widgets/HeaderController/setting/Setting.js themes/PlateauTheme/widgets/HeaderController/setting/css/style.css themes/PlateauTheme/widgets/HeaderController/setting/nls/ar/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/bs/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/ca/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/cs/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/da/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/de/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/el/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/es/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/et/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/fi/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/fr/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/he/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/hi/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/hr/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/hu/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/id/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/it/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/ja/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/ko/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/lt/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/lv/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/nb/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/nl/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/pl/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/pt-br/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/pt-pt/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/ro/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/ru/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/sl/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/sr/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/sv/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/th/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/tr/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/vi/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/zh-cn/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/zh-hk/strings.js themes/PlateauTheme/widgets/HeaderController/setting/nls/zh-tw/strings.js themes/PocketTheme/common.css themes/PocketTheme/images/icon.png themes/PocketTheme/layouts/default/config.json themes/PocketTheme/layouts/default/icon.png themes/PocketTheme/layouts/default/icon_rtl.png themes/PocketTheme/layouts/layout1/config.json themes/PocketTheme/layouts/layout1/icon.png themes/PocketTheme/layouts/layout1/icon_rtl.png themes/PocketTheme/main.js themes/PocketTheme/manifest.json themes/PocketTheme/nls/es/strings.js themes/PocketTheme/nls/strings.js themes/PocketTheme/nls/zh-cn/strings.js themes/PocketTheme/nls/zh-hk/strings.js themes/PocketTheme/nls/zh-tw/strings.js themes/PocketTheme/panels/PocketPanel/Panel.html themes/PocketTheme/panels/PocketPanel/Panel.js themes/PocketTheme/panels/PocketPanel/images/max.png themes/PocketTheme/panels/PocketPanel/images/pointerbottom.png themes/PocketTheme/panels/PocketPanel/images/pointertop.png themes/PocketTheme/panels/PocketPanel/positions.css themes/PocketTheme/panels/PocketPanel/style.css themes/PocketTheme/styles/black/style.css themes/PocketTheme/styles/dark-blue/style.css themes/PocketTheme/styles/dark-green/style.css themes/PocketTheme/styles/default/style.css themes/PocketTheme/styles/esri-blue/style.css themes/PocketTheme/styles/esri-green/style.css themes/PocketTheme/styles/medium-grey/style.css themes/PocketTheme/styles/orange/style.css themes/TabTheme/common.css themes/TabTheme/images/close.png themes/TabTheme/images/double_arrow.png themes/TabTheme/images/icon.png themes/TabTheme/layouts/default/config.json themes/TabTheme/layouts/default/icon.png themes/TabTheme/layouts/default/icon_rtl.png themes/TabTheme/layouts/layout1/config.json themes/TabTheme/layouts/layout1/icon.png themes/TabTheme/layouts/layout1/icon_rtl.png themes/TabTheme/main.js themes/TabTheme/manifest.json themes/TabTheme/nls/es/strings.js themes/TabTheme/nls/strings.js themes/TabTheme/nls/zh-cn/strings.js themes/TabTheme/nls/zh-hk/strings.js themes/TabTheme/nls/zh-tw/strings.js themes/TabTheme/panels/TabPanel/Panel.js themes/TabTheme/panels/TabPanel/TabWidgetFrame.html themes/TabTheme/panels/TabPanel/TabWidgetFrame.js themes/TabTheme/panels/TabPanel/images/tab_triangle.png themes/TabTheme/panels/TabPanel/images/tab_triangle_2.png themes/TabTheme/panels/TabPanel/style.css themes/TabTheme/styles/blue/style.css themes/TabTheme/styles/cyan/style.css themes/TabTheme/styles/default/style.css themes/TabTheme/styles/green/style.css themes/TabTheme/styles/purple/style.css themes/TabTheme/styles/red/style.css themes/TabTheme/styles/simpleblue/style.css themes/TabTheme/styles/yellow/style.css themes/TabTheme/widgets/Footer/Widget.html themes/TabTheme/widgets/Footer/Widget.js themes/TabTheme/widgets/Footer/css/style.css themes/TabTheme/widgets/Footer/images/icon.png themes/TabTheme/widgets/Footer/manifest.json themes/TabTheme/widgets/Footer/nls/ar/strings.js themes/TabTheme/widgets/Footer/nls/bs/strings.js themes/TabTheme/widgets/Footer/nls/ca/strings.js themes/TabTheme/widgets/Footer/nls/cs/strings.js themes/TabTheme/widgets/Footer/nls/da/strings.js themes/TabTheme/widgets/Footer/nls/de/strings.js themes/TabTheme/widgets/Footer/nls/el/strings.js themes/TabTheme/widgets/Footer/nls/es/strings.js themes/TabTheme/widgets/Footer/nls/et/strings.js themes/TabTheme/widgets/Footer/nls/fi/strings.js themes/TabTheme/widgets/Footer/nls/fr/strings.js themes/TabTheme/widgets/Footer/nls/he/strings.js themes/TabTheme/widgets/Footer/nls/hi/strings.js themes/TabTheme/widgets/Footer/nls/hr/strings.js themes/TabTheme/widgets/Footer/nls/hu/strings.js themes/TabTheme/widgets/Footer/nls/id/strings.js themes/TabTheme/widgets/Footer/nls/it/strings.js themes/TabTheme/widgets/Footer/nls/ja/strings.js themes/TabTheme/widgets/Footer/nls/ko/strings.js themes/TabTheme/widgets/Footer/nls/lt/strings.js themes/TabTheme/widgets/Footer/nls/lv/strings.js themes/TabTheme/widgets/Footer/nls/nb/strings.js themes/TabTheme/widgets/Footer/nls/nl/strings.js themes/TabTheme/widgets/Footer/nls/pl/strings.js themes/TabTheme/widgets/Footer/nls/pt-br/strings.js themes/TabTheme/widgets/Footer/nls/pt-pt/strings.js themes/TabTheme/widgets/Footer/nls/ro/strings.js themes/TabTheme/widgets/Footer/nls/ru/strings.js themes/TabTheme/widgets/Footer/nls/sl/strings.js themes/TabTheme/widgets/Footer/nls/sr/strings.js themes/TabTheme/widgets/Footer/nls/strings.js themes/TabTheme/widgets/Footer/nls/sv/strings.js themes/TabTheme/widgets/Footer/nls/th/strings.js themes/TabTheme/widgets/Footer/nls/tr/strings.js themes/TabTheme/widgets/Footer/nls/vi/strings.js themes/TabTheme/widgets/Footer/nls/zh-cn/strings.js themes/TabTheme/widgets/Footer/nls/zh-hk/strings.js themes/TabTheme/widgets/Footer/nls/zh-tw/strings.js themes/TabTheme/widgets/Header/Widget.html themes/TabTheme/widgets/Header/Widget.js themes/TabTheme/widgets/Header/css/images/arrow.png themes/TabTheme/widgets/Header/css/style.css themes/TabTheme/widgets/Header/images/app-logo.png themes/TabTheme/widgets/Header/images/group_icon.png themes/TabTheme/widgets/Header/images/icon.png themes/TabTheme/widgets/Header/images/more_icon.png themes/TabTheme/widgets/Header/manifest.json themes/TabTheme/widgets/Header/nls/ar/strings.js themes/TabTheme/widgets/Header/nls/bs/strings.js themes/TabTheme/widgets/Header/nls/ca/strings.js themes/TabTheme/widgets/Header/nls/cs/strings.js themes/TabTheme/widgets/Header/nls/da/strings.js themes/TabTheme/widgets/Header/nls/de/strings.js themes/TabTheme/widgets/Header/nls/el/strings.js themes/TabTheme/widgets/Header/nls/es/strings.js themes/TabTheme/widgets/Header/nls/et/strings.js themes/TabTheme/widgets/Header/nls/fi/strings.js themes/TabTheme/widgets/Header/nls/fr/strings.js themes/TabTheme/widgets/Header/nls/he/strings.js themes/TabTheme/widgets/Header/nls/hi/strings.js themes/TabTheme/widgets/Header/nls/hr/strings.js themes/TabTheme/widgets/Header/nls/hu/strings.js themes/TabTheme/widgets/Header/nls/id/strings.js themes/TabTheme/widgets/Header/nls/it/strings.js themes/TabTheme/widgets/Header/nls/ja/strings.js themes/TabTheme/widgets/Header/nls/ko/strings.js themes/TabTheme/widgets/Header/nls/lt/strings.js themes/TabTheme/widgets/Header/nls/lv/strings.js themes/TabTheme/widgets/Header/nls/nb/strings.js themes/TabTheme/widgets/Header/nls/nl/strings.js themes/TabTheme/widgets/Header/nls/pl/strings.js themes/TabTheme/widgets/Header/nls/pt-br/strings.js themes/TabTheme/widgets/Header/nls/pt-pt/strings.js themes/TabTheme/widgets/Header/nls/ro/strings.js themes/TabTheme/widgets/Header/nls/ru/strings.js themes/TabTheme/widgets/Header/nls/sl/strings.js themes/TabTheme/widgets/Header/nls/sr/strings.js themes/TabTheme/widgets/Header/nls/strings.js themes/TabTheme/widgets/Header/nls/sv/strings.js themes/TabTheme/widgets/Header/nls/th/strings.js themes/TabTheme/widgets/Header/nls/tr/strings.js themes/TabTheme/widgets/Header/nls/vi/strings.js themes/TabTheme/widgets/Header/nls/zh-cn/strings.js themes/TabTheme/widgets/Header/nls/zh-hk/strings.js themes/TabTheme/widgets/Header/nls/zh-tw/strings.js themes/TabTheme/widgets/SidebarController/Widget.html themes/TabTheme/widgets/SidebarController/Widget.js themes/TabTheme/widgets/SidebarController/css/images/arrow_left.png themes/TabTheme/widgets/SidebarController/css/images/arrow_left_hover.png themes/TabTheme/widgets/SidebarController/css/images/arrow_right.png themes/TabTheme/widgets/SidebarController/css/images/arrow_right_hover.png themes/TabTheme/widgets/SidebarController/css/images/close.png themes/TabTheme/widgets/SidebarController/css/images/close_hover.png themes/TabTheme/widgets/SidebarController/css/images/tab_triangle.png themes/TabTheme/widgets/SidebarController/css/style.css themes/TabTheme/widgets/SidebarController/images/arrow_choose.png themes/TabTheme/widgets/SidebarController/images/arrow_choose_rtl.png themes/TabTheme/widgets/SidebarController/images/default_icon.png themes/TabTheme/widgets/SidebarController/images/icon.png themes/TabTheme/widgets/SidebarController/images/more_tab_icon.png themes/TabTheme/widgets/SidebarController/manifest.json themes/TabTheme/widgets/SidebarController/nls/ar/strings.js themes/TabTheme/widgets/SidebarController/nls/bs/strings.js themes/TabTheme/widgets/SidebarController/nls/ca/strings.js themes/TabTheme/widgets/SidebarController/nls/cs/strings.js themes/TabTheme/widgets/SidebarController/nls/da/strings.js themes/TabTheme/widgets/SidebarController/nls/de/strings.js themes/TabTheme/widgets/SidebarController/nls/el/strings.js themes/TabTheme/widgets/SidebarController/nls/es/strings.js themes/TabTheme/widgets/SidebarController/nls/et/strings.js themes/TabTheme/widgets/SidebarController/nls/fi/strings.js themes/TabTheme/widgets/SidebarController/nls/fr/strings.js themes/TabTheme/widgets/SidebarController/nls/he/strings.js themes/TabTheme/widgets/SidebarController/nls/hi/strings.js themes/TabTheme/widgets/SidebarController/nls/hr/strings.js themes/TabTheme/widgets/SidebarController/nls/hu/strings.js themes/TabTheme/widgets/SidebarController/nls/id/strings.js themes/TabTheme/widgets/SidebarController/nls/it/strings.js themes/TabTheme/widgets/SidebarController/nls/ja/strings.js themes/TabTheme/widgets/SidebarController/nls/ko/strings.js themes/TabTheme/widgets/SidebarController/nls/lt/strings.js themes/TabTheme/widgets/SidebarController/nls/lv/strings.js themes/TabTheme/widgets/SidebarController/nls/nb/strings.js themes/TabTheme/widgets/SidebarController/nls/nl/strings.js themes/TabTheme/widgets/SidebarController/nls/pl/strings.js themes/TabTheme/widgets/SidebarController/nls/pt-br/strings.js themes/TabTheme/widgets/SidebarController/nls/pt-pt/strings.js themes/TabTheme/widgets/SidebarController/nls/ro/strings.js themes/TabTheme/widgets/SidebarController/nls/ru/strings.js themes/TabTheme/widgets/SidebarController/nls/sl/strings.js themes/TabTheme/widgets/SidebarController/nls/sr/strings.js themes/TabTheme/widgets/SidebarController/nls/strings.js themes/TabTheme/widgets/SidebarController/nls/sv/strings.js themes/TabTheme/widgets/SidebarController/nls/th/strings.js themes/TabTheme/widgets/SidebarController/nls/tr/strings.js themes/TabTheme/widgets/SidebarController/nls/vi/strings.js themes/TabTheme/widgets/SidebarController/nls/zh-cn/strings.js themes/TabTheme/widgets/SidebarController/nls/zh-hk/strings.js themes/TabTheme/widgets/SidebarController/nls/zh-tw/strings.js widgets/Basemap/Widget.html widgets/Basemap/Widget.js widgets/Basemap/css/style.css widgets/Basemap/manifest.json widgets/Basemap/nls/es/strings.js widgets/Basemap/nls/strings.js widgets/Basemap/nls/zh-cn/strings.js widgets/Bookmark/ImageNode.js widgets/Bookmark/Widget.html widgets/Bookmark/Widget.js widgets/Bookmark/common.css widgets/Bookmark/config.json widgets/Bookmark/css/style.css widgets/Bookmark/images/icon.png widgets/Bookmark/images/thumbnail_arches_national_park.png widgets/Bookmark/images/thumbnail_default.png widgets/Bookmark/images/thumbnail_eiffel_tower.png widgets/Bookmark/images/thumbnail_forbidden_city.png widgets/Bookmark/images/thumbnail_giza_pyramid.png widgets/Bookmark/images/thumbnail_great_wall.png widgets/Bookmark/images/thumbnail_sf.png widgets/Bookmark/images/thumbnail_sydney_opera.png widgets/Bookmark/images/thumbnail_us.png widgets/Bookmark/manifest.json widgets/Bookmark/nls/es/strings.js widgets/Bookmark/nls/strings.js widgets/Bookmark/nls/zh-cn/strings.js widgets/Cluster/Widget.html widgets/Cluster/Widget.js widgets/Cluster/css/style.css widgets/Cluster/images/camera.png widgets/Cluster/images/icon.png widgets/Cluster/manifest.json widgets/Cluster/nls/es/strings.js widgets/Cluster/nls/strings.js widgets/Cluster/nls/zh-cn/strings.js widgets/Cluster/widget.css widgets/CommonBase/Widget.js widgets/CommonBase/images/icon.png widgets/CommonBase/manifest.json widgets/CommonBase/nls/es/strings.js widgets/CommonBase/nls/strings.js widgets/CommonBase/nls/zh-cn/strings.js widgets/EagleEye/Widget.html widgets/EagleEye/Widget.js widgets/EagleEye/css/style.css widgets/EagleEye/images/icon.png widgets/EagleEye/manifest.json widgets/EagleEye/nls/es/strings.js widgets/EagleEye/nls/strings.js widgets/EagleEye/nls/zh-cn/strings.js widgets/HeatMap/Widget.html widgets/HeatMap/Widget.js widgets/HeatMap/css/style.css widgets/HeatMap/images/icon.png widgets/HeatMap/manifest.json widgets/HeatMap/nls/es/strings.js widgets/HeatMap/nls/strings.js widgets/HeatMap/nls/zh-cn/strings.js widgets/HeatMap/widget.css widgets/HelpButton/Widget.js widgets/HelpButton/css/style.css widgets/HelpButton/images/icon.png widgets/HelpButton/manifest.json widgets/HelpButton/nls/es/strings.js widgets/HelpButton/nls/strings.js widgets/HelpButton/nls/zh-cn/strings.js widgets/HomeButton/Widget.js widgets/HomeButton/css/style.css widgets/HomeButton/images/icon.png widgets/HomeButton/manifest.json widgets/HomeButton/nls/es/strings.js widgets/HomeButton/nls/strings.js widgets/HomeButton/nls/zh-cn/strings.js widgets/HomePage/Widget.html widgets/HomePage/Widget.js widgets/HomePage/css/style.css widgets/HomePage/manifest.json widgets/HomePage/nls/es/strings.js widgets/HomePage/nls/strings.js widgets/HomePage/nls/zh-cn/strings.js widgets/HydroNetWorkDetails/Widget.html widgets/HydroNetWorkDetails/Widget.js widgets/HydroNetWorkDetails/css/style.css widgets/HydroNetWorkDetails/manifest.json widgets/HydroNetWorkDetails/nls/es/strings.js widgets/HydroNetWorkDetails/nls/strings.js widgets/HydroNetWorkDetails/nls/zh-cn/strings.js widgets/HydrologicalNetwork/CommonPointLayer3D.js widgets/HydrologicalNetwork/GeologicalDisasterPanel.html widgets/HydrologicalNetwork/GeologicalDisasterPanel.js widgets/HydrologicalNetwork/Widget.html widgets/HydrologicalNetwork/Widget.js widgets/HydrologicalNetwork/Widget1.js widgets/HydrologicalNetwork/css/style.css widgets/HydrologicalNetwork/datas.json widgets/HydrologicalNetwork/images/icon.png widgets/HydrologicalNetwork/manifest.json widgets/HydrologicalNetwork/nls/es/strings.js widgets/HydrologicalNetwork/nls/strings.js widgets/HydrologicalNetwork/nls/zh-cn/strings.js widgets/HydrologicalNetwork/popup/css/style.css widgets/HydrologicalNetwork/popup/img/close.png widgets/HydrologicalNetwork/popup/img/data.png widgets/HydrologicalNetwork/popup/img/rote.jpg widgets/HydrologicalNetwork/popup/img/sel.png widgets/HydrologicalNetwork/popup/js/end.js widgets/HydrologicalNetwork/popup/js/rain.js widgets/HydrologicalNetwork/popup/js/river.js widgets/HydrologicalNetwork/popup/js/start.js widgets/HydrologicalNetwork/popup/js/weather.js widgets/HydrologicalNetwork/popup/rain.html widgets/HydrologicalNetwork/popup/river.html widgets/HydrologicalNetwork/popup/weather.html widgets/HydrologicalNetwork/riverInformation.json widgets/ModelAdd/Widget.html widgets/ModelAdd/Widget.js widgets/ModelAdd/css/style.css widgets/ModelAdd/images/icon.png widgets/ModelAdd/manifest.json widgets/ModelAdd/models/shafa/images/0_3d66Model-664501-files-1.png widgets/ModelAdd/models/shafa/images/1_3d66Model-664501-files-2.png widgets/ModelAdd/models/shafa/images/3d66Model-664501-files-1.png widgets/ModelAdd/models/shafa/images/3d66Model-664501-files-2.png widgets/ModelAdd/models/shafa/shafa.gltf widgets/ModelAdd/models/shafa2/images/0_3d66Model-664501-files-1.png widgets/ModelAdd/models/shafa2/images/1_3d66Model-664501-files-2.png widgets/ModelAdd/models/shafa2/images/3d66Model-664501-files-1.png widgets/ModelAdd/models/shafa2/images/3d66Model-664501-files-2.png widgets/ModelAdd/models/shafa2/shafa.gltf widgets/ModelAdd/nls/es/strings.js widgets/ModelAdd/nls/strings.js widgets/ModelAdd/nls/zh-cn/strings.js widgets/PanoramaView/CommonPointLayer3D.js widgets/PanoramaView/GeologicalDisasterPanel.html widgets/PanoramaView/GeologicalDisasterPanel.js widgets/PanoramaView/Widget.html widgets/PanoramaView/Widget.js widgets/PanoramaView/css/style.css widgets/PanoramaView/datas.json widgets/PanoramaView/images/icon.png widgets/PanoramaView/manifest.json widgets/PanoramaView/nls/es/strings.js widgets/PanoramaView/nls/strings.js widgets/PanoramaView/nls/zh-cn/strings.js widgets/Query/Widget.html widgets/Query/Widget.js widgets/Query/css/style.css widgets/Query/manifest.json widgets/Query/nls/es/strings.js widgets/Query/nls/strings.js widgets/Query/nls/zh-cn/strings.js widgets/SceneMode/Widget.js widgets/SceneMode/css/style.css widgets/SceneMode/images/icon.png widgets/SceneMode/manifest.json widgets/SceneMode/nls/es/strings.js widgets/SceneMode/nls/strings.js widgets/SceneMode/nls/zh-cn/strings.js widgets/SubmergenceAnalysis/Widget.html widgets/SubmergenceAnalysis/Widget.js widgets/SubmergenceAnalysis/css/style.css widgets/SubmergenceAnalysis/images/tc-46.png widgets/SubmergenceAnalysis/images/tc-47.png widgets/SubmergenceAnalysis/images/tc-48.png widgets/SubmergenceAnalysis/images/tc-49.png widgets/SubmergenceAnalysis/images/tc-50.png widgets/SubmergenceAnalysis/images/water.jpg widgets/SubmergenceAnalysis/manifest.json widgets/SubmergenceAnalysis/nls/es/strings.js widgets/SubmergenceAnalysis/nls/strings.js widgets/SubmergenceAnalysis/nls/zh-cn/strings.js