﻿///////////////////////////////////////////////////////////////////////////////
//
//  wcoDataPortal.js
//
// © 2007-2009 Wco iEnterprise Solutions Pty Ltd. ALL RIGHTS RESERVED.
// This file is licensed as part of the DataPortal 2.0 Managed Web Presence Solution, for details look here: http://www.wco.com.au
//
///////////////////////////////////////////////////////////////////////////////

var dataportal = {};

/*<remarks>
Method: init
Description: Initialises the dataportal object, making it ready to receive and process calls.
Parameters:
  parent: [Required] a reference to the parent object that contains the business rules on how to process the data retrieved from the DataPortal
  isPaginationEnabledByDefault: [Optional] true/false flag indicating whether to fetch children of the current object in paginated batches or all together
  paginationDefaultClassName: [Optional] the name of the default class to which pagination is to be applied
  initialObjectId: [Optional] the id of the object to be retrieved from the DataPortal
</remarks>*/
dataportal.init = function(parent, portalGuid, websiteId, sessionLanguageCultureName) {
  this.parent = parent;
  
  // initialise the session properties
  this.portalGuid = portalGuid;
  this.websiteId = websiteId;
  
  this.isNewSession = true;
  this.sessionUserGuid = '';
  this.sessionId = '';
  this.sessionClientGuid = '';
  this.sessionIPAddress = '';
  this.sessionCultureId = '';
  this.sslOneTimeKey = '';
  this.isAccessGranted = false;
  this.isAnonymous = true;
  this.isAuthenticated = false;
  this.persistenceLevel = 0;
  this.isFrutigerInstalled = false;
  
  this.userFullName = '';
  this.userEmail = '';
  
  this.userAuthResponse = '';
  
  if (sessionLanguageCultureName == null) {
    this.sessionLanguageCultureName = 'en-AU';
  }
  else {
    this.sessionLanguageCultureName = sessionLanguageCultureName;
  }
  this.sessionLanguageCultureName = '';
  
  // initialise the XMLHTTP request object properties
  this.request = null;
  this.isRequestCanceled = false;
  this.currentRequestAction = 'FetchObject';
  this.executeCallback = null;
  
  // initialise the request information properties
  //this.requestSslUrl = 'https://wic039p.server-secure.com/vs335163_secure/Default.htm';
  this.requestSslUrl = 'http://localhost/CS2009.SSL/Default.htm';
  this.isSecureConnection = false;
  this.isAspxError = false;
  this.isQuerySuccess = false;
  this.queryResponse = '';
  this.queryResponseContentType = '';
  
  // initialise the DataPortal object properties
  this.currentObjectId = 0;
  this.currentParentId = 0;
  this.previousObjectId = 0;
  this.currentObjectClass = '';
  this.currentObjectClassIsLeaf = false;
  this.previousObjectClassIsLeaf = false;
  this.isPaginationEnabled = false;
  this.paginationClassName = '';
  this.paginationItemCount = 10;
  this.paginationPageNo = 1;
  
};

dataportal.setCallback = function(pointer) {
  dataportal.executeCallback = pointer;
};

