//requires md5.js
//requires CwsUtil.js

function DataEncUtil(courseId,masterCode)
{
  //this.empIdDigitLength = 5;
  this.pwdLength = 8;
  this.completionHashLength = 4;
  this.markHashLength = 4;
  this.srcChars = new Array("9","D","2","A","3","B","4","C","5","E","F","6","G","H","7","J","8","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z");
  this.masterCode = masterCode;
  
  this.generatePassword = function(empId) {
    var password = "";
    var keyData = this.padZeros(empId,this.empIdDigitLength) + this.masterCode;
    var hash = hex_md5(keyData);
    password = hash.substring(0,this.pwdLength);
    return password.toUpperCase();
  }

  this.generateBookmark = function(kloNum,kloPageNum,time)  {
    var bookmark = "1" + this.padZeros(kloNum,2) + this.padZeros(kloPageNum,2) + time;
    return bookmark;
  }

  this.generateBookmarkCode = function(empId,mark) {
    var bookmarkCode = "";
    var alphaMark = this.convertDecimalToAlpha(parseInt(mark,10));
    //var keyData = alphaMark + this.padZeros(empId,this.empIdDigitLength) + courseId + this.masterCode;
    var keyData = alphaMark + empId + courseId + this.masterCode;
    var hash = hex_md5(keyData);
    bookmarkCode = sanitizeHash(hash.substring(0,this.markHashLength)) + alphaMark;
  	return bookmarkCode.toUpperCase();
  }

  this.decodeBookmarkCode = function(empId, bookmarkCode) {
    var mark = "";
    var markHash = bookmarkCode.substring(0,this.markHashLength);
    var alphaMark = bookmarkCode.substring(this.markHashLength,bookmarkCode.length);
    //var keyData = alphaTime + padZeros(empId,this.empIdDigitLength) + courseId + this.masterCode;
    var keyData = alphaMark + empId + courseId + this.masterCode;
    var hash = hex_md5(keyData);
    hash = sanitizeHash(hash.substring(0,this.markHashLength));
    if (hash == markHash.toUpperCase()) {
      mark = this.convertAlphaToDecimal(alphaMark) + "";
      mark = mark.substring(1,mark.length);
    }
    return mark;
  }

  this.generateCompletionCode = function(empId,score,time)  {
    var completionCode = "";
    var alphaData = this.convertDecimalToAlpha("1" + this.padZeros(score,3) + time);
    //var keyData = alphaTime + this.padZeros(empId,this.empIdDigitLength) + courseId + this.masterCode;
    var keyData = alphaData + empId + courseId + this.masterCode;
    var hash = hex_md5(keyData);
    completionCode = sanitizeHash(hash.substring(0,this.completionHashLength)) + alphaData;
  	return completionCode.toUpperCase();
  }

  this.decodeCompletionCode = function(empId, completionCode) {
    var data = -1;
    var codeHash = completionCode.substring(0,this.completionHashLength);
    var alphaData = completionCode.substring(this.completionHashLength,completionCode.length);
    //var keyData = alphaTime + padZeros(empId,this.empIdDigitLength) + courseId + this.masterCode;
    var keyData = alphaData + empId + courseId + this.masterCode;
    var hash = hex_md5(keyData);
    hash = sanitizeHash(hash.substring(0,this.completionHashLength));
    if (hash == codeHash.toUpperCase()) {
      data = this.convertAlphaToDecimal(alphaData);
    }
    return data;
  }

  this.convertAlphaToDecimal = function(alpha)  {
    var number = CwsUtil.itemIndexInArray(alpha.substring(alpha.length-1,alpha.length),this.srcChars);
  	for (q=1;q<alpha.length;q++)	{
  		var alphaDigit = alpha.substring(q-1,q);
      var exponent = alpha.length - q;
  		var numberDigit = CwsUtil.itemIndexInArray(alphaDigit,this.srcChars);
  		var product = this.getNumPower(this.srcChars.length-1,exponent);
  		number += product * numberDigit;
  	}
  	return number;
  }

  this.convertDecimalToAlpha = function(number) {
    var numDigits = 1;
  	var doit = true;
  	while (doit)
  	{
  		numDigits += 1;
  		var tmpNumber = Math.floor(number / this.getNumPower(this.srcChars.length-1,numDigits-1));
  		if (tmpNumber <= (this.srcChars.length-1))	{
  		  doit = false;
  		}
  	}
    var alpha = "";
  	for (i=numDigits-1; i>0; i--)	{
      var tmpNumber = number;
      if (number > (this.srcChars.length-1))  {
    		tmpNumber = Math.floor(number / this.getNumPower((this.srcChars.length-1),i));
      }
  		alpha += this.srcChars[tmpNumber];
  		number -= (this.getNumPower((this.srcChars.length-1),i) * tmpNumber);
  		if ((number < this.srcChars.length) && (number > -1))	{
				alpha += this.srcChars[number];
  		}
  	}
  	return alpha;
  }

  this.padZeros = function(number, numDigits) {
    var zeros = "";
    var numZeros = 0;
    var i = 0;
    number += "";
  	if (number.length < numDigits)	{
  		numZeros = numDigits - number.length;
  		for (i=0; i < numZeros; i++)	{
  			zeros += "0";
  		}
  	}
  	return zeros + number;
  }

  this.getNumPower = function(number, exponent) {
  	var product = 1;
  	for (z=1; z<=exponent; z++)	{
  		product *= number;
  	}
  	return product;
  }

  function sanitizeHash(hash) {
      hash = hash.toUpperCase();
      hash = CwsUtil.replaceChar("0","7",hash);
      hash = CwsUtil.replaceChar("1","5",hash);
      hash = CwsUtil.replaceChar("O","F",hash);
      hash = CwsUtil.replaceChar("I","Z",hash);
      return hash;
  }
}