/// <reference path="LaunchNetClientBase.js"/>
/// <reference path="BrowserServices.js"/>
/// <reference path="ErrorServices.js"/>
/// <reference path="ClientProxyServices.js"/>
/// <reference path="LaunchNetClientContext.js"/>
/// <reference path="PlatformServices.js"/>     


//the following are variables for which values are injected
//var __yourVariable;

function ReadyClinicalTrialServices() {
    var participantAnswerElementRegex = /^([^<>]*)(?:<([^<>]+),([^<>]+)>)$/;
    var commands = new LaunchNetServiceCommands();
    commands.Add("YourCommandName");
    commands.Add("ReadySiteNonUSParticipantSubmit");
    commands.Add("ParticipantAnswerSubmit");
    commands.Add("ReadySiteParticipantNonUSUnsubscribeSubmit");

  this.OnPageLoad = OnPageLoad;
  this.OnPageClick = OnPageClick;
  this.OnValidationRequiredCheck = OnValidationRequiredCheck;
  this.OnValidateLaunchNetElements = OnValidateLaunchNetElements;

  this.YourCommandName = YourCommandName;

  this.ReadySiteNonUSParticipantSubmit = ReadySiteNonUSParticipantSubmit;
  this.ParticipantAnswerSubmit = ParticipantAnswerSubmit;
  this.ReadySiteParticipantNonUSUnsubscribeSubmit = ReadySiteParticipantNonUSUnsubscribeSubmit;



  function ParticipantAnswerElement(launchNetElement) {
      this.Init = Init(launchNetElement);

      var _launchNetElement;
      var _question;
      var _answer;

      this.LaunchNetElement = _launchNetElement;
      this.Question = _question;
      this.Answer = _answer;
      this.IsOpenEnded = _answer == "OPEN" || _answer.length < 1;

      function Init(launchNetElement) {
          var result = participantAnswerElementRegex.exec(launchNetElement.Id);
          if (result == null) {
              _launchNetElement = null;
              _question = null;
              _answer = null;
          }
          else {
              _launchNetElement = launchNetElement;
              _question = result[2];
              _answer = result[3];
          }
      }
  }



  function LaunchNetElementToParticipantAnswerElement(launchNetElement) {
      var result = participantAnswerElementRegex.test(launchNetElement.Id);
      if (!result) {
          return null;
      }
      else {
          return new ParticipantAnswerElement(launchNetElement);
      }
  }



  function GetParticipantAnswerLaunchNetElements() {
      var launchNetElements = GetLaunchNetElements();
      var participantAnswerElements = [];
      var count = 0;
      for (var i = 0; i < launchNetElements.length; i++) {
          var participantAnswerElement = LaunchNetElementToParticipantAnswerElement(launchNetElements[i]);
          if (participantAnswerElement != null) {
              participantAnswerElements[count++] = participantAnswerElement;
          }
      }

      return participantAnswerElements;
  }

/* ***********************************************************************************
-  Page Load Event
************************************************************************************ */

  function OnPageLoad()
  {
//    deactivateAll();
  }

/* ***********************************************************************************
-  Page Click Event
************************************************************************************ */

  function OnPageClick(launchNetElementClicked, pageValid)
  {
    commands.HandlePageClick(this, launchNetElementClicked, pageValid);
  }
  function ReadySiteNonUSParticipantSubmit(treatmentCode) {
      //obtain data for participant
 
      var firstName = GetLaunchNetElementById("FirstName").GetValue();
      var lastName = GetLaunchNetElementById("LastName").GetValue();
      var address1 = GetLaunchNetElementById("Address1").GetValue();
      var city = GetLaunchNetElementById("City").GetValue();
      //pass dummy values to the State and Zip
      //var state = GetLaunchNetElementById("State").GetValue();
//      var statee = document.getElementById("state<111,OPEN>").value.replace(/^\s+|\s+$/, "");
//      var zipp = document.getElementById("zip<222,OPEN>").value.replace(/^\s+|\s+$/, "");
//      if (statee == "") document.getElementById("state<111,OPEN>").value = "*****";
//      else document.getElementById("state<111,OPEN>").value = GetLaunchNetElementById("State").GetValue();
//      if (zipp == "") document.getElementById("zip<222,OPEN>").value = "#####";
//      else document.getElementById("zip<222,OPEN>").value = GetLaunchNetElementById
      var state = 'AK';
      //var zip = GetLaunchNetElementById("Zip").GetValue();
      var zip = '12345';

      //as some elements are optional, we'll provide an empty string if the apropriate element cannot be found
      var prefixElement = GetLaunchNetElementById("Prefix");
      var suffixElement = GetLaunchNetElementById("Suffix");
      var middleInitialElement = GetLaunchNetElementById("MiddleInitial");
      var address2Element = GetLaunchNetElementById("Address2");

      var prefix = prefixElement == null ? "" : prefixElement.GetValue();
      var middleInitial = middleInitialElement == null ? "" : middleInitialElement.GetValue();
      var suffix = suffixElement == null ? "" : suffixElement.GetValue();
      var address2 = address2Element == null ? "" : address2Element.GetValue();

      var treatmentCode = (typeof treatmentCode == "undefined") ? "" : treatmentCode;

      //submit participant
      var response = __context.GetServiceClientProxy('FicoServices').AddParticipant
      (
      prefix
      , firstName
      , middleInitial
      , lastName
      , suffix
      , address1
      , address2
      , city
      , state
      , zip
      , treatmentCode
      );

      if (response.error != null || response.value == null) {
          __context.RedirectToErrorPage();
          return false;
      }

      //also submit any participant answers on the page
      return ParticipantAnswerSubmit();
  }

  /********/
  function ParticipantAnswerSubmit() {
      var participantAnswerElements = GetParticipantAnswerLaunchNetElements();

      var idBased = new Array();
      var idBasedCount = 0;
      var openEnded = new Array();
      var openEndedCount = 0;

      for (var i = 0; i < participantAnswerElements.length; i++) {
          var participantAnswer = new Object();

          participantAnswer.Answer = GetElementValue(participantAnswerElements[i].LaunchNetElement);

          if (participantAnswerElements[i].LaunchNetElement.Element.type == "checkbox" &&
          (participantAnswer.Answer.length < 1 || participantAnswer.Answer.trim().length < 1)) {
              //if a checkbox and no answer was provided, use the "unanswered" answer from client id
              //ie, "field<question,answer>", answer would be used for a checkbox that was unchecked
              participantAnswer.Answer = participantAnswerElements[i].Answer;
          }

          if (participantAnswer.Answer.length > 0 && participantAnswer.Answer.trim().length > 0) {
              participantAnswer.QuestionId = participantAnswerElements[i].Question;

              //only visible and enabled elements are submitted
              if (participantAnswerElements[i].LaunchNetElement.Element.style.visibility != 'hidden'
          && participantAnswerElements[i].LaunchNetElement.Element.style.display != 'none'
          && !participantAnswerElements[i].LaunchNetElement.Element.disabled) {
                  if (participantAnswerElements[i].IsOpenEnded) {
                      openEnded[openEndedCount++] = participantAnswer;
                  }
                  else {
                      idBased[idBasedCount++] = participantAnswer;
                  }
              }
          }
      }

      var response;
      if (idBasedCount > 0) {
          response = __context.GetFicoServicesClientProxy().AddParticipantAnswers(idBased, false);
          if (response.error != null || response.value == false) {
              __context.RedirectToErrorPage();
              return false;
          }
      }

      if (openEndedCount > 0) {
          response = __context.GetFicoServicesClientProxy().AddParticipantAnswers(openEnded, true);
          if (response.error != null || response.value == false) {
              __context.RedirectToErrorPage();
              return false;
          }
      }

      return true;
  }

  /* unsubscribe validation*/
  function ReadySiteParticipantNonUSUnsubscribeSubmit(treatmentCode) {
      //obtain data for participant unsubscribe

      var firstName = GetLaunchNetElementById("FirstName").GetValue();
      var lastName = GetLaunchNetElementById("LastName").GetValue();
      var address1 = GetLaunchNetElementById("Address1").GetValue();
      var city = GetLaunchNetElementById("City").GetValue();
      //pass dummy values to the State and Zip
      //var state = GetLaunchNetElementById("State").GetValue();
//      var statee = document.getElementById("state<111,OPEN>").value.replace(/^\s+|\s+$/, "");
//      var zipp = document.getElementById("zip<222,OPEN>").value.replace(/^\s+|\s+$/, "");
//      if (statee == "") document.getElementById("state<111,OPEN>").value = "*****";
//      else document.getElementById("state<111,OPEN>").value = GetLaunchNetElementById("State").GetValue();
//      if (zipp == "") document.getElementById("zip<222,OPEN>").value = "#####";
//      else document.getElementById("zip<222,OPEN>").value = GetLaunchNetElementById
      var state = 'AK';
      //var zip = GetLaunchNetElementById("Zip").GetValue();
      var zip = '12345';

      //as some elements are optional, we'll provide an empty string if the apropriate element cannot be found
      var prefixElement = GetLaunchNetElementById("Prefix");
      var suffixElement = GetLaunchNetElementById("Suffix");
      var middleInitialElement = GetLaunchNetElementById("MiddleInitial");
      var address2Element = GetLaunchNetElementById("Address2");

      var prefix = prefixElement == null ? "" : prefixElement.GetValue();
      var middleInitial = middleInitialElement == null ? "" : middleInitialElement.GetValue();
      var suffix = suffixElement == null ? "" : suffixElement.GetValue();
      var address2 = address2Element == null ? "" : address2Element.GetValue();
    
      var treatmentCode = (typeof treatmentCode == "undefined") ? "" : treatmentCode;
      
      var response = __context.GetServiceClientProxy('FicoServices').AddParticipantUnsubscribe
      (
      prefix
      , firstName
      , middleInitial
      , lastName
      , suffix
      , address1
      , address2
      , city
      , state
      , zip
      , treatmentCode
      );

      if (response.error != null || response.value == null) {
          __context.RedirectToErrorPage();
          return false;
      }

      //also submit any participant answers on the page
      return ParticipantAnswerSubmit();
  }

  function ParticipantAnswerSubmit() {
      var participantAnswerElements = GetParticipantAnswerLaunchNetElements();

      var idBased = new Array();
      var idBasedCount = 0;
      var openEnded = new Array();
      var openEndedCount = 0;

      for (var i = 0; i < participantAnswerElements.length; i++) {
          var participantAnswer = new Object();

          participantAnswer.Answer = GetElementValue(participantAnswerElements[i].LaunchNetElement);

          if (participantAnswerElements[i].LaunchNetElement.Element.type == "checkbox" &&
          (participantAnswer.Answer.length < 1 || participantAnswer.Answer.trim().length < 1)) {
              //if a checkbox and no answer was provided, use the "unanswered" answer from client id
              //ie, "field<question,answer>", answer would be used for a checkbox that was unchecked
              participantAnswer.Answer = participantAnswerElements[i].Answer;
          }

          if (participantAnswer.Answer.length > 0 && participantAnswer.Answer.trim().length > 0) {
              participantAnswer.QuestionId = participantAnswerElements[i].Question;

              //only visible and enabled elements are submitted
              if (participantAnswerElements[i].LaunchNetElement.Element.style.visibility != 'hidden'
          && participantAnswerElements[i].LaunchNetElement.Element.style.display != 'none'
          && !participantAnswerElements[i].LaunchNetElement.Element.disabled) {
                  if (participantAnswerElements[i].IsOpenEnded) {
                      openEnded[openEndedCount++] = participantAnswer;
                  }
                  else {
                      idBased[idBasedCount++] = participantAnswer;
                  }
              }
          }
      }

      var response;
      if (idBasedCount > 0) {
          response = __context.GetFicoServicesClientProxy().AddParticipantAnswers(idBased, false);
          if (response.error != null || response.value == false) {
              __context.RedirectToErrorPage();
              return false;
          }
      }

      if (openEndedCount > 0) {
          response = __context.GetFicoServicesClientProxy().AddParticipantAnswers(openEnded, true);
          if (response.error != null || response.value == false) {
              __context.RedirectToErrorPage();
              return false;
          }
      }

      return true;
  }
  
  
  
  function YourCommandName()
  {
    //your functionality here, performed on YourCommandName
  }

/* ***********************************************************************************
-  Page Validation
************************************************************************************ */

  function OnValidationRequiredCheck(launchNetElementClicked)
  {
    return commands.HandleValidationRequiredCheck(launchNetElementClicked);
    //return true if the incoming launchNetElementClicked indicates a need to perform validation
    //note that launchNetElementClicked is of type LaunchNetElement (see LaunchNetClientBase.js)
  }

  function OnValidateLaunchNetElements(validatableLaunchNetElements)
  {
    //validate any special elements here; return true if validation successful
    return true;
  }

}

function deactivateAll(which)
{
    if(typeof(which)=='undefined') {which='main';}    
    var navdiv_main = document.getElementById(which);

    if (navdiv_main != null) {

        var elementUL = (document.all ? navdiv_main.all[2] : navdiv_main.childNodes[3]);

        //------Remove selection from all Tabs------
        for (i = 0; i < elementUL.childNodes.length; i++) {
            if (elementUL.childNodes[i].nodeName == "LI") {
                elementUL.childNodes[i].className = "";
            }
        }        
    }
    
    //-----------------------------------------
    
    if(which=='secondary') {return; //jumps to activate()
    }    
    deactivateAll('secondary');   
    
    activate();
}

function activate()
{    
    //------------Set Tab Active---------------
    var selected_option=null;
    
    try { selected_option=document.getElementById("opt_selected").value; } catch(e) {}
    
    if(typeof(selected_option)=='undefined' || selected_option==null) {return false ;}
    
    document.getElementById(selected_option).className="highlighted";
}