/*<remarks>
Method: fetchObject
Description: Takes the passed object id and retrieves all data required from the DataPortal to display a new language title page.
Parameters:
  [0] objectId: [Required] the id of the object to be retrieved from the DataPortal
  [1] currentObjectClass: [Required] the class of the current object being fetched - this property determines which page to be built by the DataPortal wizard
  [2] currentObjectClassIsLeaf: [Required] flag indicating whether the current object is a leaf class or not - this property is used to control the identification of the relevant parent object of the leaf objects being fetched
  [3] isPaginationEnabled: [Optional] true/false flag indicating whether to fetch children of the current object in paginated batches or all together
  [4] paginationClassName: [Optional] the name of the default class to which pagination is to be applied
  [5] paginationItemCount: [Optional] the number of items per paginated fetch to be retrieved
  [6] paginationPageNo: [Optional] the paginated page number
  [7] sessionLanguageCultureName: [Optional] the ll-rr name of the current language, e.g. en-AU
  [8] isSignInFlagSet: [Optional] indicates whether the SignIn flag was retrieved from the url query string (if sent by the SSL application)
</remarks>*/
dataportal.fetchObject = function() {

  var objectId = 0;
  this.isPaginationEnabled = false;
  this.paginationPageNo = 1;
  if (arguments[0]) { objectId = arguments[0]; }
  if (arguments[3] != null) { this.isPaginationEnabled = arguments[3]; }
  if (arguments[4] != null) { this.paginationClassName = arguments[4]; }
  if (arguments[5] != null) { this.paginationItemCount = arguments[5]; }
  if (arguments[6] != null) { this.paginationPageNo = arguments[6]; }
  if (arguments[7] != null) { this.sessionLanguageCultureName = arguments[7]; }


  if (objectId > 0) {
    this.currentObjectId = objectId;
    this.currentObjectClass = arguments[1];
    this.currentObjectClassIsLeaf = arguments[2];
    if (!this.currentObjectClassIsLeaf) {
      this.previousObjectId = this.currentObjectId;
    }

    this.currentRequestAction = 'FetchObject';

    // prepare the xml-encoded request string to be sent to the DataPortal Wizard
    var sInput = '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>';
    sInput += '<wcoDataPortal>';

    sInput += '<session>';
    sInput += '<portalGuid>' + this.portalGuid + '</portalGuid>';
    sInput += '<websiteId>' + this.websiteId + '</websiteId>';
    if (this.sessionUserGuid != '') {
      sInput += '<userGuid>' + this.sessionUserGuid + '</userGuid>';
      sInput += '<sessionId>' + this.sessionId + '</sessionId>';
      sInput += '<clientGuid>' + this.sessionClientGuid + '</clientGuid>';
    }
    if (this.sslOneTimeKey != '') {
      sInput += '<sslOneTimeKey>' + this.sslOneTimeKey + '</sslOneTimeKey>';
    }
    sInput += '<isAuthenticated>' + this.isAuthenticated.toString().replace(/t/, 'T').replace(/f/, 'F') + '</isAuthenticated>';
    if (this.sessionLanguageCultureName != '') {
      sInput += '<sessionLanguageCultureName>' + this.sessionLanguageCultureName + '</sessionLanguageCultureName>';
    }
    sInput += '</session>';

    sInput += '<action>' + this.currentRequestAction + '</action>';

    sInput += '<currentObject>';
    sInput += '<className>' + this.currentObjectClass + '</className>';
    if (this.isPaginationEnabled) {
      sInput += '<pagination isEnabled="True">';
      sInput += '<appliesTo>' + this.paginationClassName + '</appliesTo>';
      sInput += '<pageSize>' + this.paginationItemCount + '</pageSize>';
      sInput += '<pageNo>' + this.paginationPageNo + '</pageNo>';
      sInput += '</pagination>';
    }
    sInput += '<objId>' + this.currentObjectId + '</objId>';
    //sInput += '<parentId>' + this.previousObjectId + '</parentId>';
    sInput += '<parentId>' + this.currentParentId + '</parentId>';
    sInput += '</currentObject>';
    sInput += '</wcoDataPortal>';

    //alert(sInput);
    this.httpRequest('POST', 'wcoDataPortal.aspx', true, sInput);
  }
};

/*<remarks>
Method: execute
Description: Takes the passed email address and password and attempts to signin to the DataPortal.
Parameters:
  action: [Required] the user email address registered with the DataPortal
  inputXmlStr: [Required] the password of the user account registered with the DataPortal
</remarks>*/
//dataportal.execute = function(action, inputXmlStr, callback) {
//  
//  if (action == null || action == '' || inputXmlStr == null) {
//    // cannot attempt request
//    alert('CANNOT PROCEED\n\nNo input provided.');
//    return (false);
//  }
//  else {
//    this.currentRequestAction = action;
//    if (callback != null) {
//      this.executeCallback = callback;
//    }
//    else {
//      this.executeCallback = null;
//    }
//    //alert(this.executeCallback);
//    
//    // prepare the xml-encoded request string to be sent to the PageBuilder Wizard
//    var sInput = '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>';
//    sInput += '<wcoDataPortal>';

