WME Form Filler

Use info from WME to automatically fill out related forms

当前为 2016-10-31 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name WME Form Filler
  3. // @description Use info from WME to automatically fill out related forms
  4. // @namespace https://greasyfork.org/users/6605
  5. // @version 1.3.3
  6. // @match https://www.waze.com/*editor/*
  7. // @match https://beta.waze.com/*editor/*
  8. // @exclude https://www.waze.com/*user/editor/*
  9. // @author crazycaveman
  10. // @license MIT
  11. // @run-at document-end
  12. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NUIzRDdFNzAwRTlGMTFFNkIyRDZGMzNERUFDMUM1NDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NUIzRDdFNzEwRTlGMTFFNkIyRDZGMzNERUFDMUM1NDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1QjNEN0U2RTBFOUYxMUU2QjJENkYzM0RFQUMxQzU0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1QjNEN0U2RjBFOUYxMUU2QjJENkYzM0RFQUMxQzU0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtdrqLIAAAOCSURBVHjatJdLaBNBGMdn81ITQ2mLNqlIKInGkpSgFooPpKGHIlZPJqgoIvQivooPfFUsxYNVW62KiuItPah48RaUSlFEaDzEqgeV+sBUxag1rZa8Nv6nfMKaZpNssx34kdnN7sx/5nvNCtFolAUCAW8ymdwtCIKZMZZh6jQBjIIL4EkikWA+n485HI7/HtLFYjHH0NDQnXQ6XQkBbAbaGrAsHo+PNDc3T/lTF4lEVouiWKnX62O4DgBRpYn1YBuoAkuxwBGNRjNVAP7QZjKTu/4V7FJ59euAEWjlHtBg2//ZXEOq1WpzaUyWz690Ms5jUDhZcrqm0+UYyAPuKxyH2zqohgC++j/gmcJxRot5yGAwFBTAr9+AtWrHIqKMBYNBFgqFmlKpVLympuax1+udIiBD9reUON/nLMcTtFotC4fDBoR8H5JSVV1dXVdjY+OxbAEpUA8GSxRQC95KrkUe6jABzwnbkQ/OmUwmPSJQzBbAw+YL6C5hcr7y72TO2TTeI9AA7oErELNBp9NF5HzgEziogtnNZM6j4BfoAfNBB0XZu1wCuAkWggMKJ7sBXmbd4xmwH1wHW8FKut/Hi5NcFIiUu/cpFNCfQ0ACHKGdOM0LHbx/DE54HJWX92XDMEy7oKRFc9z7SXSBBZiYWSyWs0aj8QMvzVarVTYRJckP1GhLwN7J7Ugkhv1+f4/H48mbiPi+LOKeWmIUtIKP4AxFAiNn/F0oE/KX5wB3iQLSoAmsp3sPwW0q+3kF8HL8HFgVTqrJqvn8upf6XMyhYotRhsKnVqEAXj9ikuv9wEX9m/mKWy4fWA6eKhSwEdylfjVop/4PcEJJOebbOAz2KDgdC1kr7ATl1O+gUFwMXhcjgNvuG7g8TQdcAXZQ/xW4RLvxXk6ARmagBhqoTHJvFdhCUSLX2iVjttH7h8GEEh9wggEwiw4mfirRA2Sia2CnzHjV9HuLCs5FOpwmlERBGU3Om41+50nCzJ4nFCM0eTftlI/XAJ778WHCeDou5kg2SNtXLzkXPAAnKbWeymOCzWCM+nwRGT55S0sLs9lszG635xQgSCphivq9OU7LnQUcUJRMzts4T0JozOl0Ci6Xq6AJ+GHhPGUuNRo/jJRTGZbPAyiLIZzRJrBVZXi4bQY+TsfNZvMLWQEVFRVht9u9CQJaIcCk8uf5GArQVRxAh+Ue+ivAAAY7DIf3WTuXAAAAAElFTkSuQmCC
  13. // @grant none
  14. // ==/UserScript==
  15.  
  16. /*****************
  17. To-Do:
  18. *Allow manual user entries
  19. ******************/
  20.  
  21. var WMEFFName = GM_info.script.name;
  22. var WMEFFVersion = GM_info.script.version;
  23. var WMEFFIcon = GM_info.script.icon;
  24. var forms = {};
  25.  
  26. function formfiller_bootstrap()
  27. {
  28. formfiller_log("Running bootstrap");
  29. /*var bGreasemonkeyServiceDefined = false;
  30. try
  31. {
  32. if ("object" === typeof Components.interfaces.gmIGreasemonkeyService)
  33. {
  34. bGreasemonkeyServiceDefined = true;
  35. }
  36. }
  37. catch (err)
  38. {
  39. //Ignore
  40. }
  41. if ("undefined" === typeof unsafeWindow || ! bGreasemonkeyServiceDefined)
  42. {
  43. unsafeWindow = ( function ()
  44. {
  45. var dummyElem = document.createElement('p');
  46. dummyElem.setAttribute('onClick','return window;');
  47. return dummyElem.onclick ();
  48. } )();
  49. }*/
  50.  
  51. if (typeof Waze.app === 'undefined' || !window.Waze.map)
  52. {
  53. setTimeout(formfiller_bootstrap,500);
  54. return;
  55. }
  56. formfiller_log("Starting init");
  57. formfiller_init();
  58. }
  59.  
  60. function formfiller_init()
  61. {
  62. // Check document elements are ready
  63. var userInfo = document.getElementById("user-info");
  64. if (userInfo === null)
  65. {
  66. window.setTimeout(formfiller_init,500);
  67. return;
  68. }
  69. var userTabs = document.getElementById("user-tabs");
  70. if (userTabs === null)
  71. {
  72. window.setTimeout(formfiller_init,500);
  73. return;
  74. }
  75. var navTab = userInfo.getElementsByTagName("ul");
  76. if (navTab.length === 0)
  77. {
  78. window.setTimeout(formfiller_init,500);
  79. return;
  80. }
  81. if (typeof navTab[0] === "undefined")
  82. {
  83. window.setTimeout(formfiller_init,500);
  84. return;
  85. }
  86. var tabContent = userInfo.getElementsByTagName("div");
  87. if (tabContent.length === 0)
  88. {
  89. window.setTimeout(formfiller_init,500);
  90. return;
  91. }
  92. if (typeof tabContent[0] === "undefined")
  93. {
  94. window.setTimeout(formfiller_init,500);
  95. return;
  96. }
  97.  
  98. ff_addUserTab();
  99. ff_addFormBtn();
  100. var formFillerObserver = new MutationObserver(function(mutations) {
  101. mutations.forEach(function(mutation) {
  102. // Mutation is a NodeList and doesn't support forEach like an array
  103. for (var i = 0; i < mutation.addedNodes.length; i++) {
  104. var addedNode = mutation.addedNodes[i];
  105.  
  106. // Only fire up if it's a node
  107. if (addedNode.nodeType === Node.ELEMENT_NODE) {
  108. var selectionDiv = addedNode.querySelector('div.selection');
  109.  
  110. if (selectionDiv) {
  111. ff_addFormBtn();
  112. }
  113. }
  114. }
  115. });
  116. });
  117. formFillerObserver.observe(document.getElementById("edit-panel"), { childList: true, subtree: true });
  118. //Waze.selectionManager.events.register("selectionchanged", null, ff_addFormBtn);
  119. if (Waze.app.modeController) {
  120. Waze.app.modeController.model.bind('change:mode', function(model, modeId) {
  121. if (modeId == 0) {
  122. ff_addUserTab();
  123. }
  124. });
  125. }
  126. formfiller_log("Init done");
  127. return;
  128. }
  129.  
  130. //Shamelessly copied from https://gist.github.com/CalebGrove/c285a9510948b633aa47
  131. function abbrState(input, to)
  132. {
  133. var states = [
  134. ['Arizona', 'AZ'],
  135. ['Alabama', 'AL'],
  136. ['Alaska', 'AK'],
  137. ['Arizona', 'AZ'],
  138. ['Arkansas', 'AR'],
  139. ['California', 'CA'],
  140. ['Colorado', 'CO'],
  141. ['Connecticut', 'CT'],
  142. ['Delaware', 'DE'],
  143. ['Florida', 'FL'],
  144. ['Georgia', 'GA'],
  145. ['Hawaii', 'HI'],
  146. ['Idaho', 'ID'],
  147. ['Illinois', 'IL'],
  148. ['Indiana', 'IN'],
  149. ['Iowa', 'IA'],
  150. ['Kansas', 'KS'],
  151. ['Kentucky', 'KY'],
  152. ['Kentucky', 'KY'],
  153. ['Louisiana', 'LA'],
  154. ['Maine', 'ME'],
  155. ['Maryland', 'MD'],
  156. ['Massachusetts', 'MA'],
  157. ['Michigan', 'MI'],
  158. ['Minnesota', 'MN'],
  159. ['Mississippi', 'MS'],
  160. ['Missouri', 'MO'],
  161. ['Montana', 'MT'],
  162. ['Nebraska', 'NE'],
  163. ['Nevada', 'NV'],
  164. ['New Hampshire', 'NH'],
  165. ['New Jersey', 'NJ'],
  166. ['New Mexico', 'NM'],
  167. ['New York', 'NY'],
  168. ['North Carolina', 'NC'],
  169. ['North Dakota', 'ND'],
  170. ['Ohio', 'OH'],
  171. ['Oklahoma', 'OK'],
  172. ['Oregon', 'OR'],
  173. ['Pennsylvania', 'PA'],
  174. ['Rhode Island', 'RI'],
  175. ['South Carolina', 'SC'],
  176. ['South Dakota', 'SD'],
  177. ['Tennessee', 'TN'],
  178. ['Texas', 'TX'],
  179. ['Utah', 'UT'],
  180. ['Vermont', 'VT'],
  181. ['Virginia', 'VA'],
  182. ['Washington', 'WA'],
  183. ['West Virginia', 'WV'],
  184. ['Wisconsin', 'WI'],
  185. ['Wyoming', 'WY'],
  186. ];
  187.  
  188. if (to == 'abbr'){
  189. input = input.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
  190. for(i = 0; i < states.length; i++){
  191. if(states[i][0] == input){
  192. return(states[i][1]);
  193. }
  194. }
  195. } else if (to == 'name'){
  196. input = input.toUpperCase();
  197. for(i = 0; i < states.length; i++){
  198. if(states[i][1] == input){
  199. return(states[i][0]);
  200. }
  201. }
  202. }
  203. }
  204.  
  205. function formfiller_log(message)
  206. {
  207. if (typeof message === 'string')
  208. console.log('FormFiller: ' + message);
  209. else
  210. console.log('FormFiller: ', message);
  211. }
  212.  
  213. function ff_getStreetName(sel)
  214. {
  215. var streetName = "";
  216.  
  217. for (i=0; i<sel.length; i++)
  218. {
  219. var newStreet = Waze.model.streets.get(sel[i].model.attributes.primaryStreetID);
  220. if (typeof newStreet === "undefined" || newStreet.name === null)
  221. newStreet = "No Name";
  222. if (streetName === "")
  223. streetName = newStreet.name;
  224. else if (streetName != newStreet.name)
  225. streetName += ", "+newStreet.name;
  226. }
  227. return streetName;
  228. }
  229.  
  230. function ff_getState(sel)
  231. {
  232. var stateName = "";
  233.  
  234. for (i=0; i<sel.length; i++)
  235. {
  236. var cID = Waze.model.streets.get(sel[i].model.attributes.primaryStreetID).cityID;
  237. var sID = Waze.model.cities.get(cID).attributes.stateID;
  238. var newState = Waze.model.states.get(sID).name;
  239. if (stateName === "")
  240. stateName = newState;
  241. else if (stateName != newState)
  242. {
  243. stateName = "";
  244. break;
  245. }
  246. }
  247. return stateName;
  248. }
  249.  
  250. function ff_getCity(sel)
  251. {
  252. var cityName = "";
  253. for (i=0; i<sel.length; i++)
  254. {
  255. var cID = Waze.model.streets.get(sel[i].model.attributes.primaryStreetID).cityID;
  256. var newCity = Waze.model.cities.get(cID).attributes.name;
  257. if (cityName === "")
  258. cityName = newCity;
  259. else if (cityName != newCity)
  260. {
  261. cityName = "";
  262. break;
  263. }
  264. }
  265. return cityName;
  266. }
  267.  
  268. function ff_getCounty(sel)
  269. {
  270. var county = "";
  271. var center = Waze.map.center.clone().transform(Waze.map.projection.projCode,Waze.map.displayProjection.projCode);
  272. //formfiller_log("Getting county for "+center.lat.toString()+","+center.lon.toString());
  273. var xhr = new XMLHttpRequest();
  274. xhr.open("GET",'https://maps.googleapis.com/maps/api/geocode/json?latlng='+center.lat+','+center.lon,false);
  275. xhr.onload = function () {
  276. if (xhr.readyState === 4) {
  277. if (xhr.status === 200) {
  278. var response = JSON.parse(xhr.responseText);
  279. var addrComps = response.results[0].address_components;
  280. for (comp = 0; comp < addrComps.length; comp++)
  281. {
  282. if (addrComps[comp].types.indexOf("administrative_area_level_2") !== -1)
  283. {
  284. county = addrComps[comp].long_name;
  285. //formfiller_log("ff_getCounty: "+county);
  286. var countyIndex = (county.indexOf(" County") !== -1 ? county.indexOf(" County") : county.indexOf(" Parish"));
  287. if (countyIndex !== -1)
  288. county = county.slice(0,countyIndex);
  289. break;
  290. }
  291. }
  292. }
  293. }
  294. };
  295. xhr.send(null);
  296. return county;
  297.  
  298. //Async call. Figure this out!
  299. /*return $.getJSON('https://maps.googleapis.com/maps/api/geocode/json?latlng='+center.lat+','+center.lon, function(data) {
  300. if (data.status === "OK")
  301. {
  302. var addrComps = data.results[0].address_components;
  303. for (comp = 0; comp < addrComps.length; comp++)
  304. {
  305. if (addrComps[comp].types.indexOf("administrative_area_level_2") !== -1)
  306. {
  307. county = addrComps[comp].long_name;
  308. county = county.slice(0,county.indexOf(" County"));
  309. formfiller_log("JSON func "+county);
  310. break;
  311. }
  312. }
  313. }
  314. if (county === "")
  315. county = "Not found";
  316. formfiller_log("Got county");
  317. formfiller_log(county);
  318. return county;
  319. });*/
  320. }
  321.  
  322. function ff_closureActive(sel)
  323. {
  324. for (i=0; i<sel.length; i++)
  325. {
  326. if (sel[i].model.hasClosures())
  327. if (Waze.model.roadClosures.getByAttributes({segID: sel[i].model.attributes.id})[0].active)
  328. return true;
  329. }
  330. return false;
  331. }
  332.  
  333. function ff_getClosureInfo(seg)
  334. {
  335. var closureInfo = {
  336. direction: "",
  337. endDate: "",
  338. idFwd: "",
  339. idRev: "",
  340. reason: ""
  341. };
  342. var segID = seg.model.attributes.id;
  343. var closureList = Waze.model.roadClosures.getByAttributes({segID: segID,active: true});
  344. /*if (closureList.length > 2)
  345. return closureList;
  346. if (closureList.length == 2 && closureList[0].forward != closureList[1].forward)
  347. closureInfo.direction = "Two-Way";
  348. else
  349. closureInfo.direction = "One-Way";*/
  350.  
  351. for (i=0; i<closureList.length; i++)
  352. {
  353. if (closureList[i].active === true)
  354. {
  355. if (closureInfo.endDate === "")
  356. {
  357. closureInfo.endDate = closureList[i].endDate;
  358. }
  359. else if (closureInfo.endDate > closureList[i].endDate)
  360. {
  361. closureInfo.endDate = closureList[i].endDate;
  362. }
  363. if (closureList[i].forward === true)
  364. {
  365. closureInfo.idFwd = closureList[i].id;
  366. }
  367. else
  368. {
  369. closureInfo.idRev = closureList[i].id;
  370. }
  371. if (closureInfo.reason === "")
  372. {
  373. closureInfo.reason = closureList[i].reason;
  374. }
  375. }
  376. }
  377.  
  378. if (closureInfo.idFwd !== "" && closureInfo.idRev !== "")
  379. closureInfo.direction = "Two-Way";
  380. else
  381. closureInfo.direction = "One-Way";
  382.  
  383. return closureInfo;
  384. }
  385.  
  386. function ff_createPermalink(selection)
  387. {
  388. //https://www.waze.com/editor/?env=usa&lon=-79.79248&lat=32.86150&layers=12709&zoom=5&mode=0&mapProblemFilter=1&mapUpdateRequestFilter=0&venueFilter=0&segments=504534141
  389. //https://www.waze.com/editor/?env=usa&lon=-79.79248&lat=32.86150&layers=12709&zoom=5&mode=0&mapProblemFilter=1&mapUpdateRequestFilter=0&venueFilter=0&venues=183632201.1836387542.3102948
  390. var permalink = "https://www.waze.com/editor/?", segIDs = [];
  391. var latLon = Waze.map.center.clone().transform(Waze.map.projection.projCode,Waze.map.displayProjection.projCode);
  392. var lat = latLon.lat, lon = latLon.lon;
  393. var env = Waze.location.code;
  394. var type = "segments";
  395. var zoom = Waze.map.zoom;
  396.  
  397. /*if (zoom == 3)
  398. alert('Current zoom level (3) will not select street segments! If your selection includes street segments, please increase the zoom level');
  399. else if (zoom == 2)
  400. alert ('Current zoom level (2) will only select PS+ segments! If you have any other segment type selected, please increase the zoom level');
  401. else if (zoom <= 1)
  402. {
  403. alert ('Current zoom level ('+ zoom.toString() +') will not select any segments! Increase the zoom level before submitting!');
  404. return;
  405. }*/
  406.  
  407. //To get lat and long centered on segment
  408. if (selection.length == 1)
  409. {
  410. latLon = selection[0].model.getCenter().clone();
  411. latLon.transform(Waze.map.projection.projCode,Waze.map.displayProjection.projCode);
  412. lat = latLon.y;
  413. lon = latLon.x;
  414. }
  415.  
  416. var maxzoom = 2,
  417. zoomToRoadType = Waze.Config.segments.zoomToRoadType;
  418. for (i=0; i<selection.length; i++)
  419. {
  420. var segment = selection[i].model;
  421. if (segment.type != "segment")
  422. continue;
  423. segIDs.push(segment.attributes.id);
  424. if (zoomToRoadType[zoom] !== -1 && zoomToRoadType[zoom].indexOf(segment.attributes.roadType) === -1)
  425. {
  426. alert("This zoom level ("+ zoom.toString() +") cannot be used for this road type! Please increase your zoom:\n"+
  427. "Streets: 4+\nOther drivable and Non-drivable: 3+\nHighways and PS: 2+");
  428. formfiller_log("Zoom level not correct for segment: "+ zoom.toString() +" "+ segment.attributes.roadType.toString());
  429. return;
  430. }
  431. }
  432. permalink += "env="+env+"&lon="+lon+"&lat="+lat+"&zoom="+zoom.toString()+"&"+type+"="+segIDs.join();
  433. return permalink;
  434. }
  435.  
  436. function ff_createFormLink(formIndx)
  437. {
  438. var selection = Waze.selectionManager.selectedItems;
  439. var formInfo = {};
  440. var formDt = forms[formIndx];
  441. var formLink = formDt.url;
  442. if (selection.length === 0 || selection[0].model.type != "segment")
  443. {
  444. formfiller_log("No segments selected.");
  445. return;
  446. }
  447.  
  448. formInfo.username = encodeURIComponent(Waze.loginManager.user.userName);
  449. formInfo.streetname = encodeURIComponent(ff_getStreetName(selection));
  450. formInfo.permalink = encodeURIComponent(ff_createPermalink(selection));
  451. if (formInfo.permalink === "undefined")
  452. {
  453. formfiller_log("No permalink generated");
  454. return;
  455. }
  456. formInfo.county = ff_getCounty(selection);
  457.  
  458. formInfo.status = "REPORTED";
  459. formInfo.direction = "Two-Way";
  460. formInfo.reason = document.getElementById("ff-closure-reason").value;
  461. formInfo.endDate = document.getElementById("ff-closure-endDate").value +"+"+ document.getElementById("ff-closure-endTime").value;
  462. if (ff_closureActive(selection))
  463. {
  464. formInfo.status = "CLOSED";
  465. var closureInfo = ff_getClosureInfo(selection[0]);
  466. formInfo.direction = closureInfo.direction;
  467. formInfo.reason = encodeURIComponent(closureInfo.reason);
  468. formInfo.endDate = encodeURIComponent(closureInfo.endDate);
  469. }
  470. formInfo.notes = "Form+filled+by+"+WMEFFName+"+v"+WMEFFVersion;
  471.  
  472. //Need to do this part better, works for now
  473. formLink += "?entry."+formDt.username+"="+formInfo.username;
  474. formLink += "&entry."+formDt.streetname+"="+formInfo.streetname;
  475. formLink += "&entry."+formDt.permalink+"="+formInfo.permalink;
  476. if (formDt.hasOwnProperty('state'))
  477. {
  478. formInfo.state = abbrState(ff_getState(selection),"abbr"); //Abbreviation
  479. formLink += "&entry."+formDt.state+"="+formInfo.state;
  480. }
  481. if (formDt.hasOwnProperty('city'))
  482. {
  483. formInfo.city = encodeURIComponent(ff_getCity(selection));
  484. formLink += "&entry."+formDt.city+"="+formInfo.city;
  485. }
  486. formLink += "&entry."+formDt.county+"="+formInfo.county;
  487. formLink += "&entry."+formDt.status+"="+formInfo.status;
  488. formLink += "&entry."+formDt.direction+"="+formInfo.direction;
  489. formLink += "&entry."+formDt.reason+"="+formInfo.reason;
  490. formLink += "&entry."+formDt.endDate+"="+formInfo.endDate;
  491. formLink += "&entry."+formDt.notes+"="+formInfo.notes;
  492. formfiller_log(formLink);
  493. return formLink;
  494. }
  495.  
  496. function ff_addFormBtn()
  497. {
  498. var selection = Waze.selectionManager.selectedItems;
  499. if (selection.length === 0 || selection[0].model.type != "segment")
  500. {
  501. //formfiller_log("No segments selected.");
  502. return;
  503. }
  504. if (document.getElementById("formfillerDiv"))
  505. {
  506. //formfiller_log("Div already created");
  507. return;
  508. }
  509.  
  510. forms = [
  511. {
  512. //https://docs.google.com/forms/d/e/1FAIpQLScY_5WKyYTqvH1fdiBThqLO4DRIzFzgdBtBexw5-iKL_LOzBw/viewform?entry.1553765347=username&entry.1264424583=CLOSED&entry.1811077109=permalink&entry.792657790=Two-Way&entry.345142186=reason&entry.1102521735=2016-09-20+03:00&entry.2015424420=street+name&entry.1547375393=from+street&entry.1335391716=to+street&entry.1867193205=SC&entry.1714138473=county&entry.1803937317=source&entry.1648634142=notes
  513. name: 'USA Weather related closures',
  514. url: 'https://docs.google.com/forms/d/e/1FAIpQLScY_5WKyYTqvH1fdiBThqLO4DRIzFzgdBtBexw5-iKL_LOzBw/viewform',
  515. username: '1553765347',
  516. status: '1264424583',
  517. permalink: '1811077109',
  518. direction: '792657790',
  519. reason: '345142186',
  520. endDate: '1102521735',
  521. streetname: '2015424420',
  522. fromStreet: '1547375393',
  523. toStreet: '1335391716',
  524. state: '1867193205',
  525. county: '1714138473',
  526. source: '1803937317',
  527. notes: '1648634142',
  528. },
  529. {
  530. //https://docs.google.com/forms/d/e/1FAIpQLSff7nsBw8qxCojBdxrjTPl6tercqyyzGy92Vif_SBdHkYDchw/viewform?entry.1204781462=Reporter&entry.828228572=Reported&entry.1647952662=Street+name+&entry.1501712688=From+street+&entry.2094306654=To+street+&entry.1414240321=Two-Way&entry.900957975=10/27/2016+00:00&entry.1051351191=Adams&entry.1093044522=City+&entry.1540676081=IDOT&entry.430378754=Reason+&entry.1754051160=Permalink+&entry.172235277=Source+&entry.1722909714=Notes+
  531. name: 'Illinois event/weather closures',
  532. url: 'https://docs.google.com/forms/d/e/1FAIpQLSff7nsBw8qxCojBdxrjTPl6tercqyyzGy92Vif_SBdHkYDchw/viewform',
  533. username: '1204781462',
  534. status: '828228572',
  535. permalink: '1754051160',
  536. direction: '1414240321',
  537. reason: '430378754',
  538. endDate: '900957975',
  539. streetname: '1647952662',
  540. fromStreet: '1501712688',
  541. toStreet: '2094306654',
  542. //state: '0',
  543. county: '1051351191',
  544. city: '1093044522',
  545. source: '172235277',
  546. notes: '1722909714',
  547. },
  548. {
  549. //https://docs.google.com/forms/d/e/1FAIpQLSeRVbj9DNsbP4GOeYr_6_2KjgS2TGi3f_Z5d9FVX1MmqMrZDQ/viewform?entry.1553765347=username&entry.1264424583=REPORTED&entry.1811077109=permalink&entry.792657790=Two-Way&entry.345142186=reason&entry.1102521735=2016-09-12+19:15&entry.2015424420=streetname&entry.1547375393=closure_from&entry.1335391716=closure_to&entry.1867193205=SC&entry.1714138473=county&entry.1803937317=source&entry.1648634142=notes
  550. name: 'Testing form weather closures',
  551. url: 'https://docs.google.com/forms/d/e/1FAIpQLSeRVbj9DNsbP4GOeYr_6_2KjgS2TGi3f_Z5d9FVX1MmqMrZDQ/viewform',
  552. username: '1553765347',
  553. status: '1264424583',
  554. permalink: '1811077109',
  555. direction: '792657790',
  556. reason: '345142186',
  557. endDate: '1102521735',
  558. streetname: '2015424420',
  559. fromStreet: '1547375393',
  560. toStreet: '1335391716',
  561. state: '1867193205',
  562. county: '1714138473',
  563. source: '1803937317',
  564. notes: '1648634142',
  565. },
  566. /*{
  567. //https://docs.google.com/forms/d/1uXS-Z0-5aJbOrzcZtT8CM-qpUNMonU1iH9NWiPQ5w2o/viewform?entry.728513350=HavanaDay&entry.167700229=REPORTED&entry.1331253387=http://&entry.1363270254=Two-Way&entry.1681433373=Reason+Text&entry.12817715=2016-06-01+12:00&entry.1761873222=CLOSED+STREET+TEXT&entry.798060845=CLOSURE+FROM+TEXT&entry.1536374235=CLOSURE+TO+TEXT&entry.1030293134=NC&entry.1012282273=County+Text&entry.1223225270=Source+Text&entry.150335656=Notes+Text
  568. name: 'Old USA Weather related closures',
  569. url: 'https://docs.google.com/forms/d/1uXS-Z0-5aJbOrzcZtT8CM-qpUNMonU1iH9NWiPQ5w2o/viewform',
  570. username: '728513350',
  571. streetname: '1761873222',
  572. permalink: '1331253387',
  573. state: '1030293134',
  574. county: '1012282273',
  575. status: '167700229',
  576. direction: '1363270254',
  577. reason: '1681433373',
  578. endDate: '12817715',
  579. }*/
  580. ];
  581.  
  582. var ffDiv = document.createElement("div"),
  583. ffMnu = document.createElement("select"),
  584. ffBtn = document.createElement("button");
  585. ffDiv.id = "formfillerDiv";
  586. var formWindowName = "WME Form Filler result",
  587. formWindowSpecs = "resizable=1,menubar=0,scrollbars=1,status=0,toolbar=0";
  588. var editPanel, selElem, formLink;
  589. editPanel = document.getElementById("edit-panel");
  590. selElem = editPanel.getElementsByClassName("selection");
  591.  
  592. for (i=0; i<forms.length; i++)
  593. {
  594. ffMnu.options.add(new Option(forms[i].name,i));
  595. }
  596. ffBtn.innerHTML = "Go to Form";
  597. ffBtn.onclick = function()
  598. {
  599. //alert(ffMnu.options[ffMnu.selectedIndex].value+": "+forms[ffMnu.options[ffMnu.selectedIndex].value].name);
  600. ff_saveSettings();
  601. formLink = ff_createFormLink(ffMnu.options[ffMnu.selectedIndex].value);
  602. if (typeof formLink === "undefined")
  603. return;
  604.  
  605. if ($("#ff-open-in-tab").prop("checked"))
  606. window.open(formLink,"_blank");
  607. else
  608. window.open(formLink,formWindowName,formWindowSpecs);
  609. };
  610. ffDiv.appendChild(ffMnu);
  611. ffDiv.appendChild(ffBtn);
  612. selElem[0].appendChild(ffDiv);
  613.  
  614. return;
  615. }
  616.  
  617. function ff_loadSettings()
  618. {
  619. var todayDate = new Date(),
  620. futureDate = new Date(),
  621. daysInFuture = 3;
  622. var today = todayDate.getFullYear() +"-"+ (todayDate.getMonth()+1<10 ? "0"+(todayDate.getMonth()+1) : todayDate.getMonth()+1) +"-"+ todayDate.getDate();
  623. futureDate.setDate(futureDate.getDate() + daysInFuture);
  624.  
  625. var ffOpenInTab = localStorage.getItem("ff-open-in-tab");
  626. if (ffOpenInTab === "1")
  627. $("#ff-open-in-tab").trigger("click");
  628. var ffClosureReason = localStorage.getItem("ff-closure-reason");
  629. if (ffClosureReason !== null)
  630. $("#ff-closure-reason").val(ffClosureReason);
  631. var ffClosureEndDate = localStorage.getItem("ff-closure-endDate");
  632. if (ffClosureEndDate !== null && ffClosureEndDate !== "" && ffClosureEndDate >= today)
  633. $("#ff-closure-endDate").val(ffClosureEndDate);
  634. else
  635. {
  636. var closureDate = futureDate.getFullYear() +"-"+ (futureDate.getMonth()+1<10 ? "0"+(futureDate.getMonth()+1) : futureDate.getMonth()+1) +"-"+ (futureDate.getDate() < 10 ? "0"+futureDate.getDate() : futureDate.getDate());
  637. $("#ff-closure-endDate").val(closureDate);
  638. }
  639. var ffClosureEndTime = localStorage.getItem("ff-closure-endTime");
  640. if (ffClosureEndTime !== null && ffClosureEndTime !== "")
  641. $("#ff-closure-endTime").val(ffClosureEndTime);
  642. //formfiller_log("Settings loaded");
  643. return;
  644. }
  645.  
  646. function ff_saveSettings()
  647. {
  648. /*formfiller_log("Saving settings:\n"+$("#ff-open-in-tab").prop("checked")+
  649. "\n"+$("#ff-closure-reason").val()+
  650. "\n"+$("#ff-closure-endDate").val()+
  651. "\n"+$("#ff-closure-endTime").val());*/
  652. if ($("#ff-open-in-tab").prop("checked"))
  653. localStorage.setItem("ff-open-in-tab", "1");
  654. else
  655. localStorage.setItem("ff-open-in-tab", "0");
  656. localStorage.setItem("ff-closure-reason", $("#ff-closure-reason").val());
  657. localStorage.setItem("ff-closure-endDate", $("#ff-closure-endDate").val());
  658. localStorage.setItem("ff-closure-endTime", $("#ff-closure-endTime").val());
  659. //formfiller_log("Settings saved");
  660. return;
  661. }
  662.  
  663. function ff_addUserTab()
  664. {
  665. var userInfo = document.getElementById("user-info"),
  666. userTabs = document.getElementById("user-tabs"),
  667. navTabs = userTabs.getElementsByClassName("nav-tabs"),
  668. tabContent = userInfo.getElementsByClassName("tab-content");
  669. var ffTab = document.createElement("li"),
  670. ffPanel = document.createElement("div"),
  671. ffReason = document.createElement("div"),
  672. ffEndDate = document.createElement("div"),
  673. ffNewTabBox = document.createElement("input"),
  674. ffNewTabLabel = document.createElement("label"),
  675. ffTabInfo = document.createElement("div");
  676.  
  677. ffTab.innerHTML = '<a title="Form Filler" href="#sidepanel-formfill" data-toggle="tab"><img class="fa" src="'+WMEFFIcon+'" width="15px" /></a>';
  678. ffPanel.id = "sidepanel-formfill";
  679. ffPanel.className = "tab-pane";
  680.  
  681. ffTabInfo.innerHTML = '<b>'+ WMEFFName +'</b> v'+ WMEFFVersion;
  682.  
  683. ffNewTabBox.id = "ff-open-in-tab";
  684. ffNewTabBox.type = "checkbox";
  685. ffNewTabBox.name = "ff_open_tab";
  686.  
  687. ffNewTabLabel.innerHTML = "Open form in new tab";
  688. ffNewTabLabel.for = "ff_open_tab";
  689.  
  690. ffReason.className = "form-group";
  691. ffReason.innerHTML = '<label class="control-label" for="ff_closure_reason">Closures reason:</label><div class="controls"><input id="ff-closure-reason" class="form-control" type="text" name="ff_closure_reason"></div>';
  692.  
  693. ffEndDate.className = "form-group";
  694. ffEndDate.innerHTML = '<label class="control-label" for="ff_closure_endDate">Closures end:</label><div class="controls"><div class="date date-input-group input-group pull-left" style="width: 62%"><input id="ff-closure-endDate" class="form-control end-date" type="text" name="ff_closure_endDate"><span class="input-group-addon"><i class="fa fa-calendar"></i></span></div><div class="bootstrap-timepicker input-group style="width: 38%""><input id="ff-closure-endTime" class="end-time form-control" type="text" name="ff_closure_endTime"><span class="input-group-addon"><i class="fa fa-clock-o"></i></span></div></div>';
  695.  
  696. ffPanel.appendChild(ffTabInfo);
  697. ffPanel.appendChild(ffNewTabBox);
  698. ffPanel.appendChild(ffNewTabLabel);
  699. ffPanel.appendChild(ffReason);
  700. ffPanel.appendChild(ffEndDate);
  701. navTabs[0].appendChild(ffTab);
  702. tabContent[0].appendChild(ffPanel);
  703.  
  704. if (typeof $.fn.datepicker !== "undefined") {
  705. $("#ff-closure-endDate").datepicker({format:"yyyy-mm-dd", todayHighlight:true, autoclose:true});
  706. } else {
  707. if (typeof $.fn.daterangepicker !== "undefined") {
  708. $("#ff-closure-endDate").daterangepicker({singleDatePicker:true, locale:{format:"YYYY-MM-DD"}});
  709. }
  710. }
  711.  
  712. if (typeof $.fn.timepicker !== "undefined") {
  713. $("#ff-closure-endTime").timepicker({template:false,defaultTime:"00:00",showMeridian:false});
  714. }
  715.  
  716. ff_loadSettings();
  717. $("#ff-closure-reason").change(function() {ff_saveSettings();});
  718. $("#ff-closure-endDate").change(function() {ff_saveSettings();});
  719. $("#ff-closure-endTime").change(function() {ff_saveSettings();});
  720. $("#ff-open-in-tab").click(function() {ff_saveSettings();});
  721. }
  722.  
  723. setTimeout(formfiller_bootstrap,2000);