CIBCMarketWatch.TABLE_TEMPLATE =
	"<table class='marketwatch-table section-wide'>" +
	"  <tbody>#{content}</tbody>" +
	"</table>" +
	"<p id='mwUpdateTime' class='legalText'>#{updateTimeMessage}</p>";
	
CIBCMarketWatch.INDEX_TEMPLATE = 
	"<tr>" +
	"  <td class='index-name'>#{indexName}</td>" +
	"  <td class='index-value number'>#{indexValue}</td>" +
	"  <td class='index-variance #{indexVarianceClass}'>#{indexVariance}</td>" +
	"</tr>";
	
CIBCMarketWatch.QUOTE_TEMPLATE = 
	"<tr>" +
	"  <td class='quote-label'>#{bundle.symbol}</td>" +
	"  <td class='quote-value'>#{quoteSymbol}</td>" +
	"</tr>" +
	"<tr>" +
	"  <td class='quote-label'>#{bundle.exchange}</td>" +
	"  <td class='quote-value'>#{quoteExchange}</td>" +
	"</tr>" +
	"<tr>" +
	"  <td class='quote-label'>#{bundle.last}</td>" +
	"  <td class='quote-value'>#{quoteLastValue}</td>" +
	"</tr>" +
	"<tr>" +
	"  <td class='quote-label'>#{bundle.change}</td>" +
	"  <td class='quote-value #{quoteVarianceClass}'>#{quoteVariance}</td>" +
	"</tr>" +
	"<tr>" +
	"  <td class='quote-label'>#{bundle.bid}</td>" +
	"  <td class='quote-value'>#{quoteBid}</td>" +
	"</tr>" +
	"<tr>" +
	"  <td class='quote-label'>#{bundle.ask}</td>" +
	"  <td class='quote-value'>#{quoteAsk}</td>" +
	"</tr>" +
	"<tr>" +
	"  <td class='quote-label'>#{bundle.vol}</td>" +
	"  <td class='quote-value'>#{quoteVol}</td>" +
	"</tr>";

CIBCMarketWatch.ERROR_MESSAGE_TEMPLATE = 
	"<p class='error'>#{errorMessage}</p>";

CIBCMarketWatch.BACK_TEMPLATE = 
	"<p class='marketwatch-back'><a id='#{namespace}back' href='javascript: void(0);'>Back</a></p>";

CIBCMarketWatch.Language = {
	
	formatNumber: function(value) {
		return this.format("number", value);
	},
	
	formatVolume: function(value) {
		return this.format("volume", value);
	},
	
	formatVariance: function(value) {
		return this.format("variance", value);
	},
	
	formatCurrency: function(value) {
		return this.format("currency", value);
	},
	
	formatTime: function(value) {
		return this.format("time.est", value);
	},
	
	formatExchange: function(value) {
		return this.format("currency.exchange", value);
	},
	
	format: function(type, value) {
		var xhr = jQuery.ajax({
			async: false,
			type: "GET",
			url: "/cibc-wg-marketwatch/portlet/marketwatch/formatter.jsp",
			data: {
				language: themeDisplay.getLanguageId().substring(0, 2),
				type: type,
				value: value
			}
		});
		return xhr.responseText.trim();
	}
		
};

CIBCMarketWatch.IndexRenderer = function(key) {
	
	this.key = key;
	
	this.render = function(index) {
		var result = CIBCMarketWatch.INDEX_TEMPLATE;
		var indexName = Liferay.Language.get(this.key);
		var indexValue = index.fields[1].value;
		indexValue = CIBCMarketWatch.Language.formatNumber(indexValue);
		var indexVariance = new Number(index.fields[2].value);
		var indexVarianceClass = "number";
		if(indexVariance > 0) {
			indexVarianceClass = indexVarianceClass + " positive";
		} else if(indexVariance < 0) {
			indexVarianceClass = indexVarianceClass + " negative";
		}
		indexVariance = CIBCMarketWatch.Language.formatVariance(indexVariance);
		result = result.replace("#{indexName}", indexName);
		result = result.replace("#{indexValue}", indexValue);
		result = result.replace("#{indexVarianceClass}", indexVarianceClass);
		result = result.replace("#{indexVariance}", indexVariance);
		return result;
	};
};

CIBCMarketWatch.CommodityRenderer = function(key) {
	
	this.key = key;
	
	this.render = function(commodity) {
		var result = CIBCMarketWatch.INDEX_TEMPLATE;
		var commodityName = Liferay.Language.get(this.key);
		var commodityValue = commodity.fields[1].value;
		commodityValue = CIBCMarketWatch.Language.formatCurrency(commodityValue);
		var commodityVariance = "";
		var commodityVarianceClass = "";
		var commodityVarianceSign = "";
		result = result.replace("#{indexName}", commodityName);
		result = result.replace("#{indexValue}", commodityValue);
		result = result.replace("#{indexVarianceClass}", commodityVarianceClass);
		result = result.replace("#{indexVarianceSign}", commodityVarianceSign);
		result = result.replace("#{indexVariance}", commodityVariance);
		return result;
	};
};

