//////////////////////////////////////////////////
// Helpers

// &nbsp; \u00a0

// Text
	function GetCurrencyString()
	{
		return 'Ls';
	}
	function GetCloseImageText()
	{
		if (GetLanguage() == 'lv')
			return 'Aizvērt';
		else
			return 'Закрыть';
	}
	function GetColorString()
	{
		if (GetLanguage() == 'lv')
			return 'Krāsa: ';
		else
			return 'Цвет: ';
	}
	function GetAllCategoriesString()
	{
		if (GetLanguage() == 'lv')
			return 'Visas kategorijas';
		else
			return 'Все категории';
	}
	function GetSearchString()
	{
		if (GetLanguage() == 'lv')
			return 'Meklēt';
		else
			return 'Поиск';
	}
	function GetCartString()
	{
		if (GetLanguage() == 'lv')
			return 'Grozs';
		else
			return 'Корзина';
	}
	function GetEmptyCartString()
	{
		if (GetLanguage() == 'lv')
			return 'Grozs ir tukšs'; // TODO: Translate
		else
			return 'Корзина пуста';
	}
	function GetOrderString()
	{
		if (GetLanguage() == 'lv')
			return 'Kārtība';
		else
			return 'Заказ';
	}
	function GetFinishOrderString()
	{
		if (GetLanguage() == 'lv')
			return 'Beigas'; // TODO: Translate
		else
			return 'Конец';
	}
	function GetRemoveString()
	{
		if (GetLanguage() == 'lv')
			return 'dzēst';
		else
			return 'удалить';
	}
	function GetSingleColorString()
	{
		if (GetLanguage() == 'lv')
			return 'Vienkrāsaina  prece'; // TODO: Translate
		else
			return 'Одноцветный товар';
	}
	function GetMultiColorString()
	{
		if (GetLanguage() == 'lv')
			return 'Daudzkrāsaina prece. Cena '; // TODO: Translate
		else
			return 'Товар состоящий из нескольких цветов. Цена товара ';
	}
	function GetMultiColorDescriptionString()
	{
		if (GetLanguage() == 'lv')
			return '. Cenā būs iekļautas abas krāsas.'; // TODO: Translate
		else
			return '. Пожалуйста, имейте ввиду, что в цену будут включены оба цвета.';
	}
	function GetInstallString()
	{
		if (GetLanguage() == 'lv')
			return 'Montāža un uzstādīšana'; // TODO: Translate
		else
			return 'Сборка и установка';
	}
	function GetSubmitOrderValidationWarningString()
	{
		if (GetLanguage() == 'lv')
			return 'Lūdzu,  aizpildiet visas laukus'; // TODO: Translate
		else
			return 'Пожалуйста, заполните все поля';
	}

