Zapatec Suite

zptravel.js

Summary

Zapatec Travel application based on Zapatec Suite. Common functions.

 Copyright (c) 2004-2009 by Zapatec, Inc.
 http://www.zapatec.com
 1700 MLK Way, Berkeley, California,
 94709, U.S.A.
 All rights reserved.
 



Class Summary
Zapatec.Travel  

/**
 * @fileoverview Zapatec Travel application based on Zapatec Suite. Common
 * functions.
 *
 * <pre>
 * Copyright (c) 2004-2009 by Zapatec, Inc.
 * http://www.zapatec.com
 * 1700 MLK Way, Berkeley, California,
 * 94709, U.S.A.
 * All rights reserved.
 * </pre>
 */

/* $Id: zptravel.js 15736 2009-02-06 15:29:25Z nikolai $ */

/**
 * Namespace definition.
 * @constructor
 */
Zapatec.Travel = function() {};


/**
 * On load its attached some validation to the search form
 * @public
 */
window.onload = function(){
	// Initiate Form Validations
	Zapatec.Travel.SearchForm = new Zapatec.Form({
	    form: 'zpTravelSearchFlightForm',
	    strict: true,
	    showErrorsOnSubmit: true,
	    submitValidFunc: function(){ Zapatec.Travel.message('Search started.'); },
		asyncSubmitFunc: Zapatec.Travel.parseSessionId,
		statusImgPos: 'beforeField',
		showErrors: function(el,msg){
			el.style.backgroundColor = (typeof(msg)!=='undefined') ? '#F9CFA6' : '#FFFFFF';
			document.getElementById(el.id+'_req').style.display = (typeof(msg)!=='undefined') ? '' : 'none';
		},
		statusImgPos: null,
		startupFocusPosition: 'firstRequiredField',
		theme: 'zptravelform',
		themePath: Zapatec.Travel.baseDir+'apps/travel/',
		hideUntilThemeLoaded: true,
		putTabIndexesOnError: false
	});
	// Init session ID
	Zapatec.Travel.sessionId = '';
	// Remove listeners if any
	Zapatec.EventDriven.removeEvent('zpTravelGotSessionId');
}
/*
Zapatec.Travel.Validate = function(){
	Zapatec.Travel.searchFlight();
	return false;
}
*/
/**
 * Holds session ID on kayak.
 * @private
 */
Zapatec.Travel.sessionId = '';

/**
 * Initializes session.
 * @private
 */
Zapatec.Travel.initSession = function() {
  // Init session ID
  Zapatec.Travel.sessionId = '';
  // Remove listeners if any
  Zapatec.EventDriven.removeEvent('zpTravelGotSessionId');
};

/**
 * Opens session on kayak and stores its ID.
 * @private

Zapatec.Travel.getSession = function() {
  // Put session request through the proxy
  Zapatec.Transport.fetchJsonObj({
    url: 'zpsession.php',
    reliable: true,
    onLoad: Zapatec.Travel.parseSessionId
  });
};
 */
 
/**
 * Parses response from kayak and gets session ID from it. Gets called from
 * Zapatec.Travel#getSession.
 *
 * @private
 * @param {object} oSession Server response
 */
Zapatec.Travel.parseSessionId = function(oSession) {
  // Get session ID
  if (oSession && oSession.sid) {
    Zapatec.Travel.sessionId = oSession.sid;
	Zapatec.Travel.searchFlight();
    Zapatec.Travel.startSearchFlight();
    return;
  }
  // Show the reason why session ID was not returned
  var strError = '';
  if (oSession && oSession.error) {
    strError = oSession.error;
  }
  Zapatec.Travel.error('Cannot open session: ' + strError);
};

/**
 * Holds search ID on kayak.
 * @private
 */
Zapatec.Travel.searchId = '';

/**
 * Holds "morepending" flag value.
 * @private
 */
Zapatec.Travel.morePending = false;

/**
 * Holds search instance on kayak.
 * @private
 */
Zapatec.Travel.searchInstance = '';

/**
 * Holds next poll timeout.
 * @private
 */
Zapatec.Travel.pollTimeout = null;

/**
 * Holds reference to the grid object to be able to update it on next poll.
 * @private
 */
Zapatec.Travel.grid = null;


/**
 * Holds reference to window object that will contain chart
 * @private
 */
Zapatec.Travel.PopupBigChart = null;

/**
 * Initializes search.
 * @private
 */
