//constants
var CONST_METHOD_HTML = 0;
var CONST_METHOD_ALERT = 1;
var CONST_METHOD_FUNCTION = 2;

var CONST_GENERATE_PWD = "pwd_generate";
var CONST_VALIDATE_PWD = "pwd_validate";
var CONST_GENERATE_COMP_CODE = "comp_generate";
var CONST_DECODE_COMP_CODE = "comp_decode";
var CONST_GENERATE_BOOKMARK_CODE = "bookmark_generate";
var CONST_DECODE_BOOKMARK_CODE = "bookmark_decode";
var CONST_GENERATE_VERIFY_CODE = "verify_generate";

var CONST_MOVIE_PATH = "includes/karta_enc_util_rt.swf";
var CONST_MOVIE_COLOR = "#FFFFFF";
var CONST_MOVIE_WIDTH = "5";
var CONST_MOVIE_HEIGHT = "5";

function CourseEncUtil(courseID,thisVarName){
  var mPID = -1;
  var params = new Array();
  var values = new Array();
  var outputTypeIDs = new Array();
  var outputObj = new DataOutput();
  
  var containerObj = null;
  
  this.getOutputObj = function()  {
    return(outputObj);
  }
 
  this.generatePassword = function(emp_id, outputTypeID) {
    mPID += 1;
    params[mPID] = new Array();
    values[mPID] = new Array();
    params[mPID][0] = "action";
    values[mPID][0] = CONST_GENERATE_PWD;
    params[mPID][1] = "emp_id";
    values[mPID][1] = emp_id.toString();
    params[mPID][2] = "util_obj";
    values[mPID][2] = thisVarName;
    outputTypeIDs[mPID] = outputTypeID;
    this.doRequest(mPID);
    return(mPID);
  }
  
this.validatePassword = function(emp_id, pwd, outputTypeID) {
    mPID += 1;
    params[mPID] = new Array();
    values[mPID] = new Array();
    params[mPID][0] = "action";
    values[mPID][0] = CONST_VALIDATE_PWD;
    params[mPID][1] = "emp_id";
    values[mPID][1] = emp_id.toString();
    params[mPID][2] = "pwd";
    values[mPID][2] = pwd.toString();
    params[mPID][3] = "util_obj";
    values[mPID][3] = thisVarName;
    outputTypeIDs[mPID] = outputTypeID;
    this.doRequest(mPID);
    return(mPID);
  }
  
  this.generateCompletion = function(emp_id,time,verification_code,outputTypeID) {
    mPID += 1;
    params[mPID] = new Array();
    values[mPID] = new Array();
    params[mPID][0] = "action";
    values[mPID][0] = CONST_GENERATE_COMP_CODE;
    params[mPID][1] = "emp_id";
    values[mPID][1] = emp_id.toString();
    params[mPID][2] = "time";
    values[mPID][2] = time;
    params[mPID][3] = "code";
    values[mPID][3] = verification_code;
    params[mPID][4] = "course_id";
    values[mPID][4] = courseID;
    params[mPID][5] = "util_obj";
    values[mPID][5] = thisVarName;
    outputTypeIDs[mPID] = outputTypeID;
    this.doRequest(mPID);
    return(mPID);
  }
  
  this.decodeCompletion = function(emp_id,completion_code,outputTypeID) {
    mPID += 1;
    params[mPID] = new Array();
    values[mPID] = new Array();
    params[mPID][0] = "action";
    values[mPID][0] = CONST_DECODE_COMP_CODE;
    params[mPID][1] = "emp_id";
    values[mPID][1] = emp_id.toString();
    params[mPID][2] = "code";
    values[mPID][2] = completion_code;
    params[mPID][3] = "course_id";
    values[mPID][3] = courseID;
    params[mPID][4] = "util_obj";
    values[mPID][4] = thisVarName;
    outputTypeIDs[mPID] = outputTypeID;
    this.doRequest(mPID);
    return(mPID);
  }
  
  this.generateBookmark = function(emp_id,mark,verification_code,outputTypeID) {
    mPID += 1;
    params[mPID] = new Array();
    values[mPID] = new Array();
    params[mPID][0] = "action";
    values[mPID][0] = CONST_GENERATE_BOOKMARK_CODE;
    params[mPID][1] = "emp_id";
    values[mPID][1] = emp_id.toString();
    params[mPID][2] = "mark";
    values[mPID][2] = mark;
    params[mPID][3] = "code";
    values[mPID][3] = verification_code;
    params[mPID][4] = "course_id";
    values[mPID][4] = courseID;
    params[mPID][5] = "util_obj";
    values[mPID][5] = thisVarName;
    outputTypeIDs[mPID] = outputTypeID;
    this.doRequest(mPID);
    return(mPID);
  }
  
  this.decodeBookmark = function(emp_id,mark_code,outputTypeID) {
    mPID += 1;
    params[mPID] = new Array();
    values[mPID] = new Array();
    params[mPID][0] = "action";
    values[mPID][0] = CONST_DECODE_BOOKMARK_CODE;
    params[mPID][1] = "emp_id";
    values[mPID][1] = emp_id.toString();
    params[mPID][2] = "code";
    values[mPID][2] = mark_code;
    params[mPID][3] = "course_id";
    values[mPID][3] = courseID;
    params[mPID][4] = "util_obj";
    values[mPID][4] = thisVarName;
    outputTypeIDs[mPID] = outputTypeID;
    this.doRequest(mPID);
    return(mPID);
  }
  
  this.generateVerify = function(emp_id,outputTypeID) {
    mPID += 1;
    params[mPID] = new Array();
    values[mPID] = new Array();
    params[mPID][0] = "action";
    values[mPID][0] = CONST_GENERATE_VERIFY_CODE;
    params[mPID][1] = "emp_id";
    values[mPID][1] = emp_id.toString();
    params[mPID][2] = "course_id";
    values[mPID][2] = courseID;
    params[mPID][3] = "util_obj";
    values[mPID][3] = thisVarName;
    outputTypeIDs[mPID] = outputTypeID;
    this.doRequest(mPID);
    return(mPID);
  }
  
  this.generateAdminComp = function(emp_id,time,outputTypeID)  {
    mPID += 1;
    params[mPID] = new Array();
    values[mPID] = new Array();
    params[mPID][0] = "action";
    values[mPID][0] = "verify_generate";
    params[mPID][1] = "emp_id";
    values[mPID][1] = emp_id.toString();
    params[mPID][2] = "course_id";
    values[mPID][2] = courseID;
    params[mPID][3] = "time";
    values[mPID][3] = time;
    params[mPID][4] = "outputTypeID";
    values[mPID][4] = outputTypeID;
    params[mPID][5] = "util_obj";
    values[mPID][5] = thisVarName;

    outputTypeIDs[mPID] = outputObj.createOutputType(CONST_METHOD_FUNCTION,thisVarName + ".completeAdminComp","");
    this.doRequest(mPID);
    return(mPID);
  }
  
  this.completeAdminComp = function(pid,verification_code) {
    var time = this.getRequestValue(pid,"time");
    var emp_id = this.getEmployeeID(pid);
    var outputTypeID = this.getRequestValue(pid,"outputTypeID");
    mPID += 1;
    params[mPID] = new Array();
    values[mPID] = new Array();
    params[mPID][0] = "action";
    values[mPID][0] = "comp_generate";
    params[mPID][1] = "emp_id";
    values[mPID][1] = emp_id.toString();
    params[mPID][2] = "time";
    values[mPID][2] = time;
    params[mPID][3] = "code";
    values[mPID][3] = verification_code;
    params[mPID][4] = "course_id";
    values[mPID][4] = courseID;
    params[mPID][5] = "util_obj";
    values[mPID][5] = thisVarName;
    outputTypeIDs[mPID] = outputTypeID;
    this.doRequest(mPID);
    return(mPID);
  }
  
  this.getEmployeeID = function(pid) {
    return this.getRequestValue(pid,"emp_id");
  }
  
  this.getOutputMethodType = function(pid) {
    return outputTypeIDs[pid];
  }
  
  this.getRequestValue = function(pid,key) {
    var return_value = "";
    index = this.getIndex(params[pid],key);
    if (index > -1)
      return_value = values[pid][index];
    return return_value;
  }
  
  this.getRequestValues = function(pid) {
    return values[pid];
  }
  
  this.doRequest = function(pid) {
    if (params[pid].length > 0) {
      containerObj = document.createElement("SPAN");
      document.body.appendChild(containerObj);
      var tmpRequest = new FlashRequest(pid.toString(),containerObj);
      for (i=0;i<params[pid].length;i++)  {
        tmpRequest.setParam(params[pid][i],values[pid][i]);
      }
      tmpRequest.sendRequest();
    }
  }
  
  this.output = function(pid,result)  {
    //clear html flash movie container object
    if (containerObj.hasChildNodes())  {
      var tmpNode = containerObj.firstChild;
      containerObj.removeChild(tmpNode);
    }
    outputObj.outputData(pid,result,outputTypeIDs[pid]);
  }
  
  this.getIndex = function(tmpArray,tmpValue)  {
    idx = -1;
    for (i=0;i<tmpArray.length;i++)  {
      if (tmpArray[i] == tmpValue)
        idx = i;
    }
    return idx;
  }
}