CIBCMarketWatch.ExchangeRenderer = function(key) {
	
	this.key = key;
	
	this.render = function(exchange) {
		var result = CIBCMarketWatch.INDEX_TEMPLATE;
		var exchangeName = Liferay.Language.get(this.key);
		var exchangeValue = exchange.fields[1].value;
		exchangeValue = CIBCMarketWatch.Language.formatExchange(exchangeValue);
		var exchangedCurrency = exchange.fields[4].value;
		var exchangedCurrencyClass = "";
		var exchangedCurrencySign = "";
		result = result.replace("#{indexName}", exchangeName);
		result = result.replace("#{indexValue}", exchangeValue);
		result = result.replace("#{indexVarianceClass}", exchangedCurrencyClass);
		result = result.replace("#{indexVarianceSign}", exchangedCurrencySign);
		result = result.replace("#{indexVariance}", exchangedCurrency);
		return result;
	};
};

CIBCMarketWatch.QuoteRenderer = function() {
	
	this.render = function(quote) {
		var result = CIBCMarketWatch.QUOTE_TEMPLATE;
		var quoteSymbol = quote.code;
		var quoteExchange = quote.fields[3].value;
		var quoteLastValue = CIBCMarketWatch.Language.formatNumber(quote.fields[4].value);
		var quoteVariance = new Number(quote.fields[5].value);
		var quoteVarianceClass = "";
		if(quoteVariance > 0) {
			quoteVarianceClass = quoteVarianceClass + "positive";
		} else if(quoteVariance < 0) {
			quoteVarianceClass = quoteVarianceClass + "negative";
		}
		quoteVariance = CIBCMarketWatch.Language.formatVariance(quoteVariance);
		var quoteBid = CIBCMarketWatch.Language.formatNumber(quote.fields[1].value);
		var quoteAsk = CIBCMarketWatch.Language.formatNumber(quote.fields[0].value);
		var quoteVol = CIBCMarketWatch.Language.formatVolume(quote.fields[7].value);
		result = result.replace("#{bundle.symbol}", Liferay.Language.get("symbol"));
		result = result.replace("#{quoteSymbol}", quoteSymbol);
		result = result.replace("#{bundle.exchange}", Liferay.Language.get("exchange"));
		result = result.replace("#{quoteExchange}", quoteExchange);
		result = result.replace("#{bundle.last}", Liferay.Language.get("last"));
		result = result.replace("#{quoteLastValue}", quoteLastValue);
		result = result.replace("#{bundle.change}", Liferay.Language.get("change"));
		result = result.replace("#{quoteVariance}", quoteVariance);
		result = result.replace("#{quoteVarianceClass}", quoteVarianceClass);
		result = result.replace("#{bundle.bid}", Liferay.Language.get("bid"));
		result = result.replace("#{quoteBid}", quoteBid);
		result = result.replace("#{bundle.ask}", Liferay.Language.get("ask"));
		result = result.replace("#{quoteAsk}", quoteAsk);
		result = result.replace("#{bundle.vol}", Liferay.Language.get("vol"));
		result = result.replace("#{quoteVol}", quoteVol);
		return result;
	};
};

CIBCMarketWatch.renderers = [];
CIBCMarketWatch.renderers[".GSPTSE"] = new CIBCMarketWatch.IndexRenderer("indexes.SAndPTSX.name");
CIBCMarketWatch.renderers[".DJI"] = new CIBCMarketWatch.IndexRenderer("indexes.Dow.name");
CIBCMarketWatch.renderers[".GSPC"] = new CIBCMarketWatch.IndexRenderer("indexes.SAndP500.name");
CIBCMarketWatch.renderers[".IXIC"] = new CIBCMarketWatch.IndexRenderer("indexes.NASDAQ.name");
CIBCMarketWatch.renderers[".SPCDNX"] = new CIBCMarketWatch.IndexRenderer("indexes.Venture.name");
CIBCMarketWatch.renderers[".TSE60"] = new CIBCMarketWatch.IndexRenderer("indexes.SAndPTSX60.name");
CIBCMarketWatch.renderers["XAU=X"] = new CIBCMarketWatch.CommodityRenderer("indexes.gold.name");
CIBCMarketWatch.renderers["EOD-LCOc1"] = new CIBCMarketWatch.CommodityRenderer("indexes.oil.name");
CIBCMarketWatch.renderers["CADUSD=X"] = new CIBCMarketWatch.ExchangeRenderer(
		"indexes.dollar.ca.name");