Zapatec.Travel.initSearch = function() {
  // Remove listeners if any
  Zapatec.EventDriven.removeEvent('zpTravelGotSearchId');
  Zapatec.EventDriven.removeEvent('zpTravelScheduleNextPoll');
  // Stop pending search
  if (Zapatec.Travel.pollTimeout) {
    clearTimeout(Zapatec.Travel.pollTimeout);
    Zapatec.Travel.pollTimeout = null;
  }
  // Init search ID
  Zapatec.Travel.searchId = '';
  // Init "morepending" flag
  Zapatec.Travel.morePending = false;
  // Init search instance
  Zapatec.Travel.searchInstance = '';
};

/**
 * Parses response from kayak and gets search ID from it.
 *
 * @private
 * @param {object} oSearch Server response
 */
Zapatec.Travel.parseSearchId = function(oSearch) {
  // Get search ID
  if (oSearch && oSearch.searchid) {
    Zapatec.Travel.searchId = oSearch.searchid;
    Zapatec.EventDriven.fireEvent('zpTravelGotSearchId');
    return;
  }
  // Show the reason why search ID was not returned
  var aError = [];
  if (oSearch) {
    if (oSearch.title) {
      aError.push(oSearch.title);
    }
    if (oSearch.message) {
      aError.push(oSearch.message);
    }
    if (oSearch.detail) {
      aError.push(oSearch.detail);
    }
    if (oSearch.origin) {
      aError.push('Ambiguous location. Try one of the following:');
      aError.push(oSearch.origin);
    }
  }
  Zapatec.Travel.error('Cannot start search: ' + aError.join('\n'));
  Zapatec.Travel.searchShow();
};

/**
 * Parses search poll result and updates the grid.
 *
 * @private
 * @param {object} oData Server response
 */
Zapatec.Travel.parsePoll = function(oData) {
  if (!oData) {
    return;
  }
  // Get morepending
  if (oData.morepending && oData.morepending == 'true') {
    Zapatec.Travel.morePending = true;
  } else {
    Zapatec.Travel.morePending = false;
  }
  // Get search instance
  if (typeof oData.searchinstance != 'undefined') {
    Zapatec.Travel.searchInstance = oData.searchinstance;
  } else {
    Zapatec.Travel.searchInstance = '';
  }
  // Update grid
  if ((oData.rows instanceof Array) && oData.rows.length) {
    setTimeout(function() {
      // Remove filters and go to first page
      Zapatec.Travel.grid.resetFilters();
      // Replace all rows
      Zapatec.Travel.grid.splice({
        atRow: 0,
        howMany: Zapatec.Travel.grid.totalRecords(),
        rows: oData.rows
      });
      // Let the grid to redraw itself
      setTimeout(Zapatec.Travel.finishPoll, 0);
    }, 0);
  } else if(Zapatec.Travel.morePending===false) {
    Zapatec.Travel.finishPoll();
  }
};

/**
 * Finishes search poll.
 * @private
 */
Zapatec.Travel.finishPoll = function() {
  // If there are more data left
  if (Zapatec.Travel.morePending) {
    // Schedule next poll
    Zapatec.EventDriven.fireEvent('zpTravelScheduleNextPoll');
  } else {
	//Display chart axis sliders
	Zapatec.Travel.chartIsLarger = false;
    //Create a window for larger Chart
	Zapatec.Travel.PopupBigChart = new Zapatec.Window.setup({
		theme: 'winxp',
		title: 'Flight\'s chart',
		initialState : 'hidden',
		divContent: 'zpTFCBContainer',
		showCloseButton: true,
		canResize: true,
		width: 380,
		height: 495,
		showStatus: false,
		hideOnClose: true,
		eventListeners: {
		    onClose: function(){
		    	Zapatec.Travel.chartIsLarger = false;
		    	document.getElementById('zpTFCBContainer').style.display = 'none';
		        document.getElementById('zpTFCB').innerHTML = '';
		        document.getElementById('zpTravelFlightChartContainer').style.display = '';
		    }
		}
	});
    // Remove progress
    Zapatec.Travel.progressBarUpdate(100);
    Zapatec.Travel.message('');
  }
};

/**
 * Holds pagination slider object.
 * @private
 */
Zapatec.Travel.paginationSliderOnBottom = null;
Zapatec.Travel.paginationSliderOnTop = null;
//MXCODER para paginacion ONTOP
/**
 * Gets called by the pagination slider to update the grid.
 *
 * @private
 * @param {object} iValue New page number
 */
