
// *********************************************************************
//	Deals Module
//	Date: March 3, 2008
//	Author: Chris Gregg, Web Developer - Signature Vacations
//
//	Description:
//	This script uses xPath to extract XML content from URL for deals
// *********************************************************************


/* Global Variables */
var packages = new Array(); // stores array of package objects
var chkGateway = getCookie('SVRegionCookie');

var isFrench = false;
if (!language) { var language = "en"; }

if (language == "fr") {  // language var is initialized on JSP page
	isFrench = true;
	var langCode = "2";
	var langSuffix = "_fr";
	var lblSortPrice = "Prix";
	var lblSortDest = "Destination";
	var lblSortGateway = "Ville de départ";
	var lblSortHotel = "Hotel";	
	var lblDays = "jours";
	var lblLeadingDollar = "";	
	var lblTrailingDollar = "$";
	var lblSortBy = "Trier par:";
	var lblDepFrom = "Départ de:";
	var lblTaxInc = "Taxes Incluses";
} else {
	language = "en"; 
	var langSuffix = "";
	var langCode = "1";
	var lblSortPrice = "Price";
	var lblSortDest = "Destination";
	var lblSortGateway = "Departure City";
	var lblSortHotel = "Hotel";		
	var lblDays = "Days";	
	var lblLeadingDollar = "$";	
	var lblTrailingDollar = "";	
	var lblSortBy = "Sort by:";	
	var lblDepFrom = "Departing from:";	
	var lblTaxInc = "Tax Included";
}

var xml=loadXMLDoc("/svec/jsp_cust/adModule.jsp?adType=HOME&gateway="+chkGateway+"&language="+language);
var totalDeals = getData("/advertising/deals_found"); // num of deals found

/* Load XML document */
function loadXMLDoc(fname) {

	var xmlDoc;
	
	// Code for IE
	if (window.ActiveXObject) { 
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
	}
	// Code for Mozilla
	else if (document.implementation && document.implementation.createDocument) {
		xmlDoc=document.implementation.createDocument("","",null);	
	}
	else {
		alert('Your browser cannot handle this script');
	}

	xmlDoc.async=false;
	xmlDoc.load(fname);
	return(xmlDoc);

}


function getData(path,nodeNum) {

	if (!nodeNum) { nodeNum = 0; }
	
	// code for IE
	if (window.ActiveXObject) {
		var nodes=xml.selectNodes(path);
		return(nodes[nodeNum].childNodes[0].nodeValue); 
	}
	
	// code for Mozilla, Firefox, Opera, etc.
	else if (document.implementation && document.implementation.createDocument) {
		var nodes=xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null);
		var result=nodes.iterateNext();

		x = 0;
		
		while (result) {
			if (x == nodeNum) {
				return(result.childNodes[0].nodeValue);
			}
			else { 
				x++; 
				result=nodes.iterateNext();
			}
		}
	}
	
}


/* Contructor function for creating new package objets */
function packageObj(nodeNum) {
	this.id = getData("/advertising/deal/id",nodeNum);
	this.hotel = getData("/advertising/deal/hotel_name",nodeNum);
	this.gateway = getData("/advertising/deal/gateway",nodeNum);
	this.dest = getData("/advertising/deal/destination",nodeNum);
	this.destName = getData("/advertising/deal/destination_name",nodeNum);
	this.depart = getData("/advertising/deal/date_dep",nodeNum);
	if (chkGateway == "YUL") {
	this.price = getData("/advertising/deal/totpax",nodeNum);
	}
	else
	{
	this.price = getData("/advertising/deal/price",nodeNum);
	this.tax = getData("/advertising/deal/tax",nodeNum);	
	}
	this.rating = getData("/advertising/deal/rating",nodeNum);
	this.duration = getData("/advertising/deal/duration",nodeNum);
	this.mealplan = getData("/advertising/deal/meal_description",nodeNum);	
	this.room = getData("/advertising/deal/room_description",nodeNum);	
	this.hotelLink = getData("/advertising/deal/hotel_link",nodeNum);		
}


/* Create object for each deal that matches criteria */
function createAds() {	
	for (x=0; x<totalDeals; x++) {
		packages[x] = new packageObj(x); // create new package object, and store into array		
	}	
	sortList(); // when complete, sort and display ads
}


// Sorting function, accepts param to specify field to sort by
function sortList(param) {
	if (!param) {
		param = comparePrice; // default to sort by price
	}
	packages.sort(param); // pre-sort before display to screen

	displayAds();
}


function comparePrice(a, b) { return a.price-b.price } // to sort ascendingly by price

