Minecraft xp calculator

Compute xp and level information given the total xp value

by Mr Pingouin

HTML

<div>
  Total xp point :<br>
  <input id="xpInput" type="text" value="0">
  <button onclick="compute(true);">Set</button>
  <button onclick="compute(false);">Add</button>
  <button onclick="resetXp(true);">Reset</button>
  <button onclick="findPair();">Find Pair</button>
  <p>
    Result :<br>
    <span id="xpOutput"></span>
  </p>
</div>

JavaScript

function XpHelper(){
	this.xpLevel = 0;
  this.xpTotal = 0;
  this.experience = 0;
  
  this.getXpPoint = function(){
  	return Math.round(this.experience * this.getXpBarCap());
  }
  this.getXpToNext = function(){
  	return Math.round((1.0 - this.experience) * this.getXpBarCap());
  }
	this.getXpBarCap = function() {
    if (this.xpLevel >= 30) {
      return 112 + (this.xpLevel - 30) * 9;
    }
    if (this.xpLevel >= 15) {
      return 37 + (this.xpLevel - 15) * 5;
    }
    return 7 + this.xpLevel * 2;
  }
  
  this.addXP = function(amount) {
        this.experience += amount/this.getXpBarCap();
        this.xpTotal = clamp(this.xpTotal + amount, 0, 2147483647);
        while (this.experience >= 1){
            this.experience = (this.experience - 1.0) * this.getXpBarCap();
            this.xpLevel += 1;
            this.experience /= this.getXpBarCap();
        }
    }
}

var xpObj = new XpHelper();

function compute(reset_xp){
	var xpInput = parseInt(document.getElementById("xpInput").value);
  if(reset_xp){
  	resetXp(false);
  }
  xpObj.addXP(xpInput);
  document.getElementById("xpOutput").innerHTML = getResult(xpObj);
}

function resetXp(redraw){
	xpObj = new XpHelper();
  if(redraw){
  	document.getElementById("xpOutput").innerHTML = getResult(xpObj);
	}
}

function clamp(value, min, max){
	if(value < min){return min;}
  if(value > max){return max;}
  return value;
}

function findPair(){
	var xpInput = parseInt(document.getElementById("xpInput").value);
  
  var min = 1;
  var sol = [-1, -1];
  for(var i = 1; i < xpInput; i++){
  	var base_xp = new XpHelper();
    base_xp.addXP(i)
    base_xp.addXP(xpInput - i)
    var progress = base_xp.experience
    if(progress < min && progress > 0.5){
    	max = progress;
    	sol = [i, xpInput - i];
    }
  }
	document.getElementById("xpOutput").innerHTML = sol;
}

function getResult(xpObj){
	var builder = "";
  builder += "Level " + xpObj.xpLevel + "<br>";
  builder += "Progress " + xpObj.experience*100 +...