﻿// controls

$.fn.preload = function() {
	this.each(function(){
		$('<img/>')[0].src = this;
	});
}

function acc(container, headerSelector, contentSelector)
{
	container.data("headerSelector", headerSelector);
	container.data("contentSelector", contentSelector);
	var headers = container.find(headerSelector);
	headers.data("container", container);
	headers.mouseenter(function()
	{
		if($(this).hasClass("active")) return;
		var c = $(this).data("container");
		var hs = c.data("headerSelector");
		var cs = c.data("contentSelector");
		var a = c.find(hs).filter(".active");
		if(a.size() > 0)
		{
			a.removeClass("active");
			var ac = cs(a);
			ac.stop(true, true);
			ac.animate({height: "hide"}, 300);
		}
		$(this).addClass("active");
		var nc = cs($(this));
		nc.stop(true, true);
		nc.animate({height: "show"}, 300);
	});
};

function detail(container, itemSelector, detailSelector)
{
	var items = container.find(itemSelector);
	items.each(function()
	{
		$(this).data("detail", detailSelector($(this)));
	});
	items.mouseenter(function()
	{
		if(!$(this).hasClass("active"))
		{
			$(this).addClass("active");
			var d = $(this).data("detail");
			d.stop(true, true);
			d.animate({height: "show"}, 300);
		}
	});
	items.mouseleave(function()
	{
		if($(this).hasClass("active"))
		{
			$(this).removeClass("active");
			var d = $(this).data("detail");
			d.stop(true, true);
			d.animate({height: "hide"}, 300);
		}
	});
};

function mouseRel(container, itemSelector, detailSelector)
{
	var items = container.find(itemSelector);
	items.each(function()
	{
		var d = detailSelector($(this));
		d.css({"position": "absolute", "border": "1px solid #5B5F6B"});
		$(this).data("detail", d);
	});
	items.mouseenter(function(e)
	{
		if(!$(this).hasClass("active"))
		{
			$(this).addClass("active");
			var d = $(this).data("detail");
			d.stop(true, true);
			d.css({"left": (e.pageX + 10) + "px", "top": (e.pageY + 10) + "px"});
			d.show();
		}
	});
	items.mouseleave(function()
	{
		if($(this).hasClass("active"))
		{
			$(this).removeClass("active");
			var d = $(this).data("detail");
			d.stop(true, true);
			d.hide();
		}
	});
	items.mousemove(function(e)
	{
		if($(this).hasClass("active"))
		{
			var d = $(this).data("detail");
			d.css({ "left": (e.pageX + 10) + "px", "top": (e.pageY + 10) + "px" });
		}
	});
};

function selectTab(newTab)
{
	var control = $(newTab).data("control");
	var newId = $(newTab).attr("relid");
	$(control).find("[rel~=tab]").each(function(i, tab)
	{
		var id = $(tab).attr("relid");
		$(tab).removeClass(id == newId ? "ful_inaktiv" : "ful_aktiv").addClass(id == newId ? "ful_aktiv" : "ful_inaktiv");
		$(control).find("[rel~=panel][relid="+id+"]").css("display", id == newId ? "block" : "none");
	});
};

function tabs(control, active)
{
	$(control).find("[rel~=tab]").each(function(i, tab)
	{
		$(tab).data("control", control);
		$(tab).click(function()
		{
			selectTab(this);
		});
	});
	if(active != null)
	{
		var tab = $(control).find("[rel~=tab][relid="+active+"]");
		if(tab) selectTab(tab);
	};
};

// autorefresh functions

var autoRefreshMode = null; // setInterval
var autoRefreshFunc = null; // function
var ajaxRequest = null; // XMLHttpRequest

function startAutoRefresh()
{
	if(!autoRefreshMode)
	{
		autoRefreshFunc = (typeof autoRefresh == "function") ? autoRefresh : reloadCommon;
		autoRefreshMode = setInterval(function()
		{
			if(!ajaxRequest || ajaxRequest.readyState == 4) autoRefreshFunc();
		}, 5000);
	};
};

function stopAutoRefresh()
{
	if(autoRefreshMode)
	{
		clearInterval(autoRefreshMode);
		autoRefreshMode = null;
	};
};

function clearAjaxReuqest()
{
	if(ajaxRequest != null && ajaxRequest.readyState != 4)
	{
		ajaxRequest.abort();
		ajaxRequest = null;
	};
};