Zapatec.Travel.onPaginationSliderMove = function(iValue) {
	Zapatec.Travel.grid.gotoPage(Math.ceil(iValue));
	//Update both sliders
	Zapatec.Travel.paginationSliderOnTop.setPos(Math.ceil(iValue));
	Zapatec.Travel.paginationSliderOnBottom.setPos(Math.ceil(iValue));
};

/**
 * Gets called by the grid to display pagination.
 *
 * @private
 * @param {object} oGrid Grid object
 */
Zapatec.Travel.displayPagination = function(oGrid) {
  // Get number of pages
  var iPages = oGrid.totalPages();
  if (iPages < 2) {
    document.getElementById('zpTravelGridPaginationOnTop').style.display = 'none';
    document.getElementById('zpTravelGridPaginationOnBottom').style.display = 'none';
    return;
  } else {
    document.getElementById('zpTravelGridPaginationOnTop').style.display = '';
    document.getElementById('zpTravelGridPaginationOnBottom').style.display = '';
  }
  // Gat current page
  var iCurrentPage = oGrid.getCurrentPageNumber();
  // Print current page number
  document.getElementById('zpTravelGridPaginationContainerOnTop').innerHTML = 'Page '+iCurrentPage+' of '+iPages+' : ';
  document.getElementById('zpTravelGridPaginationContainerOnBottom').innerHTML = 'Page '+iCurrentPage+' of '+iPages+' : ';
  // Reset slider
  if (Zapatec.Travel.paginationSliderOnTop && Zapatec.Travel.paginationSliderOnBottom) {
    // Need to reset slider only after filtering or searching
    var aSliderRange = Zapatec.Travel.paginationSliderOnBottom.config.range;
    if (!(aSliderRange instanceof Array) || aSliderRange[1] != iPages - 1) {
      Zapatec.Travel.paginationSliderOnBottom.setRange(0, iPages - 1);
      Zapatec.Travel.paginationSliderOnTop.setRange(0, iPages - 1);
    }
  } else {
    // Initialize slider
    Zapatec.Travel.paginationSliderOnTop = new Zapatec.Slider({
      div: 'zpTravelGridPaginationSliderOnTop',
      length: 99,
      orientation: 'H',
      step: 1,
      range: [0, iPages - 1],
      newPosition: Zapatec.Travel.onPaginationSliderMove
    });
    Zapatec.Travel.paginationSliderOnBottom = new Zapatec.Slider({
      div: 'zpTravelGridPaginationSliderOnBottom',
      length: 99,
      orientation: 'H',
      step: 1,
      range: [0, iPages - 1],
      newPosition: Zapatec.Travel.onPaginationSliderMove
    });
  }
  // Get number of results per page
  var aSelectd = ['', '', '', ''];
  var oConfig = oGrid.getConfiguration();
  if (oConfig.rowsPerPage == 5) {
    aSelectd[0] = ' selected';
  } else if (oConfig.rowsPerPage == 15) {
    aSelectd[2] = ' selected';
  } else if (oConfig.rowsPerPage == 20) {
    aSelectd[3] = ' selected';
  } else {
    // Default is 10
    aSelectd[1] = ' selected';
  }
  // Print number of results per page
  document.getElementById('zpTravelGridPaginationPerPageOnTop').innerHTML =
   '<select onclick="Zapatec.Travel.setResultsPerPage(\
     this[this.selectedIndex].value)">\
      <option value="5"' + aSelectd[0] + '>5</option>\
      <option value="10"' + aSelectd[1] + '>10</option>\
      <option value="15"' + aSelectd[2] + '>15</option>\
      <option value="20"' + aSelectd[3] + '>20</option>\
    </select>';
  document.getElementById('zpTravelGridPaginationPerPageOnBottom').innerHTML = document.getElementById('zpTravelGridPaginationPerPageOnTop').innerHTML;
};

/**
 * Changes number of results per page.
 *
 * @private
 * @param {number} iRowsPerPage Number of results per page
 */
Zapatec.Travel.setResultsPerPage = function(iRowsPerPage) {
  // Check argument
  var oConfig = Zapatec.Travel.grid.getConfiguration();
  if (oConfig.rowsPerPage == iRowsPerPage) {
    return;
  }
  // Reconfigure grid
  Zapatec.Travel.grid.reconfigure({
    rowsPerPage: iRowsPerPage
  });
  // Go to first page
  Zapatec.Travel.grid.gotoPage(0);
};

/**
 * Holds reference to the progress bar object to be able to update it.
 * @private
 */
Zapatec.Travel.progressBar = null;

/**
 * Shows progress bar.
 *
 * @private
 * @param {string} strMessage Message
 */
