function levelxp(targetlev) { // (c) tip.it
  var test = 0;
  var counter1 = 0;

  for (clvl = 1; clvl < targetlev; test = Math.floor(counter1 / 4), clvl++) 
  {
	diff = Math.floor(clvl + 300 * Math.pow(2, clvl / 7));
	counter1 += diff;
  }
  return test;
}

function xplevel(exp) // (c) tip.it
{
  var points = 0;
  var output = 0;
  for (var lvl = 1; lvl <= 150; lvl++)
  {
    points += Math.floor(lvl + 300 * Math.pow(2, lvl / 7.))
    if (lvl >= 1)
	{
      if (output > exp)
      {
        lvl = lvl - 1;
		if (lvl == "0")	{  return "1";	}
		else if (lvl > "99")	{  return "99";	}
		else 			{  return lvl;  }
      }
      output = Math.floor(points / 4);
    }
  }
  return 0;
}


function runecalc() // (c) tip.it
{ 
  if (typeof(document.output) == 'undefined') {
	  // We're not done loading. Exit 
	  return false
  }
  var totalxp = document.output.playerxp.value;
  totalxp = totalxp.replace(',','');
  var printhtml = "";
  var type = document.output.targetselect.selectedIndex;  // Target Type (Level or XP)
  var neededlevel; // Target level input by user, or level corresponding to target XP
  var neededxp;    // Target XP input by user, or XP corresponding to target level

  if (type == 0)  // (Target Type == Target Level)
  { 
    neededlevel = document.output.selectlv.value;
    if (neededlevel < 2)
    {
      neededlevel = 2;
      document.output.selectlv.value = 2;
    }    
    neededxp = levelxp(neededlevel);
  }
  else  // (Target Type == Target XP)
  { 
    neededxp = document.output.selectxp.value;
    if (neededxp > 200000000)
    {
      neededxp = 200000000;
      document.output.selectxp.value = 200000000;
    }
    neededlevel = xplevel(neededxp);
  }

  var diffexp = neededxp - totalxp;
  var penguinpoints = calc_needed_PP(totalxp, neededxp)
  if (totalxp < 0) 
  {
    document.output.playerxp.value = 0;
    totalxp = 0;
  }

  totalxp = Math.round(totalxp)
  
  if (type == 0)
  {
    printhtml = "<span class=\"nextlevel\">For Level "+neededlevel+", you need <b>"+outputComma(diffexp)+" XP</b>";
    printhtml = printhtml+"<br> Or <b>"+penguinpoints+"</b> <a href=\"?page=penguin_hide_and_seek.htm#rewards\">Penguin Points</a></span> <center><table width=\"100%\" border=\"1\" cellspacing=\"0\" cellpadding=\"3\">";
  }
  else
  {
    printhtml = "<span class=\"nextlevel\">To get a total of "+outputComma(neededxp)+" XP,<br />you will need to earn <b>"+outputComma(diffexp)+" XP</b>";
    printhtml = printhtml+"<br> Or <b>"+penguinpoints+"</b> penguin points</span> <center><table width=\"100%\" border=\"1\" cellspacing=\"0\" cellpadding=\"3\">";
  }

  if (typeof(formula) == 'undefined') {
	printhtml = printhtml + "<tr bgcolor=\"#333333\"><td><b><font color=\"#FFFFFF\">Number</font></b></td><td><b><font color=\"#FFFFFF\">Name</font></b></td><td><b><font color=\"#FFFFFF\">Lvl</font></b></td><td><b><font color=\"#FFFFFF\">XP</font></b></td></tr>";
  } else {
	printhtml = printhtml + "<tr bgcolor=\"#333333\"><td><b><font color=\"#FFFFFF\">Number</font></b></td><td><b><font color=\"#FFFFFF\">Name</font></b></td><td><b><font color=\"#FFFFFF\">Lvl</font></b></td><td><b><font color=\"#FFFFFF\">XP</font></b></td><td><b><font color=\"#FFFFFF\">Price</font></b></td><td><b><font color=\"#FFFFFF\">Total cost</font></b></td></tr>";
  }

  for(count = 0; count < itemname.length; count++) 
  {
    color = "bgcolor=\"#C73333\"";
  
    if (limitxp[count] < neededlevel)  
      color = "bgcolor=\"#3A9D19\"";
  
    if (limitxp[count] == neededlevel)  
      color = "bgcolor=\"#D4B00A\"";
  
    numitems = outputComma( (Math.ceil(diffexp/itemxp[count])));
	itemsxp = outputCommaDecimal(itemxp[count]);

	// Return the price columns only if the formula array exists
	if (typeof(formula) != 'undefined') {
		price = 0;
		// If no formula is defined we return 0 as price
		// If the prices array has not yet been loaded we return 0 as price
		if (typeof(formula[count]) != 'undefined' && typeof(prices) != 'undefined') {
			formulas = formula[count].toString().split(',');
			for(ix1=0; ix1<formulas.length; ix1++) {
				ids = formulas[ix1].toString().split('+');
				for(ix2=0; ix2<ids.length; ix2++) {
					form = ids[ix2].toString().split('*');
					if (form.length == 1) {
						itemid = form[0];
						price = price + prices[itemid];
					} else {
						itemid = form[1];
						price = price + (form[0] * prices[itemid]);
					}
				}
			}
		}
		total = outputComma( price * Math.ceil(diffexp/itemxp[count]));
	    printhtml = printhtml + "<tr><td " + color + ">" + numitems + "</b></td><td " + color + ">" + itemname[count] + "</td><td " + color + ">" + limitxp[count] + "</td><td " + color + ">" + itemsxp + "</td><td " + color + ">" + price + "</td><td " + color + ">" + total + "</td></tr>"
	} else {
	    printhtml = printhtml + "<tr><td " + color + ">" + numitems + "</b></td><td " + color + ">" + itemname[count] + "</td><td " + color + ">" + limitxp[count] + "</td><td " + color + ">" + itemsxp + "</td></tr>"
	}
  }

  printhtml = printhtml + "</table></center>";

  if (document.all)
  {
    printtable.innerHTML = printhtml;
    if (type == 0){document.getElementById("neededlvlexp").innerHTML = "(" + outputComma(neededxp) + " XP)";}
    else {document.getElementById("neededlvlexp").innerHTML = "(Level " + xplevel(neededxp) + ")";}
  }
  
  if (document.getElementById)
  {
    document.getElementById("printtable").innerHTML = printhtml;
    if (type == 0){document.getElementById("neededlvlexp").innerHTML = "(" + outputComma(neededxp) + " XP)";}
    else {document.getElementById("neededlvlexp").innerHTML = "(Level " + xplevel(neededxp) + ")";}
    document.getElementById('playerlvl').innerHTML = "(Level " + xplevel(totalxp) + ")";
  }

  return false
}

