﻿var decimalSeparator = ',';
var groupSeparator = '.';
var fullDateFormat = 'yyyy-MM-ddThh:mm:ss:fff';

function redirect(url) {
	if (window.location.href != url) {
		window.location = url;
	} else {
		location.replace(url);
		window.location.reload(true);
	}
}

function displayCharsLeft($textArea) {
	var $charsLeftLabel = null;
	var charsLeftSelector = $textArea.attr('charsLeftLabel');
	var maxLength = $textArea.attr('maxlength');
	if (charsLeftSelector != null)
		$charsLeftLabel = $(charsLeftSelector);

	var lbl = $charsLeftLabel != null && $charsLeftLabel[0] != null ? $charsLeftLabel[0] : null;

	// set correct chars left value
	if (lbl != null) {
		var charLeft = countCharsLeft($textArea[0], maxLength);
		lbl.innerHTML = charLeft;
	}
}

$(document).ready(function() {
	$('textarea[maxlength]').each(function(idx, textArea) {
		var $textArea = $(textArea);
		var $charsLeftLabel = null;
		var charsLeftSelector = $textArea.attr('charsLeftLabel');
		var maxLength = $textArea.attr('maxlength');
		if (charsLeftSelector != null)
			$charsLeftLabel = $(charsLeftSelector);

		var lbl = $charsLeftLabel != null && $charsLeftLabel[0] != null ? $charsLeftLabel[0] : null;

		// set correct chars left value
		if (lbl != null) {
			var charLeft = countCharsLeft($textArea[0], maxLength);
			lbl.innerHTML = charLeft;
		}

		// handle keypress, click and keyup events
		var handler = function(args) {
			var charLeft = countCharsLeft($textArea[0], maxLength);

			if (lbl != null)
				lbl.innerHTML = charLeft;

			if (args.keyCode == 8)
				return true;

			if (charLeft == 0)
				return false;
		}
		$textArea.keypress(handler);
		$textArea.keyup(handler);
		$textArea.click(handler);

		// handle paste events
		if (checkIfIEIsUsed() >= 5) {
			$textArea.bind('paste', function() {
				var charLeft = doPasteMaxLen($textArea[0], maxLength);

				if (lbl != null)
					lbl.innerHTML = charLeft;
			});
		}
		else {
			textArea.blur(handler);
		}
	});
});

function checkIfIEIsUsed() {
	if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) //test for MSIE x.x;
		return ieversion = new Number(RegExp.$1) // capture x.x portion and store as a number
	else
		return -1;
}

function countCharsLeft(obj, nMaxLen) {
	var charsLeft = nMaxLen - obj.value.length;
	if (charsLeft < 0)
		charsLeft = 0;

	if (charsLeft == 0) {
		if (document.selection) {
			var oTR = document.selection.createRange();
			if (oTR.htmlText.length > 0)
				charsLeft = charsLeft + oTR.length;
		} else if (window.getSelection) {
			var range = window.getSelection();
			if (range.toString().length > 0)
				charsLeft = charsLeft + range.toString().length;
		}
	}

	return charsLeft;
}

function doPasteMaxLen(obj, nMaxLen) {
	event.returnValue = false;
	var oTR = document.selection.createRange();
	var nInsLen = nMaxLen - obj.value.length + oTR.text.length;
	oTR.text = window.clipboardData.getData('Text').substr(0, nInsLen);
	return countCharsLeft(obj, nMaxLen);
}

function markUnmarkCbxs(mainCbx, elName) {
	var items = document.getElementsByTagName('input');

	for (var i = 0, l = items.length; i < l; i++) {
		if (items[i].type == 'checkbox' && items[i].name != 'All')
			items[i].checked = mainCbx.checked;
	}

	if (document.getElementById(elName) != null)
		document.getElementById(elName).disabled = !mainCbx.checked;
}

