/**
 * Jyxo crossdomain login library.
 *
 * @author Jaroslav Hanslík
 * @author Ondřej Nešpor
 */
(function($)
{
	/**
	 * Url cross-domain serveru pro daný projekt.
	 *
	 * @var string
	 */
	var xdUrl = '';

	/**
	 * Callback, který se zavolá po přihlášení (ve funkci login i username).
	 *
	 * @var callback
	 */
	var xdCallback;

	/**
	 * Deklarace objektu s veřejně přístupnými funkcemi
	 *
	 * @var object
	 */
	var JyxoCrossDomain =
	{
		/**
		 * Jména cookie.
		 *
		 * @var object
		 */
		COOKIE: {
			TICKET: 'xdlogin',		// Ticket pro přihlášení
			LOGIN: 'tlogin',		// Login ticket pro odeslání
			PERMANENT: 'plogin'		// Permanent ticket pro odeslání
		},

		/**
		 * Doména pro cookie daného projektu.
		 *
		 * @var string
		 */
		cookieDomain: '',

		/**
		 * Časový limit požadavků.
		 *
		 * @var integer
		 */
		XD_TIMEOUT: 2000,

		/**
		 * Uživatel se právě odhlašuje.
		 *
		 * @var boolean
		 */
		loggingOut: false,

		/**
		 * Inicializace.
		 *
		 * @param string url
		 * @param string domain
		 * @param callback callback function
		 */
		init: function(url, domain, callback)
		{
			xdUrl = url + ('/' !== url.charAt(url.length - 1) ? '/' : '');
			this.cookieDomain = domain;
			xdCallback = callback;

			// Pokud je nastaven ticket, není třeba kontrolovat přihlášení
			if ('' === this.getCookie(this.COOKIE.TICKET)) {
				$.ajax({
					url: xdUrl + 'username/',
					dataType: 'script',
					timeout: this.XD_TIMEOUT,
					cache: false
				});
			}

			if ('' !== this.getCookie(this.COOKIE.PERMANENT)) {
				// Odešle se ticket permanetního přihlášení na cross-domain server
				$.ajax({
					url: xdUrl + 'permanent/' + this.getCookie(this.COOKIE.PERMANENT),
					dataType: 'script',
					timeout: this.XD_TIMEOUT,
					cache: false
				});
			} else if ('' !== this.getCookie(this.COOKIE.LOGIN)) {
				// Odešle se ticket nepermanetního přihlášení na cross-domain server
				$.ajax({
					url: xdUrl + 'login/' + this.getCookie(this.COOKIE.LOGIN),
					dataType: 'script',
					timeout: this.XD_TIMEOUT,
					cache: false
				});
			}
		},

		/**
		 * Přihlásí pomocí ticketu a uživatelského jména - nastaví ticket a provede volitelný callback.
		 *
		 * @param string username
		 * @param string ticket
		 */
		username: function(username, ticket)
		{
			if ('' !== username && '' !== ticket) {
				if (xdCallback) {
					xdCallback.call(arguments.callee, username, ticket);
				} else {
					this.setCookie(this.COOKIE.TICKET, encodeURIComponent(ticket), 0);
					window.location.reload();
				}
			}
		},

		/**
		 * Odhlásí uživatele na serveru a přesměruje na zadanou adresu.
		 *
		 * @param string url
		 */
		logout: function(url)
		{
			if (JyxoCrossDomain.loggingOut) {
				return;
			}

			window.JyxoCrossDomain.loggingOut = true;

			var $this = arguments.callee;
			var redirect = url || window.location.href;

			$.ajax({
				url: xdUrl + 'logout',
				dataType: 'script',
				timeout: this.XD_TIMEOUT,
				cache: false,
				success: function(data) {
					if (xdCallback) {
						xdCallback.call($this, data, redirect);
					} else {
						window.location = redirect;
					}
				},
				error: function(data) {
					if (xdCallback) {
						xdCallback.call($this, data, redirect);
					} else {
						window.location = redirect;
					}
				}
			});
		},

		/**
		 * Smaže ticket nepermanentního přihlášení.
		 */
		logged: function()
		{
			this.setCookie(this.COOKIE.LOGIN, null);
		},

		/**
		 * Smaže ticket permanentního přihlášení.
		 */
		permanent: function()
		{
			this.setCookie(this.COOKIE.PERMANENT, null);
		},

		/**
		 * Vrátí cookie.
		 *
		 * @param string name
		 * @return string
		 */
		getCookie: function(name)
		{
			if (document.cookie && '' !== document.cookie) {
				var cookies = document.cookie.split(';');
				var cookie;
				for (var i = 0; i < cookies.length; i++) {
					cookie = trim(cookies[i]);
					if (0 === cookie.indexOf(name + '=')) {
						return trim(decodeURIComponent(cookie.substring(name.length + 1)));
					}
				}
			}
			return '';
		},

		/**
		 * Nastaví cookie.
		 *
		 * @param string name
		 * @param mixed value
		 * @param integer expire
		 */
		setCookie: function(name, value, expire)
		{
			if (!value) {
				// Smazání cookie
				expire = -1;
			} else if (0 !== expire) {
				var date = new Date();
				date.setTime(date.getTime() + expire);
				expire = date.toUTCString();
			}

			var expires = 0 !== expire ? '; expires=' + expire : '';
			var path = '; path=/';
			var domain = '; domain=' + this.cookieDomain;
			var secure = '';
			document.cookie = [name, '=', value, expires, path, domain, secure].join('');
		}
	};
	window.JyxoCrossDomain = JyxoCrossDomain;

	/**
	 * Odstraní bílé znaky ze začátku a konce řetězce.
	 *
	 * @param string text
	 * @return string
	 */
	function trim(text)
	{
		return text.replace(/^\s+|\s+$/g, '');
	}
})(jQuery);