// URL parameters
	function GET( name )
	{
		name = name.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]');
		var regexS = '[\\?&]' + name + '=([^&#]*)';
		var regex = new RegExp(regexS);
		var results = regex.exec(window.location.href);
		if(results == null)
			return '';
		else
			return results[1];	
	}
	function GetPage()
    {
        var rxRegExp = /^.+\/([^\._]*)/;
        var Results = rxRegExp.exec(window.location.href);
        if (Results == null)
            return 'index';
        else
            return Results[1];
    }
	
	var g_sDefaultLanguage = 'lv';
	
	var sSelectedCategory = GET('category');
	var sSelectedItem = GET('item');
	var sSelectedLanguage = GET('lang');
	
	function GetLanguage()
	{
		if (!sSelectedLanguage.length)
			return g_sDefaultLanguage;
		return sSelectedLanguage;
	}
	function GetLanguageParameter()
	{
		return 'lang=' + GetLanguage();
	}
	
	//////////////////////////////////
	// CLocationArgument
	
	function CLocationArgument(sName, sValue)
	{
		this.sName = sName;
		this.sValue = sValue;
	}
	
	//////////////////////////////////
	// CLocation
	
	function CLocation(sPage, sLanguage)
	{
	// Variables
		this.sPage = sPage;
		this.sLanguage = (sLanguage && sLanguage.length) ? sLanguage : GetLanguage();
		this.Arguments = new Array;
		
	// Methods
		this.AddArgument =
			function(sName, sValue)
			{
				this.Arguments[this.Arguments.length] = new CLocationArgument(sName, sValue);
			}
		this.SetArgument = 
			function(sName, sValue)
			{
				var nArgumentIndex = -1;
				for (var nIndex = 0; nIndex < this.Arguments.length; nIndex++)
					if (this.Arguments[nIndex].sName == sName)
					{
						nArgumentIndex = nIndex;
						break;
					}
				if (nArgumentIndex < 0)
					this.AddArgument(sName, sValue);
				else
					this.Arguments[nArgumentIndex].sValue = sValue;
			}
		this.FindArgument = 
			function(sName, nStartPosition)
			{
				for (var nIndex = nStartPosition ? nStartPosition : 0; nIndex < this.Arguments.length; nIndex++)
					if (this.Arguments[nIndex].sName == sName)
						return nIndex;
				return -1;					
			}
		this.RemoveAllArguments =
			function()
			{
				this.Arguments = new Array();
			}
		this.GetLocation = CLocation_GetLocation;
	}
	function CLocation_GetLocation()
	{
		var sLocation = this.sPage;
		if (!sLocation.length)
			sLocation = 'index';
		var bNotLanguageDefault = this.sLanguage != g_sDefaultLanguage;
		sLocation += '.html';
		if (this.Arguments.length || bNotLanguageDefault)
		{
			sLocation += '?';
			if (bNotLanguageDefault)
			{
				sLocation += 'lang=' + this.sLanguage;
				if (this.Arguments.length)
					sLocation += '&';
			}				
			for (var nIndex = 0; nIndex < this.Arguments.length; nIndex++)
			{
				sLocation += this.Arguments[nIndex].sName + '=' + this.Arguments[nIndex].sValue;
				if (nIndex < this.Arguments.length - 1)
					sLocation += '&';
			}
		}
		return sLocation;
	}
	
	function GetCurrentLocation(sLanguage)
	{
		var Location = new CLocation(GetPage(), sLanguage);
		if (sSelectedCategory.length)
			Location.AddArgument('category', sSelectedCategory);
		if (sSelectedItem.length)
			Location.AddArgument('item', sSelectedItem);
		var sSelectedPage = GET('page');
		if (sSelectedPage.length)
			Location.AddArgument('page', sSelectedPage);
		var sSearchRequest = GET('search');
		if (sSearchRequest.length)
			Location.AddArgument('search', sSearchRequest);
		// TODO: Implement other arguments
		return Location;
	}
	
	function SwitchLanguage(sLanguage)
	{
		window.location.href = GetCurrentLocation(sLanguage).GetLocation();	
	}
	
	function OpenRoot()
	{
		var Location = new CLocation("index");
		window.location.href = Location.GetLocation();
	}
	
// HTML
	function GetBrowserVersion()
	{
		var nVersion = 999;
		if (navigator.appVersion.indexOf("MSIE") != -1)
			nVersion = parseFloat(navigator.appVersion.split('MSIE')[1]);
		return nVersion;
	}
	function CSize(nWidth, nHeight)
	{
		this.nWidth = nWidth;
		this.nHeight = nHeight;
	}
	// TODO: alretSize function is temporary
	function GetWindowSize()
	{	
		if (typeof(window.innerWidth) == 'number') // Non IE browser
			return new CSize(window.innerWidth, window.innerHeight);
		// IE
		return new CSize(document.documentElement.clientWidth, document.documentElement.clientHeight);
	}
	function SetElementClass(Element, sClass)
	{
		Element.setAttribute('class', sClass);
		Element.setAttribute('className', sClass);
	}
	function CreateTableElement(TBodyElement)
	{
		var TableElement = document.createElement('table');
		var THeadElement = document.createElement('thead');
		THeadElement.style.height = '0px';
		var TFootElement = document.createElement('tfoot');
		TFootElement.style.height = '0px';
		TableElement.appendChild(THeadElement);
		TableElement.appendChild(TBodyElement);
		TableElement.appendChild(TFootElement);
		return TableElement;
	}
	
	function CreateInputRadioElement(sName)
	{	
		var RadioElement;
		if (GetBrowserVersion() < 8)
			RadioElement = document.createElement('<input type="radio" name="' + sName + '" />');  
		else 
			RadioElement = document.createElement('input');
		RadioElement.setAttribute('type', 'radio');  
		RadioElement.setAttribute('name', sName);
		return RadioElement;
	}
	
	function DestroyChildrens(Node)
	{
		while (Node.firstChild)
			Node.removeChild(Node.firstChild);
	}
	