function checkIfAnyChecked(cbx, elName) {
	var el = document.getElementById(elName);
	var items = document.getElementsByTagName('input');

	if (cbx.checked) {
		el.disabled = false;
	}
	else {
		for (var i = 0, l = items.length; i < l; i++) {
			if (items[i].type == 'checkbox' && items[i].name != 'All' && items[i].checked) {
				el.disabled = false;
				return;
			}
		}
		el.disabled = true;
	}
}

function onAjaxBegin(args) {
}

function onAjaxComplete(args) {
}

function onAjaxFailure(args) {
	// TODO: redirect to error page. In params should be
	enableButtons();
}

function onAjaxSuccess(args) {
	var response = args.get_response();
	var status = response.get_statusCode();
	var data = response.get_object();

	if (status == 200) {
		handleJSONResponse(data);
		enableButtons();
	}
}

function handleJSONResponse(data) {
	var stopExecuting = false;
	switch (data.Type) {
		case 'r':
			{
				var l = document.location;
				var fullUrl = l.protocol + '//' + l.hostname;
				if (l.port)
					fullUrl += l.port;
				fullUrl += data.Url;
				l = fullUrl;
				redirect(l);
				stopExecuting = true;
				break;
			}
		case 'msg':
			{
				infoDialog(data.Message == null || data.Message == '' ? "&nbsp;" : data.Message, data.Title, data.Callback);
				break;
			}
		case 'cnfrm':
			{
				confirmDialog(data.Message == null || data.Message == '' ? "&nbsp;" : data.Message, data.Title, data.Callback);
				break;
			}
		case 'tmplt':
			{
				templatedDialog(data.Message == null || data.Message == '' ? "&nbsp;" : data.Message, data.Title);
				break;
			}
		case 'err':
			{
				errorDialog(data.Message == null || data.Message == '' ? "&nbsp;" : data.Message, data.Title);
				break;
			}
		case 'gameInfo': // retrieved from games server
			if (gamesMonitor != null) {
				gamesMonitor.ClearTimer();
				gamesMonitor.HandleGameInfoResult(data);
				// reset timer for next update;
				gamesMonitor.CheckGameInfoAsync();
			}
			break;
		case 'upcommingGame': // retrieved from host
			if (gamesMonitor != null) {
				gamesMonitor.ClearTimer();
				gamesMonitor.HandleUpcommingGameResult(data);
				if (gamesMonitor.PendingGameStart)
					gamesMonitor.CheckGameInfo();
				else
					gamesMonitor.CheckGameInfoAsync();
			}
			break;
	}



	return stopExecuting;
}

function syncFakeRadiobuttons($fakeRdb, clearValues) {
	$("input:radio.hiddenRdb").each(function() {
		var fakeTrgId = "#fake" + this.id.substr(3);

		var $lbl = $(fakeTrgId);
		if (clearValues && $fakeRdb.filter(fakeTrgId).length > 0)
			$(this).attr('checked', false); // do this if tactics for this round has not been selected

		this.checked ? $lbl.addClass('fakeChecked') : $(fakeTrgId).removeClass('fakeChecked');
	});
}
function attachFakeRadiobuttons($fakeRdb, clearValues, allowUnselect) {
	syncFakeRadiobuttons($fakeRdb, clearValues);
	// function to 'check' the fake ones and their matching checkboxes
	$fakeRdb.click(function() {
		var $this = $(this);
		if ($this.is('.disabled') || $this.parents('.disabled').length > 0)
			return false;
		var trg = $('#' + $this.attr('for'));
		var groupName = trg.attr('name');

		var isSelected = trg.attr('checked');
		// uncheck current checked item from same group
		$("input:radio:checked[name='" + groupName + "'].hiddenRdb").each(function() {
			var oldFakeTrgId = "#fake" + this.id.substr(3);
			$(oldFakeTrgId).removeClass('fakeChecked');
		});
		if (!(isSelected && allowUnselect)) {
			$this.addClass('fakeChecked');
			$(trg).trigger('click');
		}
		else {
			$(trg).attr('checked', false);
			return false;
		}
		// TODO: do I need to click it here?
	});
}

