URL Shortner (Concise)

http://stackoverflow.com/questions/742013/how-to-code-a-url-shortener http://mathbits.com/MathBits/CompSci/Introduction/tobase10.htm

by kshep92

HTML

<div id="message">
</div>

<div>
  <table cellspacing="10" id="debug">
    
  </table>
</div>

CSS

body {
  font-family: sans-serif;
}

div {
  margin: 10px 0;
  line-height: 1.4;
}

td.head { font-weight: bold; }

JavaScript

var alphabet = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789".split("")
var base = alphabet.length;

function encode(id) {
  var encoded = [];
  while(id > 0) {
  	encoded.push(alphabet[id % base]);
    id = parseInt(id/base);
  }
  return encoded.reverse().join("");
}

function decode(shortCode) {
	var decoded = 0;
  var indexes = [];
  shortCode.split("").forEach((char) => {
  	indexes.push(alphabet.indexOf(char));
  });
  indexes.reverse().forEach((elm, idx) => {
  	decoded += elm * Math.pow(base, idx);
  });
  if(decoded < 0) return null;
  return decoded;
}

function generateNumber() {
	var number = '';
  var excluded= [0,1];
  for(var i=0; i<12; i++) {
  	var n;
    do {
    	n = Math.floor(Math.random() * 10);
    } while(exluded.indexOf(n) != -1);
  	number += n;
  }
  return number;
}

function truncate(str, len) {
	return str.length > len ? str.substring(0, len-3).trim() + "..." : str;
}

function pin() { return Math.floor(Math.random() * 8999) + 1000; }

var giftCertNumber = generateNumber();
var shortCode = encode(giftCertNumber);
var msg = `You've received a $500.00 ${truncate("Francis Fashions Shoe Locker", 25)} gift certificate! Visit https://giftexpress.co/g/${shortCode} to claim it.`;

document.getElementById('message').innerText = msg;

var debugText = `
		<tr>
      <td class="head">Message Length</td>
      <td>${msg.length}</td>
    </tr>
    <tr>
      <td class="head">Gift Card # (plain)</td>
      <td>GXP-${giftCertNumber}</td>
    </tr>
    <tr>
      <td class="head">Gift Card # (decoded)</td>
      <td>GXP-${decode(shortCode)}</td>
    </tr>
    <tr>
      <td class="head">Gift Card # (encoded)</td>
      <td>${shortCode}</td>
    </tr>
`;

document.getElementById('debug').innerHTML = debugText;