WME Form Filler

Use info from WME to automatically fill out related forms

当前为 2016-09-26 提交的版本,查看 最新版本

  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.0
  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. // @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. var response = JSON.parse(xhr.responseText);
  250. var addrComps = response.results[0].address_components;
  251. for (comp = 0; comp < addrComps.length; comp++)
  252. {
  253. if (addrComps[comp].types.indexOf("administrative_area_level_2") !== -1)
  254. {
  255. county = addrComps[comp].long_name;
  256. //formfiller_log("ff_getCounty: "+county);
  257. var countyIndex = (county.indexOf(" County") !== -1 ? county.indexOf(" County") : county.indexOf(" Parish"));
  258. if (countyIndex !== -1)
  259. county = county.slice(0,countyIndex);
  260. break;
  261. }
  262. }
  263. }
  264. }
  265. };
  266. xhr.send(null);
  267. return county;
  268.  
  269. //Async call. Figure this out!
  270. /*return $.getJSON('https://maps.googleapis.com/maps/api/geocode/json?latlng='+center.lat+','+center.lon, function(data) {
  271. if (data.status === "OK")
  272. {
  273. var addrComps = data.results[0].address_components;
  274. for (comp = 0; comp < addrComps.length; comp++)
  275. {
  276. if (addrComps[comp].types.indexOf("administrative_area_level_2") !== -1)
  277. {
  278. county = addrComps[comp].long_name;
  279. county = county.slice(0,county.indexOf(" County"));
  280. formfiller_log("JSON func "+county);
  281. break;
  282. }
  283. }
  284. }
  285. if (county === "")
  286. county = "Not found";
  287. formfiller_log("Got county");
  288. formfiller_log(county);
  289. return county;
  290. });*/
  291. }
  292.  
  293. function ff_closureActive(sel)
  294. {
  295. for (i=0; i<sel.length; i++)
  296. {
  297. if (sel[i].model.hasClosures())
  298. if (Waze.model.roadClosures.getByAttributes({segID: sel[i].model.attributes.id})[0].active)
  299. return true;
  300. }
  301. return false;
  302. }
  303.  
  304. function ff_getClosureInfo(seg)
  305. {
  306. var closureInfo = {
  307. direction: "",
  308. endDate: "",
  309. idFwd: "",
  310. idRev: "",
  311. reason: ""
  312. };
  313. var segID = seg.model.attributes.id;
  314. var closureList = Waze.model.roadClosures.getByAttributes({segID: segID,active: true});
  315. /*if (closureList.length > 2)
  316. return closureList;
  317.  
  318. if (closureList.length == 2 && closureList[0].forward != closureList[1].forward)
  319. closureInfo.direction = "Two-Way";
  320. else
  321. closureInfo.direction = "One-Way";*/
  322.  
  323. for (i=0; i<closureList.length; i++)
  324. {
  325. if (closureList[i].active === true)
  326. {
  327. if (closureInfo.endDate === "")
  328. {
  329. closureInfo.endDate = closureList[i].endDate;
  330. }
  331. else if (closureInfo.endDate > closureList[i].endDate)
  332. {
  333. closureInfo.endDate = closureList[i].endDate;
  334. }
  335. if (closureList[i].forward === true)
  336. {
  337. closureInfo.idFwd = closureList[i].id;
  338. }
  339. else
  340. {
  341. closureInfo.idRev = closureList[i].id;
  342. }
  343. if (closureInfo.reason === "")
  344. {
  345. closureInfo.reason = closureList[i].reason;
  346. }
  347. }
  348. }
  349.  
  350. if (closureInfo.idFwd !== "" && closureInfo.idRev !== "")
  351. closureInfo.direction = "Two-Way";
  352. else
  353. closureInfo.direction = "One-Way";
  354.  
  355. return closureInfo;
  356. }
  357.  
  358. function ff_createPermalink(selection)
  359. {
  360. //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
  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&venues=183632201.1836387542.3102948
  362. var permalink = "https://www.waze.com/editor/?", segIDs = [];
  363. var latLon = Waze.map.center.clone().transform(Waze.map.projection.projCode,Waze.map.displayProjection.projCode);
  364. var lat = latLon.lat, lon = latLon.lon;
  365. var env = Waze.location.code;
  366. var type = "segments";
  367. var zoom = Waze.map.zoom;
  368.  
  369. /*if (zoom == 3)
  370. alert('Current zoom level (3) will not select street segments! If your selection includes street segments, please increase the zoom level');
  371. else if (zoom == 2)
  372. alert ('Current zoom level (2) will only select PS+ segments! If you have any other segment type selected, please increase the zoom level');
  373. else if (zoom <= 1)
  374. {
  375. alert ('Current zoom level ('+ zoom.toString() +') will not select any segments! Increase the zoom level before submitting!');
  376. return;
  377. }*/
  378.  
  379. //To get lat and long centered on segment
  380. if (selection.length == 1)
  381. {
  382. latLon = selection[0].model.getCenter().clone();
  383. latLon.transform(Waze.map.projection.projCode,Waze.map.displayProjection.projCode);
  384. lat = latLon.x;
  385. lon = latLon.y;
  386. }
  387.  
  388. var maxzoom = 2,
  389. zoomToRoadType = Waze.Config.segments.zoomToRoadType;
  390. for (i=0; i<selection.length; i++)
  391. {
  392. var segment = selection[i].model;
  393. if (segment.type != "segment")
  394. continue;
  395. segIDs.push(segment.attributes.id);
  396. if (zoomToRoadType[zoom] !== -1 && zoomToRoadType[zoom].indexOf(segment.attributes.roadType) === -1)
  397. {
  398. alert("This zoom level ("+ zoom.toString() +") cannot be used for this road type! Please increase your zoom:\n"+
  399. "Streets: 4+\nOther drivable and Non-drivable: 3+\nHighways and PS: 2+");
  400. formfiller_log("Zoom level not correct for segment: "+ zoom.toString() +" "+ segment.attributes.roadType.toString());
  401. return;
  402. }
  403. }
  404. permalink += "env="+env+"&lon="+lon+"&lat="+lat+"&zoom="+zoom.toString()+"&"+type+"="+segIDs.join();
  405. return permalink;
  406. }
  407.  
  408. function ff_createFormLink(formDt)
  409. {
  410. var selection = Waze.selectionManager.selectedItems;
  411. var formInfo = {};
  412. var formLink = formDt.url;
  413. if (selection.length === 0 || selection[0].model.type != "segment")
  414. {
  415. formfiller_log("No segments selected.");
  416. return;
  417. }
  418.  
  419. formInfo.username = encodeURIComponent(Waze.loginManager.user.userName);
  420. formInfo.streetname = encodeURIComponent(ff_getStreetName(selection));
  421. formInfo.permalink = encodeURIComponent(ff_createPermalink(selection));
  422. if (formInfo.permalink === "undefined")
  423. {
  424. formfiller_log("No permalink generated");
  425. return;
  426. }
  427. formInfo.state = abbrState(ff_getState(selection),"abbr"); //Abbreviation
  428. formInfo.county = ff_getCounty(selection);
  429.  
  430. formInfo.status = "REPORTED";
  431. formInfo.direction = "Two-Way";
  432. formInfo.reason = document.getElementById("ff-closure-reason").value;
  433. formInfo.endDate = document.getElementById("ff-closure-endDate").value +"+"+ document.getElementById("ff-closure-endTime").value;
  434. if (ff_closureActive(selection))
  435. {
  436. formInfo.status = "CLOSED";
  437. var closureInfo = ff_getClosureInfo(selection[0]);
  438. formInfo.direction = closureInfo.direction;
  439. formInfo.reason = encodeURIComponent(closureInfo.reason);
  440. formInfo.endDate = encodeURIComponent(closureInfo.endDate);
  441. }
  442.  
  443. //Need to do this part better, works for now
  444. formLink += "?entry."+formDt.username+"="+formInfo.username;
  445. formLink += "&entry."+formDt.streetname+"="+formInfo.streetname;
  446. formLink += "&entry."+formDt.permalink+"="+formInfo.permalink;
  447. formLink += "&entry."+formDt.state+"="+formInfo.state;
  448. formLink += "&entry."+formDt.county+"="+formInfo.county;
  449. formLink += "&entry."+formDt.status+"="+formInfo.status;
  450. formLink += "&entry."+formDt.direction+"="+formInfo.direction;
  451. formLink += "&entry."+formDt.reason+"="+formInfo.reason;
  452. formLink += "&entry."+formDt.endDate+"="+formInfo.endDate;
  453. formfiller_log(formLink);
  454. return formLink;
  455. }
  456.  
  457. function ff_addFormBtn()
  458. {
  459. var selection = Waze.selectionManager.selectedItems;
  460. if (selection.length === 0 || selection[0].model.type != "segment")
  461. {
  462. //formfiller_log("No segments selected.");
  463. return;
  464. }
  465. if (document.getElementById("formfillerDiv"))
  466. {
  467. //formfiller_log("Div already created");
  468. return;
  469. }
  470.  
  471. var forms = [
  472. {
  473. //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
  474. name: 'USA Weather related closures',
  475. url: 'https://docs.google.com/forms/d/e/1FAIpQLScY_5WKyYTqvH1fdiBThqLO4DRIzFzgdBtBexw5-iKL_LOzBw/viewform',
  476. username: '1553765347',
  477. status: '1264424583',
  478. permalink: '1811077109',
  479. direction: '792657790',
  480. reason: '345142186',
  481. endDate: '1102521735',
  482. streetname: '2015424420',
  483. fromstreet: '1547375393',
  484. tostreet: '1335391716',
  485. state: '1867193205',
  486. county: '1714138473',
  487. source: '1803937317'
  488. },
  489. {
  490. //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
  491. name: 'Testing form weather closures',
  492. url: 'https://docs.google.com/forms/d/e/1FAIpQLSeRVbj9DNsbP4GOeYr_6_2KjgS2TGi3f_Z5d9FVX1MmqMrZDQ/viewform',
  493. username: '1553765347',
  494. streetname: '2015424420',
  495. permalink: '1811077109',
  496. state: '1867193205',
  497. county: '1714138473',
  498. status: '1264424583',
  499. direction: '792657790',
  500. reason: '345142186',
  501. endDate: '1102521735'
  502. },
  503. /*{
  504. //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
  505. name: 'Old USA Weather related closures',
  506. url: 'https://docs.google.com/forms/d/1uXS-Z0-5aJbOrzcZtT8CM-qpUNMonU1iH9NWiPQ5w2o/viewform',
  507. username: '728513350',
  508. streetname: '1761873222',
  509. permalink: '1331253387',
  510. state: '1030293134',
  511. county: '1012282273',
  512. status: '167700229',
  513. direction: '1363270254',
  514. reason: '1681433373',
  515. endDate: '12817715',
  516. }*/
  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.