function compareDest(a, b) { // to sort alphabetically by destination
	if (a.dest > b.dest) return 1;
	if (a.dest < b.dest) return -1;
	return 0; 	
} 


function compareGateway(a, b) { // to sort alphabetically by destination
	if (a.gateway > b.gateway) return 1;
	if (a.gateway < b.gateway) return -1;
	return 0; 	
} 

function compareHotel(a, b) { // to sort alphabetically by hotel
	if (a.hotel > b.hotel) return 1;
	if (a.hotel < b.hotel) return -1;
	return 0; 	

}

// format date from YYYYMMDD to YYYY/MM/DD
function formatDate(num) {

	var numFormatted = "";
	
	for (x=0; x<num.length; x++)  {
		if (x==4 || x==6) {
			numFormatted = numFormatted + "/";		
		}
		numFormatted = numFormatted + num.charAt(x);
	}
	
	return numFormatted;
}






// Functions below used to decode base64 url from softvoyage

function urlDecode(str){
    str=str.replace(new RegExp('\\+','g'),' ');
    return unescape(str);
}
function urlEncode(str){
    str=escape(str);
    str=str.replace(new RegExp('\\+','g'),'%2B');
    return str.replace(new RegExp('%20','g'),'+');
}

var END_OF_INPUT = -1;

var base64Chars = new Array(
    'A','B','C','D','E','F','G','H',
    'I','J','K','L','M','N','O','P',
    'Q','R','S','T','U','V','W','X',
    'Y','Z','a','b','c','d','e','f',
    'g','h','i','j','k','l','m','n',
    'o','p','q','r','s','t','u','v',
    'w','x','y','z','0','1','2','3',
    '4','5','6','7','8','9','+','/'
);

var reverseBase64Chars = new Array();
for (var i=0; i < base64Chars.length; i++){
    reverseBase64Chars[base64Chars[i]] = i;
}

var base64Str;
var base64Count;
function setBase64Str(str){
    base64Str = str;
    base64Count = 0;
}
function readBase64(){    
    if (!base64Str) return END_OF_INPUT;
    if (base64Count >= base64Str.length) return END_OF_INPUT;
    var c = base64Str.charCodeAt(base64Count) & 0xff;
    base64Count++;
    return c;
}


function readReverseBase64(){   
    if (!base64Str) return END_OF_INPUT;
    while (true){      
        if (base64Count >= base64Str.length) return END_OF_INPUT;
        var nextCharacter = base64Str.charAt(base64Count);
        base64Count++;
        if (reverseBase64Chars[nextCharacter]){
            return reverseBase64Chars[nextCharacter];
        }
        if (nextCharacter == 'A') return 0;
    }
    return END_OF_INPUT;
}


function ntos(n){
    n=n.toString(16);
    if (n.length == 1) n="0"+n;
    n="%"+n;
    return unescape(n);
}

function decodeBase64(str){
    setBase64Str(str);
    var result = "";
    var inBuffer = new Array(4);
    var done = false;
    while (!done && (inBuffer[0] = readReverseBase64()) != END_OF_INPUT
        && (inBuffer[1] = readReverseBase64()) != END_OF_INPUT){
        inBuffer[2] = readReverseBase64();
        inBuffer[3] = readReverseBase64();
        result += ntos((((inBuffer[0] << 2) & 0xff)| inBuffer[1] >> 4));
        if (inBuffer[2] != END_OF_INPUT){
            result +=  ntos((((inBuffer[1] << 4) & 0xff)| inBuffer[2] >> 2));
            if (inBuffer[3] != END_OF_INPUT){
                result +=  ntos((((inBuffer[2] << 6)  & 0xff) | inBuffer[3]));
            } else {
                done = true;
            }
        } else {
            done = true;
        }
    }
    return result;
}

//retreives product id from string
function getProductID(url) {

	url = unescape(url); // removes url encoding
	var str = decodeBase64(url); // perform base 64 decoding
	var prodID = "";

	for (x=0; x<str.length; x++) {
		if (!isNaN(str.charAt(x))) {
			prodID = prodID + str.charAt(x);
		}
	}
	
	return prodID;


}




