popufare_admin.js 32 KB

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