/*---------------------------------------------------------------------------------------*/  
//
//  site.js 
//  This site.js code makes use of the Prototype Javascript framework
//  It was tested using Prototype version 1.4.0
//
//  These are generic functions used by RACCA
//  At the time this was created, we found some issues using Event.observe specifically 
//  when doing onmouseovers and onmouseouts. Instead we create anonymous functions to
//  handle those events`
//
/*---------------------------------------------------------------------------------------*/  

var Generic = {
  ajaxError: function(request){
    alert("There was an error processing the xml document");
  },

  clearElement: function(element){
    if(element.childNodes){
      while(element.childNodes.length > 0){
        element.removeChild(element.childNodes[0]);
      }
    }else if(element.options){
      element.options.length = 0;
    }
  },

  hideAll: function() { //Hide a list elements based on classname
    for(var i = 0; i < arguments.length; i++){
      var hideables = document.getElementsByClassName(arguments[i]);
      var nodes = $A(hideables);
      nodes.each( function(node){
        Element.hide(node);
      });
    }
  },

  showAll: function() { //Show a list elements based on classname
    for(var i = 0; i < arguments.length; i++){
      var showables = document.getElementsByClassName(arguments[i]);
      var nodes = $A(showables);
      nodes.each( function(node){
        Element.show(node);
      });
    }
  },

  toggleSelect: function(popable){
    var popable_position = Position.cumulativeOffset(popable);
    var popable_dimensions = Element.getDimensions(popable);
    var x1 = popable_position[0];
    var x2 = x1+popable_dimensions.width;
    var y1 = popable_position[1];
    var y2 = y1+popable_dimensions.height;
    var allSels = document.getElementsByTagName("select");
    
    var nodes = $A(allSels);
    nodes.each( function(node){
      if(popable.style.display == "none"){
        node.style.visibility = "visible";
      }else{
        var sel_position = Position.cumulativeOffset(node);
        var sel_dimensions = Element.getDimensions(node);
        var objX1 = sel_position[0];
        var objX2 = objX1+sel_dimensions.width;
        var objY1 = sel_position[1];
        var objY2 = objY1+sel_dimensions.height;

        if(Position.within(popable,objX1,objY1) || Position.within(popable,objX2,objY2)){
          node.style.visibility="hidden";
        }else{
          node.style.visibility="visible";
        }
      }
    });
  },

  urlEncode: function(sStr){
    return escape(sStr).
      replace(/\+/g,'%2B').
      replace(/\"/g,'%22').
      replace(/\'/g,'%27').
      replace(/\//g,'%2F');
  },

  urlDecode: function(sStr){
    return escape(sStr).
      replace(/%2B/g,'+').
      replace(/%22/g,'"').
      replace(/%27/g,"'").
      replace(/%2F/g,'/');
  },

  validatePassphrase: function(passphrase,strict){
    var errormsg = "";
    if(passphrase.length < 6){
      errormsg += "Your passphrase must be at least 6 characters.<br>";
    }
    if(passphrase.search(/[0-9]/) == -1 && strict == true){
      errormsg += "Your passphrase must contain at least 1 number.<br>";
    }
    if(passphrase.search(/[A-Z]/) == -1 && strict == true){
      errormsg += "Your passphrase must contain at least 1 uppercase letter.<br>";
    }
    if(passphrase.search(/[a-z]/) == -1 && strict == true){
      errormsg += "Your passphrase must contain at least 1 lowercase letter.<br>";
    }
    if(errormsg != ""){
      return errormsg;
    }else{
      return true;
    }
  },
  
  validateEmail: function(email){ 
    var errormsg = "";
    var filter = /^.+@.+\..{2,3}$/;
    var illegal = /[\(\)\<\>\,\;\:\\\/\"\[\]]/

    if(!(filter.test(email))){
      errormsg += "Please enter a valid email address.<br>\n";
    }
    if(email.match(illegal)){
      errormsg += "The email address contains illegal characters.<br>\n";
    }

    if(errormsg == ""){
      return true;
    }else{
      return errormsg;
    }
  },

  validateForm: function(error,form){
    var options = Object.extend({
      password: '', //new password
      cpassword: '', //current password
      rpassword: '', //repeat password
      answer: '',     
      strict: true,
      supress: 0 //Supress error messages
    }, arguments[2] || {});
    error = $(error);
    form = $(form);

    if(options.password != "") var password = eval("document.forms[0]."+options.password);
    if(options.cpassword != "") var cpassword = eval("document.forms[0]."+options.cpassword);
    if(options.rpassword != "") var rpassword = eval("document.forms[0]."+options.rpassword);
    if(options.answer != "") var answer = eval("document.forms[0]."+options.answer);

    var errormsg = "";

    if(options.answer != "" && answer.value == ""){
      errormsg += "Security answer can not be left blank.<br>";
    }
    if(options.cpassword != "" && cpassword.value == ""){
      errormsg += "Current passphrase must be filled out.<br>";
    }
    if(options.password != "" && (password.value != rpassword.value)){
      errormsg += "The two passphrase entries do not match.<br>";
    }
    if(options.password != ""){
      if(password.value == ""){
        errormsg += "Passphrase can not be left blank.<br>";
      }else{
        var passes = Generic.validatePassphrase(password.value,options.strict);
        if(passes != true){
          errormsg += passes;
        }
      }
    }

    var formerror = "";
    for(var i=0; i < form.elements.length; i++){
      var el = form.elements[i];
      if(el.getAttribute("validate") == "required"){
        if(el.tagName == "select"){
          var val = el.options[el.selectedIndex].value;
        }else{
          var val = el.value; 
        }
        if(val == ""){
          formerror = "Required fields must be filled out.<br>";
        }
      }
    } 

    if(formerror != "") errormsg += formerror;

    if(errormsg == "" || errormsg == "true"){
      return true;
    }else{
      if(options.supress == 0){
        error.style.display = "";
        error.innerHTML = errormsg;
      }
      return false;
    }
  },

  initProfileScreen: function(country,state,statesxml){
    country = eval("document.forms[0]."+country);
    state = eval("document.forms[0]."+state);
    state.options.length = 0;
    var selectedoption = "";
    var cval = country.options[country.selectedIndex].value;
    if(cval == ""){
      Generic.hideAll('phideable');
    }else{
      Generic.showAll('phideable');
    }
    var params = "COUNTRY="+cval;
    var transport = (new Ajax.Request(
      statesxml,{
        parameters:params,
        asynchronous:false
      })
    ).transport;

    var sresults = transport.responseXML.getElementsByTagName("state");
    for(var i=0;i<sresults.length;i++){
      state.options[state.options.length] = new Option(sresults[i].getAttribute("sps_state"),sresults[i].getAttribute("sps_code"));
      if(sresults[i].getAttribute("sps_code") == document.forms[0].SELECTED_STATE.value){
        var selectedoption = i;
      }
    }
    if(selectedoption != ""){
      state.selectedIndex = selectedoption;
    }
    if(sresults.length <= 0){
      Element.hide(state.parentNode.parentNode);
    }else{
      Element.show(state.parentNode.parentNode);
    }
  },

  prepIE: function(pct,overflow){
    bdy = document.getElementsByTagName('body')[0];
    bdy.style.height = pct;
    bdy.style.width = pct;
    bdy.style.overflow = overflow;

    htm = document.getElementsByTagName('html')[0];
    htm.style.height = pct;
    htm.style.width = pct;
    htm.style.overflow = overflow;
  },

  getScroll: function(){
    var yScroll;
    if(self.pageYOffset){
      yScroll = self.pageYOffset;
    }else if(document.documentElement && document.documentElement.scrollTop){
      yScroll = document.documentElement.scrollTop;
    }else if(document.body){
      yScroll = document.body.scrollTop;
    }
    
    return yScroll;
  },

  setScroll: function(x,y){
    window.scrollTo(x,y);
  },

  _waitmessage: function(message,put){
    var options = Object.extend({
      classname:'loading',
      colspan: '0'     
    }, arguments[2] || {});

    Generic.clearElement(put);
    
    if(put.tagName == "TBODY"){
      var waitElement = document.createElement("tr");
      var tdElement = document.createElement("td");

      tdElement.className = options.classname;
      tdElement.colSpan = options.colspan;
      tdElement.innerHTML = message;

      waitElement.appendChild(tdElement);
    }else if(put.tagName == "UL"){
      var waitElement = document.createElement("li");
      waitElement.className = options.classname;
      waitElement.innerHTML = message;
    }else{
      var waitElement = document.createElement("div");
      waitElement.className = options.classname;
      waitElement.innerHTML = message;
    }
    put.appendChild(waitElement);
  },

  displayEmails: function(){
    //This Generic function requires that the Search object has been initialized properly. The Search object can be found in search.js
    Generic.clearElement(Search.results);
    Generic._waitmessage("Searching for emails...",Search.results);
 
    if(Search._load()){
      Generic.clearElement(Search.results);

      Search.list.each( function(node){
        var dv = document.createElement("div");
        dv.className = "text_1 padding3";
        dv.id = node.id;
        dv.innerHTML = node.email;
        dv.title = node.name;
        dv.app_guid = node.app_guid;
  
        var mover = eval(Search.mouseover);
        var mout = eval(Search.mouseout);
        var mclick = eval(Search.mouseclick);
        Event.observe(dv,"mouseover",mover);
        Event.observe(dv,"mouseout",mout);
        Event.observe(dv,"click",mclick);
  
        Search.results.appendChild(dv);
      });

      if(Search.list.length == 0){
        Generic.clearElement(Search.results);
        Generic._waitmessage("There were no results found using the current search criteria.",Search.results,{
          classname:"text_2",
          colspan:Search.subjects.length
        });
      }
    }else{
      Generic._waitmessage("There was a problem retrieving the result set.",Search.results,{
        classname:"text_2",
        colspan:Search.subjects.length
      });
    }
  },

  center: function(element){
    try{
      element = $(element);
    }catch(e){
      return;
    } 

    var e_width = 0;
    var e_height = 0;

    if(typeof(window.innerWidth) == 'number'){
      e_width = window.innerWidth;
      e_height = window.innerHeight;
    }else if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight)){
      e_width = document.documentElement.clientWidth;
      e_height = document.documentElement.clientHeight;
    }else if(document.body && ( document.body.clientWidth || document.body.clientHeight)){
      e_width = document.body.clientWidth;
      e_height = document.body.clientHeight;
    }

    var elementDimensions = Element.getDimensions(element);

    //var X = ( e_width  - elementDimensions.width  ) / 2;
    //var Y = ( e_height - elementDimensions.height ) / 2;

    var X = Math.round(Generic.getScrollX()+((e_width-elementDimensions.width)/2));
    var Y = Math.round(Generic.getScrollY()+((e_height-elementDimensions.height)/2));

    X = ( X < 0 ) ? 0 : X;
    Y = ( Y < 0 ) ? 0 : Y;

    element.style.left = X + "px";
    element.style.top  = Y + "px";
  },
  
  changePIN: function(pwd,cpwd,rpwd){
    var newval = eval("document.forms[0]."+pwd+".value");
    var curval = eval("document.forms[0]."+cpwd+".value");
    Element.hide('SAVEBUTTON');
    Element.show('CHANGING');

    if(Tokens.exists()){
      Tokens.isInitOK();

      var formComplete = Generic.validateForm('ERRORPLACEHOLDER',document.forms[0],{
        password: pwd,
        cpassword: cpwd,
        rpassword: rpwd,
        strict: false
      });

      if(formComplete == true){
        var tokenlist = document.token.getTokenArrayList();
        if(tokenlist.size() == 1){
          if(tokenlist.get(0).checkPIN(curval).indexOf("ERROR") != -1){
            $('ERRORPLACEHOLDER').innerHTML = "The 'current passphrase' you have entered is incorrect.";
            Element.hide('CHANGING');
            Element.show('SAVEBUTTON');
          }else{
            tokenlist.get(0).changePIN(curval,newval);
            $('CHANGING','NO_TOKEN').invoke('hide');
            $('CHANGE_PASS','SAVEBUTTON').invoke('show');
            $('ERRORPLACEHOLDER').innerHTML = "Your passphrase has been successfully changed.";
          }
        }else{
          $('ERRORPLACEHOLDER').innerHTML = "There is more than one token inserted.<br>Please insert only one token at one time.";
          Element.hide('CHANGING');
          Element.show('SAVEBUTTON');
        }
      }else{
        Element.hide('CHANGING');
        Element.show('SAVEBUTTON');
      }    
    }else{
      $('CHANGING','SAVEBUTTON','CHANGE_PASS').invoke('hide');
      Element.show('NO_TOKEN');
    }
  },

  mouseOver: function(event){
    var srcObj = event.target || event.srcElement;
    if(srcObj.tagName == "TD"){
      var sObj = Event.findElement(event,'TR');
    }else{
      var sObj = srcObj;
    }
    Element.addClassName(sObj,"over");
  },

  mouseOut: function(event){
    var srcObj = event.target || event.srcElement;
    if(srcObj.tagName == "TD"){
      var sObj = Event.findElement(event,'TR');
    }else{
      var sObj = srcObj;
    }
    Element.removeClassName(sObj,"over");
  },

  getScrollX: function(){
    var scrollX = 0; 

    if(typeof(window.pageXOffset) == 'number'){
      scrollX = window.pageXOffset;
    }else if(document.documentElement){
      scrollX = document.documentElement.scrollLeft;
    }else if(document.body){
      scrollX = document.body.scrollLeft;
    }

    return scrollX;
  },

  getScrollY: function(){
    var scrollY = 0;

    if(typeof(window.pageXOffset) == 'number'){
      scrollY = window.pageYOffset;
    }else if(document.documentElement){
      scrollY = document.documentElement.scrollTop;
    }else if(document.body){
      scrollY = document.body.scrollTop;
    }

    return scrollY;
  },
  
  generateRandomString: function(len){
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    var rand = "";
    for(var i = 0; i < len; i++){
      var r = Math.floor(Math.random() * chars.length);
      rand += chars.substring(r,r+1);
    }
    return rand;
  }
}

/*---------------------------------------------------------------------------------------*/  

var Popup = {
  show: function(event,popable){
    var options = Object.extend({
      fade: '0'     
    }, arguments[2] || {});
    popable = $(popable);

    var pop = Element.getDimensions(popable);
    var bodyWidth = document.body.offsetWidth + document.body.scrollLeft;
    var bodyHeight = document.body.offsetHeight + document.body.scrollTop;
    var x = Event.pointerX(event);
    var y = Event.pointerY(event);

    if((x+pop.width) > bodyWidth){
      x = (bodyWidth - pop.width) - 10;
    }else{
      x = x + 15;
    }

    if((y+pop.height) > bodyHeight){
      y = (bodyHeight - pop.height) - 10;
    }else{
      y = y + 15;
    }
    
    Element.hide(popable.id);
    popable.style.left = x+"px";
    popable.style.top = y+"px";
    if(options.fade == "1"){
      new Effect.Appear(popable);
    }else{
      Element.show(popable);
    }

    if(document.all){
      Generic.toggleSelect(popable);
    }
  },

  hide: function(popable){
    popable = $(popable);
    Element.hide(popable);
    Generic.toggleSelect(popable);
  }
}

/*-------------------------------------------------------*/
//
// cert_login.html javascript
//
/*-------------------------------------------------------*/

var CL = {
  container: '',
  details: '',
  init: function(container,details){
    var options = Object.extend({
      ra_approve: '0'     
    }, arguments[2] || {});
    CL.container = container;
    CL.details = details;
    Certificates.details = details;
    if(!Tokens.load()){
      Generic.hideAll('hideable');
      Element.show('NO_TOKEN');
    }else{
      if(!Tokens.certsExist()){
        Generic.hideAll('hideable');
        Element.show('NO_MATCHING_TOKEN');
      }else{
        Certificates.displayList(CL.container,CL.details);
        Generic.hideAll('hideable');

        if(!Certificates.selected.obj.isLoginRequired()){
          Element.hide("PININPUT");
        }else{
          Element.show("PININPUT");
        }       
        if(options.ra_approve == '0'){
          $('YES_TOKEN','submit_button').invoke('show');
          if(document.forms[0].TOKEN_PASS) document.forms[0].TOKEN_PASS.focus();
        }
      }
    }
  },

  login: function(pass,data,verifysigneddataxml){
    var passphrase = eval("document.forms[0]."+pass+".value"); 
    var datasigned = eval("document.forms[0]."+data+".value"); 
    Generic.hideAll('hideable');
    Element.show('LOGIN_DV');

    if(!Certificates.validatePIN(passphrase)){
      var error = $('ERRORPLACEHOLDER');
      error.innerHTML = "An invalid passphrase was entered.  Please check the passphrase and try again.";
      error.style.display = "";

      Generic.hideAll('hideable');
      $('YES_TOKEN','submit_button').invoke('show');
      //Element.show('YES_TOKEN','submit_button');
      Certificates.displayList(CL.container,CL.details);
      return false;
    }

    var signed = Certificates.selected.obj.signData(datasigned,passphrase);
    if(signed.indexOf("ERROR") != -1){
      Generic.hideAll('hideable');
      $('YES_TOKEN','LOGIN_DV','ERRORPLACEHOLDER','submit_button').invoke('show');
      $('ERRORPLACEHOLDER').innerHTML = signed;
      document.forms[0].TOKEN_PASS.value = "";
      return false;
    }else{
      document.forms[0].SIGNEDDATA.value = signed;
      params = "DATASIGNED="+Generic.urlEncode(datasigned)+"&SIGNATURE="+Generic.urlEncode(signed);

      var transport = (new Ajax.Request(
        verifysigneddataxml,{
          parameters:params,
          asynchronous:false
        })
      ).transport;
      
      var results = transport.responseXML;
      isValidArray = results.getElementsByTagName("isValid");
      isvalid = isValidArray[0].childNodes[0].nodeValue;
      if(isvalid == "true"){
        document.forms[0].TOKEN_MFG.value = Certificates.selected.token.getManufacturerID();
        document.forms[0].TOKEN_MODEL.value = Certificates.selected.token.getModel();
        document.forms[0].TOKEN_SERIAL.value = Certificates.selected.token.getSerialNumber();
        document.forms[0].CERT_EMAIL.value = Certificates.selected.email;
        document.forms[0].submit();
      }else{
        eArray = results.getElementsByTagName("errorMessage");

        Generic.hideAll('hideable');
        $('YES_TOKEN','ERRORPLACEHOLDER','submit_button').invoke('show');
        //Element.show('YES_TOKEN','ERRORPLACEHOLDER','submit_button');
        $('ERRORPLACEHOLDER').innerHTML = certerror = eArray[0].childNodes[0].nodeValue+"<br>";
      }
    }
  },

  reload: function(){
    Generic.hideAll('hideable');
    Element.show('LOADING');
    if(!Certificates.reload(CL.container)){
      Generic.hideAll('hideable');
      Element.show('NO_TOKEN');
    }else{
      if(!Tokens.certsExist()){
        Generic.hideAll('hideable');
        Element.show('NO_MATCHING_TOKEN');
      }else{
        Generic.hideAll('hideable');
        $('YES_TOKEN','submit_button').invoke('show');
      }
    }
  }
}

/*-------------------------------------------------------*/
//
// drivers.html javascript
//
/*-------------------------------------------------------*/

var Driver = {
  win: '', 
  confirm: function(loc){
    var dl = confirm('Administrative rights are required in order to install this software onto your system.\nIf you do not have administrative rights or if you are unsure if you do, please contact your local IT Helpdesk for support prior to downloading this software.\nContinue?');
    if(dl){
      Driver.win = window.open(loc,'Software_Download');
      if(window.focus) { Driver.win.focus() }
    }
  }
}

/*-------------------------------------------------------*/
//
// login.html javascript
//
/*-------------------------------------------------------*/
  
var Login = {
  validate: function(errordv,login,passphrase){
    var errormsg = "";
    login = $(login);
    passphrase = $(passphrase);
    errordv =  $(errordv);

    //Element.hide(errordv);
    errordv.innerHTML = "";

    if(login.value == ""){
      errormsg += "Please provide an email address.<br>";
    }else{
      var check = Generic.validateEmail(login.value);
      if(check != true){
        errormsg += check;
      }
    }

    if(passphrase.value == ""){
      errormsg += "Please provide the password to your account, or if you have never signed in, your invitation code.<br>";
    }

    if(errormsg != ""){
      //Element.show(errordv);
      errordv.innerHTML = errormsg; 
    }else{
      document.forms[0].submit();
    }
  },

  invitelogin: function(login,repeat_login){
    var l = eval("document.forms[0]."+login);
    var rl = eval("document.forms[0]."+repeat_login);

    if(l.value == rl.value){
      var check = Generic.validateEmail(l.value);
      if(check != true){
        $('ERRORPLACEHOLDER').innerHTML = "Please enter a valid email address.";
      }else{
        document.forms[0].submit();
      }
    }else{
      $('ERRORPLACEHOLDER').innerHTML = "Please confirm that the two email addresses entered match.";
    }
  }
}

/*-------------------------------------------------------*/
//
// main.html javascript
//
/*-------------------------------------------------------*/

var Main = {
  url: '',
  biowin: '',

  reload: function(element){
    if(top.frames[1].document.getElementById(element)){top.frames[1].document.location.reload()}
  },

  showBio: function(element,url){ 
    Main.url = url;

    element = $(element);
    Event.observe(element,"mousedown",Main.eventMouseDown);
  },

  eventMouseDown: function(event){
    if(typeof(event)=='undefined')
      event = window.event||window.Event; 

    var opcode = 0;
    
    if(event.shiftKey){
      opcode = 1;
    }
    if(window.Event){
      if(event.modifiers & Event.SHIFT_MASK){
        opcode = 1;
      }
    }

    if(opcode == 1){
      var urlparams = "height:325,width=450,top=200,left=200,resizable=true,scrollbars=no,toolbar=no,status=no,menubar=no,location=no";
      Main.biowin = window.open(Main.url,'JoeRacca_Bio',urlparams);
      if(window.focus){ Main.biowin.focus() }
    } 
  },

  go: function(xml,code,loc){
    var ic = eval("document.forms[0]."+code);
    var params = "INVITE_CODE="+ic.value;
    new Ajax.Request(
      xml,{
        method:'get',
        parameters: params,
        onSuccess: function(transport){
          if(transport.responseText != ""){
            Element.show("ERRORPLACEHOLDER");
            $("ERRORPLACEHOLDER").innerHTML = transport.responseText;
          }else{
            document.location = loc+"?ic="+ic.value
          }
        },
        onFailure: function(transport){
        }
      }
    );
  }
}

/*-------------------------------------------------------*/
//
// menu.html javascript
//
/*-------------------------------------------------------*/

var Menu = {
  open: function(which){
    which = $(which);
    if(which) Element.toggle(which);
  },
 
  goThere: function(loc,newwin){
    if(newwin == "true"){
      var nwindow;
      nwindow = window.open(loc,'Help','resizable=true,scrollbars=no,toolbar=no,status=no,menubar=no,location=no');
      if(window.focus) { nwindow.focus() }
    }else{
      top.frames[2].document.location = loc;
    }
  }
}

/*-------------------------------------------------------*/
//
// requestor/search.html javascript
//
/*-------------------------------------------------------*/

var rSearch = {
  y: '',
  node:'', 
  timer:'',
  rate:'',

  displayDetails: function(event){
    var srcObj = Event.findElement(event,'TR');
    var node = Search.assocArray[srcObj.id];

    Element.addClassName(srcObj,"over");
    dtls = $('details');
    dtls.innerHTML = node.email+"<br>"+node.name;

    Popup.show(event,dtls,{fade:0});
  },

  hideDetails: function(event){
    var srcObj = Event.findElement(event,'TR');
    Element.removeClassName(srcObj,"over");
    Popup.hide('details');
  },

  openEdit: function(event){

    rSearch.stopTimer();

    var srcObj = Event.findElement(event,'TR');
    var node = Search.assocArray[srcObj.id];
    rSearch.node = node;

    if(navigator.appVersion.indexOf('MSIE')>0){
      rSearch.y = Generic.getScroll();
      Generic.setScroll(0,0);
      Generic.prepIE("100%","hidden");
    }
    $('overlay','editable').invoke('show');
    Generic.center($('editable'));
    
    $('userheader').innerHTML = "Approve "+node.name;
    $('username').innerHTML = node.name;
    $('userdetails').innerHTML = "Email: "+node.email+"<br>Process Step: "+node.step+"<br>Created: "+node.created;
    $('ERRORPLACEHOLDER').innerHTML = "";
  },

  closeEdit: function(){
    if(navigator.appVersion.indexOf('MSIE')>0){
      Generic.setScroll(0,rSearch.y);
      Generic.prepIE("auto","auto");
    }
    $('overlay','editable').invoke('hide');
    rSearch.node = "";
    rSearch.refresh();
  },

  submit: function(xml,form){
    $('ERRORPLACEHOLDER').innerHTML = "";
    form = $(form);
    var params = "APP_GUID="+rSearch.node.app_guid;
    var transport = (new Ajax.Request(
      xml,{
        parameters: params,
        asynchronous: false
      })
    ).transport;

    if(transport.responseText != ""){
      $('ERRORPLACEHOLDER').innerHTML = transport.responseText;
    }else{
      $('ERRORPLACEHOLDER').innerHTML = rSearch.node.email+" has been Approved.";
    }
    Search.show();
    rSearch.closeEdit();
  },

  editProfile: function(event){
    if(Event.element(event).tagName != "A"){
      var srcObj = Event.findElement(event,'TR');
      var node = Search.assocArray[srcObj.id];

      document.location = overview+"?APP_GUID="+node.app_guid;
    }
  },

  refresh: function(element){
    if(element){ 
      var rate = element.options[element.selectedIndex].value;
      rSearch.rate = rate;
    }
    if(rSearch.rate != ""){
      Generic._waitmessage("Refreshing list...",Search.results,{
        classname:"refreshing",
        colspan:Search.subjects.length
      });
      setTimeout("Search.show()",200);
      setTimeout("rSearch.refresh()",rSearch.rate);
    }
  },

  startTimer: function(rate){
    rSearch.timer = setTimeout("rSearch.refresh()",rSearch.rate);
  },

  stopTimer: function(){
    clearTimeout(rSearch.timer);
  }
}

/*-------------------------------------------------------*/
//
// requestor/overview.html javascript
//
/*-------------------------------------------------------*/

var AO = {
  viewData: function(classname,which){
    Element.hide("ERRORPLACEHOLDER");
    Generic.hideAll(classname);
    Element.show(which);
  }
}

/*-------------------------------------------------------*/
//
// reset.html javascript
//
/*-------------------------------------------------------*/

var Reset = {
  y: '',
  node:'',

  openEdit: function(event){
    var srcObj = Event.findElement(event,'TR');
    var node = Search.assocArray[srcObj.id];
    Reset.node = node;

    if(navigator.appVersion.indexOf('MSIE')>0){
      Reset.y = Generic.getScroll();
      Generic.setScroll(0,0);
      Generic.prepIE("100%","hidden");
    }
    
    $('overlay','editable').invoke('show');
    $('editable').style.zIndex  = "9998";
    $('editable').style.position  = "absolute";
    Generic.center($('editable'));
    
    $('userheader').innerHTML = "Modify "+node.name;
    $('username').innerHTML = node.name;
    $('userdetails').innerHTML = "Email: "+node.email+"<br>Role: "+node.role+"<br>Created: "+node.created+"<br>DN: "+node.dn+"<br>Valid To: "+node.valid_to;
    $('ERRORPLACEHOLDER').innerHTML = "";
    
    if(node.role == "NEWUSER"){
      document.forms[1].ACT[0].style.display = "none";
      document.forms[1].ACT[1].checked = true; 
    }else{
      document.forms[1].ACT[0].style.display = "";
      document.forms[1].ACT[0].checked = true; 
    }
  },

  closeEdit: function(){
    if(navigator.appVersion.indexOf('MSIE')>0){
      Generic.setScroll(0,Reset.y);
      Generic.prepIE("auto","auto");
    }
    $('overlay','editable','waiting').invoke('hide');
    Reset.node='';
  },

  submit: function(xml,form){
    $('ERRORPLACEHOLDER').innerHTML = "";
    
    $('waiting').innerHTML = "Please wait while the application processes the request."; 
    Element.show('waiting');
    $('waiting').style.zIndex = "9999";
    $('waiting').style.position = "absolute";
    Position.clone('editable','waiting');

    form = $(form);
    var params = Form.serialize(form)+"&EMAIL_ADDRESS="+Reset.node.email;
   
    new Ajax.Request(
      xml,{
        method: 'get',
        parameters: params,
        onSuccess: function(transport){
          if(transport.responseText.indexOf("SUCCESS") != -1){
            if(document.forms[1].ACT[0].checked) var act = "reset";
            if(document.forms[1].ACT[1].checked) var act = "deleted";
            $('ERRORPLACEHOLDER').innerHTML = Reset.node.email+" has been "+act+".";
          }else{
            $('ERRORPLACEHOLDER').innerHTML = transport.responseText;          
          }
          Search.show();
          Reset.closeEdit();                  
        },
        onFailure: function(transport){
          alert(transport.responseText);
        }
      }
    );
  }
}

/*-------------------------------------------------------*/
//
// raccalogs.html javascript
//
/*-------------------------------------------------------*/

var Logs = {
  view: function(xml,form,results){
    form = $(form);
    results = $(results);

    var transport = (new Ajax.Request(
      xml,{ 
        parameters: Form.serialize(form),
        asynchronous: false
      })
    ).transport;

    results.innerHTML = "<pre>"+transport.responseText+"</pre>";
  }
}

/*-------------------------------------------------------*/
//
// assignroles.html javascript
//
/*-------------------------------------------------------*/

var Groups = {
  xml:'',
  save:'',
  members:'',
  results:'',
  form:'',
  list:[],
  memberlist:[],
  assocArray:{},
  selected:'',

  initialize: function(xml,save,members,results,form,groupselect){
    Groups.xml = xml;
    Groups.results = $(results);
    Groups.form = $(form);
    Groups.selectbox = groupselect;
    Groups.save = save;
    Groups.members = members;

    Groups.display();
    Groups.createMemberList();
  },

  _load: function(){
    var xmlObj = new ParseXML(Groups.xml,Form.serialize(Groups.form));
    if(xmlObj.list.length > 0 && !xmlObj.error){
      Groups.list = xmlObj.list;
      Groups.assocArray = xmlObj.assocArray;
      return true;
    }else{
      return false;
    }
  },

  display: function(){
    this._load();
    var selectedoption = Groups.selectbox.options.length > 0 ? Groups.selectbox.options[Groups.selectbox.selectedIndex].value : 0;
    Groups.selectbox.options.length = 0;

    for(var i=0; i < Groups.list.length; i++){
      group = Groups.list[i];
      Groups.selectbox.options[Groups.selectbox.options.length] = new Option(group.desc,group.id);
      if(selectedoption == group.id){
        selectthis = i;
      }
    }
    Groups.selectbox.options[selectthis].selected = true;
    Groups.users(selectthis);
  },

  users: function(id){
    var group = Groups.assocArray[id];
    Groups.selected = group;

    Generic.clearElement(Groups.results);

    group.list.each( function(user){
      var trElement = document.createElement("tr");
      var emailTD = document.createElement("td");
      var memberTD = document.createElement("td");
      var removeTD = document.createElement("td");

      emailTD.className = "text_2";
      removeTD.style.textAlign = "right";
      emailTD.innerHTML = user.email;
      if(group.assign_member_yn == "Y"){
        Groups.createMemberSelect(memberTD,user.member_guid,group.assocArray[user.id].rpf_guid);
      }else{
        memberTD.innerHTML = "";
      }
      removeTD.innerHTML = "<a href='#' onclick='Groups.deleteUser(\""+user.id+"\");return false' class='text_1' style='color:blue' title='Delete "+user.email+" from "+group.name+" group'>Delete from "+group.desc+"</a>";

      trElement.appendChild(emailTD);
      trElement.appendChild(memberTD);
      trElement.appendChild(removeTD);
      Groups.results.appendChild(trElement);
    });
    if(group.list.length == 0){
      Generic._waitmessage("There were no users found for the chosen group.",Groups.results,{
        classname:"text_2",
        colspan:"3"
      });
    }
  },

  add: function(event){
    var srcObj = Search.assocArray[Event.element(event).id];
    var params = "ACTION=ADD&USER="+srcObj.rpf_guid+"&MEMBER="+srcObj.member_guid+"&USER_ROLE="+Groups.selected.code;

    var transport = (new Ajax.Request(
      Groups.save,{ 
        parameters: params,
        asynchronous: false
      })
    ).transport;

    $('ERRORPLACEHOLDER').innerHTML = transport.responseText;
    Groups.display();
    Generic._waitmessage("Enter an email address above and click search to display results.",Search.results,{
      classname:"text_1 padding3",
      colspan:"3"
    });
  },

  deleteUser: function(id){
    var params = "ACTION=DELETE&USER="+Groups.selected.assocArray[id].rpf_guid+"&MEMBER="+Groups.selected.assocArray[id].member_guid+"&USER_ROLE="+Groups.selected.code;
    var transport = (new Ajax.Request(
      Groups.save,{ 
        parameters: params,
        asynchronous: false
      })
    ).transport;

    $('ERRORPLACEHOLDER').innerHTML = transport.responseText;

    Groups.display();
    Generic._waitmessage("Enter an email address above and click search to display results.",Search.results,{
      classname:"text_1 padding3",
      colspan:"3"
    });
  },

  changeMember: function(event){
    var sel = Event.element(event);
    var params = "ACTION=CHANGEGROUP&USER="+sel.id.substring(4,sel.id.length)+"&MEMBER="+sel.options[sel.selectedIndex].value+"&USER_ROLE="+Groups.selected.code;
    var transport = (new Ajax.Request(
      Groups.save,{ 
        parameters: params,
        asynchronous: false
      })
    ).transport;

    $('ERRORPLACEHOLDER').innerHTML = transport.responseText;

    Groups.display();
    Generic._waitmessage("Enter an email address above and click search to display results.",Search.results,{
      classname:"text_1 padding3",
      colspan:"3"
    });
  },

  createMemberSelect: function(element,memberguid,userguid){
    var sel = document.createElement("select");
    Event.observe(sel,"change",Groups.changeMember);
    var selected = 0;
    sel.id = "mem_"+userguid;
    for(var i=0; i < Groups.memberlist.length; i++){
      var member = Groups.memberlist[i];
      sel.options[sel.options.length] = new Option(member.mem_name,member.mem_guid);
      if(member.mem_guid == memberguid){
        selected = i;
      }
    }
    sel.options[selected].selected = true;
    element.appendChild(sel);
  },

  createMemberList: function(){
    Groups.memberlist.length = 0;
    var obj = new ParseXML(Groups.members,Form.serialize(Groups.form));
    if(obj.list.length > 0 && !obj.error){
      Groups.memberlist = obj.list;
    }
  },

  describe: function(object){
    var tree = "";
    object.list.each( function(c){
      tree += c.code+"\n";
      var childlist = "";
      c.list.each( function(gc){
        childlist += " - "+gc.email+"\n";
      });
      tree += childlist;
    });
    alert(tree);
  }
}

var ParseXML = Class.create();
ParseXML.prototype = {
  list:[],
  assocArray:{},
  error: false,

  initialize: function(xml,params){
    this.list = [];
    this.assocArray = {};
    var transport = this._load(xml,params);

   
    try{
      var de = transport.documentElement ? transport.documentElement : transport.responseXML.documentElement;

      for(var i=0;i<de.childNodes.length; i++){
        var n = de.childNodes[i];
        this._createObjs(this,n,i);
      }
    }catch(e){
      this.error = true;
    } 
  },

  _load: function(xml,params){
    var transport = (new Ajax.Request(
      xml, {
        parameters: params,
        asynchronous: false
      })
    ).transport;
     
    return transport;
  },
 
  _createObjs: function(parent,node,index){
    var obj = new CreateXMLObj(node,index);

    for(var i=0;i<node.childNodes.length;i++){
      var c = node.childNodes[i];
      this._createObjs(obj,c,i);
    }
    parent.list.push(obj);
    parent.assocArray[obj.id] = obj;
  }
}

var CreateXMLObj = Class.create();
CreateXMLObj.prototype = {
  list:[],
  assocArray:{},

  initialize: function(node,index){
    //Clear out the list and assocArray before continuing. If not, all values will get carried through to the other parents
    this.list = [];
    this.assocArray = {};
    this.id = index;
    for(var i=0;i<node.attributes.length;i++){
      var att = node.attributes[i];
      var val = att.value.replace(/\'/g,"&#39");
      val = val.replace(/\n/gi,"&lt;br&gt;");

      eval("this."+att.name+" = '"+val+"';");
    }
  }
}

/*-------------------------------------------------------*/
//
// guid5.html javascript
//
/*-------------------------------------------------------*/

var GUID5 = {
  validate: function(){
    var val;
    var msg = "";
    for(var i=0; i<document.forms[0].elements.length; i++){
      var formEl = document.forms[0].elements[i];
      if(formEl.parentNode.parentNode.tagName == "TR" && formEl.parentNode.parentNode.style.display != "none"){
        if(formEl.tagName == "SELECT"){
          val = formEl.options[formEl.selectedIndex].value;
        }else{
          val = formEl.value;
        }
        if(val == ""){
          msg = "All required fields must be filled out.";
        }
      }
    }
   
    if(msg != ""){
      $('ERRORPLACEHOLDER').innerHTML = msg;
      Element.show('ERRORPLACEHOLDER');
    }else{
      document.forms[0].submit();
    }
  }
}

/*-------------------------------------------------------*/
//
// reports javascript
//
/*-------------------------------------------------------*/

var Reports = {
  reloadScreen: function(orderby){
    var options = Object.extend({
      target: '',
      role: ''
    }, arguments[1] || {});

    if(options.target != "") document.forms[0].MODE.value = options.target;
    if(options.role != "") document.forms[0].RAS_ROLE.value = options.role;
    if(orderby != "" && document.forms[0].ORDERBY.value == orderby){
      if(orderby.indexOf(",") != -1){
        orderby = orderby.replace(","," desc,"); 
      }else{
        orderby += " desc";
      }
    }
    if(orderby != "") document.forms[0].ORDERBY.value = orderby;
    document.forms[0].submit();
  }
}

/*-------------------------------------------------------*/
//
// applicant javascript
//
/*-------------------------------------------------------*/

var Applicant = {
  saveProfile: function(error,form,cert_reg){
    if(Generic.validateForm(error,form,{supress:"1"})){
      Element.show("SAVE_BUTTON");
      Element.hide("SAVE_BUTTON_DISABLED");
      if(cert_reg == "Y" && document.forms[0].AGREE_UPDATE.checked != true){
        Element.show("SAVE_BUTTON_DISABLED");
        Element.hide("SAVE_BUTTON");
      }
    }else{
      Element.show("SAVE_BUTTON_DISABLED");
      Element.hide("SAVE_BUTTON");
    }
  },

  showSave: function(next,fake,activation_code,sub_agreement){
    var next = $(next);
    var fake = $(fake);
    var ac = eval("document.forms[0]."+activation_code);
    var sa = eval("document.forms[0]."+sub_agreement);

    ac.value = ac.value.toUpperCase();

    if(sa.checked == true && ac.value != ""){
      if(ac.value.length == 8){
        if(next.style.display == "none"){
          Element.hide(fake);
          Element.show(next);
        }
      }else{
        Element.hide(next);
        Element.show(fake);
      }
    }else{
      Element.hide(next);
      Element.show(fake);
    }
  },

  openWindow: function(loc,desc){
      var win = window.open(loc,desc,"resizable=yes,menubar=no,toolbar=no,location=no,width=650,height=400,scrollbars=yes,status=no");
      if(window.focus) { win.focus() }
  },

  printPage: function(){
    Element.hide("PRINT");
    window.print();
    window.close();
  },

  showDirections: function(classname){
    Generic.hideAll('safenet','aladdin');
    Generic.showAll(classname);
    if(classname == "safenet"){
      if(BrowserDetect.OS == "Windows"){
        Element.hide('MacDriver');
        Element.show('WindowsDriver');
      }else{
        Element.show('MacDriver');
        Element.hide('WindowsDriver');
      }
    }
  },

  toggle: function(event,element,show){
    element = $(element);
    $('SAFENET_IMG','ALADDIN_IMG').invoke('hide');
    if(show) Popup.show(event,element,{fade:0});

  },
 
  confirmDL: function(desc,canedit){
    var dl = confirm("Administrative rights are required in order to install this software onto your system.\nIf you do not have administrative rights or if you are unsure if you do, please contact your local IT Helpdesk for support prior to downloading this software.\nContinue?"); 
    if(dl){
      canedit = 1;
      if(canedit == 1) document.forms[0].submit();
      return true;
    }else{
      return false;
    }
  }
}

/*-------------------------------------------------------*/
//
// signAuthAttr javascript
//
/*-------------------------------------------------------*/

var authAttr = { 
  xml: '',
  doc: '',
  randid: '',
  block: '',
  confirm: '',
  signer_email: '',
  apguid: '',
  pdfsvsurl: '',
  signurl: '',
  contact_app: '',
  use_constraints: '',

  init: function(authattrxml){
    var options = Object.extend({
      signurl:'',
      pdfsvsurl: '',
      email: '',
      appguid: '',
      block: '',
      confirm: '',
      contact_app: '',
      use_constraints: false 
    }, arguments[1] || {});

    this.xml = authattrxml;
    this.signurl = options.signurl;
    this.pdfsvsurl = options.pdfsvsurl;
    this.email = options.email;
    this.appguid = options.appguid;
    this.reason = options.reason;
    this.block = options.block;
    this.confirm = options.confirm;
    this.contact_app = options.contact_app;
    this.use_constraints = options.use_constraints;
  },

  getDocInfo: function(){
    try{
      var transport = (new Ajax.Request(
        this.pdfsvsurl,{
          asynchronous:false
        })
      ).transport;

      var doc_attr = transport.responseXML.getElementsByTagName("Doc");
      this.doc = doc_attr[0].getAttribute("docpath");
      this.randid = doc_attr[0].getAttribute("randid");
      return true;
    }catch(e){
      return false;
    }
  },

  sign: function(pEl){
    $('submit_button','PININPUT','YES_TOKEN').invoke('hide');
    Element.show('CONFIRM');

    pin = eval("document.forms[0]."+pEl);
    $('SIGNINGERROR').innerHTML = "";
    if(!document.token.isTokenInserted(false)){
      $('LOADING','YES_TOKEN','submit_button','CONFIRM').invoke('hide')
      Element.show('NO_TOKEN');
      return;
    }
    if(!Certificates.validatePIN(pin.value)){
      $('SIGNINGERROR').innerHTML = "The passphrase entered is incorrect";
      $('SIGNING','CONFIRM').invoke('hide');
      $('submit_button','PININPUT','YES_TOKEN').invoke('show');
      return;
    }


    var confirm_sign = authAttr.confirm != "" ? confirm(authAttr.confirm) : true;

    if(confirm_sign){
      Element.hide('CONFIRM');
      Element.show('SIGNING');

      //Checking use_constraints. In prod, a user's email must match what is on the token
      //In dev and test, we set that to false to allow for easier testing with fewer tokens
      if(this.use_constraints == false){
        this.email = Certificates.selected.email;
      }
      if(!(Certificates.selected.email < this.email || Certificates.selected.email > this.email)){
        //Get the document path and the randid
        if(this.getDocInfo()){
          var b64 = Doc.getb64AuthAttr(this.xml,{
            outputfile: this.doc,
            signatureblock: this.block,
            randid: this.randid
            });
          if(b64 == "" || b64.indexOf("ERROR") != -1){
            if(b64 == "") b64 = "An error occurred in the signing process";
            Element.hide('SIGNING');
            $('submit_button','PININPUT','YES_TOKEN').invoke('show');
            $('SIGNINGERROR').innerHTML = b64;
          }else{
            var signed = Certificates.selected.obj.signAuthAttr(
              b64,
              pin.value);
            signed = Generic.urlEncode(signed);

            var su = this.signurl;
            if(this.contact_app != ""){
              if(su.indexOf("?") != -1){
                var op = "&";
              }else{
                var op = "?";
              }
              su += op+"CONTACT_APP="+this.contact_app.options[this.contact_app.selectedIndex].value;
            }
            var complete = Doc.completeSigning(su,{
              signature: signed,
              randid: this.randid,
              doc: this.doc,
              token_mfg: Certificates.selected.token.getManufacturerID(),
              token_model: Certificates.selected.token.getModel(),
              token_serial: Certificates.selected.token.getSerialNumber(),
              app_guid: this.appguid
            });
            Element.hide('SIGNING');
            if(complete == "TEST_SIGN_COMPLETE"){
              top.frames[0].document.location.reload();
              top.frames[1].document.location.reload();
              $('TEST_SIGN').src = $('TEST_SIGN').src.replace("step_6_on","step_6_done");
              if($("SUCCESS")) Element.show('SUCCESS');
              if($('COMPLETE_CERT_DETAILS')) Element.hide('COMPLETE_CERT_DETAILS');
            }else if(complete == "COMPLETE"){
              if($("SUCCESS")) Element.show('SUCCESS');
              if($('COMPLETE_CERT_DETAILS')) Element.hide('COMPLETE_CERT_DETAILS');

            }else if(complete.indexOf("ACTIVATION_CODE") != -1){
              var act_code = complete.substring(complete.indexOf("ACTIVATION_CODE")+15,complete.length);
              if($('COMPLETE_CERT_DETAILS')) Element.hide('COMPLETE_CERT_DETAILS');
              if($('ACT_CODE')) $('ACT_CODE').innerHTML = act_code;
              if($("SUCCESS")){
                var cell = $('SUCCESS').childNodes[1] || $('SUCCESS').childNodes[0];
                cell.innerHTML += "<br>Activation Code:"+act_code;
                Element.show('SUCCESS');
              }
            }else{
              $('SIGNINGERROR').innerHTML = "There was an error in the attempt to sign the document.<br>"+complete;
              $('YES_TOKEN','submit_button','PININPUT').invoke('show');
            }
          }
        }else{
          $('SIGNING','CONFIRM').invoke('hide');
          $('YES_TOKEN','submit_button','PININPUT').invoke('show');
          $('SIGNINGERROR').innerHTML = "There was a problem fetching the document.";
        }
      }else{
        $('SIGNING','CONFIRM','submit_button','PININPUT','YES_TOKEN','NO_TOKEN').invoke('hide');
        Element.show('NO_MATCHING_TOKEN');
        $('SIGNINGERROR').innerHTML = "The Signer's email does not match the email address associated to the certificate used in the signing.";
      }
    }else{
      $('SIGNING','CONFIRM').invoke('hide');
      $('YES_TOKEN','submit_button','PININPUT').invoke('show');
    }
  }
}

/*-------------------------------------------------------*/
//
// RA/TA Overview javascript
//
/*-------------------------------------------------------*/

var Overview = {
  saveIADetails: function(classname,detail){
    detail = eval("document.forms[0]."+detail);
    cbs = document.getElementsByClassName(classname);
    var txt = "I&A Details:";
    var checked = 0;
    for(var i=0; i < cbs.length; i++){
      var cb = cbs[i];
      if(cb.checked == true){
        txt += "\n"+cb.value;
        checked = 1;
      }
      if((cb.name == "DN_OTHER" && cb.checked == true) && detail.value == ""){
        alert("Please provide details when choosing 'Other'.");
        return false;
      }
    }
    if(checked == 0 && detail.value == ""){
      alert("Please select a Document Viewed from the checkboxes, add text describing the document viewed, or upload an I&A Document.");
      return false;
    }
    if(checked == 1 && detail.value == ""){
      alert("Please enter ID Document detals.\ni.e. Driver's License state and number.");
      return false;
    }
    if(detail.value == ""){
      detail.value += txt;
    }else{
      detail.value += "\n"+txt;
    }
    document.forms[0].ACTION.value = "SAVE_IA";
    document.forms[0].submit();
  },
  
  prepSI: function(deliv,approve){
    deliv = eval("document.forms[0]."+deliv);
    approve = eval("document.forms[0]."+approve);
    if(approve.checked == true && deliv.selectedIndex > 0){
      deliv.disabled = true;
      Element.hide("SAVE_BUTTON");
      $('submit_button','signing_interface','YES_TOKEN').invoke('show');
      if(document.forms[0].TOKEN_PASS) document.forms[0].TOKEN_PASS.focus();
    }else{
      if(approve.checked == true && deliv.selectedIndex == 0){
        alert("Please select a shipping choice before approving this application");
        approve.checked = false;
      }
      deliv.disabled = false;
      $('signing_interface','submit_button').invoke('hide');
      Element.show('SAVE_BUTTON');
    }
  }
}

/*-------------------------------------------------------*/

var UserSearch = {
  mouseClick: function(event){
    var srcObj = event.target || event.srcElement;
    var loc = document.location.toString();
    document.location = loc.substring(0,loc.indexOf("?"))+"?APP_GUID="+srcObj.app_guid;
  }
}

/*-------------------------------------------------------*/

var initToken = { //This will initialize the token, generate a cert, and then import the new cert onto the token
  url:'',
  dn:'',
  tokens: '',
  msgblock: '',
  
  init: function(){
    $('savebutton','fields').invoke('show');
    Element.hide("notoken");
    initToken.msgblock = $("ERRORPLACEHOLDER");
    initToken.msgblock.innerHTML = "";
    initToken.tokenInserted();
  },
  
  tokenInserted: function(){
    if(!document.token.isTokenInserted(false)){
      $('notoken',initToken.msgblock).invoke('show');
      $('savebutton','fields').invoke('hide');
      initToken.msgblock.innerHTML = "Please insert your token and click 'Continue'.";
      return false;
    }else{
      initToken.tokens = document.token.getTokenArrayList();
      if(initToken.tokens.size().length > 1){
        $('notoken',initToken.msgblock).invoke('show');
        $('savebutton','fields').invoke('hide');
        initToken.msgblock.innerHTML = "There is more than one token inserted.<br>Please insert only one token at one time.";
        return false;
      }
      return true;
    }
  },
  
  confirmInit: function(){
    initToken.tokenInserted();
    Tokens.isInitOK();
    if(confirm("Initializing this token will clear out any existing certificates that currently exist on it.\nContinue?")){
      $('loading',initToken.msgblock).invoke('show');
      $('savebutton','fields').invoke('hide');
      initToken.msgblock.innerHTML = "";
      var msg = "";
      if(document.forms[0].PASSWORD.value.length < 6){
        msg += "Your passphrase must be at least 6 characters.";
      }
      if(document.forms[0].PASSWORD.value == ""){
        msg += "Please enter a passphrase for your token.";
      }
      if(document.forms[0].PASSWORD.value != document.forms[0].REPEATPASSWORD.value){
        msg += "The two passphrases entered do not match.";
      } 
      if(msg != ""){
        $('fields','savebutton',initToken.msgblock).invoke('show');
        Element.hide("loading");
        initToken.msgblock.innerHTML += msg;
      }else{  
        initToken.msgblock.innerHTML = "This process may take a while. Please be patient.<br><br>Initializing token...";
        setTimeout("initToken.initializeToken()",500);
      }
    }
  },
  
  initializeToken: function(){
    initToken.tokenInserted();
    var worked = initToken.tokens.get(0).initToken($("PASSWORD").value,$("PASSWORD").value,$("NAME").value);
    if(!worked){
      $('fields','savebutton',initToken.msgblock).invoke('show');
      Element.hide("loading");
      initToken.msgblock.innerHTML += "<br>A problem was encountered trying to initialize the token.<br>"+worked;
    }else{
      initToken.msgblock.innerHTML += "&nbsp; &nbsp; Complete.";
      initToken.generateCert();
    }
  },
  
  generateCert: function(){
    var rstring = Generic.generateRandomString(20);

    var username = $("USERNAME").value;
    var re = new RegExp("(,| )","g");
    username = username.replace(re,".");
    re = new RegExp("\\.\\.+","g");
    username = username.replace(re,".");
    
    initToken.msgblock.innerHTML += "<br>Generating certificate...";
    var p10 = initToken.tokens.get(0).getPKCS10Request("CN="+username+initToken.dn,$("APP_EMAIL_ADDRESS").value,$("PASSWORD").value);
    var params = "p10="+Generic.urlEncode(p10)+"&APP_EMAIL_ADDRESS="+$("APP_EMAIL_ADDRESS").value+"&ACTIVATION_CODE="+$("ACTIVATION_CODE").value+"&RSTR="+rstring;
    new Ajax.Request(
      initToken.url,{
        parameters:params,
        onSuccess: function(transport){
          initToken.importBlock(transport);
        },
        onFailure:function(transport){
          alert("ERROR:"+transport.responseText);
        },
        method:'get'
      }
     );
  },
  
  importBlock: function(transport){
    initToken.msgblock.innerHTML += "&nbsp; &nbsp; Complete.<br>Importing certificate onto token...";
    var block = transport.responseText;
    if(block.indexOf("ERROR") != -1){
      initToken.msgblock.innerHTML += "<br>"+block;
    }else{
      var enc_cert = initToken.tokens.get(0).importPKCS7(block,$("PASSWORD").value);
      if(enc_cert.indexOf("ERROR") != -1){
        initToken.msgblock.innerHTML += "<br>There was a problem with the import of the cert. Please contact your helpdesk.";
      }else{
        initToken.msgblock.innerHTML += "&nbsp; &nbsp; Complete.";
        $("TOKEN_MFG").value = initToken.tokens.get(0).getManufacturerID();
        $("TOKEN_MODEL").value = initToken.tokens.get(0).getModel();
        $("TOKEN_SERIAL").value = initToken.tokens.get(0).getSerialNumber();
        $("ENCODED_CERT").value = enc_cert;
        
        document.forms[0].submit();
      }
    }
  },
  
  reload: function(){
    $('fields','savebutton',initToken.msgblock,'loading').invoke('hide');
    initToken.msgblock.innerHTML = "";
    initToken.init();
  }
}
/*---------------------------------------------------------------------------------------*/  

var Profile = {
  requiredFields: [],
  url: '',
  countryList: [],
  "MAC": [
    {
      "code":"OSX",
      "name":"OS X"
    }
  ],
  "WINDOWS": [
    {
      "code":"WINDOWS_XP",
      "name":"Windows XP"
    },
    {
      "code":"WINDOWS_NT",
      "name":"Windows NT"
    },
    {
      "code":"WINDOWS_VISTA",
      "name":"Windows Vista"
    }
  ],
  
  prepRequired: function(){
    for(var i=0; i < Profile.requiredFields.length; i++){
      var field = Profile.requiredFields[i];
      var inp = $(field);
      if(field != "AGREE_UPDATE"){
        if(field != "APP_NO_AUTOFILL" && field != "GD5_MM" && field != "GD5_DD"){
          //var label = $(field.substr(4));
          var label = field+"_LABEL";
        }else{
          var label = $("BIRTHDAY");
        }
        if(field != "GD5_DD") label.innerHTML += "<span class='required'> *</span>";
      }
    }
  },
  
  toggleCountryDetails: function(country,state){
    if(country != ""){
      Generic.showAll("phideable");
      Profile.getStates(country,state);
    }else{
      Generic.hideAll("phideable");    
    }
  },
  
  validateForm: function(){
    Element.show("SAVE_BUTTON_DISABLED");
    Element.hide("SAVE_BUTTON");   
    for(var i=0; i < Profile.requiredFields.length; i++){
      var el = $(Profile.requiredFields[i]);
      if(el){
        var p_el = el.parentNode;
        if(el.id.indexOf("GD5_") != -1){
          p_el = el.parentNode.parentNode;
        }
        //Check if parent div is visible
        //If so, check value
        //If not, allow it to be saved for edit w/o being filled in
        if(p_el.visible()){
          if(el.tagName == "select"){
            if(el.options[el.selectedIndex].value == ""){
              return false;
            }
          }else{
            if(el.type == "checkbox"){
              if(el.checked == false){
                return false;
              }
            }else{
              if(el.value == ""){       
                return false;
              }          
            }
          }
        }
      } 
    }
    Element.hide("SAVE_BUTTON_DISABLED");
    Element.show("SAVE_BUTTON");    
  },
  
  toggleGUID5: function(flag){
    if(flag == "none"){
      Element.hide("GUID5");
      Generic.hideAll("link");
    }else{
      Element.show("GUID5");
      Generic.showAll("link");      
    }
    var gd5 = document.getElementsByClassName("guid5");
    for(var i=0; i < gd5.length; i++){
      var el = gd5[i];
      if(el.tagName == "select"){
        el.selectedIndex = 0;
      }else{
        el.value = "";
      }
    }
  },
  
  createCountryList: function(xmlDoc){
    var countries = xmlDoc.getElementsByTagName("country");
    if(countries.length == 0){
      $("ERRORPLACEHOLDER").innerHTML = "There was a problem fetching the country list.";
      Element.hide("loading");
      return;
    }
    for(var i=0; i<countries.length; i++){
      var country = countries[i];
      var states = country.getElementsByTagName("states")[0];
      var obj = {
        "name": country.getElementsByTagName("name")[0].firstChild.nodeValue,
        "code": country.getElementsByTagName("code")[0].firstChild.nodeValue,
        "list": []
      };
      if(states.getElementsByTagName("name")[0].firstChild.nodeValue != "null"){
        for(var j=0; j<states.getElementsByTagName("name").length; j++){
          obj.list.push({
            "name": states.getElementsByTagName("name")[j].firstChild.nodeValue,
            "code": states.getElementsByTagName("code")[j].firstChild.nodeValue
          });
        }
      }
      Profile.countryList[obj.code] = obj;
    } 
  },
  
  getCountries: function(country,state){
    $('APP_NO_AUTOFILL').options.length = 1;
    Element.hide('SAVE_BUTTON');
    $('loading','SAVE_BUTTON_DISABLED').invoke('show');
    new Ajax.Request(
      Profile.url,{
        method: 'get',
        onSuccess: function(transport){
          if(transport.getHeader('Content-type').indexOf('text/xml') == -1){
            $("ERRORPLACEHOLDER").innerHTML = "There was a problem fetching the country list.";
            $('loading','SAVE_BUTTON_DISABLED').invoke('hide');
            Element.show('SAVE_BUTTON');            
            return;
          }
          var xmlDoc = transport.responseXML;
          Profile.createCountryList(xmlDoc);
          var count = 1;
          var sel = 0;
          for(c in Profile.countryList){
            $('APP_NO_AUTOFILL').options[$('APP_NO_AUTOFILL').options.length] = new Option(Profile.countryList[c].name,Profile.countryList[c].code);
            if(Profile.countryList[c].code == country){
              sel = count;
            }
            count++;
          }
          $('APP_NO_AUTOFILL').options[0].text = "Choose Your Country";
          $('APP_NO_AUTOFILL').options[sel].selected = true;
          Profile.toggleCountryDetails(country,state);
          $('loading','SAVE_BUTTON_DISABLED').invoke('hide');
          Element.show('SAVE_BUTTON');                    
        },
        onFailure: function(transport){
          alert("ERROR");
        }
      }
    );
  },
  
  getStates: function(country,state){
    $('APP_STATE').options.length = 0;
    var sel = 0;
    var stateList = Profile.countryList[country].list;
    if(stateList.length > 0){
      for(var i=0; i <  stateList.length; i++){
        $('APP_STATE').options[$('APP_STATE').options.length] = new Option(stateList[i].name,stateList[i].code);
        if(stateList[i].code == state) sel = i;
      }
      $('APP_STATE').options[sel].selected = true;
    }else{
      Generic.hideAll("state");
    }
  },
  
  changeHardware: function(el,os){
    var system = el.options[el.selectedIndex].value;
    var systemOSList = Profile[system];
    
    os.options.length = 0;
    for(var i=0; i < systemOSList.length; i++){
      os.options[os.options.length] = new Option(systemOSList[i].name,systemOSList[i].code);
    }
  },
  
  showHelp: function(url){
    var win;
    var objX = 100;
    var objY = 100;
    if(window.screen){
      var ah = screen.availHeight - 30;
      var aw = screen.availWidth - 10;
      var xc = (aw - 400) / 2;
      var yc = (ah - 200) / 2;

      objX = xc;
      objY = yc;    
    }
    
    var urlparams = "height=300,width=440,top="+objY+",left="+objX+",resizable=true,scrollbars=no,toolbar=no,status=no,menubar=no,location=no";     

    win = window.open(url,'Unique_ID_Help',urlparams);
    if (window.focus) win.focus();    
  },
  
  launchWarning: function(subscriber){
    var warning = "Saving this data will not mark the application as complete.\nIf the data on this application is complete and you would like to submit it for approval, please choose the 'Save and submit application profile for approval' selection.";
    if(subscriber == 1) warning = "Changing this data will result in the inactivation of your current certificate and begin a new application process.\nContinue?";
    if($('APP_PROCESS_STATUS_STARTED')){
      if($('APP_PROCESS_STATUS_STARTED').checked == true){
        var savepage = confirm(warning);      
      }else if($('APP_PROCESS_STATUS_COMPLETED').checked == true){
        var savepage = true;
      }else{
        var savepage = false;
        $("ERRORPLACEHOLDER").innerHTML = "The profile must either be left open for edit or submitted for approval."; 
      }
    }
    if($('AGREE_UPDATE')){
      if($('AGREE_UPDATE').checked == true){
        var savepage = true;
      }else{
        var savepage = false;
        $("ERRORPLACEHOLDER").innerHTML = "Please acknowledge that you understand that changing the name associated to this application will result in the revocation of your current token and the beginning of a new application process.";
      }
    }
    if(savepage){
      document.forms[0].submit();
    }
  }
}

var Required = {
  list: [],
  load: function(){
    for(var i=0; i<Required.list.length; i++){
      var obj = Required.list[i];
      if(obj.input){
        var inp = obj.input;
        inp.setAttribute("validate","required");
      }
      if(obj.label && obj.label != ""){
        var lbl = obj.label;
        if(lbl.innerHTML.indexOf("class='required'") == -1){
          lbl.innerHTML += "<span class='required'> *</span>";
        } 
      }
    }
  },
  validate: function(){
    for(var i=0; i<Required.list.length; i++){
      var obj = Required.list[i];     
      if(obj.input && obj.input.value == ""){
        if(obj.input.descendantOf('GUID5') && !$('GUID5').visible()){
        }else{
          $("ERRORPLACEHOLDER").innerHTML = "The form can not be saved until all required fields are filled out.";
          return false;
        }
      }
    }
    return true;
  }
}

var IDTTG = {
  getPassword: function(xml){
    new Ajax.Request(
      xml,{
        method: 'get',
        onSuccess: function(transport){
          if(transport.responseText != "" && transport.responseText.indexOf("ERROR") == -1){
            $("passwordButton","passwordInstructions").invoke("hide");
            $("initButton","initInstructions").invoke("show");
            $("tempPassword").innerHTML = transport.responseText;
          }else{
            $("ERRORPLACEHOLDER").innerHTML = "There was an error getting your temporary password.<br>"+transport.responseText;
          }
        },
        onFailure: function(transport){
          alert(transport.responseText);
        }
      }
    );
  },
  initTool: function(element){
    if("createEvent" in document){
      var evt = document.createEvent("Events");
      evt.initEvent("IdToolExtensionEvent",true,false);
      element.dispatchEvent(evt);
    }
  }
}