function changeAutoRefreshMode()
{
	var value = $.cookie("auto-refresh"); // old value
	if(value == "true" || value == null) value = true; else if(value == "false") value = false;
	if(value) $.cookie("auto-refresh", "false", { path: "/", expires: 36500 });
	else $.cookie("auto-refresh", "true", { path: "/", expires: 36500 });
	var link = $("#autoRefreshLink");
	if(link)
	{
		if(value) $(link).removeClass("frissites_aktiv").addClass("frissites_inaktiv").html("BE");
		else $(link).removeClass("frissites_inaktiv").addClass("frissites_aktiv").html("KI");
	};
	if(value) stopAutoRefresh();
	else startAutoRefresh();
};

function getRateables()
{
	return $("[rel~=rateable]").map(function(){return $(this).attr("relid");}).toArray();
};

function refreshTitle(title)
{
	document.title = title;
};
function refreshHeader(data)
{
	if(data.t) $("#headerDate").html(data.t);
	if(data.m) $("#headerStockMessage").html(data.m);
};
function refreshRateable(element, rateable, old)
{
	$(element).find("[rel~=ticker]").html(rateable.t);
	$(element).find("[rel~=price]").html(rateable.p);
	$(element).find("[rel~=change]").html(rateable.c);
	$(element).find("[rel~=rate]").html(rateable.r);

	if(old && old != rateable.pd)
	{
		var changebg = $(element).find("[rel~=changebg]");
		if(old < rateable.pd) $(changebg).addClass("poz_bg");
		else if(old > rateable.pd) $(changebg).addClass("neg_bg");
	};
	var colored = $(element).find("[rel~=colored]");
	if(rateable.cd == 0) $(colored).removeClass("neg_text").removeClass("poz_text").addClass("nul_text");
	else if(rateable.cd > 0) $(colored).removeClass("nul_text").removeClass("neg_text").addClass("poz_text");
	else if(rateable.cd < 0) $(colored).removeClass("nul_text").removeClass("poz_text").addClass("neg_text");

	return rateable.pd;
};
function refreshRateables(rateables)
{
	jQuery.each(rateables, function(i, rateable)
	{
		$("[rel=rateable][relid="+rateable.i+"]").each(function(j, element)
		{
			var pd = refreshRateable(element, rateable, $(element).data("last"));
			if(pd) $(element).data("last", pd);
		});
	});
	removeBackground("*[rel=rateable]");
};
function removeBackground(filter)
{
	setTimeout(function()
	{
		$(filter).find("[rel~=changebg]").removeClass("poz_bg").removeClass("neg_bg");
	}, 1000);
};

// main page functions

function getLastNews() {
	var old = $("[rel=newsbox]").data("lastNews");
	if (old) return old;
	return -1;
};
function setLastNews(newNews) {
	var box = $("[rel=newsbox]");
	if (newNews > 0) box.css("visibility", "visible");
	else box.css("visibility", "hidden");
	box.find("[rel=text]").html(newNews + " új hír");
};
function refreshTopStockSection(element, stocks)
{
	var rows = $(element).find("[rel=rateable]").toArray();
	var id = 0;
	jQuery.each(stocks, function(i, stock)
	{
		var pd = refreshRateable(rows[id], stock, $(element).data(stock.i.toString()));
		$(rows[id]).find("[rel~=link]").attr("href", stock.l);
		$(rows[id]).find("[rel~=grafikon]").attr("src", stock.g);
		if(pd) $(element).data(stock.i.toString(), pd);
		id++;
	});
};
function refreshTopStocks(top)
{
	refreshTopStockSection($("[rel=stockWinner]"), top.winner);
	refreshTopStockSection($("[rel=stockLoser]"), top.loser);
	refreshTopStockSection($("[rel=stockTrade]"), top.trade);
	removeBackground("[rel=stockWinner]");
	removeBackground("[rel=stockLoser]");
	removeBackground("[rel=stockTrade]");
};
function refreshCrossRates(rates)
{
	jQuery.each(rates, function(i, rate)
	{
		$("[rel=crossrate][relid="+rate.i+"]").each(function(j, element)
		{
			var pd = refreshRateable(element, rate, $(element).data("last"));
			if(pd) $(element).data("last", pd);
		});
	});
	removeBackground("*[rel=crossrate]");
};

