Greasy Fork is available in English.

WME Form Filler

Use info from WME to automatically fill out related forms

Versione datata 26/09/2016. Vedi la nuova versione l'ultima versione.

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