diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..fdba1a1 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,98 @@ +{ + // JSHint Configuration, esri jsapi + // Modified from [jshint web defaults][1]. + // Differences between the default and our file are noted + // Options that are commented out completely are uneccesary or problematic for our codebase + // [1] : https://github.com/jshint/jshint/blob/2.x/examples/.jshintrc + // See http://jshint.com/docs/ for more details + + "maxerr" : 5000, // {int} Maximum error before stopping ** Get ALL the errors ** + + // Enforcing - true = enforce this rule, false = don't enforce this rule + "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) + "camelcase" : false, // true: Identifiers must be in camelCase + "curly" : true, // true: Require {} for every new block or scope + "eqeqeq" : false, // true: Require triple equals (===) for comparison ** Just use triples with undefined, null, false, 0 and 1 ** + "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() ** Still needed until IE8 support is dropped ** + "immed" : true, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` ** Avoids confusion and minification errors ** + "latedef" : false, // true: Require variables/functions to be defined before being used + "newcap" : true, // true: Require capitalization of all constructor functions e.g. `new F()` ** Coding style enforcement ** + "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` + "noempty" : true, // true: Prohibit use of empty blocks + "nonew" : true, // true: Prohibit use of constructors for side-effects (without assignment) ** Coding style enforcement ** + "plusplus" : false, // true: Prohibit use of `++` & `--` + "quotmark" : true, // Quotation mark consistency: ** Use the same style. Doubles should be used it most cases ** + // false : do nothing (default) + // true : ensure whatever is used is consistent + // "single" : require single quotes + // "double" : require double quotes + "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) + "unused" : "vars", // true: Require all defined variables be used + "strict" : false, // true: Requires all functions run in ES5 Strict Mode ** Dojo style and existing codebase conflicts ** + "trailing" : false, // true: Prohibit trailing whitespaces + //"indent" : 4, // {int} Number of spaces to use for indentation + //"maxparams" : false, // {int} Max number of formal params allowed per function + //"maxdepth" : false, // {int} Max depth of nested blocks (within functions) + //"maxstatements" : false, // {int} Max number statements per function + //"maxcomplexity" : false, // {int} Max cyclomatic complexity per function + //"maxlen" : false, // {int} Max number of characters per line + + // Relaxing - false = continue to enforce this rule, true = don't enforce this rule (relax it) + "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) + "boss" : false, // true: Tolerate assignments where comparisons would be expected + "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. + "eqnull" : true, // true: Tolerate use of `== null` + "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) + "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) + "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) + // (ex: `for each`, multiple try/catch, function expression…) + "evil" : false, // true: Tolerate use of `eval` and `new Function()` + "expr" : false, // true: Tolerate `ExpressionStatement` as Programs + "funcscope" : true, // true: Tolerate defining variables inside control statements ** Other variable checks keep use from abusing this ** + "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict') + "iterator" : false, // true: Tolerate using the `__iterator__` property + "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block + "laxbreak" : false, // true: Tolerate possibly unsafe line breakings + "laxcomma" : false, // true: Tolerate comma-first style coding + "loopfunc" : true, // true: Tolerate functions being defined in loops ** Almost required in some callback & promise style code ** + "multistr" : false, // true: Tolerate multi-line strings + "proto" : false, // true: Tolerate using the `__proto__` property + "scripturl" : true, // true: Tolerate script-targeted URLs ** If this is being used, there is probably a good reason ** + "smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment + "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` + "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation + "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` + "validthis" : true, // true: Tolerate using this in a non-constructor function ** We don't run in `strict mode` & coding style conflicts ** + + // Environments + "browser" : true, // Web Browser (window, document, etc) + "devel" : true, // Development/debugging (alert, confirm, etc) + "couch" : false, // CouchDB + "dojo" : false, // Dojo Toolkit ** Don't use global dojo objects. Use AMD style coding ** + "jquery" : false, // jQuery + "mootools" : false, // MooTools + "node" : false, // Node.js + "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) + "prototypejs" : false, // Prototype and Scriptaculous + "rhino" : false, // Rhino + "worker" : false, // Web Workers ** Make a jshint comment when this is `true` ** + "wsh" : false, // Windows Scripting Host + "yui" : false, // Yahoo User Interface + + // Legacy ** According to jshint docs, these options are NOT to be used or relied on. Removing them. + //"nomen" : false, // true: Prohibit dangling `_` in variables + //"onevar" : false, // true: Allow only one `var` statement per function + //"passfail" : false, // true: Stop on first error + //"white" : false, // true: Check against strict whitespace and indentation rules + + // Custom Globals - additional predefined global variables + // Using both `predef` and `globals` to support tools with older jshint parsers + "predef" : [ + "define", + "require" + ], + "globals" : { // ** `false` = don't allow variable to be redefined locally + "define": false, + "require": false + } +} diff --git a/lib/edit/attachmentsStore.js b/lib/edit/attachmentsStore.js index 6cf3fa7..8ac3f1f 100644 --- a/lib/edit/attachmentsStore.js +++ b/lib/edit/attachmentsStore.js @@ -1,7 +1,7 @@ -"use strict"; - +/*global IDBKeyRange,indexedDB */ define([], function() { + "use strict"; var AttachmentsStore = function() { this._db = null; @@ -322,7 +322,7 @@ define([], function() this._createLocalURL = function(attachmentFile) { - return window.URL.createObjectURL(attachmentFile) + return window.URL.createObjectURL(attachmentFile); }; this._revokeLocalURL = function(attachment) diff --git a/lib/edit/editsStore.js b/lib/edit/editsStore.js index f8d78d8..73db4b2 100644 --- a/lib/edit/editsStore.js +++ b/lib/edit/editsStore.js @@ -1,7 +1,6 @@ -"use strict"; - define(["esri/graphic"], function(Graphic) { + "use strict"; /* private consts */ var EDITS_QUEUE_KEY = "esriEditsQueue"; var SEPARATOR = "|@|"; @@ -24,15 +23,15 @@ define(["esri/graphic"], function(Graphic) isSupported: function() { // http://stackoverflow.com/questions/11214404/how-to-detect-if-browser-supports-html5-local-storage - var mod = 'esriLocalStorageTest'; + var mod = "esriLocalStorageTest"; try { window.localStorage.setItem(mod, mod); window.localStorage.removeItem(mod); return true; } catch(e) { return false; - } - }, + } + }, pushEdit: function(operation,layer,graphic) { diff --git a/lib/edit/offlineFeaturesManager.js b/lib/edit/offlineFeaturesManager.js index 61f90c7..181443a 100644 --- a/lib/edit/offlineFeaturesManager.js +++ b/lib/edit/offlineFeaturesManager.js @@ -1,4 +1,3 @@ -"use strict"; define([ "edit/editsStore", @@ -12,7 +11,7 @@ define([ "dojo/dom-attr", "dojo/dom-style", "dojo/query", - + "esri/config", "esri/layers/GraphicsLayer", "esri/graphic", "esri/symbols/SimpleMarkerSymbol", @@ -21,24 +20,25 @@ define([ "esri/urlUtils"], function(editsStore, AttachmentsStore, Evented,Deferred,all,declare,array,domAttr,domStyle,query, - GraphicsLayer,Graphic,SimpleMarkerSymbol,SimpleLineSymbol,SimpleFillSymbol,urlUtils) + esriConfig,GraphicsLayer,Graphic,SimpleMarkerSymbol,SimpleLineSymbol,SimpleFillSymbol,urlUtils) { + "use strict"; return declare([Evented], { _onlineStatus: "online", _featureLayers: {}, ONLINE: "online", // all edits will directly go to the server - OFFLINE: "offline", // edits will be enqueued - RECONNECTING: "reconnecting", // sending stored edits to the server + OFFLINE: "offline", // edits will be enqueued + RECONNECTING: "reconnecting", // sending stored edits to the server // manager emits event when... events: { - EDITS_SENT: 'edits-sent', // ...whenever any edit is actually sent to the server - EDITS_ENQUEUED: 'edits-enqueued', // ...when an edit is enqueued (and not sent to the server) - ALL_EDITS_SENT: 'all-edits-sent', // ...after going online and there are no pending edits in the queue - ATTACHMENT_ENQUEUED: 'attachment-enqueued', - ATTACHMENTS_SENT: 'attachments-sent' + EDITS_SENT: "edits-sent", // ...whenever any edit is actually sent to the server + EDITS_ENQUEUED: "edits-enqueued", // ...when an edit is enqueued (and not sent to the server) + ALL_EDITS_SENT: "all-edits-sent", // ...after going online and there are no pending edits in the queue + ATTACHMENT_ENQUEUED: "attachment-enqueued", + ATTACHMENTS_SENT: "attachments-sent" }, /** @@ -101,7 +101,7 @@ define([ } return true; } - alert('The File APIs are not fully supported in this browser.'); + alert("The File APIs are not fully supported in this browser."); return false; }, @@ -487,7 +487,7 @@ define([ */ goOffline: function() { - console.log('going offline'); + console.log("going offline"); this._onlineStatus = this.OFFLINE; }, @@ -498,7 +498,7 @@ define([ */ goOnline: function(callback) { - console.log('going online'); + console.log("going online"); this._onlineStatus = this.RECONNECTING; this._replayStoredEdits(function(success,responses) { @@ -540,7 +540,7 @@ define([ var layer = this._featureLayers[ edit.layer ]; var graphic = editsStore._deserialize(edit.graphic); var readableGraphic = graphic.geometry.type; - var layerId = edit.layer.substring(edit.layer.lastIndexOf('/')+1); + var layerId = edit.layer.substring(edit.layer.lastIndexOf("/")+1); if(layer) { readableGraphic += " [id=" + graphic.attributes[layer.objectIdField] + "]"; @@ -563,55 +563,55 @@ define([ var color = [0,255,0,255]; var width = 1.5; - this._phantomSymbols['point'] = []; - this._phantomSymbols['point'][editsStore.ADD] = new SimpleMarkerSymbol({ + this._phantomSymbols.point = []; + this._phantomSymbols.point[editsStore.ADD] = new SimpleMarkerSymbol({ "type": "esriSMS", "style": "esriSMSCross", "xoffset": 10, "yoffset": 10, "color": [255,255,255,0], "size": 15, "outline": { "color": color, "width": width, "type": "esriSLS", "style": "esriSLSSolid" } }); - this._phantomSymbols['point'][editsStore.UPDATE] = new SimpleMarkerSymbol({ + this._phantomSymbols.point[editsStore.UPDATE] = new SimpleMarkerSymbol({ "type": "esriSMS", "style": "esriSMSCircle", "xoffset": 0, "yoffset": 0, "color": [255,255,255,0], "size": 15, "outline": { "color": color, "width": width, "type": "esriSLS", "style": "esriSLSSolid" } }); - this._phantomSymbols['point'][editsStore.DELETE] = new SimpleMarkerSymbol({ + this._phantomSymbols.point[editsStore.DELETE] = new SimpleMarkerSymbol({ "type": "esriSMS", "style": "esriSMSX", "xoffset": 0, "yoffset": 0, "color": [255,255,255,0], "size": 15, "outline": { "color": color, "width": width, "type": "esriSLS", "style": "esriSLSSolid" } }); - this._phantomSymbols['multipoint'] = null; + this._phantomSymbols.multipoint = null; - this._phantomSymbols['polyline'] = []; - this._phantomSymbols['polyline'][editsStore.ADD] = new SimpleLineSymbol({ + this._phantomSymbols.polyline = []; + this._phantomSymbols.polyline[editsStore.ADD] = new SimpleLineSymbol({ "type": "esriSLS", "style": "esriSLSSolid", "color": color,"width": width }); - this._phantomSymbols['polyline'][editsStore.UPDATE] = new SimpleLineSymbol({ + this._phantomSymbols.polyline[editsStore.UPDATE] = new SimpleLineSymbol({ "type": "esriSLS", "style": "esriSLSSolid", "color": color,"width": width }); - this._phantomSymbols['polyline'][editsStore.DELETE] = new SimpleLineSymbol({ + this._phantomSymbols.polyline[editsStore.DELETE] = new SimpleLineSymbol({ "type": "esriSLS", "style": "esriSLSSolid", "color": color,"width": width }); - this._phantomSymbols['polygon'] = []; - this._phantomSymbols['polygon'][editsStore.ADD] = new SimpleFillSymbol({ + this._phantomSymbols.polygon = []; + this._phantomSymbols.polygon[editsStore.ADD] = new SimpleFillSymbol({ "type": "esriSFS", "style": "esriSFSSolid", "color": [255,255,255,0], "outline": { "type": "esriSLS", "style": "esriSLSSolid", "color": color, "width": width } }); - this._phantomSymbols['polygon'][editsStore.UPDATE] = new SimpleFillSymbol({ + this._phantomSymbols.polygon[editsStore.UPDATE] = new SimpleFillSymbol({ "type": "esriSFS", "style": "esriSFSSolid", "color": [255,255,255,0], "outline": { "type": "esriSLS", "style": "esriSLSDash", "color": color, "width": width } }); - this._phantomSymbols['polygon'][editsStore.DELETE] = new SimpleFillSymbol({ + this._phantomSymbols.polygon[editsStore.DELETE] = new SimpleFillSymbol({ "type": "esriSFS", "style": "esriSFSSolid", "color": [255,255,255,0], @@ -664,8 +664,9 @@ define([ dfd.reject(err); }; var proxy = esriConfig.defaults.io.proxyUrl || ""; - if(proxy !== "") - proxy += "?" + if(proxy !== ""){ + proxy += "?"; + } console.log("proxy:", proxy); oAjaxReq.open("post", proxy + attachment.featureId + "/addAttachment", true); var sBoundary = "---------------------------" + Date.now().toString(16); @@ -777,7 +778,6 @@ define([ case editsStore.ADD: /* impossible!! */ throw("can't add the same feature twice!"); - break; case editsStore.UPDATE: layerEdits[ objectId ].graphic = edit.graphic; break; diff --git a/lib/tiles/TilesStore.js b/lib/tiles/TilesStore.js index 29ac9bf..7956337 100644 --- a/lib/tiles/TilesStore.js +++ b/lib/tiles/TilesStore.js @@ -1,5 +1,5 @@ -"use strict"; +/*global indexedDB */ /** * Library for handling the storing of map tiles in IndexedDB. * @@ -8,6 +8,7 @@ */ define([],function() { + "use strict"; var TilesStore = function() { /** diff --git a/lib/tiles/base64utils.js b/lib/tiles/base64utils.js index 9b1a6e4..60658dc 100644 --- a/lib/tiles/base64utils.js +++ b/lib/tiles/base64utils.js @@ -1,7 +1,6 @@ -"use strict"; - define([],function() { + "use strict"; var Base64Utils={}; Base64Utils.outputTypes={ // summary: @@ -43,7 +42,7 @@ define([],function() s.push(String.fromCharCode((wa[i>>5]>>>(i%32))&mask)); } return s.join(""); // string - } + }; Base64Utils.wordToHex=function(/* word[] */wa){ // summary: // convert an array of words to a hex tab @@ -52,7 +51,7 @@ define([],function() s.push(h.charAt((wa[i>>2]>>((i%4)*8+4))&0xF)+h.charAt((wa[i>>2]>>((i%4)*8))&0xF)); } return s.join(""); // string - } + }; Base64Utils.wordToBase64=function(/* word[] */wa){ // summary: // convert an array of words to base64 encoding, should be more efficient diff --git a/lib/tiles/offlineTilesEnabler.js b/lib/tiles/offlineTilesEnabler.js index ef75ec8..33e2385 100644 --- a/lib/tiles/offlineTilesEnabler.js +++ b/lib/tiles/offlineTilesEnabler.js @@ -1,5 +1,3 @@ -"use strict"; - define([ "dojo/query", "dojo/request", @@ -11,6 +9,7 @@ define([ "tiles/FileSaver" ], function(query, request, declare, geometry,Base64Utils,TilesStore,TilingScheme,FileSaver) { + "use strict"; return declare([],{ /** * Utility method to get the basemap layer reference @@ -83,7 +82,7 @@ define([ return url; } - url = url.split('?')[0]; + url = url.split("?")[0]; /* temporary URL returned immediately, as we haven't retrieved the image from the indexeddb yet */ var tileid = "void:/"+level+"/"+row+"/"+col; @@ -334,7 +333,7 @@ define([ for(i=1; i