function reloadMain()
{
	clearAjaxReuqest();

	var data =
	{
		rateables: getRateables(),
		lastNews: getLastNews()
	};
	ajaxRequest = $.ajax(
	{
		type: "POST",
		url: "/AutoRefresh.asmx/Main",
		data: $.toJSON(data),
		contentType: "application/json; charset=utf-8",
		dataType: "json",
		success: function(msg) {
			var data = $.evalJSON(msg.d);
			if (data.title) refreshTitle(data.title);
			refreshHeader(data.clock);
			refreshRateables(data.rateables);
			refreshTopStocks(data.top);
			refreshCrossRates(data.cross);
			setLastNews(data.newNews);
		},
		error: function(msg) {
		}
	});
};

// stock market page functions

function rebuildStockMarketTable(data)
{
	$("#stocktable").each(function(s, table)
	{
		if(data.t) $(table).data("data", data.t);

		{ // header
			$(table).find("TR[class=header]").html(data.h);
		}
		{ // indexes
			var rows = $(table).find("TBODY[rel=index]").toArray();
			var id = 0;
			var last = $(rows).last();
			if(last.length == 0) last = null;

			$(data.i).each(function(i, index)
			{
				var old = $(table).data(index.id.toString());
				var element;
				if(rows.length > id)
				{ // existing row
					element = rows[id];
				}
				else
				{ // new row
					var row = document.createElement("tbody");
					if(last == null) $(table).children().last().after(row);
					else $(last).after(row);
					$(row).attr("rel", "index");
					element = row;
					last = row;
				}
				$(element).attr("relid", index.id);
				$(element).html(index.html);
				if(old && old != index.price)
				{ // set change background
					var changebg = $(element).find("[rel~=changebg]");
					if(old < index.price) $(changebg).addClass("poz_bg");
					else if(old > index.price) $(changebg).addClass("neg_bg");
				};
				$(table).data(index.id.toString(), index.price); // save new value
				id++;
			});
			while(id < rows.length)
			{
				$(rows[id]).remove();
				id++;
			}
		}
		{ // stocks
			var rows = $(table).find("TBODY[rel=stock]").toArray();
			var id = 0;
			var last = $(rows).last();
			if(last.length == 0) last = null;

			$(data.s).each(function(i, stock)
			{
				var old = $(table).data(stock.id.toString());
				var element;
				if(rows.length > id)
				{ // existing row
					element = rows[id];
				}
				else
				{ // new row
					var row = document.createElement("tbody");
					if(last == null) $(table).children().last().after(row);
					else $(last).after(row);
					$(row).attr("rel", "stock");
					element = row;
					last = row;
				}
				$(element).attr("relid", stock.id);
				$(element).html(stock.html);
				if(old && old != stock.price)
				{ // set change background
					var changebg = $(element).find("[rel~=changebg]");
					if(old < stock.price) $(changebg).addClass("poz_bg");
					else if(old > stock.price) $(changebg).addClass("neg_bg");
				};
				$(table).data(stock.id.toString(), stock.price); // save new value
				id++;
			});
			while(id < rows.length)
			{
				$(rows[id]).remove();
				id++;
			}
		}
	});
	$("#stocktableAll").each(function(i, link)
	{
		$(link).attr("class", data.t.all ? "rejt" : "mutat").html(data.t.all ? "Inaktívak elrejtése" : "Inaktívak mutatása");
	});
	removeBackground($("#stocktable"));
};

function reloadStockMarket(selcol, all) // selected column, is all link clicked
{
	clearAjaxReuqest();

	var tableData = $("#stocktable").data("data");
	if(tableData)
	{
		var data =
		{
			rateables: getRateables(),
			type: tableData.type,
			category: tableData.category,
			column: tableData.column,
			dir: tableData.dir,
			all: (all != null) ? !tableData.all : tableData.all,
			selected: selcol
		};
		ajaxRequest = $.ajax(
		{
			type: "POST",
			url: "/AutoRefresh.asmx/StockMarket",
			data: $.toJSON(data),
			contentType: "application/json; charset=utf-8",
			dataType: "json",
			success: function(msg)
			{
				var data = $.evalJSON(msg.d);
				if(data.title) refreshTitle(data.title);
				refreshHeader(data.clock);
				refreshRateables(data.rateables);
				rebuildStockMarketTable(data.market);
			},
			error: function(msg)
			{
			}
		});
	};
}

// stock subpages functions

function refreshStockPage(element, data)
{
	$(element).find("[rel=header]").html(data.header);
	$(element).find("[rel=datatable]").html(data.datatable);
};

