﻿var xmlHttp = function ()
{
	function createObject()
	{
		var factories = [
			function () { return new XMLHttpRequest() },
			function () { return new ActiveXObject('Msxml2.XMLHTTP') },
			function () { return new ActiveXObject('Msxml3.XMLHTTP') },
			function () { return new ActiveXObject('Microsoft.XMLHTTP') }
		]

		for (var i in factories)
			try { return factories[i]() }
			catch (e) {}

		return false
	}

	return {
		Request: function (url, postData)
		{
			var req = createObject()

			if (req)
			{
				req.open(postData ? 'POST' : 'GET', url, false)

				req.setRequestHeader('User-Agent', 'XMLHTTP/1.0')

				if (postData)
					req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')

				req.send(postData)
				
				return req.responseText
			}
		}
	}
}()

var cookie = function ()
{
	function ExpiryDate(/*seconds*/ lifetime)
	{
		return '; expires=' + new Date(Date.now() + lifetime * 1000).toGMTString()
	}

	return {
		Set: function (name, value, /*seconds*/ lifetime, path, domain, secure)
		{
			var cookieStr = name + '=' + escape(value)

			if (lifetime)
				cookieStr += ExpiryDate(lifetime)

			if (path)
				cookieStr += '; path=' + escape(path)

			if (domain)
				cookieStr += '; domain=' + escape(domain)

			if (secure)
				cookieStr += '; secure'

			document.cookie = cookieStr
		},

		Get: function (/*string*/ name)
		{
			var results = document.cookie.match('(^|;) ?' + name + '=([^;]*)')

			return results ? unescape(results[2]) : null
		},
		
		Delete: function (/*string*/ name)
		{
			document.cookie = name += '=' + ExpiryDate(-1)
		}
	}
}()

var lng = function ()
{
	var langIds		= 'en|es|fr|it|pt|ru|uk|'
	var cookieName	= 'langId'
	var curLangId	= 'en'
	var artistAndSong
	var commentsDiv
	var dictIds
	var lookup
	var sep

	function LangIdIndex(langId)
	{
		var i = langIds.indexOf(langId + '|')
		
		return i >= 0 ? i / 3 : -1
	}

	function Set(/*string*/ langId)
	{
		// If language specified and its already selected or its not specified and none has been selected
		if (curLangId == langId)
			return

		// Build a list of dictionary IDs used in this document

		dictIds	= ''
		lookup	= {}
		sep		= ''

		Traverse(document.firstChild)

		// Get translations from the server

		var postData = artistAndSong

		if (dictIds)
			postData = postData + 'l=' + langId + '&' + dictIds

		if (!postData)
			return

		var replies	= xmlHttp.Request('http://www.ooltra.net/DictLookup.php', postData).split('|')

		var i = 0

		// Update the comments

		if (artistAndSong)
		{
			if (commentsDiv)
				commentsDiv.innerHTML = replies[0]

			++i
		}

		// Add the translations to the lookup table

		for (var l in lookup)
			lookup[l] = replies[i++]

		curLangId = langId
		cookie.Set(cookieName, langId, 2419200 /*28 days*/, '/')

		// Now traverse the document again substituting the translations

		Traverse2(document.firstChild)
	}

	function Traverse(e)
	{
		while (e)
		{
			if (e.nodeType == 1)	// Element
			{
				var dictId = e.getAttribute('dictid')

				if (dictId && lookup[dictId] == null)
				{
					dictIds += sep + dictId + '='	// Add it to the XMLRequest string...
					sep = '&'
					lookup[dictId] = ''				// and to the lookup table
				}
				else
					Traverse(e.firstChild)
			}

			e = e.nextSibling
		}
	}

	function Traverse2(e)
	{
		while (e)
		{
			if (e.nodeType == 1)	// Element
			{
				var dictId	= e.getAttribute('dictid')
				var trav	= true

				if (dictId)
				{
					e.firstChild.nodeValue = lookup[dictId]
					trav = false
				}

				if (e.nodeName == 'A')
				{
					// Fix the language parameter in anchor tags.

					var href = e.getAttribute('href')

					// FireFox has a relative path, IE is absolute.
					if (href && (href.substring(0, 5) != 'http:' || href.substring(0, 22) == 'http://www.ooltra.net/') && href.indexOf('.php') > 0)
					{
						var lpar = href.indexOf('?l=')

						if (lpar < 0)
							lpar = href.indexOf('&l=')

						if (lpar < 0)
						{
							if (curLangId != 'en')
								href = href + (href.indexOf('?') < 0 ? '?l=' : '&l=') + curLangId
						}
						else
						{
							var parEnd = href.indexOf('&', lpar + 3)

							href =
								curLangId != 'en' ?
								href.substring(0, lpar + 3) + curLangId + (parEnd < 0 ? '' : href.substring(parEnd)) :
								(parEnd < 0 ? href.substring(0, lpar) : href.substring(0, lpar + 1) + href.substring(parEnd + 1))
						}

						e.setAttribute('href', href)
					}

					trav = false
				}

				if (trav)
					Traverse2(e.firstChild)
			}

			e = e.nextSibling
		}
	}

	return {
		OnLoad: function (/*string*/_artistAndSong)
		{
			artistAndSong	= 'a=' + _artistAndSong + '&'
			commentsDiv		= document.getElementById('comments')

			var langId = location.search

			if (langId && (langId = langId.match('(\\?|&)l=([^&]*)')))
				if (LangIdIndex(langId = langId[2]) >= 0)
					curLangId = langId
				else
					langId = null

			if (!langId)
				langId = cookie.Get(cookieName)

			if (!langId)
			{
				langId = navigator.language		// FireFox

				if (!langId)
					langId = navigator.userLanguage

				langId = langId.substr(0, 2).toLowerCase()

				if (LangIdIndex(langId) < 0)
					langId = 'en'
			}

			Set(langId)
		},

		AddLangList: function ()
		{
			var langTitle = [
				'Interface in English',
				'La interfaz en español',
				'L\'interface en français',
				'L\'interfaccia in italiano',
				'A interface em português',
				'Русскоязычный интерфейс',
				'Український інтерфейс'
			]
			
			var style = ' style="margin-right:4px"'
			
			document.write('<div>')

			for (var i = 0; i < langTitle.length; ++i)
			{
				var id = langIds.substr(i * 3, 2)

				if (i == langTitle.length - 1)
					style = ''

				document.write('<a href="javascript:lng.OnChange(\'' + id + '\')" title="' + langTitle[i] + '"' + style + '><img class="flag ' + id + '" src="x.gif" alt="' + id + '" /></a>')
			}

			document.write('</div>')
		},
		
		Changed: function() {},
		
		OnChange: function (newLangId)
		{
			Set(newLangId)
			this.Changed()
		},
		
		CurLangId: function () { return curLangId },
		
		lParam: function ()
		{
			return curLangId != 'en' ? '&l=' + curLangId : ''
		}
	}
}()