//////////////////////////////////
// CResizedImage
	// TODO: If image is already loaded try to use it

	function CalculateResizedImageSize(nCurrentWidth, nCurrentHeight, nSupposedWidth, nSupposedHeight)
	{	
		if (nSupposedWidth == 0 || nSupposedHeight == 0)
			return new CSize(nCurrentWidth, nCurrentHeight);
		var fAspect = nCurrentWidth / nCurrentHeight;
		var nNewWidth = nCurrentWidth, nNewHeight = nCurrentHeight;
		if (nNewHeight != nSupposedHeight)
		{
			nNewHeight = nSupposedHeight;
			nNewWidth = fAspect * nNewHeight;
		}
		if (nNewWidth > nSupposedWidth)
		{
			nNewWidth = nSupposedWidth;
			nNewHeight = nNewWidth / fAspect;
		}
		return new CSize(nNewWidth, nNewHeight);
	}
	function CResizedImage_onload()
	{
		var Size = CalculateResizedImageSize(this.width, this.height, this.nSupposedWidth, this.nSupposedHeight);
		this.width = Size.nWidth;
		this.height = Size.nHeight;
		// FIX: Opera can append image only after some timeout after onload callback called
		this.ResizedImageOwner.AppendImageToRootElement();		
	}
	function CResizedImage(HiddenImagesElement, RootElement, nSupposedWidth, nSupposedHeight, sImagePath, OnLoadedFunction)
	{	
		// Methods		
		// FIX: Opera can append image only after some timeout after onload callback called
		this.AppendImageToRootElement = 
			function()
			{
				var thisPointer = this;
				if (thisPointer.OnLoadRootElement) 
					setTimeout(
						function()
						{
							thisPointer.CResizedImage_AppendImage()
						}, 
						10);
			}
		this.CResizedImage_AppendImage = 
			function()
			{
				this.OnLoadRootElement.appendChild(this.ImageElement);			
				if (this.ImageElement.OnLoadedFunction)
					this.ImageElement.OnLoadedFunction();
			}	
		this.ImageElement = document.createElement('img');
		this.ImageElement.ResizedImageOwner = this;
		this.ImageElement.OnLoadedFunction = OnLoadedFunction;
		if (HiddenImagesElement)
		{
			HiddenImagesElement.appendChild(this.ImageElement);
			this.OnLoadRootElement = RootElement;
		}
		else
		{
			RootElement.appendChild(this.ImageElement);
		}			
		this.ImageElement.nSupposedWidth = nSupposedWidth;
		this.ImageElement.nSupposedHeight = nSupposedHeight;
		this.ImageElement.onload = CResizedImage_onload;
		this.ImageElement.setAttribute('src', sImagePath);
		this.ImageElement.setAttribute('border', 0);
	}
	
