popufare_admin.js 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309
  1. // example usage:
  2. //
  3. // api_req({"ui_function":"manage_card.find", "api_function":"CardInfo", "data":[ ["action","search"],["mag_token","370000000007015"]]})
  4. //
  5. function api_req(ctx) {
  6. var xhr;
  7. xhr = new XMLHttpRequest();
  8. if (!xhr) { return false; }
  9. var param_val = [];
  10. for (var idx=0; idx<ctx.data.length; idx++) {
  11. param_val.push(ctx.data[idx][0] + '=' + ctx.data[idx][1]);
  12. }
  13. var api_func = "nop";
  14. if ("api_function" in ctx) { api_func = ctx["api_function"]; }
  15. var req_str = "api/v1/" + api_func + "?" + param_val.join("&");
  16. xhr.onreadystatechange = (function(_x,_f) {
  17. return function(v) { api_resp(_x, {"ui_function":_f}); }
  18. })(xhr, ctx["ui_function"])
  19. xhr.open("GET", req_str);
  20. xhr.send()
  21. }
  22. function update_message(ui_id, msg_type, msg_text) {
  23. var ele = document.getElementById(ui_id);
  24. if (msg_type === "error") { ele.style.color = "#f00"; }
  25. else { ele.style.color = "#007"; }
  26. ele.innerHTML = msg_text;
  27. }
  28. function update_pass_radio_button(page, pass_choice) {
  29. var _rid = ["pass_none", "pass_nride", "pass_nday", "pass_other"];
  30. for (var ii=0; ii<_rid.length; ii++) {
  31. var ele = document.getElementById("ui." + page + "." + _rid[ii]);
  32. ele.checked = false;
  33. }
  34. if (pass_choice === "none") {
  35. var ele = document.getElementById("ui." + page + ".pass_none");
  36. ele.checked = true;
  37. }
  38. else if (pass_choice === "nride") {
  39. var ele = document.getElementById("ui." + page + ".pass_nride");
  40. ele.checked = true;
  41. }
  42. else if (pass_choice === "nday") {
  43. var ele = document.getElementById("ui." + page + ".pass_nday");
  44. ele.checked = true;
  45. }
  46. else if (pass_choice === "other") {
  47. var ele = document.getElementById("ui." + page + ".pass_other");
  48. ele.checked = true;
  49. }
  50. }
  51. function api_resp(xhr,extra) {
  52. if (xhr.readyState === XMLHttpRequest.DONE) {
  53. if (xhr.status === 200) {
  54. var dat = JSON.parse(xhr.responseText);
  55. if (extra["ui_function"] === "manage_card.find") {
  56. console.log("manage_card.find", dat);
  57. if (dat["result"] == "fail") {
  58. manage_card_find_fill({});
  59. update_message("ui.manage_card.message", "error", dat["api_comment"]);
  60. return;
  61. }
  62. if (("cards"in dat) &&
  63. (dat.cards.length>0)) {
  64. update_message("ui.manage_card.message", "success", "");
  65. manage_card_find_fill(dat.cards[0]);
  66. }
  67. else {
  68. manage_card_find_fill({});
  69. update_message("ui.manage_card.message", "error", "no cards");
  70. }
  71. }
  72. else if (extra["ui_function"] === "manage_card.findone") {
  73. console.log("... manage_card.findone", dat);
  74. if (dat["result"] == "fail") {
  75. update_message("ui.manage_card.message", "error", dat["api_comment"]);
  76. manage_card_find_fill({});
  77. }
  78. else {
  79. update_message("ui.manage_card.message", "success", "");
  80. manage_card_find_fill(dat);
  81. }
  82. }
  83. else if (extra["ui_function"] === "manage_card.update") {
  84. console.log("issuing 'manage_card.update'");
  85. if (dat["result"] == "fail") {
  86. update_message("ui.manage_card.message", "error", dat["api_comment"]);
  87. }
  88. else {
  89. update_message("ui.manage_card.message", "success", "");
  90. var cardid = _get_input_field("ui.manage_card.logical_card_id");
  91. api_req({"api_function":"CardInfo", "ui_function":"manage_card.findone", "data":[["logical_card_id",cardid]]});
  92. }
  93. }
  94. else if (extra["ui_function"] === "create_user.finish") {
  95. if (dat["result"] === "success") {
  96. update_message("ui.manage_user.message", "success", "");
  97. _redirect( "manage_user?" + "action=get&userid=" + dat["userid"]);
  98. }
  99. else {
  100. update_message("ui.create_user.message", "error", dat.api_comment);
  101. console.log("FAIL:", dat);
  102. }
  103. }
  104. else if (extra["ui_function"] === "manage_user.find") {
  105. console.log("manage_user.find:", dat);
  106. if (dat["result"] === "success") {
  107. update_message("ui.manage_user.message", "success", "");
  108. manage_user_find_fill(dat);
  109. }
  110. else {
  111. update_message("ui.manage_user.message", "error", dat.api_comment);
  112. }
  113. }
  114. else if (extra["ui_function"] === "manage_user.update") {
  115. var userid = _get_input_field("ui.manage_user.userid");
  116. console.log("manage_user.update resp:", dat);
  117. if (dat["result"] === "success") {
  118. // After we've associated the card to the user, re-get user information to re-fill
  119. // page
  120. //
  121. update_message("ui.manage_user.message", "success", "")
  122. update_message("ui.manage_user.password_message", "success", "")
  123. update_message("ui.manage_user.card_message", "success", "")
  124. api_req({"api_function":"UserInfo", "ui_function":"manage_user.find", "data":[["userid",userid]]});
  125. }
  126. else {
  127. update_message("ui.manage_user.message", "error", dat.api_comment);
  128. }
  129. }
  130. else if (extra["ui_function"] === "manage_user.associate_card") {
  131. if (dat["result"] === "success") {
  132. update_message("ui.manage_user.message", "success", "")
  133. update_message("ui.manage_user.password_message", "success", "")
  134. update_message("ui.manage_user.card_message", "success", "")
  135. api_req({"api_function":"UserInfo", "ui_function":"manage_user.find", "data":[["userid",userid]]});
  136. }
  137. else {
  138. update_message("ui.manage_user.card_message", "error", dat.api_comment);
  139. }
  140. }
  141. else if (extra["ui_function"] === "reissue_card.find") {
  142. if (dat["result"] === "success") {
  143. update_message("ui.reissue_card.message", "success", "")
  144. reissue_card_fill(dat);
  145. }
  146. else {
  147. update_message("ui.reissue_card.message", "error", dat.api_comment);
  148. }
  149. }
  150. else if (extra["ui_function"] === "recycle_card.update") {
  151. if (dat["result"] === "success") {
  152. update_message("ui.recycle_card.message", "success", "")
  153. }
  154. else {
  155. update_message("ui.recycle_card.message", "error", dat.api_comment);
  156. }
  157. }
  158. else if (extra["ui_function"] === "add_card_block.add") {
  159. if (dat["result"] === "success") {
  160. update_message("ui.add_card_block.message", "success", "loaded");
  161. }
  162. else {
  163. update_message("ui.add_card_block.message", "error", dat.api_comment);
  164. }
  165. }
  166. else if (extra["ui_function"] === "ui_search.update") {
  167. console.log("search result:", dat);
  168. if (dat["result"] === "success") {
  169. update_message("ui.search.message", "success", "loaded");
  170. ui_search_fill(dat);
  171. }
  172. else {
  173. update_message("ui.search.message", "error", dat.api_comment);
  174. }
  175. }
  176. else if (extra["ui_function"] === "group") {
  177. }
  178. //else if (extra["ui_function"] === "manage_card.find") { manage_card_find_fill(dat); }
  179. }
  180. else {
  181. console.log("xhr error:", xhr);
  182. }
  183. }
  184. }
  185. function _param2hash(p) {
  186. var h = {};
  187. p = p.substring(1);
  188. var tokval = p.split("&");
  189. for (var idx=0; idx<tokval.length; idx++) {
  190. pv = tokval[idx].split("=");
  191. h[pv[0]] = pv[1];
  192. }
  193. return h;
  194. }
  195. function _attach_button(btn_id, cb) {
  196. ele = document.getElementById(btn_id);
  197. if (ele) { ele.onclick = cb; }
  198. }
  199. function _redirect(rel_str) {
  200. console.log("redirect", rel_str);
  201. window.location.href = rel_str;
  202. }
  203. function _fill_input_field(fid, fdata) {
  204. var ele = document.getElementById(fid);
  205. if (ele) {
  206. if (ele.nodeName === "DIV") { ele.innerHTML = fdata; }
  207. else { ele.value = fdata; }
  208. }
  209. }
  210. function _get_input_field(fid) {
  211. var ele = document.getElementById(fid);
  212. if (ele) { return ele.value; }
  213. return null;
  214. }
  215. function _get_select(fid) {
  216. var ele = document.getElementById(fid);
  217. if (ele) {
  218. return ele.options[ele.selectedIndex].value;
  219. }
  220. return null;
  221. }
  222. function _get_select_id(fid) {
  223. var ele = document.getElementById(fid);
  224. if (ele) {
  225. return ele.options[ele.selectedIndex].id;
  226. }
  227. return null;
  228. }
  229. function _date_only(s) {
  230. if (!s) { return s; }
  231. if (s.length > 0) {
  232. return s.split(" ")[0];
  233. }
  234. return s;
  235. }
  236. function _create_pass_row(dat) {
  237. var pass_table = document.getElementById("ui.manage_card.list_passes");
  238. var _cb = "<input type='checkbox' id='xxx' name='xxx'>";
  239. while (pass_table.firstChild) {
  240. pass_table.removeChild(pass_table.lastChild);
  241. }
  242. var row = document.createElement("div");
  243. row.classList.add("row");
  244. row.classList.add("rowpop");
  245. row.classList.add("row-shade");
  246. var fields_width = [1,1,1,1,2,2,2,2];
  247. //var fields = ["x", "Type", "Original", "Remain", "Exp.", "Issued", "First Used", "Last Used"];
  248. var fields = ['', "Type", "Original", "Remain", "Exp.", "Issued", "First Used", "Last Used"];
  249. for (var idx=0; idx<fields.length; idx++) {
  250. var cell = document.createElement("div");
  251. cell.innerHTML = fields[idx];
  252. cell.classList.add("col-" + fields_width[idx]);
  253. row.appendChild(cell);
  254. }
  255. pass_table.appendChild(row);
  256. for (var idx=0; idx<dat["pass"].length; idx++) {
  257. var pass_data = dat["pass"][idx];
  258. var passid = pass_data["user_pass_id"];
  259. var pass_type = "unk";
  260. var pass_rule = pass_data["rule"];
  261. var pass_orig = "";
  262. var pass_remain = "";
  263. var pass_exp = "";
  264. if (pass_rule.search(/NRIDE/) >= 0) {
  265. pass_type = "NRide";
  266. pass_orig = pass_data["nrides_orig"];
  267. pass_remain = pass_data["nrides_remain"];
  268. pass_exp = "";
  269. }
  270. else if (pass_rule.search(/NDAY/) >= 0) {
  271. pass_type = "NDay";
  272. pass_orig = pass_data["nday_orig"];
  273. pass_remain = "";
  274. pass_exp = pass_data["nday_expiration"];
  275. }
  276. else {
  277. pass_type = "Other";
  278. }
  279. var pass_firstused = "";
  280. var pass_lastused = "";
  281. if ( (typeof pass_data["firstused"] !== "undefined") &&
  282. (pass_data["firstused"]) ) {
  283. pass_firstused = pass_data["firstused"];
  284. }
  285. if ( (typeof pass_data["lastused"] !== "undefined") &&
  286. (pass_data["lastused"]) ) {
  287. pass_lastused = pass_data["lastused"];
  288. }
  289. row = document.createElement("div");
  290. row.classList.add("row");
  291. row.classList.add("rowpop");
  292. if ((idx%2)==1) {
  293. row.classList.add("row-shade");
  294. }
  295. //var cell = document.createElement("div");
  296. //cell.innerHTML = "x";
  297. var cell = document.createElement("input");
  298. cell.setAttribute('type', 'checkbox');
  299. cell.setAttribute('value', '');
  300. cell.setAttribute('id', "ui.manage_card.cb_" + idx + "_pass");
  301. cell.classList.add("col-" + fields_width[0]);
  302. row.appendChild(cell);
  303. //cell.classList.add("col-" + fields_width[0]);
  304. //row.appendChild(cell);
  305. cell = document.createElement("div");
  306. cell.innerHTML = pass_type;
  307. cell.classList.add("col-" + fields_width[1]);
  308. row.appendChild(cell);
  309. cell = document.createElement("div");
  310. cell.innerHTML = pass_orig;
  311. cell.classList.add("col-" + fields_width[2]);
  312. row.appendChild(cell);
  313. cell = document.createElement("div");
  314. cell.innerHTML = pass_remain;
  315. cell.classList.add("col-" + fields_width[3]);
  316. row.appendChild(cell);
  317. cell = document.createElement("div");
  318. //cell.innerHTML = pass_exp;
  319. cell.innerHTML = _date_only(pass_exp);
  320. cell.classList.add("col-" + fields_width[4]);
  321. row.appendChild(cell);
  322. cell = document.createElement("div");
  323. //cell.innerHTML = pass_data["issued"];
  324. cell.innerHTML = _date_only(pass_data["issued"]);
  325. cell.classList.add("col-" + fields_width[5]);
  326. row.appendChild(cell);
  327. cell = document.createElement("div");
  328. //cell.innerHTML = pass_firstused;
  329. cell.innerHTML = _date_only(pass_firstused);
  330. cell.classList.add("col-" + fields_width[6]);
  331. row.appendChild(cell);
  332. cell = document.createElement("div");
  333. cell.innerHTML = pass_lastused;
  334. cell.classList.add("col-" + fields_width[7]);
  335. row.appendChild(cell);
  336. cell = document.createElement("div");
  337. cell.innerHTML = passid;
  338. cell.setAttribute('id', "ui.manage_card.row_" + idx + "_pass");
  339. cell.style.display = "none";
  340. row.appendChild(cell);
  341. pass_table.appendChild(row);
  342. }
  343. }
  344. function manage_card_find_fill(data) {
  345. var fields = [ "logical_card_id", "group", "mag_token", "rfid_token"];
  346. var user_fields = [ "userid", "username", "first_name", "last_name",
  347. "email", "phone", "address", "city", "state", "zip", "group" ];
  348. console.log("manage_card_find_fill:", data);
  349. for (var idx=0; idx<fields.length; idx++) {
  350. _fill_input_field("ui.manage_card." + fields[idx], "");
  351. }
  352. _fill_input_field("ui.manage_card.disp_userid", "");
  353. for (var idx=0; idx<fields.length; idx++) {
  354. if (fields[idx] in data) {
  355. _fill_input_field("ui.manage_card." + fields[idx], data[fields[idx]])
  356. }
  357. }
  358. for (_user_key in user_fields) {
  359. _fill_input_field("ui.manage_card." + user_fields[_user_key], "");
  360. }
  361. if ("user" in data) {
  362. for (_key in data["user"]) {
  363. _fill_input_field("ui.manage_card." + _key, data["user"][_key]);
  364. }
  365. if ("userid" in data["user"]) {
  366. _fill_input_field("ui.manage_card.disp_userid", data["user"]["userid"]);
  367. }
  368. }
  369. console.log("cp0");
  370. if ("pass" in data) {
  371. _create_pass_row(data);
  372. }
  373. window.history.replaceState({}, document.title, "/manage_card");
  374. }
  375. function manage_card_find_cardid() {
  376. var cardid = _get_input_field("ui.manage_card.logical_card_id");
  377. console.log("??", cardid);
  378. api_req({"api_function":"CardInfo", "ui_function":"manage_card.find", "data": [ ["action","search"], ["logical_card_id",cardid] ] });
  379. }
  380. function manage_card_find_magstripe() {
  381. var mag = _get_input_field("ui.manage_card.mag_token");
  382. api_req({"api_function":"CardInfo", "ui_function":"manage_card.find", "data": [ ["action","search"],["mag_token",mag] ] });
  383. }
  384. function manage_card_find_rfid() {
  385. var rfid = _get_input_field("ui.manage_card.rfid_token");
  386. api_req({"api_function":"CardInfo", "ui_function":"manage_card.find", "data": [ ["action","search"],["rfid_token",rfid] ] });
  387. }
  388. function manage_user_find_fill(data) {
  389. var fields = [ "userid", "username", "first_name", "last_name",
  390. "email", "phone", "address", "city", "state", "zip",
  391. "shipping_name", "shipping_city", "shipping_state", "shipping_address",
  392. "shipping_country_code", "shipping_country_name",
  393. "shipping_zip", "password"];
  394. for (_user_key in fields) {
  395. _fill_input_field("ui.manage_card." + _user_key, "");
  396. }
  397. if ("user" in data) {
  398. var user_data = data["user"];
  399. for (var idx=0; idx<fields.length; idx++) {
  400. if (fields[idx] in user_data) {
  401. _fill_input_field("ui.manage_user." + fields[idx], user_data[fields[idx]])
  402. }
  403. }
  404. }
  405. if ("card" in data) {
  406. var card_table = document.getElementById("ui.manage_user.list_cards");
  407. while (card_table.firstChild) {
  408. card_table.removeChild(card_table.lastChild);
  409. }
  410. var row = document.createElement("div");
  411. row.classList.add("row");
  412. row.classList.add("rowpop");
  413. row.classList.add("row-shade");
  414. var cell = document.createElement("div");
  415. cell.innerHTML = "Card Id";
  416. cell.classList.add("col-4");
  417. row.appendChild(cell);
  418. cell = document.createElement("div");
  419. cell.innerHTML = "Mag Stripe";
  420. cell.classList.add("col-4");
  421. row.appendChild(cell);
  422. cell = document.createElement("div");
  423. cell.innerHTML = "RFID";
  424. cell.classList.add("col-4");
  425. row.appendChild(cell);
  426. card_table.appendChild(row);
  427. var card_data = data["card"];
  428. for (var idx=0; idx<card_data.length; idx++) {
  429. var cardid = card_data[idx]["logical_card_id"];
  430. var magid = card_data[idx]["mag_token"];
  431. var rfid = card_data[idx]["rfid_token"];
  432. row = document.createElement("div");
  433. row.classList.add("row");
  434. row.classList.add("rowpop");
  435. if ((idx % 2) == 1) {
  436. row.classList.add("row-shade");
  437. }
  438. cell = document.createElement("div");
  439. cell.innerHTML = "<a href='/manage_card?logical_card_id=" + cardid + "'>" + cardid + "</a>";
  440. cell.classList.add("col-4");
  441. row.appendChild(cell);
  442. cell = document.createElement("div");
  443. cell.innerHTML = "<a href='/manage_card?logical_card_id=" + cardid + "'>" + magid + "</a>";
  444. cell.classList.add("col-4");
  445. row.appendChild(cell);
  446. cell = document.createElement("div");
  447. cell.innerHTML = "<a href='/manage_card?logical_card_id=" + cardid + "'>" + rfid + "</a>";
  448. cell.classList.add("col-4");
  449. row.appendChild(cell);
  450. card_table.appendChild(row);
  451. console.log("card", idx,
  452. card_data[idx]["logical_card_id"],
  453. card_data[idx]["mag_token"],
  454. card_data[idx]["rfid_token"] );
  455. }
  456. }
  457. window.history.replaceState({}, document.title, "/manage_user");
  458. }
  459. // --------------------------------------
  460. // --------------------------------------
  461. // --------------------------------------
  462. // --------------------------------------
  463. // --------------------------------------
  464. function add_card_block() {
  465. var pass = [ "none", "nride", "nday", "other" ];
  466. var mag_token = _get_input_field("ui.add_card_block.mag_token");
  467. var rfid_pfx = _get_input_field("ui.add_card_block.rfid_prefix");
  468. var rfid_val = _get_input_field("ui.add_card_block.rfid_value");
  469. var group_id = _get_select_id("ui.add_card_block.group");
  470. var count = _get_input_field("ui.add_card_block.count")
  471. var rfid_token = "";
  472. if (rfid_pfx && (rfid_pfx.length > 0) && rfid_val && (rfid_val.length > 0)) {
  473. rfid_token = "26:" + rfid_pfx + ":" + rfid_val;
  474. }
  475. if ((mag_token.length==0) && (rfid_token.length==0)) {
  476. update_message("ui.add_card_block.message", "error", "Please provide Magstripe or RFID");
  477. return;
  478. }
  479. if (count == "") {
  480. update_message("ui.add_card_block.message", "error", "Count must be positive");
  481. return;
  482. }
  483. update_message("ui.add_card_block.message", "success", "");
  484. var dat = {
  485. "api_function":"AddCardBlock",
  486. "ui_function":"add_card_block.add",
  487. "data": [
  488. ["group_id",group_id],
  489. ["count",count]
  490. ]
  491. };
  492. if (mag_token.length > 0) {
  493. if (mag_token.split(":").length == 1) {
  494. mag_token = "2:" + mag_token;
  495. }
  496. dat.data.push(["mag_token", mag_token]);
  497. }
  498. if (rfid_token.length > 0) {
  499. if (rfid_token.split(":").length < 2) {
  500. rfid_token = "26:" + rfid_token;
  501. }
  502. dat.data.push(["rfid_token", rfid_token]);
  503. }
  504. var pass_kind = "none";
  505. for (var ii=0; ii<pass.length; ii++) {
  506. var ele = document.getElementById("ui.add_card_block.pass_" + pass[ii]);
  507. if (ele.checked) {
  508. pass_kind = pass[ii];
  509. break;
  510. }
  511. }
  512. if (pass_kind == "other") {
  513. dat.data.push(["pass_class" , 'OTHER']);
  514. dat.data.push(["pass_rule" , _get_select("ui.add_card_block.pass_other_rule") ]);
  515. }
  516. else if (pass_kind === "nday") {
  517. var pass_nday_type = _get_select("ui.add_card_block.pass_nday_type");
  518. var pass_nday_region = _get_select("ui.add_card_block.pass_nday_region");
  519. var pass_nday_quantity = _get_select("ui.add_card_block.pass_nday_quantity");
  520. var pass_nday_other = _get_input_field("ui.add_card_block.pass_nday_quantity");
  521. var rule = 'TEST-ORG-NDAY';
  522. var nday = pass_nday_quantity;
  523. if (pass_nday_other && pass_nday_other.length > 0) {
  524. nday = pass_nday_other;
  525. }
  526. dat.data.push(["pass_class" , 'NDAY']);
  527. dat.data.push(["pass_rule", rule]);
  528. dat.data.push(["pass_nday_orig", nday]);
  529. }
  530. else if (pass_kind === "nride") {
  531. var pass_nride_type = _get_select("ui.add_card_block.pass_nride_type");
  532. var pass_nride_region = _get_select("ui.add_card_block.pass_nride_region");
  533. var pass_nride_quantity = _get_input_field("ui.add_card_block.pass_nride_quantity");
  534. var pass_nride_other = _get_input_field("ui.add_card_block.pass_nride_other");
  535. var rule = 'TEST-ORG-NRIDE';
  536. var nride = pass_nride_quantity;
  537. if (pass_nride_other && pass_nride_other.length > 0) {
  538. nride = pass_nride_other;
  539. }
  540. dat.data.push(["pass_class", 'NRIDE']);
  541. dat.data.push(["pass_rule", rule]);
  542. dat.data.push(["pass_nrides_orig", nride]);
  543. dat.data.push(["pass_nrides_remain", nride]);
  544. }
  545. console.log("add_card_block: sending", dat);
  546. api_req(dat);
  547. }
  548. // --------------------------------------
  549. // --------------------------------------
  550. // --------------------------------------
  551. // --------------------------------------
  552. // --------------------------------------
  553. function recycle_card() {
  554. var fields = [ "mag_token", "rfid_token_a", "rfid_token_b",
  555. "pass_nride_other",
  556. "pass_nday_other" ];
  557. var pass = [ "none", "nride", "nday", "other" ];
  558. var h_in = {};
  559. for (var idx=0; idx<fields.length; idx++) {
  560. var field = fields[idx];
  561. var val = _get_input_field("ui.recycle_card." + field);
  562. if (val && (val.length > 0)) { h_in[field] = val; }
  563. }
  564. var rfid_prefx = "26";
  565. if (("rfid_token_a" in h_in) && ("rfid_token_b" in h_in)) {
  566. h_in["rfid_token"] = rfid_prefix + ":" + h_in["rfid_token_a"] + ":" + h_in["rfid_token_b"];
  567. }
  568. var pass_kind = "none";
  569. for (var ii=0; ii<pass.length; ii++) {
  570. var ele = document.getElementById("ui.recycle_card.pass_" + pass[ii]);
  571. if (ele.checked) {
  572. pass_kind = pass[ii];
  573. break;
  574. }
  575. }
  576. var group = _get_select("ui.recycle_card.group");
  577. var other_rule = _get_select("ui.recycle_card.pass_other_rule");
  578. var pass_nday_type = _get_select("ui.recycle_card.pass_nday_type");
  579. var pass_nday_region = _get_select("ui.recycle_card.pass_nday_region");
  580. var pass_nday_quantity = _get_select("ui.recycle_card.pass_nday_quantity");
  581. var pass_nride_type = _get_select("ui.recycle_card.pass_nride_type");
  582. var pass_nride_region = _get_select("ui.recycle_card.pass_nride_region");
  583. var pass_nride_quantity = _get_select("ui.recycle_card.pass_nride_quantity");
  584. var dat = {
  585. "api_function":"RecycleCard",
  586. "ui_function":"recycle.update",
  587. "data": [
  588. //["mag_token",h_in["mag_token"]],
  589. //["rfid_token",h_in["rfid_token"]],
  590. ["group",group]
  591. ]
  592. };
  593. if ("mag_token" in h_in) {
  594. dat.data.push(["mag_token", h_in["mag_token"]]);
  595. }
  596. if ("rfid_token" in h_in) {
  597. dat.data.push(["rfid_token", h_in["rfid_token"]]);
  598. }
  599. if (pass_kind == "nday") {
  600. pass_rule = group + "-NDAY";
  601. dat.data.push( ["pass_rule",pass_rule ] );
  602. dat.data.push( ["pass_val", pass_nday_quantity ] );
  603. dat.data.push( ["pass_class", "NDAY" ] );
  604. }
  605. else if (pass_kind == "nride") {
  606. pass_rule = group + "-NRIDE";
  607. dat.data.push( ["pass_rule", pass_rule ] );
  608. dat.data.push( ["pass_val", pass_nride_quantity ] );
  609. dat.data.push( ["pass_class", "NRIDE" ] );
  610. }
  611. else if (pass_kind == "other") {
  612. pass_rule = other_rule;
  613. dat.data.push( ["pass_rule", pass_rule ] );
  614. dat.data.push( ["pass_class", "OTHER" ] );
  615. }
  616. console.log("recycle:>>>", dat);
  617. api_req(dat);
  618. }
  619. function recycle_card_radio(radio_button) {
  620. var _rid = ["pass_none", "pass_nride", "pass_nday", "pass_other"];
  621. for (var ii=0; ii<_rid.length; ii++) {
  622. var ele = document.getElementById("ui.recycle_card." + _rid[ii]);
  623. ele.checked = false;
  624. }
  625. if (radio_button === "none") {
  626. var ele = document.getElementById("ui.recycle_card.pass_none");
  627. ele.checked = true;
  628. }
  629. else if (radio_button === "nride") {
  630. var ele = document.getElementById("ui.recycle_card.pass_nride");
  631. ele.checked = true;
  632. }
  633. else if (radio_button === "nday") {
  634. var ele = document.getElementById("ui.recycle_card.pass_nday");
  635. ele.checked = true;
  636. }
  637. else if (radio_button === "other") {
  638. var ele = document.getElementById("ui.recycle_card.pass_other");
  639. ele.checked = true;
  640. }
  641. }
  642. // --------------------------------------
  643. // --------------------------------------
  644. // --------------------------------------
  645. // --------------------------------------
  646. // --------------------------------------
  647. function reissue_card() {
  648. var fields = [ "source_magstripe", "source_rfid_a", "source_rfid_b",
  649. "dest_magstripe", "dest_rfid_a", "dest_rfid_b" ];
  650. var data = [];
  651. for (var idx=0; idx<fields.length; idx++) {
  652. var field = fields[idx];
  653. var val = _get_input_field("ui.reissue_card." + field);
  654. if (val.length > 0) {
  655. data.push([ field, val ]);
  656. }
  657. }
  658. console.log("REISSUE (not implemented):", data);
  659. var dat = {
  660. "api_function":"Reissue",
  661. "ui_function":"reissue.update",
  662. "data": [
  663. ["source_logical_card_id",cardid],
  664. ["source_mag_token","..."],
  665. ["source_rfid_token","..."],
  666. ["source_group","..."],
  667. ["destination_mag_token","..."],
  668. ["destination_rfid_token","..."]
  669. ["destination_group","..."]
  670. ]};
  671. //api_req(dat);
  672. }
  673. function reissue_card_fill(card_data) {
  674. if (typeof card_data === "undefined") { return; }
  675. if ( (!("cards" in card_data)) || (card_data.cards.length==0)) {
  676. return;
  677. }
  678. var card = card_data.cards[0];
  679. if ("mag_token" in card) {
  680. _fill_input_field("ui.reissue_card.source_magstripe", card["mag_token"]);
  681. }
  682. if ("rfid_token" in card) {
  683. var tok = card["rfid_token"].split(":");
  684. var rfid_a = "", rfid_b = "";
  685. if (tok.length >= 3) {
  686. rfid_a = tok[1];
  687. rfid_b = tok[2];
  688. }
  689. _fill_input_field("ui.reissue_card.source_rfid_a", rfid_a);
  690. _fill_input_field("ui.reissue_card.source_rfid_b", rfid_b);
  691. }
  692. if ("group" in card) {
  693. }
  694. }
  695. // --------------------------------------
  696. // --------------------------------------
  697. // --------------------------------------
  698. // --------------------------------------
  699. // --------------------------------------
  700. function ui_search(search_type) {
  701. var txt = _get_input_field( "ui.search." + search_type);
  702. console.log(">>>", search_type, txt);
  703. var dat = {
  704. "api_function":"Search",
  705. "ui_function":"ui_search.update",
  706. "data": [
  707. ["search_type", search_type],
  708. ["search_string", txt]
  709. ]};
  710. api_req(dat);
  711. }
  712. function ui_search_fill(data) {
  713. }
  714. // --------------------------------------
  715. // --------------------------------------
  716. // --------------------------------------
  717. // --------------------------------------
  718. // --------------------------------------
  719. function manage_card_redirect_manage_user() {
  720. var userid = _get_input_field("ui.manage_card.userid");
  721. _redirect( "manage_user?" + "action=get&userid=" + userid);
  722. }
  723. function manage_card_reissue() {
  724. var cardid = _get_input_field("ui.manage_card.logical_card_id");
  725. _redirect( "reissue_card?" + "action=get&logical_card_id=" + cardid);
  726. }
  727. function manage_card_add_pass(pass_type) {
  728. //var cardid = _get_input_field("ui.manage_card.logical_card_id");
  729. console.log("manage_card_add_pass:", cardid, pass_type);
  730. var dat = {
  731. "api_function":"Pass",
  732. "ui_function":"manage_card.update",
  733. "data": [
  734. ["logical_card_id",cardid],
  735. ["nrides_orig", 3],
  736. ["nrides_remain", 2],
  737. ["nday_orig", 5],
  738. ["rule", "ORIG-NRIDE"]
  739. ]};
  740. api_req(dat);
  741. }
  742. function manage_card_add_pass_nride() {
  743. var cardid = _get_input_field("ui.manage_card.logical_card_id");
  744. var nrides_orig = _get_input_field("ui.manage_card.pass_nride_other");
  745. if (nrides_orig.length == 0) {
  746. nrides_orig = _get_select("ui.manage_card.pass_nride_orig");
  747. }
  748. var rule = "ORG";
  749. rule += "-" + _get_select("ui.manage_card.pass_nride_type");
  750. rule += "-" + _get_select("ui.manage_card.pass_nride_region");
  751. var api_data = {
  752. "api_function":"Pass",
  753. "ui_function":"manage_card.update",
  754. "data" : [
  755. ["action","add"],
  756. ["logical_card_id" , cardid],
  757. ["nrides_orig" , nrides_orig],
  758. ["nrides_remain" , nrides_orig],
  759. ["rule" , rule]
  760. ]
  761. };
  762. //DEBUG
  763. console.log(">>nride++", api_data);
  764. api_req(api_data);
  765. }
  766. function manage_card_add_pass_nday() {
  767. var cardid = _get_input_field("ui.manage_card.logical_card_id");
  768. var nday_orig = _get_input_field("ui.manage_card.pass_nday_other");
  769. if (nday_orig.length == 0) {
  770. nday_orig = _get_select("ui.manage_card.pass_nday_orig");
  771. }
  772. var rule = "ORG";
  773. rule += "-" + _get_select("ui.manage_card.pass_nday_type");
  774. rule += "-" + _get_select("ui.manage_card.pass_nday_region");
  775. var api_data = {
  776. "api_function":"Pass",
  777. "ui_function":"manage_card.update",
  778. "data" : [
  779. ["action","add"],
  780. ["logical_card_id" , cardid],
  781. ["nday_orig" , nday_orig],
  782. ["rule" , rule]
  783. ]
  784. };
  785. //DEBUG
  786. console.log(">>nday++", api_data);
  787. api_req(api_data);
  788. }
  789. function manage_card_add_pass_other() {
  790. var cardid = _get_input_field("ui.manage_card.logical_card_id");
  791. var ui_ele = document.getElementById("ui.manage_card.pass_other");
  792. var rule = ui_ele.options[ui_ele.selectedIndex].id;
  793. var api_data = {
  794. "api_function":"Pass",
  795. "ui_function":"manage_card.update",
  796. "data" : [
  797. ["action","add"],
  798. ["logical_card_id" , cardid],
  799. ["rule" , rule]
  800. ]
  801. };
  802. //DEBUG
  803. console.log(">>other++", api_data);
  804. api_req(api_data);
  805. }
  806. function manage_card_delete_pass() {
  807. var cardid = _get_input_field("ui.manage_card.logical_card_id");
  808. var ele = document.getElementById("ui.manage_card.list_passes");
  809. var n = ele.children.length;
  810. n-=1;
  811. for (var ii=0; ii<n; ii++) {
  812. var cb = document.getElementById("ui.manage_card.cb_" + ii + "_pass");
  813. if (!cb.checked) { continue; }
  814. var v = document.getElementById("ui.manage_card.row_"+ ii + "_pass");
  815. var passid = v.innerHTML;
  816. console.log("deleting pass", passid, "(card:", cardid,")");
  817. if (cb.checked) {
  818. var dat = {
  819. "api_function":"Pass",
  820. "ui_function":"manage_card.update",
  821. "data": [
  822. ["action", "deactivate"],
  823. ["logical_card_id",cardid],
  824. ["user_pass_id", passid]
  825. ]};
  826. api_req(dat);
  827. }
  828. }
  829. }
  830. function manage_card_toggle_pass_select() {
  831. var ele = document.getElementById("ui.manage_card.list_passes");
  832. var n = ele.children.length;
  833. n-=1;
  834. for (var ii=0; ii<n; ii++) {
  835. var cb = document.getElementById("ui.manage_card.cb_" + ii + "_pass");
  836. if (cb.checked) { cb.checked = false; }
  837. else { cb.checked = true; }
  838. }
  839. }
  840. // --------------------------------------
  841. // --------------------------------------
  842. function manage_user_find_userid() {
  843. var userid = _get_input_field("ui.manage_user.userid");
  844. api_req({"api_function":"UserInfo", "ui_function":"manage_user.find", "data": [ ["userid",userid] ] });
  845. }
  846. function manage_user_find_username() {
  847. var ele = document.getElementById("ui.manage_user.username");
  848. var username = ele.value;
  849. api_req({"api_function":"UserInfo", "ui_function":"manage_user.find", "data":[["username",username]]});
  850. }
  851. function manage_user_update_user() {
  852. var ele = document.getElementById("ui.manage_user.userid");
  853. var userid = ele.value;
  854. var user_data = [["action","update"],["userid", userid]];
  855. var fields = ["username", "lookup_userid", "lookup_username", "first_name", "last_name", "email", "phone",
  856. "address", "city", "state", "zip", "shipping_name", "shipping_address", "shipping_city",
  857. "shipping_state", "shipping_country_code", "shipping_country_name", "shipping_zip" ];
  858. for (var idx=0; idx<fields.length; idx++) {
  859. var _e = document.getElementById("ui.manage_user." + fields[idx]);
  860. if (!_e) { continue; }
  861. user_data.push([fields[idx],_e.value]);
  862. }
  863. var req_data = {"api_function":"User", "ui_function":"manage_user.update_finish", "data":user_data};
  864. api_req(req_data);
  865. }
  866. function manage_user_associate_card(data) {
  867. var ele = document.getElementById("ui.manage_user.userid");
  868. var userid = ele.value;
  869. var ele = document.getElementById("ui.manage_user.logical_card_id");
  870. var cardid = ele.value;
  871. ele = document.getElementById("ui.manage_user.mag_token");
  872. var mag = ele.value;
  873. ele = document.getElementById("ui.manage_user.rfid_token");
  874. var rfid = ele.value;
  875. var req_dat = { "api_function":"Card", "ui_function":"manage_user.associate_card",
  876. "data": [
  877. ["action","update"],
  878. ["userid", userid],
  879. ["logical_card_id",cardid],
  880. ["mag_token",mag],
  881. ["rfid_token",rfid]
  882. ] };
  883. api_req(req_dat);
  884. }
  885. function manage_user_reset_password(data) {
  886. var ele = undefined;
  887. ele = document.getElementById("ui.manage_user.userid");
  888. var userid = ele.value;
  889. if ((userid === "") || (typeof userid === "undefined") || isNaN(userid)) {
  890. update_message("ui.manage_user.password_message", "error", "Please provide userid");
  891. return;
  892. }
  893. ele = document.getElementById("ui.manage_user.new_password");
  894. var pw0 = ele.value;
  895. if ((pw0 === "") || (typeof pw0 === "undefined")) {
  896. update_message("ui.manage_user.password_message", "error", "Please provide password");
  897. return;
  898. }
  899. ele = document.getElementById("ui.manage_user.confirm_password");
  900. var pw1 = ele.value;
  901. if ((pw1 === "") || (typeof pw1 === "undefined")) {
  902. update_message("ui.manage_user.password_message", "error", "Please provide confirmation password");
  903. return;
  904. }
  905. if (pw0 !== pw1) {
  906. update_message("ui.manage_user.password_message", "error", "Passwords must match");
  907. return;
  908. }
  909. var req_dat = { "api_function":"User", "ui_function":"manage_user.update",
  910. "data": [
  911. ["action","update"],
  912. ["userid", userid],
  913. ["password",pw0]
  914. ] };
  915. api_req(req_dat);
  916. }
  917. // --------------------------------------
  918. // --------------------------------------
  919. function create_user_process_button() {
  920. var val_names = ["username", "first_name", "last_name",
  921. "email", "phone", "address", "city", "state", "zip",
  922. "shipping_name", "shipping_address",
  923. "shipping_city", "shipping_state",
  924. "shipping_country_code", "shipping_country_name",
  925. "shipping_zip",
  926. "password"];
  927. var req_dat = { "api_function":"User", "ui_function":"create_user.finish",
  928. "data":[ ["action","add"]] };
  929. for (var idx=0; idx<val_names.length; idx++) {
  930. var v = _get_input_field("create_user:" + val_names[idx]);
  931. if (v) {
  932. req_dat.data.push([val_names[idx],v]);
  933. }
  934. }
  935. api_req(req_dat);
  936. }
  937. // --------------------------------------
  938. // --------------------------------------
  939. // --------------------------------------
  940. // --------------------------------------
  941. // --------------------------------------
  942. function admin_api_init() {
  943. var ele;
  944. var _func = location.pathname.substring(1);
  945. //console.log("...init", _func);
  946. //console.log(window.location.search);
  947. var _h = _param2hash(window.location.search);
  948. if (_func === "create_user") {
  949. _attach_button("create_user:button_create", create_user_process_button);
  950. }
  951. else if (_func === "manage_user") {
  952. _attach_button( "ui.manage_user.lookup_userid", manage_user_find_userid);
  953. _attach_button( "ui.manage_user.lookup_username", manage_user_find_username);
  954. _attach_button( "ui.manage_user.update_user", manage_user_update_user);
  955. _attach_button( "ui.manage_user.associate_card", manage_user_associate_card);
  956. _attach_button( "ui.manage_user.reset_password", manage_user_reset_password);
  957. if ("userid" in _h) {
  958. console.log("sending manage_user.find request");
  959. api_req({"api_function":"UserInfo", "ui_function":"manage_user.find", "data":[["userid",_h["userid"]]]});
  960. }
  961. }
  962. else if (_func === "manage_card") {
  963. _attach_button( "ui.manage_card.lookup_logical_card_id", manage_card_find_cardid);
  964. _attach_button( "ui.manage_card.lookup_mag_token", manage_card_find_magstripe);
  965. _attach_button( "ui.manage_card.lookup_rfid_token", manage_card_find_rfid);
  966. _attach_button( "ui.manage_card.manage_user", manage_card_redirect_manage_user);
  967. _attach_button( "ui.manage_card.reissue", manage_card_reissue);
  968. _attach_button( "ui.manage_card.add_pass_nride", manage_card_add_pass_nride);
  969. _attach_button( "ui.manage_card.add_pass_nday", manage_card_add_pass_nday);
  970. _attach_button( "ui.manage_card.add_pass_other", manage_card_add_pass_other);
  971. _attach_button( "ui.manage_card.delete_pass", manage_card_delete_pass);
  972. _attach_button( "ui.manage_card.toggle_pass_all", manage_card_toggle_pass_select);
  973. if ("logical_card_id" in _h) {
  974. console.log("sending manage_card.find request");
  975. api_req({
  976. "api_function":"CardInfo",
  977. "ui_function":"manage_card.find",
  978. "data": [
  979. ["action","search"],
  980. ["logical_card_id",_h["logical_card_id"] ]
  981. ]
  982. });
  983. }
  984. }
  985. else if (_func === "reissue_card") {
  986. _attach_button( "ui.reissue_card.reissue", reissue_card);
  987. if ("logical_card_id" in _h) {
  988. api_req({
  989. "api_function":"CardInfo",
  990. "ui_function":"reissue_card.find",
  991. "data": [
  992. ["action","search"],
  993. ["logical_card_id",_h["logical_card_id"] ]
  994. ]
  995. });
  996. }
  997. }
  998. else if (_func === "recycle_card") {
  999. _attach_button( "ui.recycle_card.recycle", recycle_card);
  1000. _attach_button( "ui.recycle_card.pass_none", (function () { recycle_card_radio("none"); }) );
  1001. _attach_button( "ui.recycle_card.pass_nride", (function () { recycle_card_radio("nride"); }) );
  1002. _attach_button( "ui.recycle_card.pass_nday", (function () { recycle_card_radio("nday"); }) );
  1003. _attach_button( "ui.recycle_card.pass_other", (function () { recycle_card_radio("other"); }) );
  1004. recycle_card_radio("none");
  1005. if ("logical_card_id" in _h) {
  1006. api_req({
  1007. "api_function":"CardInfo",
  1008. "ui_function":"recycle_card.find",
  1009. "data": [
  1010. ["action","search"],
  1011. ["logical_card_id",_h["logical_card_id"] ]
  1012. ]
  1013. });
  1014. }
  1015. }
  1016. else if (_func === "add_card_block") {
  1017. _attach_button( "ui.add_card_block.add_card_block", add_card_block);
  1018. _attach_button( "ui.add_card_block.pass_none", (function () { update_pass_radio_button("add_card_block", "none"); }) );
  1019. _attach_button( "ui.add_card_block.pass_nride", (function () { update_pass_radio_button("add_card_block", "nride"); }) );
  1020. _attach_button( "ui.add_card_block.pass_nday", (function () { update_pass_radio_button("add_card_block", "nday"); }) );
  1021. _attach_button( "ui.add_card_block.pass_other", (function () { update_pass_radio_button("add_card_block", "other"); }) );
  1022. update_pass_radio_button("add_card_block", "none");
  1023. }
  1024. else if (_func === "search") {
  1025. _attach_button( "ui.search.find_card", (function() { return ui_search("card"); }) );
  1026. _attach_button( "ui.search.find_user", (function() { return ui_search("user"); }) );
  1027. _attach_button( "ui.search.find_admin", (function() { return ui_search("admin"); }) );
  1028. }
  1029. }
  1030. admin_api_init();