Zapatec.Travel.progressBarUpdate = function(iProgress) {
  var oProgressBarContainer =
   document.getElementById('zpTravelProgressBarContainer');
  var oResultContainer = document.getElementById('zpTravelResultContainer');
  if (oProgressBarContainer) {
/*
    if (!Zapatec.Travel.progressBar) {
      Zapatec.Travel.progressBar = new Zapatec.Progress({
        container: oProgressBarContainer
      });
    }
*/
    if (iProgress == 100) {
      oProgressBarContainer.style.display = 'none';
      if (oResultContainer) {
        oResultContainer.style.display = '';
        oResultContainer.innerHTML = 'Found ' +
         Zapatec.Travel.grid.getRows().length + ' results';
      }
    } else {
      oProgressBarContainer.style.display = '';
      if (oResultContainer) {
        oResultContainer.style.display = 'none';
      }
    }
  }
};

/**
 * Shows progress message.
 *
 * @private
 * @param {string} strMessage Message
 */
Zapatec.Travel.message = function(strMessage) {
  var oMessageContainer = document.getElementById('zpTravelMessageContainer');
  if (oMessageContainer) {
    if (strMessage) {
      oMessageContainer.style.display = '';
    } else {
      oMessageContainer.style.display = 'none';
      // To prevent undesirable effect
      strMessage = '&nbsp;';
    }
    oMessageContainer.innerHTML = strMessage;
  }
};

/**
 * Shows error message.
 *
 * @private
 * @param {string} strError Error message
 */
Zapatec.Travel.error = function(strError) {
  // Stop progress bar
  Zapatec.Travel.progressBarUpdate(100);
  // Show error
  Zapatec.Travel.message(strError.replace(/(\r\n|\n)/g, '<br/>'));
  // Duplicate error in alert box
  alert(strError);
};

/**
 * Shows search form.
 * @private
 */
Zapatec.Travel.searchShow = function() {
  var oClosed = document.getElementById('zpTravelSearchClosed');
  if (!oClosed) {
    alert('Cannot find zpTravelSearchClosed element.');
    return;
  }
  var oOpened = document.getElementById('zpTravelSearchOpened');
  if (!oOpened) {
    alert('Cannot find zpTravelSearchOpened element.');
    return;
  }
  oClosed.style.display = 'none';
  oOpened.style.display = '';
};

/**
 * Hides search form.
 * @private
 */
Zapatec.Travel.searchHide = function() {
  var oClosed = document.getElementById('zpTravelSearchClosed');
  if (!oClosed) {
    alert('Cannot find zpTravelSearchClosed element.');
    return;
  }
  var oOpened = document.getElementById('zpTravelSearchOpened');
  if (!oOpened) {
    alert('Cannot find zpTravelSearchOpened element.');
    return;
  }
  oClosed.style.display = '';
  oOpened.style.display = 'none';
};

/**
 * Compares two dates. Needed for calendar.
 *
 * @private
 * @param {object} oDate1 First Date object
 * @param {object} oDate2 Second Date object
 * @return -1 => oDate1 > oDate2, 0 => equal, 1 => oDate1 < oDate2
 * @type number
 */
Zapatec.Travel.compareDates = function(oDate1, oDate2) {
  var iYear1 = oDate1.getYear();
  var iYear2 = oDate2.getYear();
  if (iYear1 > iYear2) {
    return -1;
  }
  if (iYear2 > iYear1) {
    return 1;
  }
  var iMonth1 = oDate1.getMonth();
  var iMonth2 = oDate2.getMonth();
  if (iMonth1 > iMonth2) {
    return -1;
  }
  if (iMonth2 > iMonth1) {
    return 1;
  }
  var iDay1 = oDate1.getDate();
  var iDay2 = oDate2.getDate();
  if (iDay1 > iDay2) {
    return -1;
  }
  if (iDay2 > iDay1) {
    return 1;
  }
  return 0;
};

/**
 * Converts date string into object. Needed for calendar.
 *
 * @private
 * @param {string} sDate Date string in MM/DD/YY or MM/DD/YYYY format
 * @return Date object
 * @type object
 */
Zapatec.Travel.stringToDate = function(sDate) {
  var aDate = sDate.split('/');
  var iYear = aDate[2] * 1;
  if (iYear < 2000) {
    iYear += 2000;
  }
  var iMonth = aDate[0] * 1;
  var iDay = aDate[1] * 1;
  if (iYear && iMonth && iDay) {
    return new Date(iYear, iMonth - 1, iDay);
  }
};

Zapatec Suite

Documentation generated by JSDoc on Thu May 21 12:20:07 2009