function confirmDialog(msg, title, callback, cancelCallback) {
	var selector = '#confirmDialog';

	var confirmDialogConfirmedHandler = null;

	var temp = $(selector)
	 .jqmShow()
	  .find('p')
	   .html(msg)
	    .end()
	  .find('h2')
	   .html(title)
	    .end();
	temp.find(':submit:visible')
	 .click(((confirmDialogConfirmedHandler == null) ? (confirmDialogConfirmedHandler = function() {
	 	if ((this.getAttribute("val") && this.getAttribute("val") == 'yes') || this.value == 'yes') {
	 		$(this).attr('disabled', true);
	 		(typeof callback == 'string') ?
				redirect(callback) :
				callback();
	 	}
	 	else
	 		if ($(this).hasClass('jqmClose') && cancelCallback != null) { // cancel button
	 		(typeof cancelCallback == 'string') ?
				redirect(cancelCallback) :
				cancelCallback();
	 	}
	 	$(selector)
	 	 .find(':submit') // :visible
	 	  .unbind('click', confirmDialogConfirmedHandler)
	 	   .end().jqmHide();
	 }) : confirmDialogConfirmed));
}

function templatedDialog(msg, title) {
	var selector = '#templateDialog';

	var dlg = $(selector);
	dlg.find('p')
	   .html(msg)
	    .end()
	  .find('h2')
	   .html(title);
	dlg.jqmShow();
}

function infoDialog(msg, title, callback) {
	var infoDialogClosedHandler = null;
	var selector = '#infoDialog';
	$(selector)
	 .jqmShow()
	  .find('p')
	   .html(msg)
	    .end()
	  .find('h2')
	   .html(title)
	    .end()
	.find(':submit:visible')
	 .click(((infoDialogClosedHandler == null) ? (infoDialogClosedHandler = function() {
	 	if (callback != null)
	 		(typeof callback == 'string') ?
				redirect(callback) :
				callback();
	 	$(selector)
	 	 .find(':submit')
	 	  .unbind('click', infoDialogClosedHandler)
	 	   .end().jqmHide();
	 }) : infoDialogClosedHandler));
}

function errorDialog(msg, title) {
	var errorDialogClosedHandler = null;
	var selector = '#errorDialog';
	$(selector)
	 .jqmShow()
	  .find('p')
	   .html(msg)
	    .end()
	  .find('h2')
	   .html(title)
	    .end()
	.find(':submit:visible')
	 .click(((errorDialogClosedHandler == null) ? (errorDialogClosedHandler = function() {
	 	$(selector)
	 	 .find(':submit')
	 	  .unbind('click', errorDialogClosedHandler)
	 	   .end().jqmHide();
	 }) : errorDialogClosedHandler));
}


var keepAliveIntervalID = null;
function InitializeKeepAlive(url, interval) {
	keepAliveIntervalID = setInterval(function() {
		$.post(url, function(args) {
			var data = args;
			if (data == 'logout')
				clearInterval(keepAliveIntervalID);
		});
	}, interval);
}

function getEventTarget(evt) {
	var t = (evt.target) ? evt.target : evt.srcElement;
	if (t != null) {
		if (t.nodeType == 3)
			t = t.parentNode;
	}

	return t;
}

function setFormAction(sender, url) {
	var f = $(sender).parents('form');
	f.attr('action', url);
	return true;
}

var spinnerContent = '';

function setCaretPosition(ctrl, pos) {
	if (ctrl != null) {
		if (ctrl.setSelectionRange) {
			ctrl.focus();
			ctrl.setSelectionRange(pos, pos);
		}
		else if (ctrl.createTextRange) {
			var range = ctrl.createTextRange();
			range.collapse(true);
			range.moveEnd('character', pos);
			range.moveStart('character', pos);
			range.select();
		}
	}
}