function reloadPromptPage(id, page) // prompt id, page type
{
	clearAjaxReuqest();

	var data =
	{
		rateables: getRateables(),
		id: id,
		page: page
	};
	ajaxRequest = $.ajax(
	{
		type: "POST",
		url: "/AutoRefresh.asmx/PromptPage",
		data: $.toJSON(data),
		contentType: "application/json; charset=utf-8",
		dataType: "json",
		success: function(msg)
		{
			var data = $.evalJSON(msg.d);
			if(data.title) refreshTitle(data.title);
			refreshHeader(data.clock);
			refreshRateables(data.rateables);
			refreshStockPage($("[rel=promptPage][relid="+data.prompt.id+"]"), data.prompt);
		},
		error: function(msg)
		{
		}
	});
}

function reloadDerivativePage(id, page) // derivative id, page type
{
	clearAjaxReuqest();

	var data =
	{
		rateables: getRateables(),
		id: id,
		page: page
	};
	ajaxRequest = $.ajax(
	{
		type: "POST",
		url: "/AutoRefresh.asmx/DerivativePage",
		data: $.toJSON(data),
		contentType: "application/json; charset=utf-8",
		dataType: "json",
		success: function(msg)
		{
			var data = $.evalJSON(msg.d);
			if(data.title) refreshTitle(data.title);
			refreshHeader(data.clock);
			refreshRateables(data.rateables);
			refreshStockPage($("[rel=derivativePage][relid="+data.derivative.id+"]"), data.derivative);
		},
		error: function(msg)
		{
		}
	});
}

function reloadIndexPage(id, page) // index id, page type
{
	clearAjaxReuqest();

	var data =
	{
		rateables: getRateables(),
		id: id,
		page: page
	};
	ajaxRequest = $.ajax(
	{
		type: "POST",
		url: "/AutoRefresh.asmx/IndexPage",
		data: $.toJSON(data),
		contentType: "application/json; charset=utf-8",
		dataType: "json",
		success: function(msg)
		{
			var data = $.evalJSON(msg.d);
			if(data.title) refreshTitle(data.title);
			refreshHeader(data.clock);
			refreshRateables(data.rateables);
			refreshStockPage($("[rel=indexPage][relid="+data.index.id+"]"), data.index);
		},
		error: function(msg)
		{
		}
	});
}

// crossrate market pages

function getCrossRates()
{
	return $("[rel=crossrateHistory]").find("[rel=crossrate]").map(function(){return $(this).attr("relid");}).toArray();
};

function refreshCrossRate(element, crossrate, old) {
	$(element).find("[rel~=ticker]").html(crossrate.s);
	$(element).find("[rel~=price]").html(crossrate.p);
	$(element).find("[rel~=change]").html(crossrate.c);
	$(element).find("[rel~=rate]").html(crossrate.r);

	if (old && old != crossrate.pd) {
		var changebg = $(element).find("[rel~=changebg]");
		if (old < crossrate.pd) $(changebg).addClass("poz_bg");
		else if (old > crossrate.pd) $(changebg).addClass("neg_bg");
	};
	var colored = $(element).find("[rel~=colored]");
	if (crossrate.cd == 0) colored.removeClass("neg_text").removeClass("poz_text").addClass("nul_text");
	else if (crossrate.cd > 0) colored.removeClass("nul_text").removeClass("neg_text").addClass("poz_text");
	else if (crossrate.cd < 0) colored.removeClass("nul_text").removeClass("poz_text").addClass("neg_text");

	return crossrate.pd;
};
function refreshCrossRateSection(element, rates)
{
	var rows = $(element).find("[rel=crossrate]").toArray();
	var id = 0;
	jQuery.each(rates, function(i, rate)
	{
		var pd = refreshCrossRate(rows[id], rate, $(element).data(rate.i.toString()));
		$(rows[id]).find("[rel~=link]").attr("href", rate.l);
		$(rows[id]).find("[rel~=grafikon]").attr("src", rate.g);
		if(pd) $(element).data(rate.i.toString(), pd);
		id++;
	});
};
function refreshCrossRateHistory(history)
{
	refreshCrossRateSection($("[rel=crossrateHistory]"), history);
	removeBackground("[rel=crossrateHistory]");
};