// Writes ads to screen as each object is created
function displayAds() {

	var packageLength = packages.length; // length of array
	
	var dealsInnerHTML = "";
	
	// if there are any deals, show sundeals logo
	if (packageLength>0) {
		dealsInnerHTML = "<div style='border-bottom:1px dotted #CCCCCC; padding:8px 5px 8px 5px;'><img src='/images/logo_sundeals"+langSuffix+".gif' /></div>";
	}
	
	if (chkGateway == "all" && packageLength > 15) {
		packageLength = 15; // if all gateways is selected, show 15 deals only
	}
	
	for (var x=0; x<packageLength; x++) {
		
		<!--if (isFrench == true)-->
		if (chkGateway == "YUL")
		{

		dealsInnerHTML = dealsInnerHTML + "<div class='dealsItemWrapper' onmouseover=this.className='dealsItemWrapperOver' onmouseout=this.className='dealsItemWrapper'><table width='100%' border='0' cellspacing='0' cellpadding='0'><tr><td width='44'><div class='dealsPicBorder'><img src='http://www.signaturevacations.com/images/hotel/small/"+getProductID(packages[x].hotelLink)+"_1.jpg' width='40' height='26' /></div></td><td width='10'>&nbsp;</td><td><table width='100%' border='0' cellspacing='0' cellpadding='0' class='dealsContentTbl'><tr><td><div style='float:left'><a href='http://sgn.sax.softvoyage.com/cgi-bin/resultadv.cgi?code_ag=sgn&alias=sgn&id="+packages[x].id+"&language="+language+"' class='dealsHotel'>"+packages[x].hotel+"</a>, <span class='dealsDest'>"+packages[x].destName+"</span></div><div class='dealsPrice'><a href='http://sgn.sax.softvoyage.com/cgi-bin/resultadv.cgi?code_ag=sgn&alias=sgn&id="+packages[x].id+"&language="+language+"'>"+lblLeadingDollar+packages[x].price+lblTrailingDollar+"</a></div></td></tr><tr><td>"+formatDate(packages[x].depart)+" | "+packages[x].duration+" "+lblDays+" | "+lblTaxInc+"</td></tr>";
		
		}
		else
		{
			dealsInnerHTML = dealsInnerHTML + "<div class='dealsItemWrapper' onmouseover=this.className='dealsItemWrapperOver' onmouseout=this.className='dealsItemWrapper'><table width='100%' border='0' cellspacing='0' cellpadding='0'><tr><td width='44'><div class='dealsPicBorder'><img src='http://www.signaturevacations.com/images/hotel/small/"+getProductID(packages[x].hotelLink)+"_1.jpg' width='40' height='26' /></div></td><td width='10'>&nbsp;</td><td><table width='100%' border='0' cellspacing='0' cellpadding='0' class='dealsContentTbl'><tr><td><div style='float:left'><a href='http://sgn.sax.softvoyage.com/cgi-bin/resultadv.cgi?code_ag=sgn&alias=sgn&id="+packages[x].id+"&language="+language+"' class='dealsHotel'>"+packages[x].hotel+"</a>, <span class='dealsDest'>"+packages[x].destName+"</span></div><div class='dealsPrice'><a href='http://sgn.sax.softvoyage.com/cgi-bin/resultadv.cgi?code_ag=sgn&alias=sgn&id="+packages[x].id+"&language="+language+"'>"+lblLeadingDollar+packages[x].price+lblTrailingDollar+"</a></div></td></tr><tr><td>"+formatDate(packages[x].depart)+" | "+packages[x].duration+" "+lblDays+" | "+lblLeadingDollar+packages[x].tax+lblTrailingDollar+" taxes</td></tr>";
		
			
			}
		// if all gateways, show row for departure gateway 
	//	if (chkGateway == "all") {
			dealsInnerHTML = dealsInnerHTML + "<tr><td><img src='/images/icn_smallPlane.gif' align='absmiddle'> "+lblDepFrom+" <span class='dealsGateway'>"+packages[x].gateway+"</span></td></tr>"
	//	}
			
		dealsInnerHTML = dealsInnerHTML + "</table></td></tr></table></div>";
	}

	// if more than one result, show menu for sorting 
	if (packageLength > 1) {
		dealsInnerHTML = dealsInnerHTML + "<div class='dealsSortMenu'>"+lblSortBy+" <a href='javascript:sortList(comparePrice);'>"+lblSortPrice+"</a> | <a href='javascript:sortList(compareDest);'>"+lblSortDest+"</a> | <a href='javascript:sortList(compareHotel);'>"+lblSortHotel+"</a>";

		// if all gateways, show sort option for gateway
	//	if (chkGateway == "all") {
			dealsInnerHTML = dealsInnerHTML + " | <a href='javascript:sortList(compareGateway);'>"+lblSortGateway+"</a>"
	//	}
		
		dealsInnerHTML = dealsInnerHTML + "</div>";
	}
	
	document.getElementById("dealsContent").innerHTML = dealsInnerHTML;	

	
}