function outputCommaDecimal(number)
{
	number += '';
	x = number.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

function outputComma_OLD(number) // (c) irt.org
{
  number = '' + number;
  if (number.length > 3) 
  {
    var mod = number.length%3;
	var output = (mod > 0 ? (number.substring(0,mod)) : '');
	
	for (i=0 ; i < Math.floor(number.length/3) ; i++) 
	{
	  if ((mod ==0) && (i ==0))
	  output += number.substring(mod+3*i,mod+3*i+3);
	  
	  else
	  output += ',' + number.substring(mod+3*i,mod+3*i+3);
	}
	
	return (output);
  }
  
  else 
  return number;
}

function outputComma(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

function getCookie(c_name) // (c) http://www.w3schools.com
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=")
  if (c_start!=-1)
    { 
    c_start=c_start + c_name.length+1 
    c_end=document.cookie.indexOf(";",c_start)
    if (c_end==-1) c_end=document.cookie.length
    return unescape(document.cookie.substring(c_start,c_end))
    } 
  }
  return '';
}

function tipstats(calc) // (c) Tip.It
{
  var cookie = getCookie("tipstat").split(";");
  var value = "0";
  var name = ""
  for (var i in cookie)
  {    
    var cookie_values = cookie[i].toString().split(":");
	if (cookie_values['0'] == calc)
	{
	  value = cookie_values['1'];
	}
  }
  if (value != '0')
  {
    document.getElementById('playerxp').value = value;
    document.getElementById('playerlvl').innerHTML = "(Level " + xplevel(value) + ")";
	if (xplevel(value) > "98") { document.getElementById('selectlv').value = "99"; }
	else { document.getElementById('selectlv').value = xplevel(value) + 1; }
  }  
  document.getElementById('playername').value = getCookie("tipname");
  document.getElementById('selectlv').focus();
}

function calc_needed_PP(playerxp, targetxp) {
    var expdiff = targetxp-playerxp;
    var points = 0;
    
    while (expdiff > 0) {
        currentlvl = xplevel(playerxp);
        pointxp = currentlvl*25;
        xptolvl = (currentlvl < 99) ? levelxp(currentlvl+1)-playerxp : expdiff;
        pointstolvl = Math.floor(xptolvl/pointxp)+1;
        points += pointstolvl;
        xpgained = pointstolvl*pointxp;
        playerxp = parseInt(playerxp)+parseInt(xpgained);
        expdiff-=xpgained;
    }
    return outputComma(points);
}