function rebuildCrossRateMarketTable(data)
{
	$("#crossratetable").each(function(s, table)
	{
		if(data.t) $(table).data("data", data.t);

		{ // header
			$(table).find("TR[class=header]").html(data.h);
		}
		{ // funds
			var rows = $(table).find("TBODY[rel=crossrate]").toArray();
			var id = 0;
			var last = $(rows).last();
			if(last.length == 0) last = null;

			$(data.r).each(function(i, rate)
			{
				var old = $(table).data(rate.i.toString());
				var element;
				if(rows.length > id)
				{ // existing row
					element = rows[id];
				}
				else
				{ // new row
					var row = document.createElement("tbody");
					if(last == null) $(table).children().last().after(row);
					else $(last).after(row);
					$(row).attr("rel", "crossrate");
					element = row;
					last = row;
				}
				$(element).attr("relid", rate.i);
				$(element).html(rate.h);
				if(old && old != rate.l)
				{ // set change background
					var changebg = $(element).find("[rel~=changebg]");
					if(old < rate.l) $(changebg).addClass("poz_bg");
					else if(old > rate.l) $(changebg).addClass("neg_bg");
				};
				$(table).data(rate.i.toString(), rate.l); // save new value
				id++;
			});
			while(id < rows.length)
			{
				$(rows[id]).remove();
				id++;
			}
		}
	});
	removeBackground($("#crossratetable"));
};

function rebuildCrossRateMarketMatrix(data)
{
	$("#crossratetable").each(function(s, table)
	{
		if(data.t) $(table).data("data", data.t);

		jQuery.each(data.c, function(i, rate)
		{
			$("#crossratetable [rel=crossrate][relid="+rate.i+"]").each(function(j, element)
			{
				var old = $(element).data("data");
				$(element).find("[rel~=price]").html(rate.h);
				$(element).data("data", rate.l);
				if(old && old != rate.l)
				{
					var changebg = $(element).find("[rel~=changebg]");
					if(old < rate.l) $(changebg).addClass("poz_bg");
					else if(old > rate.l) $(changebg).addClass("neg_bg");
				};
				var colored = $(element).find("[rel~=colored]");
				if(rate.c == 0) $(colored).removeClass("neg_text").removeClass("poz_text");
				else if(rate.c > 0) $(colored).removeClass("neg_text").addClass("poz_text");
				else if(rate.c < 0) $(colored).removeClass("poz_text").addClass("neg_text");
			});
		});
	});
	removeBackground($("#crossratetable"));
};

function reloadCrossRateMarket(selcol) // selected column
{
	clearAjaxReuqest();

	var tableData = $("#crossratetable").data("data");
	if(tableData)
	{
		var data =
		{
			rateables: getRateables(),
			currency: tableData.currency,
			crossrates: getCrossRates(),
			column: tableData.column,
			dir: tableData.dir,
			selected: selcol
		};
		ajaxRequest = $.ajax(
		{
			type: "POST",
			url: "/AutoRefresh.asmx/CrossRateMarket",
			data: $.toJSON(data),
			contentType: "application/json; charset=utf-8",
			dataType: "json",
			success: function(msg) {
				var data = $.evalJSON(msg.d);
				if (data.title) refreshTitle(data.title);
				refreshHeader(data.clock);
				refreshRateables(data.rateables);
				if (data.market.t.currency == "X") rebuildCrossRateMarketMatrix(data.market);
				else rebuildCrossRateMarketTable(data.market);
				refreshCrossRateHistory(data.crossrates);
			},
			error: function(msg) {
			}
		});
	};
}

// crossrate subpages functions

function refreshCrossRatePage(element, data) {
	$(element).find("[rel=header]").html(data.header);
	$(element).find("[rel=datatable]").html(data.datatable);
};

function reloadCrossRatePage(id) // crossrate id
{
	clearAjaxReuqest();

	var data =
	{
		rateables: getRateables(),
		id: id
	};
	ajaxRequest = $.ajax(
	{
		type: "POST",
		url: "/AutoRefresh.asmx/CrossRatePage",
		data: $.toJSON(data),
		contentType: "application/json; charset=utf-8",
		dataType: "json",
		success: function(msg) {
			var data = $.evalJSON(msg.d);
			if (data.title) refreshTitle(data.title);
			refreshHeader(data.clock);
			refreshRateables(data.rateables);
			refreshCrossRatePage($("[rel=crossratePage][relid=" + data.crossrate.id + "]"), data.crossrate);
		},
		error: function(msg) {
		}
	});
}

// common

function reloadCommon()
{
	clearAjaxReuqest();

	var data =
	{
		rateables: getRateables()
	};
	ajaxRequest = $.ajax(
	{
		type: "POST",
		url: "/AutoRefresh.asmx/Common",
		data: $.toJSON(data),
		contentType: "application/json; charset=utf-8",
		dataType: "json",
		success: function(msg)
		{
			var data = $.evalJSON(msg.d);
			if(data.title) refreshTitle(data.title);
			refreshHeader(data.clock);
			refreshRateables(data.rateables);
		},
		error: function(msg)
		{
		}
	});
};

