Torn Helper

Adds extra information to different pages all around Torn.

当前为 2017-01-08 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Torn Helper
  3. // @namespace Jebster.Torn
  4. // @author Jeggy
  5. // @description Adds extra information to different pages all around Torn.
  6. // @include *.torn.com/profiles.php?XID=*
  7. // @version 0.1.3
  8. // @require http://code.jquery.com/jquery-2.2.4.min.js
  9. // @require http://code.jquery.com/ui/1.12.1/jquery-ui.min.js
  10. // @resource jquery-ui http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/black-tie/jquery-ui.min.css
  11. // @resource jquery-base http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css
  12. // @grant GM_addStyle
  13. // @grant GM_getResourceText
  14. // ==/UserScript==
  15. // debugger;
  16. GM_addStyle(GM_getResourceText('jquery-base'));
  17. GM_addStyle(GM_getResourceText('jquery-ui'));
  18.  
  19. String.prototype.format = function() {
  20. var formatted = this;
  21. for (var i = 0; i < arguments.length; i++) {
  22. var regexp = new RegExp('\\{'+i+'\\}', 'gi');
  23. formatted = formatted.replace(regexp, arguments[i]);
  24. }
  25. return formatted;
  26. };
  27.  
  28. var data = {};
  29.  
  30. (function() {
  31. 'use strict';
  32.  
  33. var site = window.location.pathname;
  34.  
  35. loadData();
  36. saveOwnData();
  37.  
  38. loadAttackLog();
  39.  
  40.  
  41. if(site.indexOf('profiles.php') > 0) profileView();
  42.  
  43. })();
  44.  
  45. function loadAttackLog(){
  46. var selections = 'attacks';
  47. if('attackLogLoad' in data)
  48. //if(data.attackLogLoad > new Date().getTime() + (60*60*6))
  49. logAttacks(false);
  50. else
  51. logAttacks(true);
  52. }
  53.  
  54. function logAttacks(full){
  55. var selections = 'attacks' + (full ? 'full' : '');
  56. var url = 'https://api.torn.com/user/'+data.me.id+'?selections='+selections+'&key='+data.apikey;
  57. var now = new Date().getTime();
  58. if(!('attackLogLoad' in data) || data.attackLogLoad < now - (60*60*1000)){ // every one hour
  59. data.attackLogLoad = now;
  60.  
  61. apiCall(url, function(d) {
  62. if(d.error) getApiKey();
  63. else{
  64. for(var p in d.attacks){
  65. if (d.attacks.hasOwnProperty(p)) {
  66. var attack = d.attacks[p];
  67. var defender_id = attack.defender_id;
  68. if(!(defender_id in data)) data[defender_id] = {};
  69.  
  70. if(attack.attacker_id == data.me.id){
  71. // My attack
  72. if(!('attacks' in data[defender_id])) {console.log('Test'); data[defender_id].attacks = {};}
  73. data[defender_id].attacks[p] = attack;
  74. }else{
  75. // I'm being attacked
  76. }
  77. }
  78.  
  79. }
  80.  
  81. save();
  82. }
  83. });
  84. }
  85. }
  86.  
  87. function profileView(){
  88. var userid = getParameterByName('XID');
  89. var userData = data[userid];
  90. var content = '';
  91. content += profileViewSelectionPopUp(); // TODO: Figoure out how to call tampermonkey function from the injected code.
  92. content += '<div id="compareStats">';
  93. content += 'Loading...';
  94. content += '<br />';
  95. content += '</div>';
  96. // content += '<hr />';
  97. // content += '<b>Notes</b><br />';
  98. // content += getUserValue(userid, 'notes');
  99. // content += '<br />';
  100.  
  101. var block = $(
  102. '<div class="profile-wrapper medals-wrapper m-top10">' +
  103. '<div class="menu-header">Torn Helper</div>' +
  104. '<div class="profile-container"> ' +
  105. '<div class="profile-container-description">'+content+'</div>' +
  106. '</div>' +
  107. '<div class="clear"></div></div>');
  108.  
  109. $(block).insertAfter('.tutorial-cont + .profile-wrapper');
  110.  
  111. var compareFunc = function(){
  112. $('#compareStats').replaceWith(compareTemplate(userid, data.me.userid));
  113. };
  114. apiUserStats(userid, compareFunc);
  115. apiUserStats(data.me.userid, compareFunc);
  116. }
  117.  
  118. function profileViewSelectionPopUp(){
  119. var possibilities = possibleStats();
  120.  
  121. var popupHtml = '<div><fieldset><legend>Select:</legend>';
  122. for(var p in possibilities){
  123. var o = possibilities[p];
  124. var checked = inArray(p, data.profileview.display) ? 'checked' : '';
  125.  
  126. popupHtml += '<label for="checkbox'+p+'">'+o.display+'</label>: '+
  127. '<input type="checkbox" name="checkbox'+p+'" id="view'+p+'" '+checked+'> <br />';
  128. }
  129. popupHtml += '</fieldset></div>';
  130. var popup = popupWindow(
  131. {
  132. element: '#editProfileView',
  133. title: 'Edit Profile view'
  134. },
  135. popupHtml,
  136. [
  137. {
  138. 'display': 'Save',
  139. 'callback': function(){
  140. var selected = [];
  141. for(var p in possibleStats()){
  142. var checked = $("#view"+p).is(':checked');
  143. if(checked) selected.push(p);
  144. }
  145. data.profileview.display = selected;
  146. save();
  147. location.reload();
  148. }
  149. }
  150. ]
  151. );
  152.  
  153. var button = '<div style="float:right">' +
  154. '<button id="editProfileView">Edit</button></div>';
  155.  
  156. return button+popup;
  157. }
  158.  
  159. /**
  160. * Example usage:
  161. * popupWindow(
  162. * { 'element': '#myDialogButton', 'title': 'Hello World' },
  163. * '<h3>Something</h3><input type="text" id="myfield" />',
  164. * [{'display': 'Save',
  165. * 'close': false, // default: true
  166. * callback: function(){var something = $("#myfield").val();}
  167. * }]);
  168. */
  169. function popupWindow(e, content, buttons){
  170. var script = '<script>$("'+e.element+'").click(function(){$("#dialog-message").dialog({'+
  171. 'modal: true,'+
  172. 'draggable: true,'+
  173. 'resizable: true,'+
  174. 'position: [\'center\'],'+
  175. 'show: \'blind\','+
  176. 'hide: \'blind\','+
  177. 'width: 400,'+
  178. 'buttons: [';
  179. var test = '';
  180. for(var i = 0; i < buttons.length; i++){
  181. script += '{';
  182. script += 'text: \''+buttons[i].display+'\',';
  183. script += 'id: \'dialogButton'+i+'\'';
  184. script += '}';
  185.  
  186. // TODO: Fix this shit later!
  187. $(document).on('click','#dialogButton0', function(){
  188. buttons[0].callback();
  189. $("a.ui-dialog-titlebar-close")[0].click();
  190. });
  191. // TODO: Support multiple buttons!
  192. }
  193. // todo: remove last char
  194. script += ']}';
  195. script += ');});'+test;
  196.  
  197. script += '</script>';
  198.  
  199. var html = '<div id="dialog-message" title="'+e.title+'" style="display: none;">';
  200. html += content;
  201. html += '</div>';
  202. return script+html;
  203. }
  204.  
  205. function inArray(c, a){
  206. // Somehow $.inArray is not working? ?
  207. for(var i = 0; i < a.length; i++){
  208. if(c == a[i]) return true;
  209. }
  210. return false;
  211. }
  212.  
  213. function getUserValue(userid, property){
  214. var user = data[userid];
  215. if(user){
  216. if($.isArray(property)){
  217. for(var i = 0; i < property.length; i++){
  218. user = user[property[i]];
  219. }
  220. return user;
  221. }else{
  222. var userData = user[property];
  223. if(userData){
  224. return userData;
  225. }
  226. }
  227. }
  228. return -1;
  229. }
  230.  
  231. function setUserValue(userid, property, value){
  232. if(data[userid] === undefined) data[userid] = {};
  233. data[userid][property] = value;
  234. }
  235.  
  236. function save(){
  237. localStorage.setItem('jebster.torn', JSON.stringify(data));
  238. }
  239.  
  240. function saveOwnData(){
  241. if(!('me' in data) || !('id' in data.me) || data.me.id < 1){
  242. var url = 'https://api.torn.com/user/'+data.me.id+'?selections=basic&key='+data.apikey;
  243. apiCall(url, function(d) {
  244. id = d.player_id;
  245. data.me = {'id': id};
  246. save();
  247. });
  248. }
  249. }
  250.  
  251. function loadData(){
  252. data = localStorage.getItem('jebster.torn');
  253. if(data === undefined || data === null){
  254. // Default settings
  255. data = {
  256. profileview:{
  257. display: ['xantaken','logins','refills','useractivity']
  258. }
  259. };
  260. }else{
  261. data = JSON.parse(data);
  262. }
  263.  
  264. if(data.apikey === undefined || data.apikey === ''){
  265. getApiKey();
  266. }
  267. }
  268.  
  269. var asked = false;
  270. function getApiKey(){
  271. // Add some beautiful input/popup on the page itself
  272. if(asked) return; asked = true;
  273. var key = prompt('You API Key', 'key');
  274. if(!('me' in data)) data.me = {};
  275. data.apikey = key;
  276. save();
  277. }
  278.  
  279. function apiUserStats(userid, cb){
  280. var lastRequest = getUserValue(userid, 'lastRequest');
  281. var now = new Date();
  282. if(lastRequest === 0 || lastRequest < now.getTime() - (60*60*5*1000)){ // TODO:
  283. var selections = 'personalstats,basic';
  284. var url = 'https://api.torn.com/user/'+userid+'?selections='+selections+'&key='+data.apikey;
  285. apiCall(url, function(data) {
  286. if(data.error) getApiKey();
  287. else{
  288. setUserValue(userid, 'stats', data.personalstats);
  289. setUserValue(userid, 'lastRequest', now.getTime());
  290. setUserValue(userid, 'username', data.name);
  291. save();
  292. cb(data);
  293. }
  294. });
  295. }else{
  296. cb(data[userid].stats);
  297. }
  298. }
  299.  
  300. function compareTemplate(user1Id, user2Id){
  301.  
  302. var css = '<style>'+
  303. '.tornHelper{' +
  304. 'min-width:200px;' +
  305. '}' +
  306. '</style>';
  307.  
  308. var html = css+'<div class="profile-container basic-info"><ul class="basic-list">' +
  309. '<li>' +
  310. '<div class="user-information-section left"><span class="bold"></span></div>' +
  311. '<div class="user-information-section left tornHelper"><span class="bold">'+getUserValue(user1Id, 'username')+'</span></div>' +
  312. '<div class="tornHelper"><span class="bold">'+getUserValue(user2Id, 'username')+' (You)</span></div>' +
  313. '</li>';
  314.  
  315. var stats = possibleStats();
  316. for(var i = 0; i < data.profileview.display.length; i++){
  317. var display = stats[data.profileview.display[i]];
  318. if(stats[data.profileview.display[i]]){
  319. var user1Value = getUserValue(user1Id, display.apiname);
  320. var user2Value = getUserValue(user2Id, display.apiname);
  321.  
  322. user1Value = user1Value ? user1Value : 0;
  323. user2Value = user2Value ? user2Value : 0;
  324.  
  325. if(display.format){
  326. user1Value = display.format(user1Value);
  327. user2Value = display.format(user2Value);
  328. }
  329.  
  330. html += '<li>' +
  331. '<div class="user-information-section left"><span class="bold">' +
  332. display.display +
  333. '</span></div>' +
  334. '<div class="user-information-section left tornHelper">' +
  335. user1Value +'</div>' +
  336. '<div class="tornHelper">'+user2Value+'</div>' +
  337. '</li>';
  338. }
  339. }
  340. html += '</ul><hr />';
  341. var attacks = {hosp: {display: 'Hosped', times: 0}, mug: {display: 'Mugged', times: 0}, left: {display: 'Left', times: 0}, lost: {display: 'Lost', times: 0}};
  342. if('attacks' in data[user1Id]){
  343. for(var p in data[user1Id].attacks){
  344. var attack = data[user1Id].attacks[p];
  345.  
  346. switch(attack.result){
  347. case 'Mug':
  348. attacks.mug.times++;
  349. break;
  350. case 'Hospitalize':
  351. attacks.hosp.times++;
  352. break;
  353. case 'Leave':
  354. attacks.left.times++;
  355. break;
  356. case 'Lose':
  357. attacks.lost.times++;
  358. break;
  359. }
  360. }
  361. }
  362. html += 'Attacks you made against \''+getUserValue(user1Id, 'username')+'\'';
  363. html += '<ul class="basic-list">';
  364. for(var type in attacks){
  365. html += '<li>';
  366. html += '<div class="user-information-section left width112"><span class="bold">'+attacks[type].display+'</span></div>';
  367. html += attacks[type].times;
  368. html += '</li>';
  369. }
  370. html += '</ul></div>';
  371.  
  372. return html;
  373. }
  374.  
  375. function possibleStats(){
  376. return {
  377. attackswon:{apiname:['stats','attackswon'], display: 'Attacks Won'},
  378. attackslost:{apiname:['stats','attackslost'], display: 'Attacks Lost'},
  379. attacksdraw:{apiname:['stats','attacksdraw'], display: 'Attacks Draw'},
  380. attacksassisted:{apiname:['stats','attacksassisted'], display: 'Attacks Assisted'},
  381. defendswon:{apiname:['stats','defendswon'], display: 'Defends Won'},
  382. defendslost:{apiname:['stats','defendslost'], display: 'Defends Lost'},
  383. defendsstalemated:{apiname:['stats','defendsstalemated'], display: 'Defends Stalemated'},
  384. yourunaway:{apiname:['stats','yourunaway'], display: 'Run Aways'},
  385. theyrunaway:{apiname:['stats','theyrunaway'], display: 'Other Run Away'}, // TODO: Some better display text
  386. bestkillstreak:{apiname:['stats','bestkillstreak'], display: 'Best Kill Streak'},
  387. attackcriticalhits:{apiname:['stats','attackcriticalhits'], display: 'Attack Critical Hits'},
  388. attackhits:{apiname:['stats','attackhits'], display: 'Attack Hits'},
  389. attackmisses:{apiname:['stats','attackmisses'], display: 'Attack Misses'},
  390. roundsfired:{apiname:['stats','roundsfired'], display: 'Rounds Fired'},
  391. attacksstealthed:{apiname:['stats','attacksstealthed'], display: 'Attacks Stealthed'},
  392. moneymugged:{apiname:['stats','moneymugged'], display: 'Money Mugged'},
  393. largestmug:{apiname:['stats','largestmug'], display: 'Largest Mug'},
  394. highestbeaten:{apiname:['stats','highestbeaten'], display: 'Highest Level Beaten'},
  395. respectforfaction:{apiname:['stats','respectforfaction'], display: 'Respect For Faction'},
  396. itemsbought:{apiname:['stats','itemsbought'], display: 'Items Bought'},
  397. auctionswon:{apiname:['stats','auctionswon'], display: 'Auctions Won'},
  398. auctionsells:{apiname:['stats','auctionsells'], display: 'Auction Sells'},
  399. itemssent:{apiname:['stats','itemssent'], display: 'Items Sent'},
  400. trades:{apiname:['stats','trades'], display: 'Trades'},
  401. weaponsbought:{apiname:['stats','weaponsbought'], display: 'Weapons Bought'},
  402. pointssold:{apiname:['stats','pointssold'], display: 'Points Sold'},
  403. pointsbought:{apiname:['stats','pointsbought'], display: 'Points Bought'},
  404. bazaarcustomers:{apiname:['stats','bazaarcustomers'], display: 'Bazaar Customers'},
  405. bazaarsales:{apiname:['stats','bazaarsales'], display: 'Bazaar Sales'},
  406. bazaarprofit:{apiname:['stats','bazaarprofit'], display: 'Bazaar Profit'},
  407. jailed:{apiname:['stats','jailed'], display: 'Jailed'},
  408. peoplebusted:{apiname:['stats','peoplebusted'], display: 'People Busted'},
  409. failedbusts:{apiname:['stats','failedbusts'], display: 'Failed Busts'},
  410. peoplebought:{apiname:['stats','peoplebought'], display: 'People Bought out of Jail'},
  411. peopleboughtspent:{apiname:['stats','peopleboughtspent'], display: 'Money Spent on buying people out of jail'}, // TODO: Some shorter display text
  412. hospital:{apiname:['stats','hospital'], display: 'Hospital'},
  413. medicalitemsused:{apiname:['stats','medicalitemsused'], display: 'Medical Items Used'},
  414. bloodwithdrawn:{apiname:['stats','bloodwithdrawn'], display: 'Blood Withdrawn'},
  415. revives:{apiname:['stats','revives'], display: 'Revives'},
  416. revivesreceived:{apiname:['stats','revivesreceived'], display: 'Revives Received'},
  417. medstolen:{apiname:['stats','medstolen'], display: 'Medical Items Stolen'},
  418. //heahits:{apiname:['stats','heahits'], display: ''}, // TODO:
  419. //machits:{apiname:['stats','machits'], display: ''},
  420. //rifhits:{apiname:['stats','rifhits'], display: ''},
  421. //smghits:{apiname:['stats','smghits'], display: ''},
  422. //shohits:{apiname:['stats','shohits'], display: ''},
  423. //pishits:{apiname:['stats','pishits'], display: ''},
  424. //grehits:{apiname:['stats','grehits'], display: ''},
  425. //piehits:{apiname:['stats','piehits'], display: ''},
  426. //slahits:{apiname:['stats','slahits'], display: ''},
  427. //axehits:{apiname:['stats','axehits'], display: ''},
  428. //chahits:{apiname:['stats','chahits'], display: ''},
  429. mailssent:{apiname:['stats','mailssent'], display: 'Mail Sent'},
  430. friendmailssent:{apiname:['stats','friendmailssent'], display: 'Friend Mail Sent'},
  431. factionmailssent:{apiname:['stats','factionmailssent'], display: 'Faction Mail Sent'},
  432. companymailssent:{apiname:['stats','companymailssent'], display: 'Company Mail Sent'},
  433. spousemailssent:{apiname:['stats','spousemailssent'], display: 'Spouse Mail Sent'},
  434. classifiedadsplaced:{apiname:['stats','classifiedadsplaced'], display: 'Classified Newspaper Ads Placed'},
  435. personalsplaced:{apiname:['stats','personalsplaced'], display: 'Personal Newspaper Placed'},
  436. bountiesplaced:{apiname:['stats','bountiesplaced'], display: 'Bounties Placed'},
  437. totalbountyspent:{apiname:['stats','totalbountyspent'], display: 'Total Bounty Money Spent'},
  438. bountiescollected:{apiname:['stats','bountiescollected'], display: 'Bounties Collected'},
  439. totalbountyreward:{apiname:['stats','totalbountyreward'], display: 'Total Bounty Money Gained'},
  440. bountiesreceived:{apiname:['stats','bountiesreceived'], display: 'Bounties Received'},
  441. cityfinds:{apiname:['stats','cityfinds'], display: 'City Finds'},
  442. itemsdumped:{apiname:['stats','itemsdumped'], display: 'Items Dumped'},
  443. dumpsearches:{apiname:['stats','dumpsearches'], display: 'Dump Searches'},
  444. dumpfinds:{apiname:['stats','dumpfinds'], display: 'Dump Finds'},
  445. traveltimes:{apiname:['stats','traveltimes'], display: 'Travel Times'},
  446. itemsboughtabroad:{apiname:['stats','itemsboughtabroad'], display: 'Items Bought Abroad'},
  447. argtravel:{apiname:['stats','argtravel'], display: 'Argentina Traveled'},
  448. mextravel:{apiname:['stats','mextravel'], display: 'Mexico Traveled'},
  449. dubtravel:{apiname:['stats','dubtravel'], display: 'Dubai Traveled'},
  450. hawtravel:{apiname:['stats','hawtravel'], display: 'Hawaii Traveled'},
  451. japtravel:{apiname:['stats','japtravel'], display: 'Japan Traveled'},
  452. lontravel:{apiname:['stats','lontravel'], display: 'London Traveled'},
  453. soutravel:{apiname:['stats','soutravel'], display: 'South Africa Traveled'},
  454. switravel:{apiname:['stats','switravel'], display: 'Switzerland Traveled'},
  455. chitravel:{apiname:['stats','chitravel'], display: 'China Traveled'},
  456. cantravel:{apiname:['stats','cantravel'], display: 'Canada Traveled'},
  457. caytravel:{apiname:['stats','caytravel'], display: 'Cayman Islands Traveled'},
  458. drugsused:{apiname:['stats','drugsused'], display: 'Drug Used'},
  459. overdosed:{apiname:['stats','overdosed'], display: 'Drug Overses'},
  460. cantaken:{apiname:['stats','cantaken'], display: 'Canabis Taken'},
  461. exttaken:{apiname:['stats','exttaken'], display: 'Ecstasy Taken'},
  462. kettaken:{apiname:['stats','kettaken'], display: 'Ketamine Taken'},
  463. lsdtaken:{apiname:['stats','lsdtaken'], display: 'LSD Taken'},
  464. opitaken:{apiname:['stats','opitaken'], display: 'Opium Taken'},
  465. shrtaken:{apiname:['stats','shrtaken'], display: 'Shrooms Taken'},
  466. spetaken:{apiname:['stats','spetaken'], display: 'Speed Taken'},
  467. pcptaken:{apiname:['stats','pcptaken'], display: 'PCP Taken'},
  468. xantaken:{apiname:['stats','xantaken'], display: 'Xanax Taken'},
  469. victaken:{apiname:['stats','victaken'], display: 'Vicodin Taken'},
  470. networth:{apiname:['stats','networth'], display: 'Networth', format: formatMoney},
  471. logins:{apiname:['stats','logins'], display: 'Logins'},
  472. useractivity:{apiname:['stats','useractivity'], display: 'Time Played', format: formatSeconds},
  473. meritsbought:{apiname:['stats','meritsbought'], display: 'Merits Bought'},
  474. refills:{apiname:['stats','refills'], display: 'Refills'},
  475. trainsreceived:{apiname:['stats','trainsreceived'], display: 'Trains Received'},
  476. spydone:{apiname:['stats','spydone'], display: 'Spies Done'},
  477. statenhancersused:{apiname:['stats','statenhancersused'], display: 'Stat Enhancers Used'},
  478. virusescoded:{apiname:['stats','virusescoded'], display: 'Viruses Coded'},
  479. daysbeendonator:{apiname:['stats','daysbeendonator'], display: 'Days Been Donator'},
  480. missionscompleted:{apiname:['stats','missionscompleted'], display: 'Missions Completed'},
  481. contractscompleted:{apiname:['stats','contractscompleted'], display: 'Contracts Completed'},
  482. dukecontractscompleted:{apiname:['stats','dukecontractscompleted'], display: 'Duke Contracts Completed'},
  483. missioncreditsearned:{apiname:['stats','missioncreditsearned'], display: 'Mission Credits Earned'}
  484. };
  485. }
  486.  
  487. function apiCall(url, cb){
  488. console.log(url);
  489. $.ajax({
  490. url: url,
  491. type: 'GET',
  492. success: function(data) {
  493. cb(data);
  494. },
  495. //async: false
  496. });
  497. }
  498.  
  499. function removeFirstAndLastLine(text){
  500. var lines = text.split('\n');
  501. lines.splice(0,1);
  502. lines.splice(-1,1);
  503. var newtext = lines.join('\n');
  504. }
  505.  
  506. function formatSeconds(s){
  507. var minutes = Math.floor(s/60)%60;
  508. var hours = Math.floor(s/(60*60))%24;
  509. var days = Math.floor(s/(60*60*24));
  510. var seconds = s%60;
  511.  
  512. return '{0}d {1}h {2}m {3}s'.format(days, hours, minutes, seconds);
  513. }
  514.  
  515. function formatNumber(n){
  516. return n;
  517. }
  518.  
  519. function formatMoney(m){
  520. return '$'+m.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
  521. }
  522.  
  523. // Taken from: http://stackoverflow.com/a/15724300/1832471
  524. function getCookieValue(name) {
  525. var nameEQ = name + "=";
  526. var ca = document.cookie.split(';');
  527. for(var i=0;i < ca.length;i++) {
  528. var c = ca[i];
  529. while (c.charAt(0)==' ') c = c.substring(1,c.length);
  530. if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length,c.length);
  531. }
  532. return null;
  533. }
  534.  
  535. // Taken from: http://stackoverflow.com/a/901144/1832471
  536. function getParameterByName(name, url) {
  537. if (!url) {
  538. url = window.location.href;
  539. }
  540. name = name.replace(/[\[\]]/g, "\\$&");
  541. var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
  542. results = regex.exec(url);
  543. if (!results) return null;
  544. if (!results[2]) return '';
  545. return decodeURIComponent(results[2].replace(/\+/g, " "));
  546. }
  547.  
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.  
  561.  
  562.