//////////////////////////////////
// Image zoom

	var g_ZoomImageDivElement; // WARN: must be initialized after body loaded
	function ZoomImage_OnLoadFunction()
	{
		var WindowSize = GetWindowSize();
		//var nX = document.documentElement.scrollLeft + Math.floor((WindowSize.nWidth - this.width) / 2);
		//var nY = document.documentElement.scrollTop + Math.floor((WindowSize.nHeight - this.height) / 2)
		var nX = document.documentElement.scrollLeft + 10;
		var nY = document.documentElement.scrollTop + 10;
		this.ResizedImageOwner.OnLoadRootElement.parentNode.style.left = nX + 'px';
		this.ResizedImageOwner.OnLoadRootElement.parentNode.style.top = nY + 'px';
		this.ResizedImageOwner.OnLoadRootElement.parentNode.style.visibility = 'visible';
		
		var sCloseText = GetCloseImageText();
		var CloseDivElement = document.createElement('div');
		SetElementClass(CloseDivElement, 'closetext');
		CloseDivElement.appendChild(document.createTextNode(sCloseText));
		CloseDivElement.style.position = 'absolute';
		CloseDivElement.style.top = '10px';
		if (this.width > (sCloseText.length * 8))
			CloseDivElement.style.left = 5 + (this.width - sCloseText.length * 8) / 2 + 'px';
		else
		{
			CloseDivElement.style.left = '12px';
			CloseDivElement.style.width = (this.width - 10) + 'px';
		}
		this.ResizedImageOwner.OnLoadRootElement.parentNode.appendChild(CloseDivElement);
	}
	// NOTE: This function is blank, and used only to prevent current location change when selecting href
	function CloseZoomedImage()
	{
	}
	function ZoomImage(sImagePath)
	{
		g_ZoomImageDivElement.innerHTML = '';
		var AElement = document.createElement('a');
		AElement.setAttribute('href', 'javascript:CloseZoomedImage()');
		g_ZoomImageDivElement.appendChild(AElement);
		var ResizedImage = new CResizedImage(g_HiddenImagesElement, AElement, 0, 0, sImagePath, ZoomImage_OnLoadFunction);
	}
	function GetZoomImageHref(sImagePath)
	{
		return 'javascript:ZoomImage("' + sImagePath + '")';
	}
	
//////////////////////////////////
// Cookies

	function GetExpiresDateAsString()
	{
		var today = new Date();
		var zero_date = new Date(0,0,0);
		today.setTime(today.getTime() - zero_date.getTime());
		var cookie_expire_date = new Date(today.getTime() + (8 * 7 * 86400000)); 
		return cookie_expire_date.toGMTString();
	}
	function SetCookie(sName, sValue)
	{
		document.cookie = sName + '=' + escape(sValue) +  ";expires=" + GetExpiresDateAsString();
	}
	function GetCookie(sName) 
	{
		var cookie = " " + document.cookie;
		var search = " " + sName + "=";
		var setStr = null;
		var offset = 0;
		var end = 0;
		if (cookie.length > 0) {
			offset = cookie.indexOf(search);
			if (offset != -1) {
				offset += search.length;
				end = cookie.indexOf(";", offset)
				if (end == -1) {
					end = cookie.length;
				}
				setStr = unescape(cookie.substring(offset, end));
			}
		}
		return(setStr);
	}
	
//////////////////////////////////
// Math

	function RoundFloat(fFloat, nCountArg)
	{
		var nCount = nCountArg ? nCountArg : 2;
		var nPow = Math.pow(10, nCount);
		return Math.round(fFloat * Math.pow(10, nCount)) / nPow;
	}
	
//////////////////////////////////
// Mouse
	
	var g_nMouseX = 0, g_nMouseY = 0;

	function OnMouseMove(e)
	{
		g_nMouseX = (GetBrowserVersion() == 999 && window.Event) ? e.pageX : event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
		g_nMouseY = (GetBrowserVersion() == 999 && window.Event) ? e.pageY : event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);		
	}	
	function InitializeMouseHandling()
	{
		//alert(GetBrowserVersion());
		if (GetBrowserVersion() == 999 && window.Event) 
			document.captureEvents(Event.MOUSEMOVE);
		document.onmousemove = OnMouseMove;
	}
	
//////////////////////////////////
// Debug

	var g_nTickCount;
	var g_sDebugOutput;
	var g_nCounter;
	
	function GetTickCount()
	{
		var now = new Date();
		return now.getTime();
	}
	
	function DebugInit()
	{
		g_nTickCount = GetTickCount();
		g_sDebugOutput = "";
		g_nCounter = 1;
	}
	
	function DebugAddCounter(sInfo)
	{
		var nCurrentTickCount = GetTickCount();
		g_sDebugOutput += g_nCounter + ": " + (nCurrentTickCount - g_nTickCount) + (sInfo ? " (" + sInfo + ")" : "") + '\r\n';
		g_nCounter ++;
		g_nTickCount = nCurrentTickCount;
	}
	
	function DebugOutput(sText)
	{
		g_sDebugOutput += sText + '\r\n';
	}
	
	function DebugIsObject(Object)
	{
		return Object ? 'true' : 'false';
	}
	
	function DebugAlert()
	{
		if (true)
			alert(g_sDebugOutput);
		DebugInit();
	}
	
	DebugInit();

