// promotion Object
//
//	Reads promotion information from the sony promotions ratesheet.
//
//		getPromotionTable							Returns an array containing all promotions for the country and currency as indicated on the calculator page
//		getPromotionTableForPeriodAndFrequency		Returns the promotion table, but filtered by period and frequency
//		getPromotionModels							Returns the models of the referenced promotion
//		getPromotionDescription						Returns the description of the referenced promotion
//		getPromotionPeriod							Returns the period of the referenced promotion
//		getPromotionFrequency						Returns the frequency of the referenced promotion
//		getPromotionConditions						Returns the conditions of the referenced promotion
//		getPromotionModelDescription				Returns the description of the referenced model of the referenced promotion

// Return the promotion table containing the promotions that are valid with respect to the current date
function pr_getPromotionTable() {
	var promoRatesTable = pr_getTable("promoRatesTable", g_currencyAbbreviation+g_countryAbbreviation);
	if (promoRatesTable==null) {
		debugWindow.writeln("no promo's found");
		return new Array();
	}
	debugWindow.writeln("#promo's in promoRatesTable is " + promoRatesTable.length);

	var validPromoRatesTable = new Array();
	if (promoRatesTable == null) {
		debugWindow.writeln("No promotions found.");
		return promoRatesTable;
	}
	var currentDate = new Date();

	// Filter the table so that it contains only the promotions that are valid with
	// respect to the date specified.
	for (var i=0;i<promoRatesTable.length;i++) {
		var promotion = promoRatesTable[i];
		var startDateSplit = promotion[3].split("-"), endDateSplit = promotion[4].split("-");
		// automatically expand year to 4 digits
		if (startDateSplit[2].length == 2) startDateSplit[2] = "20" + startDateSplit[2];
		if (endDateSplit[2].length == 2) endDateSplit[2] = "20" + endDateSplit[2];
		var startDate = new Date(startDateSplit[2], startDateSplit[1] - 1, startDateSplit[0]);
		var endDate = new Date(endDateSplit[2], endDateSplit[1] - 1, endDateSplit[0]);

		debugWindow.writeln("Check validity promo " + promotion[1] + ".");
		debugWindow.writeln("Start:" + startDate.toDateString() + ",End:" + endDate.toDateString() + ",Current:" + currentDate.toDateString());

		if (startDate.getTime() <= currentDate.getTime() && currentDate.getTime() <= endDate.getTime()) {
			debugWindow.writeln("promo is valid");
			validPromoRatesTable.push(promotion);
		}
		else debugWindow.writeln("promo is no longer valid");
	}
	debugWindow.writeln("#valid promo's:" + validPromoRatesTable.length);
	return validPromoRatesTable;
}

function pr_getPromotionTableForPeriodAndFrequency(period, frequency) {
	var table = pr_getPromotionTable();
	var filteredTable = new Array(table.length);

	// copy the array
	for (var i=0;i<table.length;i++) {
		filteredTable[i] = table[i];
	}
	// filter the array
	for (var i=filteredTable.length-1;i>=0;i--)	{
		debugWindow.writeln(filteredTable[i][5] + " != " + period + "   " + filteredTable[i][6] + " != " + frequency);
		var perValue;
		if (filteredTable[i][5] >= 12)
		{ perValue = filteredTable[i][5] / 12;}
		else
		{ perValue = filteredTable[i][5];}
		if (perValue!=period || filteredTable[i][6]!=frequency) {
			// remove the item from the table
			filteredTable.splice(i,1);
		}
	}
	return filteredTable;
}

function pr_getPromotionDescription(promotionId) {

	if (pr_Exist(promotionId)) {
		var promotionsTable = pr_getPromotionTable();

		for (var i=0;i<promotionsTable.length;i++) {
			if (promotionsTable[i][0]==promotionId)	{
				return promotionsTable[i][2];
			}
		}
	}
	return "";
}

function pr_getPromotionPeriod(promotionId) {
	if (pr_Exist(promotionId)) {
		var promotionsTable = pr_getPromotionTable();

		for (var i=0;i<promotionsTable.length;i++) {
			if (promotionsTable[i][0]==promotionId)	{
				if (pr_IsIndexTerms != null)
				{
					var terms = promotionsTable[i][5];
					return terms/12;
				}
				else
				{	return promotionsTable[i][5];}
			}
		}
	}
	return 0;
}

function pr_IsIndexTerms() {
	var tableName = "indexTerms";

	// create a function to retrieve the table
	var f = new Function("try { return " + tableName + ";} catch(ex) { return null; }");
	return f();
}

function pr_getPromotionFrequency(promotionId) {
	if (pr_Exist(promotionId)) {
		var promotionsTable = pr_getPromotionTable();

		for (var i=0;i<promotionsTable.length;i++) {
			if (promotionsTable[i][0]==promotionId)	{
				return promotionsTable[i][6];
			}
		}
	}
	return "";
}