//    sInput += '<session>';
//    sInput += '<portalGuid>' + this.portalGuid + '</portalGuid>';
//    sInput += '<websiteId>' + this.websiteId + '</websiteId>';
//    sInput += '<userGuid>' + this.sessionUserGuid + '</userGuid>';
//    sInput += '<sessionId>' + this.sessionId + '</sessionId>';
//    sInput += '<clientGuid>' + this.sessionClientGuid + '</clientGuid>';
//    if (this.sslOneTimeKey != '') {
//      sInput += '<sslOneTimeKey>' + this.sslOneTimeKey + '</sslOneTimeKey>';
//    }
//    sInput += '<isAuthenticated>' + this.isAuthenticated.toString().replace(/t/, 'T').replace(/f/, 'F') + '</isAuthenticated>';
//    sInput += '<sessionLanguageCultureName>' + this.sessionLanguageCultureName + '</sessionLanguageCultureName>';
//    sInput += '</session>';
//    
//    sInput += '<action>' + this.currentRequestAction + '</action>';
//    
//    sInput += '<currentObject>';
//    sInput += '<className>' + this.currentObjectClass + '</className>';
//    if (this.isPaginationEnabled) {
//      sInput += '<pagination isEnabled="True">';
//      sInput += '<appliesTo>' + this.paginationClassName + '</appliesTo>';
//      sInput += '<pageSize>' + this.paginationItemCount + '</pageSize>';
//      sInput += '<pageNo>' + this.paginationPageNo + '</pageNo>';
//      sInput += '</pagination>';
//    }
//    sInput += '<objId>' + this.currentObjectId + '</objId>';
//    sInput += '<parentId>' + this.previousObjectId + '</parentId>';
//    sInput += '</currentObject>';
//    
//    sInput += '<input>';
//    sInput += inputXmlStr;
//    sInput += '</input>';
//    sInput += '</wcoDataPortal>';
//    //alert(sInput);
//    
//    this.httpRequest('POST', 'wcoDataPortal.aspx', true, sInput);
//  }
//};

dataportal.execute = function(action, inputXmlStr, objXmlStr, callback) {
  
  if (action == null || action == '' || (inputXmlStr == null && objXmlStr == null)) {
    // cannot attempt request
    alert('CANNOT PROCEED\n\nNo input provided.');
    return (false);
  }
  else {
    this.currentRequestAction = action;
    if (callback != undefined) {
      this.executeCallback = callback;
    }
    else {
      this.executeCallback = null;
    }
    //alert(this.executeCallback);
    
    // prepare the xml-encoded request string to be sent to the PageBuilder Wizard
    var sInput = '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>';
    sInput += '<wcoDataPortal>';
    
    sInput += '<session>';
    sInput += '<portalGuid>' + this.portalGuid + '</portalGuid>';
    sInput += '<websiteId>' + this.websiteId + '</websiteId>';
    sInput += '<userGuid>' + this.sessionUserGuid + '</userGuid>';
    sInput += '<sessionId>' + this.sessionId + '</sessionId>';
    sInput += '<clientGuid>' + this.sessionClientGuid + '</clientGuid>';
    sInput += '<isAuthenticated>' + this.isAuthenticated.toString().replace(/t/, 'T').replace(/f/, 'F') + '</isAuthenticated>';
    sInput += '<cultureId>' + this.sessionCultureId + '</cultureId>';
    sInput += '</session>';
    
    sInput += '<action>' + this.currentRequestAction + '</action>';
    
    if (objXmlStr != null) {
      sInput += objXmlStr;
    }
//    sInput += '<currentObject>';
//    sInput += '<className>' + this.currentObjectClass + '</className>';
//    if (this.isPaginationEnabled) {
//      sInput += '<pagination isEnabled="True">';
//      sInput += '<appliesTo>' + this.paginationClassName + '</appliesTo>';
//      sInput += '<pageSize>' + this.paginationItemCount + '</pageSize>';
//      sInput += '<pageNo>' + this.paginationPageNo + '</pageNo>';
//      sInput += '</pagination>';
//    }
//    sInput += '<objId>' + this.currentObjectId + '</objId>';
//    sInput += '<parentId>' + this.previousObjectId + '</parentId>';
//    sInput += '</currentObject>';
    
    sInput += '<input>';
    sInput += inputXmlStr;
    sInput += '</input>';
    sInput += '</wcoDataPortal>';
//    alert(sInput);
    
    this.httpRequest('POST', 'wcoDataPortal.aspx', true, sInput);
  }
};

dataportal.cancelRequest = function() {
  dataportal.isRequestCanceled = true;
  this.executeCallback = null;
  if (this.request != null) {
    this.request.abort();
    this.request = null;
  }
}