function parseCurrency(text) {
	var t = text.replace(new RegExp(groupSeparator, 'g'), '').replace(decimalSeparator, '.');
	return Number(t);
}

function format(num, isGold) {
	var numberCount;
	if (num != 0) numberCount = Math.floor(Math.log(num) / Math.LN10 + 0.00000001) + 1;
	else numberCount = 1;
	var txt = num.toPrecision(isGold ? numberCount + 2 : numberCount + 0).replace('.', decimalSeparator);

	var fullPart = txt.substring(0, numberCount);
	var decimalPart = isGold ? txt.slice(-3) : '';

	// format number with thousands separators
	var withThousands = '';

	while (fullPart.length > 0) {
		var part = fullPart.slice(-3);
		if (fullPart.length > 3)
			fullPart = fullPart.substring(0, fullPart.length - 3);
		else
			fullPart = '';
		if (withThousands.length > 0)
			withThousands = part + groupSeparator + withThousands;
		else
			withThousands = part;
	}

	return withThousands + decimalPart;
}

function digitsOnly(id) {
	$('#' + id).keydown(function(e) {
		if (e.keyCode != 8 && e.keyCode != 0 && (e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105)) {
			return false;
		}
	});
}

String.prototype.encHtml = function() {
	return (this.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;'));
};


$(document).ready(function() {
	$('form').each(function() {
		var $that = $(this);
		$that.submit(function() {
			var submitButton = $that.find("button[type='submit']");
			disableAfterSubmit(submitButton);
		});
	});

	$('.ellipsis').each(function() {
		trimm($(this));
	});

	$('.ellipsisMultiple').each(function() {
		trimmMultiple($(this));
	});
});

function disableAfterSubmit($button) {
	$($button).attr("disabled", true);
}

function enableButtons() {
	$('form').each(function() {
		var submitButton = $(this).find("button[type='submit']").filter("[leaveDisabled!=true]");
		enableAfterFailedSubmit(submitButton);
	});
	$("button[id^='confirmDialog']").each(function() {
		enableAfterFailedSubmit(this);
	});
}

function enableAfterFailedSubmit($button) {
	$($button).removeAttr("disabled");
}

(function($) {
	$.fn.submitOnEnter = function(options) {
		var opt = $.extend({
			targetSelector: '',
			ignoreIfEmpty: false
		}, options);
		$(this)
			.keypress(function(e) {
				if (e.which == 13) {
					if (!opt.ignoreIfEmpty || $(e.srcElement).val() != '')
						$(opt.targetSelector).focus();
				};
			});
		return $(this);
	}
})(jQuery);

var trimmCache = new Array();

function trimm(e) {
	if (!e.parent().is(':visible')) {
		e.parents('#' + e.attr('parentId')).bind('afterShow', function() {
			trimm(e);
		});
		return;
	}

	var w, t, el;
	var parentWidth = e.parent().width();
	var holder = e.find('.textHolder');
	el = (holder.length != 0) ? holder : e;
	t = el.text();
	var orgTxt = t;
	var trimmed = false;

	var key = t + '_' + parentWidth;
	if (typeof (trimmCache[key]) != 'undefined') {
		el.text(trimmCache[key] + '...');
		trimmed = true;
	}
	else {
		var rightMargin = e.hasClass('rightMargin') ? 10 : 0;

		while (t.length > 0 && e.width() > parentWidth - rightMargin) {
			w = e.width();
			t = t.substr(0, t.length - 1);

			el.text(t + '...');
			trimmed = true;
		}

		if (trimmed)
			trimmCache[key] = t;
	}

	e.css('display', e.hasClass('inline') ? 'inline' : 'block');
	e.css('visibility', 'visible');

	if (trimmed)
		e.attr('title', orgTxt);
}

function trimmMultiple(e) {
	var parentWidth = e.parent().width();

	if (!e.parent().is(':visible')) {
		e.parents('#' + e.attr('parentId')).bind('afterShow', function() {
			trimmMultiple(e);
		});

		return;
	}

	var firstHolder = e.find('.textHolder1');
	var secondHolder = e.find('.textHolder2');
	var firstText = firstHolder.text();
	var secondText = secondHolder.text();
	var firstOriginalText = firstText;
	var secondOriginalText = secondText;
	var firstTrimmed = false, secondTrimmed = false;

	var firstKey = firstText + '_' + parentWidth;
	var secondKey = secondText + '_' + parentWidth;
	if (typeof (trimmCache[firstKey]) != 'undefined' && typeof (trimmCache[secondKey]) != 'undefined') {
		firstHolder.text(trimmCache[firstKey] + '...');
		secondHolder.text(trimmCache[secondKey] + '...');
		secondTrimmed = true;
		firstTrimmed = true;
	} else {
		while (e.width() > parentWidth) {
			secondText = secondText.substr(0, secondText.length - 1);
			secondHolder.text(secondText + '...');
			secondTrimmed = true;
			if (firstText.length > 5 && e.width() > parentWidth) {
				firstText = firstText.substr(0, firstText.length - 1);
				firstHolder.text(firstText + '...');
				firstTrimmed = true;
			}
		}

		if (firstTrimmed)
			trimmCache[firstKey] = firstText;
		if (secondTrimmed)
			trimmCache[secondKey] = secondText;
	}

	e.css('display', e.hasClass('inline') ? 'inline' : 'block');
	e.css('visibility', 'visible');

	if (firstTrimmed)
		firstHolder.attr('title', firstOriginalText);

	if (secondTrimmed)
		secondHolder.attr('title', secondOriginalText);
}

function resolveFunction(value) {
	/// <summary>
	/// Returns a function reference that corresponds to the provided value
	/// </summary>
	/// <param name="value" type="Object">
	/// The value can either be a Function, the name of a function (that can be found using window['name']),
	/// or an expression that evaluates to a function.
	/// </param>
	/// <returns type="Function">
	/// Reference to the function, or null if not found
	/// </returns>

	if (value) {
		if (value instanceof Function) {
			return value;
		} else if (String.isInstanceOfType(value) && value.length > 0) {
			var func;
			if ((func = window[value]) instanceof Function) {
				return func;
			} else if ((func = eval(value)) instanceof Function) {
				return func;
			}
		}
	}
	return null;
}

$(document).ready(function() {
	$('.newBanner').each(function(idx, el) {
		AddWatermark(el, "newBannerImg", 9, 8);
	});
});

$(document).ready(function() {
	$('.newVersion').each(function(idx, el) {
		AddWatermark(el, "newVersionImg", 19, 28);
	});
});

function AddWatermark(el, className, top, left) {
	var $b = $(el);
	var $p = $b.offsetParent();
	var $img = $('<div class="' + className + '"></div>');
	var c = $b.position();
	var top = (c.top + top) + 'px'
	var left = (c.left + left) + 'px';
	$img.css({ top: top, left: left });
	$p.append($img);
}

function SaveInitValue(el, seconds, isUtc) {
	if (seconds == null) {
		var val = el.innerHTML;
		var format = el.getAttribute('format');
		var ihh = format.indexOf('HH');
		var imm = format.indexOf('mm');
		var iss = format.indexOf('ss');
		var hoursDelta = ihh >= 0 ? val.substr(ihh, 2) : 0;
		var minutesDelta = imm >= 0 ? val.substr(imm, 2) : 0;
		var secondsDelta = iss >= 0 ? val.substr(iss, 2) : 0;
		var totalSecondsDelta = new Number(hoursDelta) * 3600 + new Number(minutesDelta) * 60 + new Number(secondsDelta);
		el.initVal = Math.round(pageLoadedTicks / 1000) + totalSecondsDelta;
	}
	else {
		el.initVal = seconds;
	}

	el.elapsedTS = new Number(el.getAttribute('elapsedSeconds'));
	var elapsedHandler = el.getAttribute('onElapsed');
	if (elapsedHandler != null && elapsedHandler != '') {
		el.onElapsedHandler = resolveFunction(elapsedHandler);
	}
}

function getTimeSpan(secondsA, secondsB) {
	var newSeconds = secondsA - secondsB;
	var hours = Math.max(Math.floor(newSeconds / 3600)/* % 24*/, 0);
	var minutes = Math.max(Math.floor(newSeconds / 60) % 60, 0);
	var seconds = Math.max(newSeconds % 60, 0);

	return { hours: hours, minutes: minutes, seconds: seconds };
}

function getTotalSeconds(ts) {
	return ts.hours * 3600 + ts.minutes * 60 + ts.seconds;
}

function getLocalOffset(now) {
	return now.getTimezoneOffset() * 60000;
}

function getCurrentTime(isUtc, utcOffset, now) {
	if (now == null)
		now = new Date();
	if (isUtc == true) {
		var localTime = now.getTime();
		var localOffset = getLocalOffset(now);
		var utc = localTime + localOffset;
		var utcTime = utc + (3600000 * utcOffset);
		now = new Date(utcTime);
	}
	return now;
}

function displayTimeSpan(el, ts) {
	var h = ((ts.hours < 10) ? "0" : "") + ts.hours;
	var m = ((ts.minutes < 10) ? "0" : "") + ts.minutes;
	var s = ((ts.seconds < 10) ? "0" : "") + ts.seconds;

	formatTime(el, h, m, s);
}

function displayTime(el, now) {
	var newSeconds = el.initVal - Math.round(now / 1000);
	var hours = Math.max(Math.floor(newSeconds / 3600) /*% 24*/, 0);
	var minutes = Math.max(Math.floor(newSeconds / 60) % 60, 0);
	var seconds = Math.max(newSeconds % 60, 0);

	hours = ((hours < 10) ? "0" : "") + hours;
	minutes = ((minutes < 10) ? "0" : "") + minutes;
	seconds = ((seconds < 10) ? "0" : "") + seconds;

	formatTime(el, hours, minutes, seconds);
}

function formatTime(el, h, m, s) {
	var format = el.getAttribute('format');
	if (format == null)
		format = 'HH:mm:ss';
	var result = format.replace('HH', h);
	result = result.replace('mm', m);
	result = result.replace('ss', s);
	el.innerHTML = result;
}

function appendParameter(url, name, val) {
	var q = url.indexOf('?') > 0 ? '&' : '?'
	q += name + '=' + val;
	return url + q;
}

function setUrlParameter(url, name, val) {
	var anch = url.split('#');

	var l = anch[0].split('?');
	var params = null;
	var idx = -1;
	if (l.length > 1) {
		params = l[1].split('&');
		for (var i = 0; i < params.length; i++) {
			if (params[i].startsWith(name + '=')) {
				idx = i;
				break;
			}
		}
	}
	else
		params = [];

	if (idx < 0)
		idx = params.length;

	params[idx] = name + '=' + val;

	var q = '';
	for (var i = 0; i < params.length; i++) {
		q += (i == 0) ? '?' : '&';
		q += params[i];
	}

	var newUrl = l[0] + q;
	if (anch.length > 1)
		newUrl += '#' + anch[1];

	return newUrl;
}

function calculateSIListTopMargin(top, height) {
	var defaultTopMargin = -78;
	var delta = 20;
	var scrollTop = $(window).scrollTop();
	var windowHeight = $(window).height();

	var topMargin = -height + delta;

	var overlayBottom = top + height > scrollTop + windowHeight;
	var overlayTop = top + topMargin < scrollTop

	if (overlayBottom && overlayTop) {
		if ((windowHeight / 2) + scrollTop < top + delta)
			return topMargin;
		else
			return defaultTopMargin;
	} else if (overlayBottom)
		return topMargin;
	else
		return defaultTopMargin;
}