function pr_getPromotionRate(promotionId) {
	if (pr_isPromotion(promotionId)) {
		var promotionsTable = pr_getPromotionTable();

		for (var i=0;i<promotionsTable.length;i++) {
			if (promotionsTable[i][0]==promotionId) {
				return promotionsTable[i][12];
			}
		}
	}
	return 0;
}

function pr_getFirstPaymentRate(promotionId) {
	if (pr_isPromotion(promotionId)) {
		var promotionsTable = pr_getPromotionTable();

		for (var i=0;i<promotionsTable.length;i++) {
			if (promotionsTable[i][0]==promotionId) {
				return promotionsTable[i][13];
			}
		}
	}
	return 0;
}

function pr_getEndPaymentRate(promotionId) {
	if (pr_isPromotion(promotionId)) {
		var promotionsTable = pr_getPromotionTable();

		for (var i=0;i<promotionsTable.length;i++) {
			if (promotionsTable[i][0]==promotionId)	{
				return promotionsTable[i][14];
			}
		}
	}
	return 0;
}

function pr_getPromotionPause(promotionId) {
	if (pr_isPromotion(promotionId)) {
		var promotionsTable = pr_getPromotionTable();

		for (var i=0;i<promotionsTable.length;i++) {
			if (promotionsTable[i][0]==promotionId)	{
				return promotionsTable[i][8];
			}
		}
	}
	return 0;
}

function pr_getPromotionFurtherPayments(promotionId) {
	if (pr_isPromotion(promotionId)) {
		var promotionsTable = pr_getPromotionTable();

		for (var i=0;i<promotionsTable.length;i++) {
			if (promotionsTable[i][0]==promotionId)	{
				return promotionsTable[i][9];
			}
		}
	}
	return 0;
}

// Get the models for a promotion id.
function pr_getPromotionModels(promotionId) {
	if (pr_Exist(promotionId)) {
		return pr_getTable("promoModels", promotionId+"Table");
	}
	return "";
}

function pr_getPromotionModelDescription(promotionId, modelId) {
	if (pr_Exist(promotionId)) {
		var promotionModelsTable = pr_getPromotionModels(promotionId);
		for (var i=0;i<promotionModelsTable.length;i++) {
			if (promotionModelsTable[i][1]==modelId) {
				return promotionModelsTable[i][2];
			}
		}
	}
	return "";
}

function pr_getPromotionConditions(promotionId, nextLineChar) {
	if (pr_Exist(promotionId)) {
		var promoConditionsTable=pr_getTable("promoConditionsTable", g_countryAbbreviation);
		if (promoConditionsTable==null) return "";
		for (var i=0;i<promoConditionsTable.length;i++)	{
			if (promoConditionsTable[i][0]==promotionId) {
				return promoConditionsTable[i][1].replace(/\$/g, nextLineChar);
			}
		}
	}
	return "";

}

function pr_Exist(promotionId) {
	var promotions = pr_getPromotionTable();
	for (var i=0;i<promotions.length;i++) {
		if (promotions[i][0]==promotionId) { return true; }
	}
	alert("Promotion Id: '" + promotionId + "' does not exist. Please check the sony promotions ratesheet.");
	return false;
}

function pr_isPromotion(promotionId) {
	var promotions = pr_getPromotionTable();
	for (var i=0;i<promotions.length;i++) {
		if (promotions[i][0]==promotionId) { return true; }
	}
	return false;
}

function pr_getPromotionId(promotionName) {
	var promotions = pr_getPromotionTable();
	for (var i=0;i<promotions.length;i++) {
		if (promotions[i][1]==promotionName) { return promotions[i][0]; }
	}
	return "";
}

function pr_getTable(name, suffix) {
	var tableName = name + suffix;
	
	// create a function to retrieve the table
	var f = new Function("try { return " + tableName + ";} catch(ex) { return null; }");
	return f();
}

function promo_setup() {
	this.getPromotionTable = pr_getPromotionTable;
	this.getPromotionTableForPeriodAndFrequency = pr_getPromotionTableForPeriodAndFrequency;
	this.getPromotionModels = pr_getPromotionModels;
	this.getPromotionDescription = pr_getPromotionDescription;
	this.getPromotionPeriod = pr_getPromotionPeriod;
	this.getPromotionFrequency = pr_getPromotionFrequency;
	this.getPromotionConditions = pr_getPromotionConditions;
	this.getPromotionModelDescription = pr_getPromotionModelDescription;
	this.isPromotion = pr_isPromotion;
	this.getPromotionId = pr_getPromotionId;
	this.getPromotionRate = pr_getPromotionRate;
	this.getFirstPaymentRate = pr_getFirstPaymentRate;
	this.getEndPaymentRate = pr_getEndPaymentRate;
	this.getPromotionPause = pr_getPromotionPause;
	this.getPromotionFurtherPayments = pr_getPromotionFurtherPayments;
	this.getTable = pr_getTable;
	return this;
}

var promotion = new Object();
promotion = promo_setup();