function DataOutput() {
  var outputMethods = new Array();
  var outputText = new Array();
  var outputHTMLObjs = new Array();
  var mPID = -1;
  
  this.createOutputType = function(tmpMethod,tmpText,tmpObjID) {
    mPID += 1;     
    outputMethods[mPID] = tmpMethod;
    outputText[mPID] = tmpText;
    outputHTMLObjs[mPID] = tmpObjID;
    return mPID;
  }

  this.outputData = function(pid,result,outputTypeID)  {
    //alert(outputTypeID);
    index = parseFloat(outputTypeID);
    if ((index <= mPID) && (index > -1))  {         
      var method = outputMethods[index];
      var text = outputText[index];
      var HTMLObjID = outputHTMLObjs[index];
           
      if (method == CONST_METHOD_ALERT)  {
        alert(text + result);
      }
      
      if (method == CONST_METHOD_FUNCTION) {
        eval(text + "('" + pid + "','" + result + "');");
      }

      if (method == CONST_METHOD_HTML) {
        var HTMLObj = document.getElementById(HTMLObjID);
        if (HTMLObj.hasChildNodes())  {
          var tmpNode = HTMLObj.firstChild;
          HTMLObj.removeChild(tmpNode);
        }
        var element = document.createElement("DIV");
        element.setAttribute("style","font-family:arial;font-size:12px;");
        var txtNode = document.createTextNode(text + result);
        element.appendChild(txtNode);
        HTMLObj.appendChild(element);
      }
    }
    else  {
      alert("Output data type for PID " + pid.toString() +  " was not found. Result output aborted.");
    }   
  }
}