dataportal.fetchCurrentObjectRequestHandler = function() {

  if (dataportal.request && !dataportal.isRequestCanceled) {

    if (dataportal.request.readyState == 4) {
      // the xmlhttp request has completed
      if (dataportal.request && !dataportal.isCanceled) {
        // retrieve the request data
        if (dataportal.request.getResponseHeader('IsSecureConnection') == 'True')
          dataportal.isSecureConnection = true;
        else
          dataportal.isSecureConnection = false;
        if (dataportal.request.getResponseHeader('wcoIsAspxError') == 'True')
          dataportal.isAspxError = true;
        else
          dataportal.isAspxError = false;
        if (dataportal.request.getResponseHeader('wcoIsQuerySuccess') == 'True')
          dataportal.isQuerySuccess = true;
        else
          dataportal.isQuerySuccess = false;
        dataportal.queryResponse = dataportal.request.getResponseHeader('wcoQueryResponse');
        dataportal.queryResponseContentType = dataportal.request.getResponseHeader('Content-Type');

        // retrieve the user personal data
        dataportal.userFullName = dataportal.request.getResponseHeader('wcoUserFullName');
        dataportal.userEmail = dataportal.request.getResponseHeader('wcoUserEmail');

        // retrieve the session data
        dataportal.portalGuid = dataportal.request.getResponseHeader('wcoPortalGuid');
        dataportal.websiteId = dataportal.request.getResponseHeader('wcoWebSiteId');
        dataportal.sessionUserGuid = dataportal.request.getResponseHeader('wcoSessionUserGuid');
        dataportal.sessionId = dataportal.request.getResponseHeader('wcoSessionId');
        dataportal.sessionClientGuid = dataportal.request.getResponseHeader('wcoSessionClientGuid');
        dataportal.sessionIPAddress = dataportal.request.getResponseHeader('wcoSessionIPAddress');
        dataportal.sessionCultureId = dataportal.request.getResponseHeader('wcoSessionCultureId');
        dataportal.sessionLanguageCultureName = dataportal.request.getResponseHeader('wcoSessionLanguageCultureName');
        if (dataportal.request.getResponseHeader('wcoIsAccessGranted') == 'True')
          dataportal.isAccessGranted = true;
        else
          dataportal.isAccessGranted = false;
        dataportal.isAnonymous = (dataportal.userEmail == 'anon@wco.com.au');
        if (dataportal.request.getResponseHeader('wcoIsAuthenticated') == 'True')
          dataportal.isAuthenticated = true;
        else
          dataportal.isAuthenticated = false;
        dataportal.userAuthResponse = dataportal.request.getResponseHeader('wcoUserAuthResponse');
        if (dataportal.request.getResponseHeader('wcoIsFrutigerInstalled') == 'true') {
          dataportal.isFrutigerInstalled = true;
        }
        //alert(dataportal.isFrutigerInstalled);
        
        var content = dataportal.request.responseText
        //alert(content);

//        alert('REQUEST DATA:' +
//              '\nisSecureConnection = ' + dataportal.isSecureConnection +
//              '\n\nisAspxError = ' + dataportal.isAspxError +
//              '\nisQuerySuccess = ' + dataportal.isQuerySuccess +
//              '\nqueryResponse = ' + dataportal.queryResponse +
//              '\n\nSESSION DATA:' +
//              '\nisNewSession = ' + dataportal.isNewSession +
//              '\nportalGuid = ' + dataportal.portalGuid +
//              '\nwebsiteId = ' + dataportal.websiteId +
//              '\nsessionUserGuid = ' + dataportal.sessionUserGuid +
//              '\nsessionId = ' + dataportal.sessionId +
//              '\nsessionClientGuid = ' + dataportal.sessionClientGuid +
//              '\nsessionIPAddress = ' + dataportal.sessionIPAddress +
//              '\nsessionCultureId = ' + dataportal.sessionCultureId +
//              '\nisAccessGranted = ' + dataportal.isAccessGranted +
//              '\nisAnonymous = ' + dataportal.isAnonymous +
//              '\nisAuthenticated = ' + dataportal.isAuthenticated +
//              '\nuserAuthResponse = ' + dataportal.userAuthResponse +
//              '\nuserFullName = ' + dataportal.userFullName +
//              '\nuserEmail = ' + dataportal.userEmail +
//              '\nisFrutigerInstalled = ' + dataportal.isFrutigerInstalled);

        if (content == 'Failed' || dataportal.isAspxError) {
//          alert('DATA FETCH HALTED\n\nAn error has occured ("Failed" response received from wcoDataPortal.aspx).\nPlease notify your system administrator of this error.\nThe system cannot proceed past this point.' +
//                '\n\nREQUEST DATA:' +
//                '\nisSecureConnection = ' + dataportal.isSecureConnection +
//                '\n\nisAspxError = ' + dataportal.isAspxError +
//                '\nisQuerySuccess = ' + dataportal.isQuerySuccess +
//                '\nqueryResponse = ' + dataportal.queryResponse +
//                '\n\nSESSION DATA:' +
//                '\nisNewSession = ' + dataportal.isNewSession +
//                '\nportalGuid = ' + dataportal.portalGuid +
//                '\nwebsiteId = ' + dataportal.websiteId +
//                '\nsessionUserGuid = ' + dataportal.sessionUserGuid +
//                '\nsessionId = ' + dataportal.sessionId +
//                '\nsessionClientGuid = ' + dataportal.sessionClientGuid +
//                '\nsessionIPAddress = ' + dataportal.sessionIPAddress +
//                '\nsessionCultureId = ' + dataportal.sessionCultureId +
//                '\nisAccessGranted = ' + dataportal.isAccessGranted +
//                '\nisAnonymous = ' + dataportal.isAnonymous +
//                '\nisAuthenticated = ' + dataportal.isAuthenticated +
//                '\nuserAuthResponse = ' + dataportal.userAuthResponse +
//                '\nuserFullName = ' + dataportal.userFullName +
//                '\nuserEmail = ' + dataportal.userEmail);
          return (false);
        }

        if (!dataportal.isQuerySuccess) {
//          alert('DATA FETCH HALTED\n\nAn error has occured ("IsSuccess = False" response received from the DataPortal).\nPlease notify your system administrator of this error.\nThe system cannot proceed past this point.' +
//                '\n\nREQUEST DATA:' +
//                '\nisSecureConnection = ' + dataportal.isSecureConnection +
//                '\n\nisAspxError = ' + dataportal.isAspxError +
//                '\nisQuerySuccess = ' + dataportal.isQuerySuccess +
//                '\nqueryResponse = ' + dataportal.queryResponse +
//                '\n\nSESSION DATA:' +
//                '\nisNewSession = ' + dataportal.isNewSession +
//                '\nportalGuid = ' + dataportal.portalGuid +
//                '\nwebsiteId = ' + dataportal.websiteId +
//                '\nsessionUserGuid = ' + dataportal.sessionUserGuid +
//                '\nsessionId = ' + dataportal.sessionId +
//                '\nsessionClientGuid = ' + dataportal.sessionClientGuid +
//                '\nsessionIPAddress = ' + dataportal.sessionIPAddress +
//                '\nsessionCultureId = ' + dataportal.sessionCultureId +
//                '\nisAccessGranted = ' + dataportal.isAccessGranted +
//                '\nisAnonymous = ' + dataportal.isAnonymous +
//                '\nisAuthenticated = ' + dataportal.isAuthenticated +
//                '\nuserAuthResponse = ' + dataportal.userAuthResponse +
//                '\nuserFullName = ' + dataportal.userFullName +
//                '\nuserEmail = ' + dataportal.userEmail);
//          alert(content);
          return (false);
        }

        dataportal.request = null;
        dataportal.isNewSession = false;

        //alert('dataportal.executeCallback is:\n' + dataportal.executeCallback);
        //        if (dataportal.executeCallback != null) {
        //          dataportal.executeCallback(content);
        //        }
        //        else {
        //          dataportal.parent.handleDataPortalResults(content);
        //        }
        if (dataportal.executeCallback != null) {
          dataportal.executeCallback(content);
        }
        else {
          //alert(content);
          dataportal.parent.displayObject(content);
          //window.document.open();
          //window.document.write(content);
          //window.document.close();

          //var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
          //xmlDoc.async = "false";
          //xmlDoc.loadXML(content);
          //alert(xmlDoc.xml);
          //document.write(xmlDoc.xml);
        }

      }
    }

  }
}

