﻿///////////////////////////////////////////////////////////////////////////////
//
//  wcoDataPortal.js
//
// © 2007-2008 Wco iEnterprise Solutions. 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, languageCultureName) {
  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.userFullName = '';
  this.userEmail = '';
  
  this.userAuthResponse = '';
  
  if (languageCultureName == null) {
    this.languageCultureName = 'en-AU';
  }
  else {
    this.languageCultureName = languageCultureName;
  }
  
  // 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://WIC014V.server-secure.com/VS306483_secure/Default.htm';
  this.requestSslUrl = 'http://localhost/ssl2008/Default.htm';
  //this.requestSslUrl = 'http://wcowrk02/ssl2008/Default.htm';
  this.isSecureConnection = false;
  this.isAspxError = false;
  this.isQuerySuccess = false;
  this.queryResponse = '';
  this.queryResponseContentType = '';
  
  // initialise the DataPortal object properties
  this.currentObjectId = 0;
  this.previousObjectId = 0; // the Base Object ID of the Wco DataPortal
  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] languageCultureName: [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.languageCultureName = 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 += '<languageCultureName>' + this.languageCultureName + '</languageCultureName>';
    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 += '</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 += '<languageCultureName>' + this.languageCultureName + '</languageCultureName>';
    sInput += '</session>';
    
    sInput += '<action>' + this.currentRequestAction + '</action>';
    
    sInput += '<input>';
    sInput += inputXmlStr;
    sInput += '</input>';
    sInput += '</wcoDataPortal>';
    //alert(sInput);
    
    this.httpRequest('POST', 'wcoDataPortal.aspx', true, sInput);
  }
};

dataportal.cancelRequest = function() {
  if (this.request != null) {
    dataportal.isRequestCanceled = true;
    this.request.abort();
    this.request = null;
    this.executeCallback = 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');
        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');
        
        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);
        
        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);
          dataportal.parent.displayError(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.displayObject(content);
        }
        
      }
    }
  
  }
}

/*<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);
};