function CIBCMarketWatch(namespace) {

	this.namespace = namespace;
	
	this.initialize = function() {
		var instance = this;
		var submit = jQuery(this.getNamespaceId("submit"));
		submit.bind("click", function() {
			instance.getQuotes();
		});
	};
	
	this.getIndexes = function() {
		var instance = this;
		var id = instance.getNamespaceId("marketWatchContent");
		jQuery(id).html("<div class='loading-animation'/>");
		var content = "";
		jQuery.ajax({
			url: "/cibc-wg-marketwatch/portlet/marketwatch/indexValues.jsp",
			data: {},
			success: function(message) {
				var indexes = JSON.parse(message);
				if(indexes && indexes.MarketWatchRecords) {
					var rows = "";
					for(var i = 0; i < indexes.MarketWatchRecords.length; i++) {
						var index = indexes.MarketWatchRecords[i];
						var renderer = CIBCMarketWatch.renderers[index.code];
						if(renderer) {
							rows = rows + renderer.render(index);
						}
					}
					var updateTime = CIBCMarketWatch.Language.formatTime(
							indexes.MarketWatchRecords[0].fields[0].value + " " +
							indexes.MarketWatchRecords[0].fields[3].value);
					var updateTimeMessage = Liferay.Language.get("indexes.updatetime.message"
							, updateTime);
					content = CIBCMarketWatch.TABLE_TEMPLATE.replace("#{content}", rows);
					content = content.replace("#{updateTimeMessage}", updateTimeMessage);
				} else {
					content = CIBCMarketWatch.ERROR_MESSAGE_TEMPLATE.replace("#{errorMessage}"
							, Liferay.Language.get("cibc.wg.marketwatch.data.notfound"));
				}
				jQuery(id).html(content);
			},
			error: function(xhr, status, e) {
				content = CIBCMarketWatch.ERROR_MESSAGE_TEMPLATE.replace("#{errorMessage}"
						, Liferay.Language.get("cibc.wg.dialog.application.exception"));
				jQuery(id).html(content);
			}
		});
	};

	this.getQuotes = function() {
		var instance = this;
		var id = instance.getNamespaceId("marketWatchContent");
		jQuery(id).html("<div class='loading-animation'/>");
		var symbol = jQuery(instance.getNamespaceId("symbol")).val();
		var exchange = jQuery(instance.getNamespaceId("exchange")).val();
		var content = "";
		jQuery.ajax({
			url: "/cibc-wg-marketwatch/portlet/marketwatch/quoteValues.jsp",
			data: {
				symbol: symbol,
				exchange: exchange
			},
			success: function(message) {
				var quotes = JSON.parse(message);
				if(quotes && quotes.MarketWatchRecords 
						&& quotes.MarketWatchRecords[0] && quotes.MarketWatchRecords[0].fields[0]) {
					var quote = quotes.MarketWatchRecords[0];
					var rows = new CIBCMarketWatch.QuoteRenderer().render(quote);
					var updateTime = CIBCMarketWatch.Language.formatTime(
							quote.fields[2].value + " " + quote.fields[6].value);
					var updateTimeMessage = Liferay.Language.get("indexes.updatetime.message"
							, updateTime);
					content = CIBCMarketWatch.TABLE_TEMPLATE.replace("#{content}", rows);
					content = content.replace("#{updateTimeMessage}", updateTimeMessage);
				} else {
					content = CIBCMarketWatch.ERROR_MESSAGE_TEMPLATE.replace("#{errorMessage}"
							, Liferay.Language.get("cibc.wg.marketwatch.symbol.invalid"));
				}
				content = content + CIBCMarketWatch.BACK_TEMPLATE.replace("#{namespace}"
						, instance.namespace);
				jQuery(id).html(content);
				var back = jQuery(instance.getNamespaceId("back"));
				back.bind("click", function() {
					instance.getIndexes();
				});
			},
			error: function(xhr, status, e) {
				content = CIBCMarketWatch.ERROR_MESSAGE_TEMPLATE.replace("#{errorMessage}"
						, Liferay.Language.get("cibc.wg.dialog.application.exception"));
				content = content + CIBCMarketWatch.BACK_TEMPLATE.replace("#{namespace}"
						, instance.namespace);
				jQuery(id).html(content);
				var back = jQuery(instance.getNamespaceId("back"));
				back.bind("click", function() {
					instance.getIndexes();
				});
			}
		});
	};

	this.getNamespaceId = function(elementId) {
		return "#" + this.namespace + elementId;
	};
	
	this.initialize();
	
};