/*<remarks>
Method: httpRequest
Description: Wrapper function for constructing an AJAX request object.
Parameters:
  reqType: The HTTP request type, such as GET or POST.
  url: The URL of the server program.
  asynch: Whether to send the request asynchronously or not.
  param: The XML-encoded data string to be sent to the backed web service.
</remarks>*/
dataportal.httpRequest = function (reqType, url, asynch, param) {
  if (this.request) {this.request.abort(); this.request = null;}
  
  this.isRequestCanceled = false;
  
  //Mozilla-based browsers
  if(window.XMLHttpRequest){
    this.request = new XMLHttpRequest( );
  }
  else if (window.ActiveXObject){
    this.request = new ActiveXObject("Msxml2.XMLHTTP");
    if (! this.request){
      this.request = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  //the request object could still be null if neither ActiveXObject initialization succeeded
  if(this.request){
    this.initRequest(reqType, url, asynch, param);
  }
  else {
    alert("Your browser does not permit the use of all " +
          "of this application's features!");
  }
};

/* Initialize a request object that is already constructed */
dataportal.initRequest = function (reqType, url, bool, param) {
  this.request.onreadystatechange = this.fetchCurrentObjectRequestHandler;
  this.request.open(reqType, url, bool);
  this.request.setRequestHeader('CONTENT-TYPE', 'text/utf-8');
  //alert(param);

  // initiate the xmlhttp request
  this.request.send(param);
};