function FlashRequest(processID,containerObj) {
  var params = new Array();
  var values = new Array();
  
  var flashMovie = new FlashMovie(containerObj);
   
  this.setParam = function(param,value) {
    var index = -1;
    for (i=0;i<params.length;i++) {
      if (param[i] == param)
        index = i;
    }
    if (index < 0)
      index = params.length;
          
    params[index] = param;
    values[index] = value.toString();
  }
  
  this.sendRequest = function() {
    params[params.length] = "process_id";
    values[values.length] = processID;
    var flashParams = "";
    for (i=0;i<params.length;i++) {        
      flashParams += params[i] + "=" + values[i];
      if (i < params.length-1)
        flashParams += "&";
    }
    flashMovie.setFlashParams(flashParams);
    flashMovie.writeMovie(processID);
  }
}

function FlashMovie(containerObj) {
  var path = CONST_MOVIE_PATH;
  var bkColor = CONST_MOVIE_COLOR;
  var width = CONST_MOVIE_WIDTH;
  var height = CONST_MOVIE_HEIGHT;
  var flashParams = "";

  this.setPath = function(tmpPath) {
    path = tmpPath;
  }
  
  this.setColor = function (tmpColor)  {
    bkColor = tmpColor;
  }
  
  this.setWidth = function (tmpWidth)  {
    width = tmpWidth;
  }
  
  this.setHeight = function (tmpHeight)  {
    height = tmpHeight;
  }
  
  this.setFlashParams = function(tmpParams) {
    flashParams = tmpParams;
  }
  
  this.writeMovie = function(id)  {
      var tmpHtml = "<OBJECT classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0\" WIDTH=\"" + width + "\" HEIGHT=\"" + height + "\" id=\"" + id + "\" ALIGN=\"\"><PARAM NAME=movie VALUE=\"" + path + "?" + flashParams + "\"> <PARAM NAME=loop VALUE=false> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE=" + bkColor + "> <PARAM NAME=FlashVars VALUE='" + flashParams + "'> <EMBED src=\"" + path + "?" + flashParams + "\" loop=false quality=high bgcolor=" + bkColor + " WIDTH=\"" + width + "\" HEIGHT=\"" + height + "\" NAME=\"" + id + "\" FlashVars='" + flashParams + "' ALIGN=\"\" TYPE=\"application/x-shockwave-flash\" PLUGINSPAGE=\"http://www.macromedia.com/go/getflashplayer\"></EMBED></OBJECT>";
      var cObj = document.createElement("SPAN");
      cObj.innerHTML = tmpHtml;
      containerObj.appendChild(cObj);
  }

}
