window.ajaxManager = new function()
{
	this.makeRequest = function(parameters)
	{
		if (typeof parameters == 'object')
		{
			var ajaxRequestObject = new AjaxRequest(parameters);
			ajaxRequestObject.makeRequest();
		}
	}
	
	var self = this;
}
window.AjaxRequest = function(parameters)
{
	var init = function()
	{
		if (typeof parameters.requestXML != 'undefined')
		{
			requestXML = parameters.requestXML;
		}
		else
		{
			requestXML = false;
		}
		
		if (typeof parameters.requestURL != 'undefined')
		{
			requestURL = parameters.requestURL;
		}
		else
		{
			requestURL = false;
		}
		
		if (typeof parameters.requestType != 'undefined')
		{
			requestType = parameters.requestType.toUpperCase();
		}
		else
		{
			requestType = 'POST';
		}
		
		if (typeof parameters.contentType != 'undefined')
		{
			contentType = parameters.contentType;
		}
		else
		{
			contentType = 'application/x-www-form-urlencoded';
		}
		
		if (typeof parameters.postParameters == 'object')
		{
			postParameters = parameters.postParameters;
		}
		else
		{
			postParameters = {};
		}
		
		if (typeof parameters.successCallBack == 'function')
		{
			successCallBack = parameters.successCallBack;
		}
		else
		{
			successCallBack = false;
		}
		if (typeof parameters.failureDelay != 'undefined')
		{
			failureDelay = parameters.failureDelay;
		}
		if (typeof parameters.failCallBack == 'function')
		{
			failCallBack = parameters.failCallBack;
		}
		else
		{
			failCallBack = false;
		}
		if (typeof parameters.progressCallBack == 'function')
		{
			progressCallBack = parameters.progressCallBack;
		}
		else
		{
			progressCallBack = false;
		}
		
		XMLHttpResource = getXMLHttpRequestObject();
	}
	this.makeRequest = function()
	{		
		if (requestType == 'POST')
		{			
			var converter = new AjaxRequestDataConverter(postParameters, sendRequest, contentType);
			converter.preparePostData();
		}
		else
		{
			sendRequest();
		}
	}
	var sendRequest = function(headers, postBody)
	{			
		if (progressCallBack)
		{
			window.eventsManager.addHandler(XMLHttpResource.upload, 'progress', progressCallBack);
		}		
		if (failureDelay !== false)
		{
			failureCheckTimeOut = window.setTimeout(requestTimeOutHandler, failureDelay);
		}
		if (requestType == 'POST')
		{
			XMLHttpResource.open("POST", requestURL, true);
			
			for (var header in headers)
			{
				XMLHttpResource.setRequestHeader(header, headers[header]);
			}
			XMLHttpResource.onreadystatechange = catchRequestAnswer;
			
			if (typeof postBody == 'string')
			{
				if (typeof XMLHttpResource.sendAsBinary != 'undefined')
				{
					XMLHttpResource.sendAsBinary(postBody);
				}
				else
				{
					XMLHttpResource.send(postBody);
				}
			}
			else if (typeof postBody == 'object')
			{
				XMLHttpResource.send(postBody);
			}
		}
		else
		{
			XMLHttpResource.open("GET", requestURL, true);
			XMLHttpResource.onreadystatechange = catchRequestAnswer;
			
			XMLHttpResource.send(); 
		}
	}
	var catchRequestAnswer = function()
	{
		if (status == null)
		{
			if (XMLHttpResource.readyState == 4)
			{
				window.clearTimeout(failureCheckTimeOut);
				if (XMLHttpResource.status == 200)
				{
					status = 'success';					
					
					if (successCallBack)
					{
						var callBackArgument = false;
						if (requestXML)
						{
							callBackArgument = XMLHttpResource.responseXML;
						}
						else
						{
							callBackArgument = XMLHttpResource.responseText;
						}
						successCallBack(callBackArgument);
					}
				}
				else
				{
					status = 'failure';
					if (failCallBack)
					{
						failCallBack();
					}
				}
			}
		}
	}
	var requestTimeOutHandler = function()
	{
		status = 'timeout';
		if (failCallBack)
		{
			failCallBack();
		}
	}

	var formatNumber = function(number, decimals)
	{
		number = number.toString();
		if (number.length < decimals)
		{
			for (var a=decimals-number.length; a>0; a--)
			{
				number = '0'+number;
			}
		}
		return number;
	}
	
	var getXMLHttpRequestObject = function() 
	{
		var result = false;
		if (window.XMLHttpRequest) 
		{
			result = new XMLHttpRequest();
		}
		else if (window.ActiveXObject) 
		{
			try 
			{
				result = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e) 
			{
				try 
				{
					result = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (E) 
				{
					result = false;
				}
			}
		}
		
		return result;
	}
	var self = this;
	
	var status = null;
	
	var failureDelay = 5000;
	var failureCheckTimeOut = null;
	
	var XMLHttpResource = null;
	
	var requestURL = false;
	var requestXML = false;
	var requestType = false;
	var contentType = false;
	var successCallBack = false;
	var failCallBack = false;
	var progressCallBack = false;
	var postParameters = false;
	
	init();
}
window.AjaxRequestDataConverter = function(postParameters, callBack, contentType)
{
	this.preparePostData = function()
	{
		if (contentType == 'multipart/form-data' && typeof window.FormData == 'undefined')
		{
			for (var name in postParameters)
			{
				var value = postParameters[name];
				if (typeof value == 'object' && value.name && value.size && value.type)
				{
					fileContents[name] = false;
				
					var reader = new FileReader();
					reader.onload = function(fieldName){return function(event){getFileContents(event, fieldName)}}(name);
					reader.readAsBinaryString(value);
				}
			}
			checkFilesPreload();
		}
		else
		{
			generateContentBody();
		}
	}
	var getFileContents = function(event, name)
	{
		fileContents[name] = event.target.result;
		checkFilesPreload();
	}
	var checkFilesPreload = function()
	{
		var loaded = true;
		for (var i in fileContents)
		{
			if (fileContents[i] === false)
			{
				loaded = false;
				break;
			}
		}
		if (loaded)
		{
			generateContentBody();
		}
	}
	var generateContentBody = function()
	{
		var contentBody = '';
		var headers = {};
		if (contentType == 'application/x-www-form-urlencoded')
		{
			for (var name in postParameters)
			{
				contentBody = contentBody + name + '=' + postParameters[name] + '&';
			}
			contentBody = encodeURI(contentBody);
			headers["Content-type"] = 'application/x-www-form-urlencoded';
		}
		else if (contentType == 'multipart/form-data')
		{
			if (typeof window.FormData != 'undefined')
			{
				contentBody = new FormData();
				for (var name in postParameters)
				{
					contentBody.append(name, postParameters[name]);
				}
			}
			else
			{
				var boundary = '---------------------------';
				boundary += Math.floor(Math.random()*32768);
				boundary += Math.floor(Math.random()*32768);
				boundary += Math.floor(Math.random()*32768);
				
				headers["Content-type"] = 'multipart/form-data; boundary=' + boundary;
				
				for (var name in postParameters)
				{
					var value = postParameters[name];
					if (typeof value == 'string')
					{
						contentBody += '--' + boundary + '\r\n' + 'Content-Disposition: form-data; name="' + name + '"';
						contentBody += '\r\n\r\n';
						contentBody += value;
						contentBody += '\r\n'
					}
					else if (typeof value == 'object' && value.name && value.size && value.type)
					{
						contentBody += '--' + boundary + '\r\n' + 'Content-Disposition: form-data; name="' + name + '"; filename="'+value.name+'"';
						contentBody += '\r\n' + 'Content-Type: "'+value.type+'"';
						contentBody += '\r\n\r\n';
						contentBody += fileContents[name];
						contentBody += '\r\n'
					}
				}
				contentBody += '--' + boundary + '--';
			}
		}
		callBack(headers, contentBody);
	}
	var self = this;
	var fileContents = {};
};
window.domHelper = new function()
{
	this.setTextContent = function(element, text)
	{
		if (typeof element == 'object' && typeof text != 'undefined')
		{
			while(element.firstChild)
			{
				element.removeChild(element.firstChild);
			}
			var textNode = document.createTextNode(text);
			element.appendChild(textNode);
		}
	};
	this.formatNumber = function(number, decimals)
	{
		number = number.toString();
		if (number.length < decimals)
		{
			for (var a=decimals-number.length; a>0; a--)
			{
				number = '0'+number;
			}
		}
		return number;
	};
	this.addClass = function(element, className)
	{
		if (element)
		{
			var elementClassName = element.className + "";
			if (-1 == elementClassName.indexOf(className))
			{
				if (elementClassName == '')
				{
					element.className = className;
				}
				else
				{
					element.className += " " + className;
				}
			}
		}
	};
	this.removeClass = function(element, className)
	{
		if (element)
		{
			var elementClassName = element.className + "";
			if (-1 != elementClassName.indexOf(className))
			{
				if (-1 != elementClassName.indexOf(className + " "))
				{
					className += " ";
				}
				else if(-1 != elementClassName.indexOf(" " + className))
				{
					className = " " + className;
				}
				elementClassName = elementClassName.replace(className, "");
				element.className = elementClassName;
			}
		}
	};
	this.getElementPositions = function(domElement)
	{
		var elementLeft = 0;
		var elementTop = 0;

		if (domElement.offsetParent)
		{
			var elementLeft = domElement.offsetLeft;
			var elementTop = domElement.offsetTop;
			while (domElement = domElement.offsetParent)
			{
				if (domElement.tagName != 'body' && domElement.tagName != 'BODY')
				{
					elementLeft += domElement.offsetLeft - domElement.scrollLeft;
					elementTop += domElement.offsetTop - domElement.scrollTop;
				}
				else
				{
					elementLeft += domElement.offsetLeft;
					elementTop += domElement.offsetTop;
				}
			}
		}
		return {x: elementLeft,y: elementTop};
	};
	this.isAChildOf = function(_parent, _child)
	{
		if (_parent === _child)
		{
			return false;
		}
		while (_child && _child !== _parent)
		{
			_child = _child.parentNode;
		}

		return _child === _parent;
	}
};;
window.effectsManager = new function()
{
	this.startEffect = function(effectName, element, parameters, callback)
	{
		var effectPlugin = false;
		if (effectPlugin = this.getEffectPlugin(effectName, element))
		{
			this.setEffectParameters(effectPlugin, parameters);
			
			var effectInfo = null;
			if (effectInfo = this.registerEffectInfo(effectName, element))
			{
				effectInfo.clearTimeOuts(effectName);
				
				this.assignTimeouts(effectPlugin, effectInfo, callback);
			}
		}
	}
	this.queueEffect = function(effectName, element, parameters, callback)
	{
		var effectPlugin = false;
		if (effectPlugin = this.getEffectPlugin(effectName, element))
		{
			this.setEffectParameters(effectPlugin, parameters);
			
			var effectInfo = null;
			if (effectInfo = this.registerEffectInfo(effectName, element))
			{
				this.assignTimeouts(effectPlugin, effectInfo, callback);
			}
		}
	}
	this.assignTimeouts = function(effectPlugin, effectInfo, callback)
	{
		var timeOutDelay = this.timeOutDelay;
		
		var offsetTimeout = effectInfo.getOffsetTimeout(effectPlugin.effectName);
		var timeoutsArray = effectInfo.getTimeoutList(effectPlugin.effectName);
		
		var olderFrames = timeoutsArray.length;

		var framesCount = effectPlugin.calculateFramesCount();
		
		var currentDelay = offsetTimeout;
		var time = null;
		for (var frame = 1; frame <= framesCount; frame++)
		{
			time = frame;
			
			var currentDelay = offsetTimeout + time * timeOutDelay;
			
			timeoutsArray[currentDelay] = setTimeout(
			function(effectPlugin, time)
			{
				return function(){effectPlugin.renderFrame(time);};
			}(effectPlugin, time), currentDelay);
		}
		if (time < framesCount)
		{
			time = framesCount;
			frame = framesCount;
			var currentDelay = offsetTimeout + time * timeOutDelay;
			
			timeoutsArray[currentDelay] = setTimeout(
			function(effectPlugin, time)
			{
				return function(){effectPlugin.renderFrame(time);};
			}(effectPlugin, time), currentDelay);
			
		}
		
		if (callback)
		{
			var currentDelay  = offsetTimeout + (framesCount +1) * timeOutDelay;
			timeoutsArray[framesCount + 1  + olderFrames] = setTimeout(callback, currentDelay);
		}

		effectInfo.setTimeoutList(timeoutsArray, effectPlugin.effectName);
		effectInfo.calculateEndDate(currentDelay, effectPlugin.effectName);
	}
	this.setEffectParameters = function(effectPlugin, parameters)
	{
		effectPlugin.parameters = new Array();
		if (effectPlugin.defaults)
		{
			effectPlugin.parameters = effectPlugin.defaults;
		}
		for (var index in parameters)
		{
			effectPlugin.parameters[index] = parameters[index];
		}
	}
	this.registerEffectInfo = function(effectName, element)
	{
		if (typeof element.artWebEffects == 'undefined')
		{
			element.artWebEffects = new effectsInfo();
		}
		element.artWebEffects.register(effectName);
		
		return element.artWebEffects;
	}
	this.getEffectPlugin = function(effectName, element)
	{
		var newEffect = false;
		try
		{
			newEffect = eval('new artWebEffect_'+effectName);
			newEffect.effectName = effectName;
			newEffect.element = element;
		}
		catch(error)
		{
			alert('Effect "'+ effectName +'" load error');
		}
		return newEffect;
	}
	
	this.fps = 50;
	this.timeOutDelay = 1000 / this.fps;
}

function effectsInfo()
{
	this.register = function(effectName)
	{
		if (!this.effects[effectName])
		{
			this.effects[effectName] = new Array();
		}
		if (!this.effects[effectName].timeoutList)
		{
			this.effects[effectName].timeoutList = new Array();
		}
		if (!this.effects[effectName].endDate)
		{
			this.calculateEndDate(0, effectName);
		}
	}
	this.calculateEndDate = function(offsetValue, effectName)
	{
		var offsetDate = new Date();
		
		offsetDate.setTime(parseInt(offsetDate.getTime() + offsetValue));
		
		
		this.effects[effectName].endDate = offsetDate;
	}
	this.getOffsetTimeout = function(effectName)
	{
		var resultOffset = 0;
		var nowDate = new Date();
		var endDate = this.effects[effectName].endDate;
		
		if (nowDate < endDate)
		{
			resultOffset = endDate.getTime() - nowDate.getTime();
		}
		return resultOffset;
	}
	this.getTimeoutList = function(effectName)
	{
		try
		{
			var timeoutList = this.effects[effectName].timeoutList;
		}
		catch(error)
		{
			var timeoutList = false;
		}
		return timeoutList;
	}
	this.setTimeoutList = function(timeoutList, effectName)
	{
		this.effects[effectName].timeoutList = timeoutList;
	}
	this.clearTimeOuts = function(effectName)
	{
		var timeOutsList = this.getTimeoutList(effectName);
		for (var index in timeOutsList)
		{
			clearTimeout(timeOutsList[index]);
		}
		timeOutsList = new Array();
		this.setTimeoutList(timeOutsList, effectName);
		
		this.calculateEndDate(0, effectName);
	}
	
	this.effects = new Array();
};
function artWebEffect_opacity()
{
	this.renderFrame = function(frame)
	{
		var direction = 1;
		var startOpacity = this.startOpacity;
		var endOpacity = this.parameters.end;
		var opacityStep = this.parameters.step;
		if (startOpacity > endOpacity)
		{
			direction = -1;
		}
		var currentOpacity = (startOpacity + opacityStep * frame * direction);
		opacityHandler.setOpacity(this.element, currentOpacity);
	}
	this.calculateFramesCount = function()
	{
		var direction = 1;
		if (this.parameters.start)
		{
			var startOpacity = this.parameters.start;
		}
		else
		{
			var startOpacity = opacityHandler.getOpacity(this.element);
		}
		this.startOpacity = startOpacity;
		var endOpacity = this.parameters.end;
		var opacityStep = this.parameters.step;
		var framesCount = 0;
		
		if (startOpacity > endOpacity)
		{
			direction = -1;
		}
		var opacityChange = (endOpacity - startOpacity)*direction;
		
		framesCount = (opacityChange / opacityStep);
		return framesCount;
	}
	
	var instance = this;
	this.opacityType = false;
	this.defaults = {end: 0, step: 0.01};
};
function artWebEffect_position()
{
	this.renderFrame = function(frame)
	{
		var currentPath = this.step * frame + this.acceleration*frame*frame/2;
		var coefficient = currentPath/this.totalPath;
		
		var currentXPosition = Math.round(this.xSource + (this.xPath*coefficient*this.xDirection));
		var currentYPosition = Math.round(this.ySource + (this.yPath*coefficient*this.yDirection));
		this.element.style.left = currentXPosition+'px';
		this.element.style.top = currentYPosition+'px';
	}
	this.calculateFramesCount = function()
	{
		if (typeof this.parameters.xSource != 'undefined')
		{
			this.xSource = this.parameters.xSource;
		}
		else
		{
			this.xSource = this.element.offsetLeft;
		}
		if (typeof this.parameters.ySource != 'undefined')
		{
			this.ySource = this.parameters.ySource;
		}
		else
		{
			this.ySource = this.element.offsetTop;
		}
		
		if (typeof this.parameters.xTarget != 'undefined')
		{
			this.xTarget = this.parameters.xTarget;
		}
		else
		{
			this.xTarget = this.element.offsetLeft;
		}
		if (typeof this.parameters.yTarget != 'undefined')
		{
			this.yTarget = this.parameters.yTarget;
		}
		else
		{
			this.yTarget = this.element.offsetTop;
		}
		
		this.xDirection = 1;
		if (this.xSource > this.xTarget)
		{
			this.xDirection = -1;
		}
		this.yDirection = 1;
		if (this.ySource > this.yTarget)
		{
			this.yDirection = -1;
		}
		this.step = this.parameters.step;
		this.acceleration = this.parameters.acceleration;
		
		this.xPath = (this.xTarget - this.xSource)*this.xDirection;
		this.yPath = (this.yTarget - this.ySource)*this.yDirection;
		
		this.totalPath = Math.sqrt((this.xPath*this.xPath + this.yPath*this.yPath));
		
		if (this.acceleration > 0)
		{
			var framesCount = ((-1*this.step - Math.sqrt(this.step*this.step + 2*this.acceleration*(this.totalPath)))/this.acceleration);
			if (framesCount < 0)
			{
				framesCount = ((-1*this.step + Math.sqrt(this.step*this.step + 2*this.acceleration*(this.totalPath)))/this.acceleration);
			}
		}
		else
		{
			var framesCount = (this.totalPath/this.step);
		}
		return framesCount;
	}
	
	var instance = this;
	this.opacityType = false;
	this.defaults = {end: 0, step: 0.01};
};
function artWebEffect_slide()
{
	this.renderFrame = function(frame)
	{
		var currentPath = this.step * frame + this.acceleration*frame*frame/2;
		var currentHeight = Math.floor(this.startHeight + (currentPath * this.direction));
		if (currentHeight < 0) currentHeight = 0;
		this.element.style.height = currentHeight+'px';
	}
	this.calculateFramesCount = function()
	{
		this.direction = 1;
		if (this.parameters.start)
		{
			this.startHeight = this.parameters.start;
		}
		else
		{
			this.startHeight = this.element.offsetHeight;
		}
		
		this.endHeight = this.parameters.end;
		this.step = this.parameters.step;
		this.acceleration = this.parameters.acceleration;
		
		if (this.endHeight < this.startHeight)
		{
			this.direction = -1;
		}
		
		var totalPath = this.endHeight - this.startHeight;
		totalPath = this.direction * totalPath;
		
		if (this.acceleration > 0)
		{
			var framesCount = ((-1*this.step - Math.sqrt(this.step*this.step + 2*this.acceleration*(totalPath)))/this.acceleration);
			if (framesCount < 0)
			{
				framesCount = ((-1*this.step + Math.sqrt(this.step*this.step + 2*this.acceleration*(totalPath)))/this.acceleration);
			}
		}
		else
		{
			var framesCount = (totalPath/this.step);
		}
		return framesCount;
	}
	
	var instance = this;
	this.defaults = {end: 0, step: 1, acceleration: 1};
};
function artWebEffect_scrollx()
{
	this.renderFrame = function(frame)
	{
		var currentPath = this.step * frame + this.acceleration*frame*frame/2;
		var currentValue = Math.floor(this.start + (currentPath * this.direction));
		if (this.element.scroll)
		{
			this.element.scroll(currentValue, 0);
		}
		else
		{
			this.element.scrollLeft = currentValue;
		}
	}
	this.calculateFramesCount = function()
	{
		this.direction = 1;

		if (typeof this.element.pageXOffset != 'undefined')
		{
			this.start = this.element.pageXOffset;
		}
		else if (typeof this.element.scrollLeft != 'undefined')
		{
			this.start = this.element.scrollLeft;
		}

		this.end = this.parameters.end;
		this.step = this.parameters.step;
		this.acceleration = this.parameters.acceleration;

		if (this.end < this.start)
		{
			this.direction = -1;
		}

		var totalPath = this.end - this.start;
		totalPath = this.direction * totalPath;

		if (this.acceleration > 0)
		{
			var framesCount = ((-1*this.step - Math.sqrt(this.step*this.step + 2*this.acceleration*(totalPath)))/this.acceleration);
			if (framesCount < 0)
			{
				framesCount = ((-1*this.step + Math.sqrt(this.step*this.step + 2*this.acceleration*(totalPath)))/this.acceleration);
			}
		}
		else
		{
			var framesCount = (totalPath/this.step);
		}
		return framesCount;
	}

	var instance = this;
	this.defaults = {end: 0, step: 1, acceleration: 1};
};
function artWebEffect_color()
{
	this.renderFrame = function(frame)
	{
		var startColor = this.parameters.startColor;
		var endColor = this.parameters.endColor;
		
		var rStart = parseInt(startColor.charAt(0)+startColor.charAt(1), 16);
		var rEnd = parseInt(endColor.charAt(0)+endColor.charAt(1), 16);
		var rColor = Math.floor((rStart + (rEnd - rStart)*frame/self.framesCount));
		
		var gStart = parseInt(startColor.charAt(2)+startColor.charAt(3), 16);
		var gEnd = parseInt(endColor.charAt(2)+endColor.charAt(3), 16);
		var gColor = Math.floor((gStart + (gEnd - gStart)*frame/self.framesCount));
		
		var bStart = parseInt(startColor.charAt(4)+startColor.charAt(5), 16);
		var bEnd = parseInt(endColor.charAt(4)+endColor.charAt(5), 16);
		var bColor = Math.floor((bStart + (bEnd - bStart)*frame/self.framesCount));
		
		var value = (rColor*65536+gColor*256+bColor).toString(16);
		if (value.length < 6)
		{
			for (var a = 6 - value.length; a > 0; a--)
			{
				value = '0'+value;
			}
		}

		this.element.style.color = '#'+value;
	}
	this.calculateFramesCount = function()
	{
		this.framesCount = this.parameters.time/window.effectsManager.fps;
		
		return this.framesCount;
	}
	var self = this;
	this.framesCount = false;
	this.opacityType = false;
	this.defaults = {startColor:'ffffff', endColor:'000000'};
};
function artWebEffect_width()
{
	this.renderFrame = function(frame)
	{
		var currentPath = this.step * frame + this.acceleration*frame*frame/2;
		var currentWidth = Math.floor(this.startWidth + (currentPath * this.direction));
		if (currentWidth < 0) currentWidth = 0;
		this.element.style.width = currentWidth+'px';
	}
	this.calculateFramesCount = function()
	{
		this.direction = 1;
		if (this.parameters.start)
		{
			this.startWidth = this.parameters.start;
		}
		else
		{
			this.startWidth = this.element.offsetWidth;
		}
		
		this.endWidth = this.parameters.end;
		this.step = this.parameters.step;
		this.acceleration = this.parameters.acceleration;
		
		if (this.endWidth < this.startWidth)
		{
			this.direction = -1;
		}
		
		var totalPath = this.endWidth - this.startWidth;
		totalPath = this.direction * totalPath;
		
		if (this.acceleration > 0)
		{
			var framesCount = ((-1*this.step - Math.sqrt(this.step*this.step + 2*this.acceleration*(totalPath)))/this.acceleration);
			if (framesCount < 0)
			{
				framesCount = ((-1*this.step + Math.sqrt(this.step*this.step + 2*this.acceleration*(totalPath)))/this.acceleration);
			}
		}
		else
		{
			var framesCount = (totalPath/this.step);
		}
		return framesCount;
	}
	
	var instance = this;
	this.defaults = {end: 0, step: 1, acceleration: 1};
};
function artWebEffect_position()
{
	this.renderFrame = function(frame)
	{
		var currentPath = this.step * frame + this.acceleration*frame*frame/2;
		var coefficient = currentPath/this.totalPath;
		
		var currentXPosition = Math.round(this.xSource + (this.xPath*coefficient*this.xDirection));
		var currentYPosition = Math.round(this.ySource + (this.yPath*coefficient*this.yDirection));
		this.element.style.left = currentXPosition+'px';
		this.element.style.top = currentYPosition+'px';
	}
	this.calculateFramesCount = function()
	{
		if (typeof this.parameters.xSource != 'undefined')
		{
			this.xSource = this.parameters.xSource;
		}
		else
		{
			this.xSource = this.element.offsetLeft;
		}
		if (typeof this.parameters.ySource != 'undefined')
		{
			this.ySource = this.parameters.ySource;
		}
		else
		{
			this.ySource = this.element.offsetTop;
		}
		
		if (typeof this.parameters.xTarget != 'undefined')
		{
			this.xTarget = this.parameters.xTarget;
		}
		else
		{
			this.xTarget = this.element.offsetLeft;
		}
		if (typeof this.parameters.yTarget != 'undefined')
		{
			this.yTarget = this.parameters.yTarget;
		}
		else
		{
			this.yTarget = this.element.offsetTop;
		}
		
		this.xDirection = 1;
		if (this.xSource > this.xTarget)
		{
			this.xDirection = -1;
		}
		this.yDirection = 1;
		if (this.ySource > this.yTarget)
		{
			this.yDirection = -1;
		}
		this.step = this.parameters.step;
		this.acceleration = this.parameters.acceleration;
		
		this.xPath = (this.xTarget - this.xSource)*this.xDirection;
		this.yPath = (this.yTarget - this.ySource)*this.yDirection;
		
		this.totalPath = Math.sqrt((this.xPath*this.xPath + this.yPath*this.yPath));
		
		if (this.acceleration > 0)
		{
			var framesCount = ((-1*this.step - Math.sqrt(this.step*this.step + 2*this.acceleration*(this.totalPath)))/this.acceleration);
			if (framesCount < 0)
			{
				framesCount = ((-1*this.step + Math.sqrt(this.step*this.step + 2*this.acceleration*(this.totalPath)))/this.acceleration);
			}
		}
		else
		{
			var framesCount = (this.totalPath/this.step);
		}
		return framesCount;
	}
	
	var instance = this;
	this.opacityType = false;
	this.defaults = {end: 0, step: 0.01};
};
window.eventsManager = new function()
{
	var init = function()
	{
		self.fireEvent = fireEvent_standards;
		self.addHandler = addHandler_standards;
		if (navigator.appName == "Microsoft Internet Explorer")
		{
			if (navigator.appVersion.match(/MSIE ([\d.]+);/))
			{
				var version = navigator.appVersion.match(/MSIE ([\d.]+);/)[1];
				if (version < 9)
				{
					self.fireEvent = fireEvent_ie;
					self.addHandler = addHandler_ie;
				}
				else 
				{
					self.addHandler = addHandler_ie9;
				}
			}
		}
	}
	this.getEventTarget = function(event) 
	{
		var eventElement = null;
		if (event.target)
		{
			eventElement = event.target;
		}
		else if (event.srcElement)
		{
			eventElement = event.srcElement;
		}
		return eventElement;
	}
	var addHandler_ie9 = function(object, event, handler) 
	{
		if (object == null || typeof object != 'object' && typeof object != 'function' || handler == null || typeof handler != 'function')
		{
			return false;
		}
		else
		{
			if (event == 'mousewheel') 
			{
				object.addEventListener('DOMMouseScroll', handler, false);
			}
			object.addEventListener(event, handler, false);
		}
	}
	var addHandler_standards = function(object, event, handler) 
	{
		if (object == null || typeof object != 'object' && typeof object != 'function' || handler == null || typeof handler != 'function')
		{
			return false;
		}
		else
		{
			if (event === 'mouseenter')
			{ 
				object.addEventListener('mouseover', mouseEnter(handler), false); 
			}
			else if (event === 'mouseleave')
			{
				object.addEventListener('mouseout', mouseEnter(handler), false); 
			}
			else if (event === 'mousewheel') 
			{
				object.addEventListener('DOMMouseScroll', handler, false);
			}
			object.addEventListener(event, handler, false);
		}
	}
	var addHandler_ie = function(object, event, handler) 
	{
		if (object == null || typeof object != 'object' && typeof object != 'function' || handler == null || typeof handler != 'function')
		{
			return false;
		}
		else
		{
			if (object.attachEvent) 
			{
				object.attachEvent('on' + event, handler);
			}
			else if (event === 'readystatechange') //this is for Internet Explorer, not supporting attachEvent on XMLHTTPRequest 
			{ 
				object.onreadystatechange = handler;
			}
		}
	}
	var fireEvent_ie = function(object, eventName)
	{
		var eventObject = document.createEventObject();
		return object.fireEvent('on'+eventName, eventObject)
	}
	var fireEvent_standards = function(object, eventName)
	{
		var eventObject = document.createEvent("HTMLEvents");
		eventObject.initEvent(eventName, true, true);
		return !object.dispatchEvent(eventObject);
	}
	this.removeHandler = function(object, event, handler) 
	{
		if (object.removeEventListener) 
		{
			if (event == 'mousewheel') 
			{
				object.removeEventListener('DOMMouseScroll', handler, false);
			}
			object.removeEventListener(event, handler, false);
		}
		else if (object.detachEvent) 
		{
			object.detachEvent('on' + event, handler);
		}
	}
	this.cancelBubbling = function(event)
	{
		event.cancelBubble = true;
		if (event.stopPropagation) 
		{
			event.stopPropagation();
		}
	}
	this.preventDefaultAction = function(event)
	{
		if (event.preventDefault)
		{
			event.preventDefault();
		}
		event.returnValue = false;
	}
	var mouseEnter = function(handler)
	{
		return function(event)
		{
			var relTarget = event.relatedTarget;
			if (this === relTarget || isAChildOf(this, relTarget))
			{
				return; 
			}
			handler.call(this, event);
		}
	}
	var isAChildOf = function(_parent, _child)
	{
		if (_parent === _child) 
		{ 
			return false; 
		}
		while (_child && _child !== _parent)
		{ 
			_child = _child.parentNode; 
		}
		
		return _child === _parent;
	}
	var self = this;
	
	this.addHandler = false;
	this.fireEvent = false;
	
	init();
};
window.mouseTracker = new function()
{
	this.init = function()
	{
		self.captureMouseCoordinates = captureMouseCoordinates_standards;
		if (navigator.appName == "Microsoft Internet Explorer")
		{
			var version = navigator.appVersion.match(/MSIE ([\d.]+);/)[1];
			if (version < 9)
			{
				self.captureMouseCoordinates = captureMouseCoordinates_ie;					
			}
		}
		window.eventsManager.addHandler(document, 'mousemove', this.captureMouseCoordinates);
	}
	var captureMouseCoordinates_standards = function(event)
	{
		var mouseX = event.pageX;
		var mouseY = event.pageY;
		
		if (mouseX < 0)
		{
			mouseX = 0;
		}
		if (mouseY < 0)
		{
			mouseY = 0;
		}
		
		self.mouseX = mouseX;
		self.mouseY = mouseY;
	}
	var captureMouseCoordinates_ie = function(event)
	{
		var mouseX = window.event.clientX + document.documentElement.scrollLeft;
		var mouseY = window.event.clientY + document.documentElement.scrollTop;
		
		if (mouseX < 0)
		{
			mouseX = 0;
		}
		if (mouseY < 0)
		{
			mouseY = 0;
		}
		
		self.mouseX = mouseX;
		self.mouseY = mouseY;
	}
	this.checkMouseOver = function(domElement)
	{
		var currentMouseX = this.mouseX;
		var currentMouseY = this.mouseY;
		
		var elementCoordinates = this.getElementCoordinates(domElement);
		
		var elementX = elementCoordinates[0];
		var elementY = elementCoordinates[1];
		
		var elementWidth = domElement.offsetWidth;
		var elementHeight = domElement.offsetHeight;
		
		var check = false;
		if ((currentMouseX >= elementX) && (currentMouseX < elementX + elementWidth))
		{
			if ((currentMouseY >= elementY) && (currentMouseY < elementY + elementHeight))
			{
				check = true;
			}
		}
		return check;
	}
	this.getDelta = function(event)
	{
		var delta = 0;
		if (event.wheelDelta) 
		{
			delta = event.wheelDelta/120;
		} 
		else if (event.detail) 
		{ 
			delta = -event.detail/3;
		}
		return delta;
	}
	this.getElementCoordinates = function(domElement) 
	{
		var curleft = curtop = 0;
		if (domElement.offsetParent)
		{
			var curleft = domElement.offsetLeft;
			var curtop = domElement.offsetTop;
			while (domElement = domElement.offsetParent) 
			{
				if (domElement.tagName != 'body' && domElement.tagName != 'BODY')
				{
					curleft += domElement.offsetLeft - domElement.scrollLeft;
					curtop += domElement.offsetTop - domElement.scrollTop;
				}
				else
				{
					curleft += domElement.offsetLeft;
					curtop += domElement.offsetTop;
				}
			}
		}
		return {left:curleft,top:curtop};
	}

	
	var self = this;
	this.mouseX = 0;
	this.mouseY = 0;
	this.captureMouseCoordinates = false;
	
	this.init();
}

window.customMouseTracker = function(documentObject)
{
	this.init = function()
	{
		self.captureMouseCoordinates = captureMouseCoordinates_standards;
		if (navigator.appName == "Microsoft Internet Explorer")
		{
			var version = navigator.appVersion.match(/MSIE ([\d.]+);/)[1];
			if (version < 9)
			{
				self.captureMouseCoordinates = captureMouseCoordinates_ie;					
			}
		}
		
		if (documentObject)
		{
			this.documentObject = documentObject;
			if (documentObject.contentWindow)
			{
				eventsManager.addHandler(documentObject.contentWindow.document, 'mousemove', this.captureMouseCoordinates);
			}
			else
			{
				eventsManager.addHandler(documentObject, 'mousemove', this.captureMouseCoordinates);
			}
		}
	}
	var captureMouseCoordinates_standards = function(event)
	{
		var mouseX = event.pageX;
		var mouseY = event.pageY;
		
		if (mouseX < 0)
		{
			mouseX = 0;
		}
		if (mouseY < 0)
		{
			mouseY = 0;
		}
		
		self.mouseX = mouseX;
		self.mouseY = mouseY;
	}
	var captureMouseCoordinates_ie = function(event)
	{
		var mouseX = self.documentObject.contentWindow.event.clientX;
		var mouseY = self.documentObject.contentWindow.event.clientY;
		
		if (mouseX < 0)
		{
			mouseX = 0;
		}
		if (mouseY < 0)
		{
			mouseY = 0;
		}
		
		self.mouseX = mouseX;
		self.mouseY = mouseY;
	}
	
	var self = this;
	this.mouseX = 0;
	this.mouseY = 0;
	this.documentObject = false;
	this.captureMouseCoordinates = false;
	
	this.init();
};
window.opacityHandler = new function()
{
	var detectOpacityType = function()
	{
		if (typeof(document.body.style.opacity) == 'string')
		{
			opacityType = 'opacity';
		}
		else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1] >= 5.5 )
		{
			var version = navigator.appVersion.match(/MSIE ([\d.]+);/)[1];
			if (version >= 8 && version < 9)
			{
				opacityRecursive =  true;
			}
			opacityType =  'filter';
		}
	}
	this.setOpacity = function(element, opacity)
	{
		if (element)
		{
			if (!opacityType)
			{
				detectOpacityType();
			}
			if (opacity < 0)
			{
				opacity = 0;
			}
			if (opacityType == "filter")
			{
				if (element.currentStyle)
				{
					if (element.currentStyle.filter != '' && element.style.filter == '')
					{
						element.style.filter += element.currentStyle.filter;
					}
				}
				
				try
				{
					element.filters.item('DXImageTransform.Microsoft.alpha').opacity = Math.round(opacity*100);
				}
				catch(error)
				{
					element.style.filter += "progid:DXImageTransform.Microsoft.Alpha(style=0, opacity="+ Math.round(opacity*100) +", FinishOpacity="+ Math.round(opacity*100) +")";
				}
			}
			else
			{
				element.style[opacityType] = opacity.toFixed(2);				
			}
		}
		
		if (opacityRecursive)
		{
			for (var i=0; i<element.childNodes.length; i++)
			{
				if (element.childNodes[i].nodeType == '1')
				{
					var position = element.childNodes[i].currentStyle['position'];
					if (position == 'absolute' || position == 'relative')
					{
						self.setOpacity(element.childNodes[i], opacity);
					}
				}
			}
		}
	}
	this.getOpacity = function(element)
	{
		if (!opacityType)
		{
			detectOpacityType();
		}
		if (opacityType == "filter")
		{
			if (element.filters)
			{
				try 
				{
					var opacity = element.filters.item("DXImageTransform.Microsoft.Alpha").opacity / 100;
				}
				catch(error)
				{
					var opacity = 1;
				}
			}
		}
		else if (window.getComputedStyle)
		{
			var opacity = document.defaultView.getComputedStyle(element, null).getPropertyValue(opacityType);
		}
		return parseFloat(opacity);
	}
	var self = this;
	var opacityType = false;
	var opacityRecursive = false;
};
/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
*/
var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();;
(function(){var _=function(selector,root,noCache){if(_.c[selector]&&!noCache&&!root){return _.c[selector]}noCache=noCache||!!root;root=root||_.doc;var sets=[];if(/^[\w[:#.][\w\]*^|=!]*$/.test(selector)){var idx=0;switch(selector.charAt(0)){case"#":idx=selector.slice(1);sets=_.doc.getElementById(idx);if(_.browser.ie&&sets.id!==idx){sets=_.doc.all[idx]}sets=sets?[sets]:[];break;case".":var klass=selector.slice(1);if(_.k){sets=(idx=(sets=root.getElementsByClassName(klass)).length)?sets:[]}else{klass=" "+klass+" ";var nodes=root.getElementsByTagName("*"),i=0,node;while(node=nodes[i++]){if((" "+node.className+" ").indexOf(klass)!=-1){sets[idx++]=node}}sets=idx?sets:[]}break;case":":var node,nodes=root.getElementsByTagName("*"),i=0,ind=selector.replace(/[^(]*\(([^)]*)\)/,"$1"),mod=selector.replace(/\(.*/,"");while(node=nodes[i++]){if(_.mods[mod]&&!_.mods[mod](node,ind)){sets[idx++]=node}}sets=idx?sets:[];break;case"[":var nodes=root.getElementsByTagName("*"),node,i=0,attrs=/\[([^!~^*|$ [:=]+)([$^*|]?=)?([^ :\]]+)?\]/.exec(selector),attr=attrs[1],eql=attrs[2]||"",value=attrs[3];while(node=nodes[i++]){if(_.attr[eql]&&(_.attr[eql](node,attr,value)||(attr==="class"&&_.attr[eql](node,"className",value)))){sets[idx++]=node}}sets=idx?sets:[];break;default:sets=(idx=(sets=root.getElementsByTagName(selector)).length)?sets:[];break}}else{if(_.q&&selector.indexOf("!=")==-1){sets=root.querySelectorAll(selector.replace(/=([^\]]+)/,'="$1"'))}else{var groups=selector.split(/ *, */),gl=groups.length-1,concat=!!gl,group,singles,singles_length,single,i,ancestor,nodes,tag,id,klass,attr,eql,mod,ind,newNodes,idx,J,child,last,childs,item,h;while(group=groups[gl--]){if(!(nodes=_.c[group])||noCache){singles_length=(singles=group.replace(/(\([^)]*)\+/,"$1%").replace(/(\[[^\]]+)~/,"$1&").replace(/(~|>|\+)/," $1 ").split(/ +/)).length;i=0;ancestor=" ";nodes=[root];while(single=singles[i++]){if(single!==" "&&single!==">"&&single!=="~"&&single!=="+"&&nodes){single=single.match(/([^[:.#]+)?(?:#([^[:.#]+))?(?:\.([^[:.]+))?(?:\[([^!&^*|$[:=]+)([!$^*|&]?=)?([^:\]]+)?\])?(?:\:([^(]+)(?:\(([^)]+)\))?)?/);tag=single[1]||"*";id=single[2];klass=single[3]?" "+single[3]+" ":"";attr=single[4];eql=single[5]||"";mod=single[7];ind=mod==="nth-child"||mod==="nth-last-child"?/(?:(-?\d*)n)?(?:(%|-)(\d*))?/.exec(single[8]==="even"&&"2n"||single[8]==="odd"&&"2n%1"||!/\D/.test(single[8])&&"0n%"+single[8]||single[8]):single[8];newNodes=[];idx=J=0;last=i==singles_length;while(child=nodes[J++]){switch(ancestor){case" ":childs=child.getElementsByTagName(tag);h=0;while(item=childs[h++]){if((!id||item.id===id)&&(!klass||(" "+item.className+" ").indexOf(klass)!=-1)&&(!attr||(_.attr[eql]&&(_.attr[eql](item,attr,single[6])||(attr==="class"&&_.attr[eql](item,"className",single[6])))))&&!item.yeasss&&!(_.mods[mod]?_.mods[mod](item,ind):mod)){if(last){item.yeasss=1}newNodes[idx++]=item}}break;case"~":tag=tag.toLowerCase();while((child=child.nextSibling)&&!child.yeasss){if(child.nodeType==1&&(tag==="*"||child.nodeName.toLowerCase()===tag)&&(!id||child.id===id)&&(!klass||(" "+child.className+" ").indexOf(klass)!=-1)&&(!attr||(_.attr[eql]&&(_.attr[eql](item,attr,single[6])||(attr==="class"&&_.attr[eql](item,"className",single[6])))))&&!child.yeasss&&!(_.mods[mod]?_.mods[mod](child,ind):mod)){if(last){child.yeasss=1}newNodes[idx++]=child}}break;case"+":while((child=child.nextSibling)&&child.nodeType!=1){}if(child&&(child.nodeName.toLowerCase()===tag.toLowerCase()||tag==="*")&&(!id||child.id===id)&&(!klass||(" "+item.className+" ").indexOf(klass)!=-1)&&(!attr||(_.attr[eql]&&(_.attr[eql](item,attr,single[6])||(attr==="class"&&_.attr[eql](item,"className",single[6])))))&&!child.yeasss&&!(_.mods[mod]?_.mods[mod](child,ind):mod)){if(last){child.yeasss=1}newNodes[idx++]=child}break;case">":childs=child.getElementsByTagName(tag);i=0;while(item=childs[i++]){if(item.parentNode===child&&(!id||item.id===id)&&(!klass||(" "+item.className+" ").indexOf(klass)!=-1)&&(!attr||(_.attr[eql]&&(_.attr[eql](item,attr,single[6])||(attr==="class"&&_.attr[eql](item,"className",single[6])))))&&!item.yeasss&&!(_.mods[mod]?_.mods[mod](item,ind):mod)){if(last){item.yeasss=1}newNodes[idx++]=item}}break}}nodes=newNodes}else{ancestor=single}}}if(concat){if(!nodes.concat){newNodes=[];h=0;while(item=nodes[h]){newNodes[h++]=item}nodes=newNodes}sets=nodes.concat(sets.length==1?sets[0]:sets)}else{sets=nodes}}idx=sets.length;while(idx--){sets[idx].yeasss=sets[idx].nodeIndex=sets[idx].nodeIndexLast=null}}}return noCache?sets:_.c[selector]=sets};_.c=[];_.doc=document;_.win=window;_.attr={"":function(child,attr){return !!child.getAttribute(attr)},"=":function(child,attr,value){return(attr=child.getAttribute(attr))&&attr===value},"&=":function(child,attr,value){return(attr=child.getAttribute(attr))&&(new RegExp("(^| +)"+value+"($| +)").test(attr))},"^=":function(child,attr,value){return(attr=child.getAttribute(attr)+"")&&!attr.indexOf(value)},"$=":function(child,attr,value){return(attr=child.getAttribute(attr)+"")&&attr.indexOf(value)==attr.length-value.length},"*=":function(child,attr,value){return(attr=child.getAttribute(attr)+"")&&attr.indexOf(value)!=-1},"|=":function(child,attr,value){return(attr=child.getAttribute(attr)+"")&&(attr===value||!!attr.indexOf(value+"-"))},"!=":function(child,attr,value){return !(attr=child.getAttribute(attr))||!(new RegExp("(^| +)"+value+"($| +)").test(attr))}};_.mods={"first-child":function(child){return child.parentNode.getElementsByTagName("*")[0]!==child},"last-child":function(child){var brother=child;while((brother=brother.nextSibling)&&brother.nodeType!=1){}return !!brother},root:function(child){return child.nodeName.toLowerCase()!=="html"},"nth-child":function(child,ind){var i=child.nodeIndex||0,a=ind[3]=ind[3]?(ind[2]==="%"?-1:1)*ind[3]:0,b=ind[1];if(i){return !((i+a)%b)}else{var brother=child.parentNode.firstChild;i++;do{if(brother.nodeType==1&&(brother.nodeIndex=++i)&&child===brother&&((i+a)%b)){return 0}}while(brother=brother.nextSibling);return 1}},"nth-last-child":function(child,ind){var i=child.nodeIndexLast||0,a=ind[3]?(ind[2]==="%"?-1:1)*ind[3]:0,b=ind[1];if(i){return !((i+a)%b)}else{var brother=child.parentNode.lastChild;i++;do{if(brother.nodeType==1&&(brother.nodeLastIndex=i++)&&child===brother&&((i+a)%b)){return 0}}while(brother=brother.previousSibling);return 1}},empty:function(child){return !!child.firstChild},parent:function(child){return !child.firstChild},"only-child":function(child){return child.parentNode.getElementsByTagName("*").length!=1},checked:function(child){return !child.checked},lang:function(child,ind){return child.lang!==ind&&_.doc.documentElement.lang!==ind},enabled:function(child){return child.disabled||child.type==="hidden"},disabled:function(child){return !child.disabled},selected:function(elem){child.parentNode.selectedIndex;return !child.selected}};_.isReady=0;_.ready=function(fn){if(typeof fn==="function"){if(!_.isReady){_.ready.list[_.ready.list.length]=fn}else{fn()}}else{if(!_.isReady){_.isReady=1;var idx=_.ready.list.length;while(idx--){_.ready.list[idx]()}}}};_.ready.list=[];_.bind=function(element,event,fn){if(typeof element==="string"){var elements=_(element),idx=0;while(element=elements[idx++]){_.bind(element,event,fn)}}else{event="on"+event;var handler=element[event];if(handler){element[event]=function(){handler();fn()}}else{element[event]=fn}}};_.ua=navigator.userAgent.toLowerCase();_.k=!!_.doc.getElementsByClassName;_.browser={safari:_.ua.indexOf("webkit")!=-1,opera:_.ua.indexOf("opera")!=-1,ie:_.ua.indexOf("msie")!=-1&&_.ua.indexOf("opera")==-1,mozilla:_.ua.indexOf("mozilla")!=-1&&(_.ua.indexOf("compatible")+_.ua.indexOf("webkit")==-2)};_.q=!!_.doc.querySelectorAll&&!_.browser.ie&&!_.browser.opera;if(_.doc.addEventListener&&!_.browser.opera){_.doc.addEventListener("DOMContentLoaded",_.ready,false)}if(_.browser.ie&&_.win==top){(function(){if(_.isReady){return}try{_.doc.documentElement.doScroll("left")}catch(e){setTimeout(arguments.callee);return}_.ready()})()}if(_.browser.opera){_.doc.addEventListener("DOMContentLoaded",function(){if(_.isReady){return}var i=0,ss;while(ss=_.doc.styleSheets[i++]){if(ss.disabled){setTimeout(arguments.callee);return}}_.ready()},false)}if(_.browser.safari){(function(){if(_.isReady){return}if((_.doc.readyState!=="loaded"&&_.doc.readyState!=="complete")||_.doc.styleSheets.length!==_("style,link[rel=stylesheet]").length){setTimeout(arguments.callee);return}_.ready()})()}_.bind(_.win,"load",_.ready);_.modules={yass:[]};_.load=function(aliases,text){var loader=function(alias,text,tries,aliases){if(!(tries%100)&&_.modules[alias].status<2){_("head")[0].removeChild(_("script[title="+alias+"]")[0]);_.modules[alias].status=0;if(!(tries-=1000)){_.modules[alias].status=-1;return}}switch(_.modules[alias].status){case 2:try{eval(text)}catch(a){}case 3:case -2:break;default:_.modules[alias].status=1;var script=_.doc.createElement("script");script.src=alias.indexOf(".js")+alias.indexOf("/")!=-2?alias:_.base+"yass."+alias+".js";script.type="text/javascript";script.text=text||"";script.title=alias;script.onreadystatechange=function(){if(this.readyState==="complete"){_.postloader(this)}};script.onload=function(e){_.postloader(e.srcElement||e.target)};_("head")[0].appendChild(script);case 1:setTimeout(function(){loader(alias,text,--tries,aliases)},100);break}},idx=0,alias,a;aliases=aliases.split("#");_.base=_.base||_("script[src*=yass.]")[0].src.replace(/yass[^\/]*\.js$/,"");while(alias=aliases[idx++]){if(!_.modules[alias]){_.modules[alias]={};_.modules.yass[_.modules.yass.length]=alias}_.modules[alias].deps=_.modules[alias].deps||{yass:[]};_.modules[alias].notloaded=_.modules[alias].notloaded||0;if((a=aliases[idx-2])&&a!==alias&&!_.modules[alias].deps[a]){_.modules[alias].deps[a]=1;_.modules[alias].deps.yass[_.modules[alias].deps.yass.length]=a;_.modules[alias].notloaded++}if(!_.modules[alias].status&&!(_.modules[alias].status-=2)){_.modules[alias].status=0;loader(alias,text,11999,aliases)}}};_.postloader=function(e){if(_.browser.opera){try{eval(e.innerHTML)}catch(a){}}var module=_.modules[e.title],aliases=module.deps.yass,idx=aliases.length-1;module.status=3;while(aliases[idx]&&_.modules[aliases[idx]].status==2&&idx--){}if(idx>-1){return}module.status=2;if(module.init){module.init()}var modules=_.modules.yass,recursive=function(title){var dep,alias,idx=0;while(alias=modules[idx++]){dep=_.modules[alias];if(dep.deps[title]&&!(--dep.notloaded)&&dep.status==3){dep.status=2;if(dep.init){dep.init()}recursive(alias)}}};recursive(e.title)};_.win._=_.win._||(_.win.yass=_)})();_.ready(function(){var c=_("[class^=yass-module-]"),d,b=c.length,a=0;while(a<b){d=c[a++];_.load(d.className.slice(d.className.indexOf("yass-module-")+12),d.title);d.title=null}});
;
window.controller = new function()
{
	var init = function()
	{
		try
		{
			document.execCommand("BackgroundImageCache", false, true);
		}
		catch(err){};

		eventsManager.addHandler(window, "load", onloadHandler);
		eventsManager.addHandler(window, "DOMContentLoaded", domLoadedHandler);
	}
	var domLoadedHandler = function()
	{
		domLoaded = true;
		self.fireEvent('initLogics');
		self.fireEvent('initDom');
		self.fireEvent('startApplication');
	}
	var onloadHandler = function()
	{
		if (!domLoaded)
		{
			self.fireEvent('initLogics');
			self.fireEvent('initDom');
			self.fireEvent('startApplication');
		}
		self.fireEvent('DOMContentReady');
	}
	this.addListener = function(eventName, listener)
	{
		var listenerExists = false;
		if (!eventsIndex[eventName])
		{
			eventsIndex[eventName] = new Array();
		}

		for (var i=0; i<eventsIndex[eventName].length; i++)
		{
			if (eventsIndex[eventName][i] == listener)
			{
				listenerExists = true;
			}
		}

		if (!listenerExists)
		{
			eventsIndex[eventName].push(listener);
		}
	}
	this.fireEvent = function(eventName, argument)
	{
		if (typeof argument == 'undefined')
		{
			var argument = false;
		}
		if (eventsIndex[eventName])
		{
			for (var i=0; i<eventsIndex[eventName].length; i++)
			{
				if (typeof eventsIndex[eventName][i] == 'function')
				{
					eventsIndex[eventName][i](argument);
				}
			}
		}
	}
	this.removeListener = function(eventName, listener)
	{
		if (eventsIndex[eventName])
		{
			for (var i=0; i<eventsIndex[eventName].length; i++)
			{
				if (eventsIndex[eventName][i] == listener)
				{
					eventsIndex[eventName].splice(i, 1);
				}
			}
		}
	}

	var self = this;
	var domLoaded = false;
	var eventsIndex = {};

	init();
};
function XMLRequest(requestURL, callback, requestParameters)
{
	this.send = function()
	{
		if (requestURL)
		{
			var parameters = {};
			
			parameters['requestURL'] = requestURL;
			parameters['successCallBack'] = successCallBack;
			parameters['failCallBack'] = failCallBack;
			parameters['requestXML'] = true;
			parameters['requestType'] = 'POST';
			parameters['postParameters'] = requestParameters;
			
			ajaxManager.makeRequest(parameters);
		}
	}
	var successCallBack = function(responseXML)
	{
		var responseStatus = 'invalid';
		var responseDataXML = false;
		if (responseXML !== null && typeof responseXML == 'object')
		{
			if (typeof responseXML.documentElement == 'object')
			{
				if (typeof responseXML.documentElement.childNodes != 'undefined')
				{
					for (var i = 0; i < responseXML.documentElement.childNodes.length; i++)
					{
						var node = responseXML.documentElement.childNodes[i];
						
						if (node.tagName == 'responseStatus')
						{
							responseStatus = getTextContent(node);
						}
						else if (node.tagName == 'responseData')
						{
							responseDataXML = node;
						}
					}
				}
			}
		}
		var parsedData = false;
		if (responseDataXML)
		{
			parsedData = parseXMLData(responseDataXML);
		}
		deliverResponse(responseStatus, parsedData);
	}
	var failCallBack = function()
	{
		responseStatus = 'invalid';
		var parsedData = {};
		deliverResponse(responseStatus, parsedData);
	}
	var deliverResponse = function(responseStatus, parsedData)
	{
		if (typeof callback == 'function')
		{
			callback(responseStatus, parsedData);
		}
	}
	var parseXMLData = function(xmlNode)
	{
		var data = {};
		if (xmlNode.childNodes)
		{
			for (var i=0; i< xmlNode.childNodes.length; i++)
			{
				var node = xmlNode.childNodes[i];
				if (node.nodeType && node.nodeType == '1')
				{
					var nodeRole = getNodeRole(node);
					if (nodeRole == 'node')
					{
						data[node.tagName] = parseXMLData(node);
					}
					if (nodeRole == 'attribute')
					{
						data[node.tagName] = getTextContent(node);
					}
					else if (nodeRole == 'list')
					{
						data[node.tagName] = new Array();
						if (node.childNodes)
						{
							for (var x=0; x<node.childNodes.length; x++)
							{
								var subNode = node.childNodes[x];
								if (subNode.nodeType && subNode.nodeType == '1')
								{
									data[node.tagName].push(parseXMLData(subNode));
								}
							}
						}
					}
				}
			}
		}
		for (var i = 0; i < xmlNode.attributes.length; i++)
		{
			var attribute = xmlNode.attributes[i];
			data[attribute.nodeName] = attribute.nodeValue;
		}
		return data;
	}
	var getNodeRole = function(node)
	{
		var role = (node.getAttribute('role'));
		if (!role)
		{
			role = 'node';
		}
		return role;
	}
	var getTextContent = function(node)
	{
		var content = '';
		if (node.textContent)
		{
			content = node.textContent;
		}
		else if (node.text)
		{
			content = node.text;
		}
		return content;
	}
	var self = this;
	
	var responseType = false;
	var responseStatus = false;
};
window.storageInterface = new function()
{
	this.setValue = function(name, value)
	{
		storageCacheObject[name] = value;
		saveStorage();
	}
	this.getValue = function(name)
	{
		var value = false;
		if (typeof storageCacheObject[name] != 'undefined')
		{
			value = storageCacheObject[name];
		}
		return value;
	}
	
	var init = function()
	{
		if(typeof window.localStorage != 'undefined')
		{
			try 
			{
				if(window.localStorage) 
				{
					storageType = 'localStorage';
				}
			} 
			catch(e) {}
		}
		else 
		{
			domElement = document.createElement('link');
			if(domElement.addBehavior)
			{
				domElement.style.behavior = 'url(#default#userData)';
				document.getElementsByTagName('head')[0].appendChild(domElement);

				storageType = 'userData';
			}
			else
			{
				domElement = null;
				return;
			}
		}
		
		loadStorage();
	}
    
	var loadStorage = function()
	{
		var storageString = false;
		if (storageType == 'userData')
		{
			try
			{
				domElement.load("storageInterfaceData");
				if (domElement.getAttribute("storageString"))
				{
					storageString = domElement.getAttribute("storageString");
				}
			}
			catch(e){}
		}
		else if (storageType == 'localStorage')
		{
			storageString = window.localStorage.getItem("storageString");
		}
		if (storageString)
		{
			try
			{
				storageCacheObject = json_decode(String(storageString));
			}
			catch(e) {};		
		}
		if (!storageCacheObject)
		{
			storageCacheObject = {};
		}
	}
	var saveStorage = function()
	{
		
		try
		{
			var storageString = json_encode(storageCacheObject);
			
			if (storageType == 'userData')
			{
				domElement.setAttribute("storageString", storageString);
				domElement.save("storageInterfaceData");
			}
			else if (storageType == 'localStorage')
			{
				window.localStorage.setItem("storageString", storageString);
			}
		}
		catch(e){};
	}
	var json_encode = Object.toJSON || (window.JSON && (JSON.encode || JSON.stringify));
        var json_decode = (window.JSON && (JSON.decode || JSON.parse)) || function(str){
            return String(str).evalJSON();
        };
	
	var self = this;
	
	var storageCacheObject = {};
	var domElement = null;
	var storageService = null;
	var storageType = null;
	
	init();
};
window.anchorParameters = new function()
{
	this.initHandler = function()
	{
		if (navigator.appName == "Microsoft Internet Explorer")
		{
			if (navigator.appVersion.match(/MSIE ([\d.]+);/))
			{
				var version = navigator.appVersion.match(/MSIE ([\d.]+);/)[1];
				if (version < 9)
				{
					self.createHiddenIframe();
				}
			}
		}
		self.detectBaseURL();
	};
	this.startHandler = function()
	{
		window.setInterval(self.checkParametersChange, self.checkInterval);
	};
	this.detectBaseURL = function()
	{
		var hrefString = document.location.href;
		if (hrefString.search('#') != '-1')
		{
			var hashStrings = hrefString.split('#');
			hrefString = hashStrings[0];
		}
		self.baseURL = hrefString;
	};
	this.createHiddenIframe = function()
	{
		var element = document.createElement('iframe');
		element.setAttribute('src', self.hiddenIframeSrc);
		element.style.display = 'none';

		document.body.appendChild(element);

		self.hiddenIframe = element;
	};
	this.checkParametersChange = function()
	{
		if (self.olderHref != document.location.href)
		{
			self.olderHref = document.location.href;
			self.handleHrefChange();
		}
	};
	this.handleHrefChange = function()
	{
		var hrefString = document.location.href;
		var parametersString = '';
		if (hrefString.search('#') != '-1')
		{
			var hashStrings = hrefString.split('#');
			parametersString = hashStrings[hashStrings.length-1];
		}

		if (this.hiddenIframe)
		{
			this.hiddenIframe.src = this.hiddenIframeSrc+'?'+parametersString;
		}
		else
		{
			self.parseHashParameters(parametersString);
		}
	};
	this.handleIframeChange = function(iframeLocation)
	{
		var parametersString = '';
		if (iframeLocation.search("\\?") != '-1')
		{
			var hashStrings = iframeLocation.split('?');
			parametersString = hashStrings[hashStrings.length-1];
		}
		if (document.location.hash != '#'+parametersString)
		{
			self.navigate(parametersString);
		}
		else
		{
			self.parseHashParameters(parametersString);
		}
	};
	this.parseHashParameters = function(parametersString)
	{
		parameters = {};
		var pairsList = parametersString.split(this.pairsDelimiter);
		for(var i=0; i<pairsList.length;i++)
		{
			var words = pairsList[i].split(this.valueDelimiter);
			if (words.length == 2)
			{
				var name = words[0];
				var value = false;
				if (words[1])
				{
					value = decodeURIComponent(words[1]);
				}
				parameters[name] = value;
			}
		}
		controller.fireEvent('anchorParametersUpdate', parameters);
	};
	this.getParameter = function(name)
	{
		var result = false;
		if (parameters[name])
		{
			result = parameters[name];
		}
		return result;
	};
	var self = this;
	var parameters = {};

	this.hiddenIframe = false;
	this.hiddenIframeSrc = '/js/empty.html';
	this.baseURL = false;
	this.olderHref = '';
	this.pairsDelimiter = '&';
	this.valueDelimiter = '=';
	this.checkInterval = 200;
	controller.addListener("initLogics", this.initHandler);
	controller.addListener("startApplication", this.startHandler);
};;
// ┌─────────────────────────────────────────────────────────────────────┐ \\
// │ Raphaël 2.0.1 - JavaScript Vector Library                           │ \\
// ├─────────────────────────────────────────────────────────────────────┤ \\
// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com)   │ \\
// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com)             │ \\
// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\
// └─────────────────────────────────────────────────────────────────────┘ \\
(function(a){var b="0.4.0",c="hasOwnProperty",d=/[\.\/]/,e="*",f=function(){},g=function(a,b){return a-b},h,i,j={n:{}},k=function(a,b){var c=j,d=i,e=Array.prototype.slice.call(arguments,2),f=k.listeners(a),l=0,m=!1,n,o=[],p={},q=[],r=[];h=a,i=0;for(var s=0,t=f.length;s<t;s++)"zIndex"in f[s]&&(o.push(f[s].zIndex),f[s].zIndex<0&&(p[f[s].zIndex]=f[s]));o.sort(g);while(o[l]<0){n=p[o[l++]],q.push(n.apply(b,e));if(i){i=d;return q}}for(s=0;s<t;s++){n=f[s];if("zIndex"in n)if(n.zIndex==o[l]){q.push(n.apply(b,e));if(i){i=d;return q}do{l++,n=p[o[l]],n&&q.push(n.apply(b,e));if(i){i=d;return q}}while(n)}else p[n.zIndex]=n;else{q.push(n.apply(b,e));if(i){i=d;return q}}}i=d;return q.length?q:null};k.listeners=function(a){var b=a.split(d),c=j,f,g,h,i,k,l,m,n,o=[c],p=[];for(i=0,k=b.length;i<k;i++){n=[];for(l=0,m=o.length;l<m;l++){c=o[l].n,g=[c[b[i]],c[e]],h=2;while(h--)f=g[h],f&&(n.push(f),p=p.concat(f.f||[]))}o=n}return p},k.on=function(a,b){var c=a.split(d),e=j;for(var g=0,h=c.length;g<h;g++)e=e.n,!e[c[g]]&&(e[c[g]]={n:{}}),e=e[c[g]];e.f=e.f||[];for(g=0,h=e.f.length;g<h;g++)if(e.f[g]==b)return f;e.f.push(b);return function(a){+a==+a&&(b.zIndex=+a)}},k.stop=function(){i=1},k.nt=function(a){if(a)return(new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)")).test(h);return h},k.unbind=function(a,b){var f=a.split(d),g,h,i,k,l,m,n,o=[j];for(k=0,l=f.length;k<l;k++)for(m=0;m<o.length;m+=i.length-2){i=[m,1],g=o[m].n;if(f[k]!=e)g[f[k]]&&i.push(g[f[k]]);else for(h in g)g[c](h)&&i.push(g[h]);o.splice.apply(o,i)}for(k=0,l=o.length;k<l;k++){g=o[k];while(g.n){if(b){if(g.f){for(m=0,n=g.f.length;m<n;m++)if(g.f[m]==b){g.f.splice(m,1);break}!g.f.length&&delete g.f}for(h in g.n)if(g.n[c](h)&&g.n[h].f){var p=g.n[h].f;for(m=0,n=p.length;m<n;m++)if(p[m]==b){p.splice(m,1);break}!p.length&&delete g.n[h].f}}else{delete g.f;for(h in g.n)g.n[c](h)&&g.n[h].f&&delete g.n[h].f}g=g.n}}},k.once=function(a,b){var c=function(){b.apply(this,arguments),k.unbind(a,c)};return k.on(a,c)},k.version=b,k.toString=function(){return"You are running Eve "+b},typeof module!="undefined"&&module.exports?module.exports=k:a.eve=k})(this),function(){function cr(b,d,e,f,h,i){e=Q(e);var j,k,l,m=[],o,p,q,t=b.ms,u={},v={},w={};if(f)for(y=0,z=cl.length;y<z;y++){var x=cl[y];if(x.el.id==d.id&&x.anim==b){x.percent!=e?(cl.splice(y,1),l=1):k=x,d.attr(x.totalOrigin);break}}else f=+v;for(var y=0,z=b.percents.length;y<z;y++){if(b.percents[y]==e||b.percents[y]>f*b.top){e=b.percents[y],p=b.percents[y-1]||0,t=t/b.top*(e-p),o=b.percents[y+1],j=b.anim[e];break}f&&d.attr(b.anim[b.percents[y]])}if(!!j){if(!k){for(var A in j)if(j[g](A))if(U[g](A)||d.paper.customAttributes[g](A)){u[A]=d.attr(A),u[A]==null&&(u[A]=T[A]),v[A]=j[A];switch(U[A]){case C:w[A]=(v[A]-u[A])/t;break;case"colour":u[A]=a.getRGB(u[A]);var B=a.getRGB(v[A]);w[A]={r:(B.r-u[A].r)/t,g:(B.g-u[A].g)/t,b:(B.b-u[A].b)/t};break;case"path":var D=bG(u[A],v[A]),E=D[1];u[A]=D[0],w[A]=[];for(y=0,z=u[A].length;y<z;y++){w[A][y]=[0];for(var F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(E[y][F]-u[A][y][F])/t}break;case"transform":var H=d._,I=bP(H[A],v[A]);if(I){u[A]=I.from,v[A]=I.to,w[A]=[],w[A].real=!0;for(y=0,z=u[A].length;y<z;y++){w[A][y]=[u[A][y][0]];for(F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(v[A][y][F]-u[A][y][F])/t}}else{var J=d.matrix||new bQ,K={_:{transform:H.transform},getBBox:function(){return d.getBBox(1)}};u[A]=[J.a,J.b,J.c,J.d,J.e,J.f],bN(K,v[A]),v[A]=K._.transform,w[A]=[(K.matrix.a-J.a)/t,(K.matrix.b-J.b)/t,(K.matrix.c-J.c)/t,(K.matrix.d-J.d)/t,(K.matrix.e-J.e)/t,(K.matrix.e-J.f)/t]}break;case"csv":var L=r(j[A])[s](c),M=r(u[A])[s](c);if(A=="clip-rect"){u[A]=M,w[A]=[],y=M.length;while(y--)w[A][y]=(L[y]-u[A][y])/t}v[A]=L;break;default:L=[][n](j[A]),M=[][n](u[A]),w[A]=[],y=d.paper.customAttributes[A].length;while(y--)w[A][y]=((L[y]||0)-(M[y]||0))/t}}var O=j.easing,P=a.easing_formulas[O];if(!P){P=r(O).match(N);if(P&&P.length==5){var R=P;P=function(a){return cp(a,+R[1],+R[2],+R[3],+R[4],t)}}else P=be}q=j.start||b.start||+(new Date),x={anim:b,percent:e,timestamp:q,start:q+(b.del||0),status:0,initstatus:f||0,stop:!1,ms:t,easing:P,from:u,diff:w,to:v,el:d,callback:j.callback,prev:p,next:o,repeat:i||b.times,origin:d.attr(),totalOrigin:h},cl.push(x);if(f&&!k&&!l){x.stop=!0,x.start=new Date-t*f;if(cl.length==1)return cn()}l&&(x.start=new Date-x.ms*f),cl.length==1&&cm(cn)}else k.initstatus=f,k.start=new Date-k.ms*f;eve("anim.start."+d.id,d,b)}}function cq(a,b){var c=[],d={};this.ms=b,this.times=1;if(a){for(var e in a)a[g](e)&&(d[Q(e)]=a[e],c.push(Q(e)));c.sort(bc)}this.anim=d,this.top=c[c.length-1],this.percents=c}function cp(a,b,c,d,e,f){function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(z(f)<b)return e;j=(3*i*e+2*h)*e+g;if(z(j)<1e-6)break;e=e-f/j}c=0,d=1,e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(z(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cd(){return this.x+q+this.y+q+this.width+" × "+this.height}function cc(){return this.x+q+this.y}function bQ(a,b,c,d,e,f){a!=null?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function bw(a){var b=[];for(var c=0,d=a.length;d-2>c;c+=2){var e=[{x:+a[c],y:+a[c+1]},{x:+a[c],y:+a[c+1]},{x:+a[c+2],y:+a[c+3]},{x:+a[c+4],y:+a[c+5]}];d-4==c?(e[0]={x:+a[c-2],y:+a[c-1]},e[3]=e[2]):c&&(e[0]={x:+a[c-2],y:+a[c-1]}),b.push(["C",(-e[0].x+6*e[1].x+e[2].x)/6,(-e[0].y+6*e[1].y+e[2].y)/6,(e[1].x+6*e[2].x-e[3].x)/6,(e[1].y+6*e[2].y-e[3].y)/6,e[2].x,e[2].y])}return b}function bv(){return this.hex}function bt(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[g](f)){bs(i,f);return c?c(h[f]):h[f]}i.length>=1e3&&delete h[i.shift()],i.push(f),h[f]=a[m](b,e);return c?c(h[f]):h[f]}return d}function bs(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function a(c){if(a.is(c,"function"))return b?c():eve.on("DOMload",c);if(a.is(c,E))return a._engine.create[m](a,c.splice(0,3+a.is(c[0],C))).add(c);var d=Array.prototype.slice.call(arguments,0);if(a.is(d[d.length-1],"function")){var e=d.pop();return b?e.call(a._engine.create[m](a,d)):eve.on("DOMload",function(){e.call(a._engine.create[m](a,d))})}return a._engine.create[m](a,arguments)}a.version="2.0.1",a.eve=eve;var b,c=/[, ]+/,d={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},e=/\{(\d+)\}/g,f="prototype",g="hasOwnProperty",h={doc:document,win:window},i={was:Object.prototype[g].call(h.win,"Raphael"),is:h.win.Raphael},j=function(){this.ca=this.customAttributes={}},k,l="appendChild",m="apply",n="concat",o="createTouch"in h.doc,p="",q=" ",r=String,s="split",t="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[s](q),u={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},v=r.prototype.toLowerCase,w=Math,x=w.max,y=w.min,z=w.abs,A=w.pow,B=w.PI,C="number",D="string",E="array",F="toString",G="fill",H=Object.prototype.toString,I={},J="push",K=a._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,L=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,M={NaN:1,Infinity:1,"-Infinity":1},N=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,O=w.round,P="setAttribute",Q=parseFloat,R=parseInt,S=r.prototype.toUpperCase,T=a._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},U=a._availableAnimAttrs={blur:C,"clip-rect":"csv",cx:C,cy:C,fill:"colour","fill-opacity":C,"font-size":C,height:C,opacity:C,path:"path",r:C,rx:C,ry:C,stroke:"colour","stroke-opacity":C,"stroke-width":C,transform:"transform",width:C,x:C,y:C},V=/\s*,\s*/,W={hs:1,rg:1},X=/,?([achlmqrstvxz]),?/gi,Y=/([achlmrqstvz])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?\s*,?\s*)+)/ig,Z=/([rstm])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?\s*,?\s*)+)/ig,$=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)\s*,?\s*/ig,_=a._radial_gradient=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,ba={},bb=function(a,b){return a.key-b.key},bc=function(a,b){return Q(a)-Q(b)},bd=function(){},be=function(a){return a},bf=a._rectPath=function(a,b,c,d,e){if(e)return[["M",a+e,b],["l",c-e*2,0],["a",e,e,0,0,1,e,e],["l",0,d-e*2],["a",e,e,0,0,1,-e,e],["l",e*2-c,0],["a",e,e,0,0,1,-e,-e],["l",0,e*2-d],["a",e,e,0,0,1,e,-e],["z"]];return[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},bg=function(a,b,c,d){d==null&&(d=c);return[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},bh=a._getPath={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return bg(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return bg(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return bf(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return bf(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return bf(b.x,b.y,b.width,b.height)}},bi=a.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;a=bG(a);for(e=0,g=a.length;e<g;e++){i=a[e];for(f=1,h=i.length;f<h;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d}return a};a._g=h,a.type=h.win.SVGAngle||h.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bj=h.doc.createElement("div"),bk;bj.innerHTML='<v:shape adj="1"/>',bk=bj.firstChild,bk.style.behavior="url(#default#VML)";if(!bk||typeof bk.adj!="object")return a.type=p;bj=null}a.svg=!(a.vml=a.type=="VML"),a._Paper=j,a.fn=k=j.prototype=a.prototype,a._id=0,a._oid=0,a.is=function(a,b){b=v.call(b);if(b=="finite")return!M[g](+a);if(b=="array")return a instanceof Array;return b=="null"&&a===null||b==typeof a&&a!==null||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||H.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+w.atan2(-i,-h)*180/B+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*B/180},a.deg=function(a){return a*180/B%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,E)){var e=b.length;while(e--)if(z(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};var bl=a.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=w.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){eve("setWindow",a,h.win,b),h.win=b,h.doc=h.win.document,a._engine.initWin&&a._engine.initWin(h.win)};var bm=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),d=e.body}catch(f){d=createPopup().document.body}var g=d.createTextRange();bm=bt(function(a){try{d.style.color=r(a).replace(c,p);var b=g.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=h.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",h.doc.body.appendChild(i),bm=bt(function(a){i.style.color=a;return h.doc.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bm(b)},bn=function(){return"hsb("+[this.h,this.s,this.b]+")"},bo=function(){return"hsl("+[this.h,this.s,this.l]+")"},bp=function(){return this.hex},bq=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,D)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},br=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:bp};a.is(e,"finite")&&(f.opacity=e);return f};a.color=function(b){var c;a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b?(c=a.hsb2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b?(c=a.hsl2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):(a.is(b,"string")&&(b=a.getRGB(b)),a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b?(c=a.rgb2hsl(b),b.h=c.h,b.s=c.s,b.l=c.l,c=a.rgb2hsb(b),b.v=c.b):(b={hex:"none"},b.r=b.g=b.b=b.h=b.s=b.v=b.l=-1)),b.toString=bp;return b},a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-z(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return br(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-z(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return br(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bq(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=x(a,b,c),g=f-y(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bn}},a.rgb2hsl=function(a,b,c){c=bq(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=x(a,b,c),h=y(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bo}},a._path2string=function(){return this.join(",").replace(X,"$1")};var bu=a._preload=function(a,b){var c=h.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,h.doc.body.removeChild(this)},c.onerror=function(){h.doc.body.removeChild(this)},h.doc.body.appendChild(c),c.src=a};a.getRGB=bt(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bv};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none",toString:bv};!W[g](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bm(b));var c,d,e,f,h,i,j,k=b.match(L);if(k){k[2]&&(f=R(k[2].substring(5),16),e=R(k[2].substring(3,5),16),d=R(k[2].substring(1,3),16)),k[3]&&(f=R((i=k[3].charAt(3))+i,16),e=R((i=k[3].charAt(2))+i,16),d=R((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4][s](V),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5][s](V),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,f,h)}if(k[6]){j=k[6][s](V),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,f,h)}k={r:d,g:e,b:f,toString:bv},k.hex="#"+(16777216|f|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bv}},a),a.hsb=bt(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=bt(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=bt(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=bt(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=by(b)),d.length||r(b).replace(Y,function(a,b,e){var f=[],g=b.toLowerCase();e.replace($,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(d.push([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");if(g=="r")d.push([b][n](f));else while(f.length>=c[g]){d.push([b][n](f.splice(0,c[g])));if(!c[g])break}}),d.toString=a._path2string;return d}),a.parseTransformString=bt(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=by(b)),d.length||r(b).replace(Z,function(a,b,c){var e=[],f=v.call(b);c.replace($,function(a,b){b&&e.push(+b)}),d.push([b][n](e))}),d.toString=a._path2string;return d}),a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=A(j,3),l=A(j,2),m=i*i,n=m*i,o=k*a+l*3*i*c+j*3*i*i*e+n*g,p=k*b+l*3*i*d+j*3*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,x=j*e+i*g,y=j*f+i*h,z=90-w.atan2(q-s,r-t)*180/B;(q>s||r<t)&&(z+=180);return{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:x,y:y},alpha:z}},a._removedFactory=function(a){return function(){throw new Error("Raphaël: you are calling to method “"+a+"” of removed object")}};var bx=bt(function(a){if(!a)return{x:0,y:0,width:0,height:0};a=bG(a);var b=0,c=0,d=[],e=[],f;for(var g=0,h=a.length;g<h;g++){f=a[g];if(f[0]=="M")b=f[1],c=f[2],d.push(b),e.push(c);else{var i=bF(b,c,f[1],f[2],f[3],f[4],f[5],f[6]);d=d[n](i.min.x,i.max.x),e=e[n](i.min.y,i.max.y),b=f[5],c=f[6]}}var j=y[m](0,d),k=y[m](0,e);return{x:j,y:k,width:x[m](0,d)-j,height:x[m](0,e)-k}},null,function(a){return{x:a.x,y:a.y,width:a.width,height:a.height}}),by=function(b){var c=[];if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);for(var d=0,e=b.length;d<e;d++){c[d]=[];for(var f=0,g=b[d].length;f<g;f++)c[d][f]=b[d][f]}c.toString=a._path2string;return c},bz=a._pathToRelative=bt(function(b){if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=b[0][1],e=b[0][2],f=d,g=e,h++,c.push(["M",d,e]));for(var i=h,j=b.length;i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=v.call(l[0])){k[0]=v.call(l[0]);switch(k[0]){case"a":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]-d).toFixed(3),k[7]=+(l[7]-e).toFixed(3);break;case"v":k[1]=+(l[1]-e).toFixed(3);break;case"m":f=l[1],g=l[2];default:for(var m=1,n=l.length;m<n;m++)k[m]=+(l[m]-(m%2?d:e)).toFixed(3)}}else{k=c[i]=[],l[0]=="m"&&(f=l[1]+d,g=l[2]+e);for(var o=0,p=l.length;o<p;o++)c[i][o]=l[o]}var q=c[i].length;switch(c[i][0]){case"z":d=f,e=g;break;case"h":d+=+c[i][q-1];break;case"v":e+=+c[i][q-1];break;default:d+=+c[i][q-2],e+=+c[i][q-1]}}c.toString=a._path2string;return c},0,by),bA=a._pathToAbsolute=bt(function(b){if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);if(!b||!b.length)return[["M",0,0]];var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=+b[0][1],e=+b[0][2],f=d,g=e,h++,c[0]=["M",d,e]);for(var i,j,k=h,l=b.length;k<l;k++){c.push(i=[]),j=b[k];if(j[0]!=S.call(j[0])){i[0]=S.call(j[0]);switch(i[0]){case"A":i[1]=j[1],i[2]=j[2],i[3]=j[3],i[4]=j[4],i[5]=j[5],i[6]=+(j[6]+d),i[7]=+(j[7]+e);break;case"V":i[1]=+j[1]+e;break;case"H":i[1]=+j[1]+d;break;case"R":var m=[d,e][n](j.slice(1));for(var o=2,p=m.length;o<p;o++)m[o]=+m[o]+d,m[++o]=+m[o]+e;c.pop(),c=c[n](bw(m));break;case"M":f=+j[1]+d,g=+j[2]+e;default:for(o=1,p=j.length;o<p;o++)i[o]=+j[o]+(o%2?d:e)}}else if(j[0]=="R")m=[d,e][n](j.slice(1)),c.pop(),c=c[n](bw(m)),i=["R"][n](j.slice(-2));else for(var q=0,r=j.length;q<r;q++)i[q]=j[q];switch(i[0]){case"Z":d=f,e=g;break;case"H":d=i[1];break;case"V":e=i[1];break;case"M":f=i[i.length-2],g=i[i.length-1];default:d=i[i.length-2],e=i[i.length-1]}}c.toString=a._path2string;return c},null,by),bB=function(a,b,c,d){return[a,b,c,d,c,d]},bC=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bD=function(a,b,c,d,e,f,g,h,i,j){var k=B*120/180,l=B/180*(+e||0),m=[],o,p=bt(function(a,b,c){var d=a*w.cos(c)-b*w.sin(c),e=a*w.sin(c)+b*w.cos(c);return{x:d,y:e}});if(!j){o=p(a,b,-l),a=o.x,b=o.y,o=p(h,i,-l),h=o.x,i=o.y;var q=w.cos(B/180*e),r=w.sin(B/180*e),t=(a-h)/2,u=(b-i)/2,v=t*t/(c*c)+u*u/(d*d);v>1&&(v=w.sqrt(v),c=v*c,d=v*d);var x=c*c,y=d*d,A=(f==g?-1:1)*w.sqrt(z((x*y-x*u*u-y*t*t)/(x*u*u+y*t*t))),C=A*c*u/d+(a+h)/2,D=A*-d*t/c+(b+i)/2,E=w.asin(((b-D)/d).toFixed(9)),F=w.asin(((i-D)/d).toFixed(9));E=a<C?B-E:E,F=h<C?B-F:F,E<0&&(E=B*2+E),F<0&&(F=B*2+F),g&&E>F&&(E=E-B*2),!g&&F>E&&(F=F-B*2)}else E=j[0],F=j[1],C=j[2],D=j[3];var G=F-E;if(z(G)>k){var H=F,I=h,J=i;F=E+k*(g&&F>E?1:-1),h=C+c*w.cos(F),i=D+d*w.sin(F),m=bD(h,i,c,d,e,0,g,I,J,[F,H,C,D])}G=F-E;var K=w.cos(E),L=w.sin(E),M=w.cos(F),N=w.sin(F),O=w.tan(G/4),P=4/3*c*O,Q=4/3*d*O,R=[a,b],S=[a+P*L,b-Q*K],T=[h+P*N,i-Q*M],U=[h,i];S[0]=2*R[0]-S[0],S[1]=2*R[1]-S[1];if(j)return[S,T,U][n](m);m=[S,T,U][n](m).join()[s](",");var V=[];for(var W=0,X=m.length;W<X;W++)V[W]=W%2?p(m[W-1],m[W],l).y:p(m[W],m[W+1],l).x;return V},bE=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:A(j,3)*a+A(j,2)*3*i*c+j*3*i*i*e+A(i,3)*g,y:A(j,3)*b+A(j,2)*3*i*d+j*3*i*i*f+A(i,3)*h}},bF=bt(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bE(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bE(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bE(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bE(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:y[m](0,p),y:y[m](0,o)},max:{x:x[m](0,p),y:x[m](0,o)}}}),bG=a._path2curve=bt(function(a,b){var c=bA(a),d=b&&bA(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][n](bD[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][n](bC(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][n](bC(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](bB(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](bB(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](bB(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](bB(b.x,b.y,b.X,b.Y))}return a},h=function(a,b){if(a[b].length>7){a[b].shift();var e=a[b];while(e.length)a.splice(b++,0,["C"][n](e.splice(0,6)));a.splice(b,1),k=x(c.length,d&&d.length||0)}},i=function(a,b,e,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),e.bx=0,e.by=0,e.x=a[g][1],e.y=a[g][2],k=x(c.length,d&&d.length||0))};for(var j=0,k=x(c.length,d&&d.length||0);j<k;j++){c[j]=g(c[j],e),h(c,j),d&&(d[j]=g(d[j],f)),d&&h(d,j),i(c,d,e,f,j),i(d,c,f,e,j);var l=c[j],o=d&&d[j],p=l.length,q=d&&o.length;e.x=l[p-2],e.y=l[p-1],e.bx=Q(l[p-4])||e.x,e.by=Q(l[p-3])||e.y,f.bx=d&&(Q(o[q-4])||f.x),f.by=d&&(Q(o[q-3])||f.y),f.x=d&&o[q-2],f.y=d&&o[q-1]}return d?[c,d]:c},null,by),bH=a._parseDots=bt(function(b){var c=[];for(var d=0,e=b.length;d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;d<e;d++)if(!c[d].offset){var h=Q(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=Q(i);var k=(i-h)/(j-d+1);for(;d<j;d++)h+=k,c[d].offset=h+"%"}return c}),bI=a._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)},bJ=a._tofront=function(a,b){b.top!==a&&(bI(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},bK=a._toback=function(a,b){b.bottom!==a&&(bI(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},bL=a._insertafter=function(a,b,c){bI(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},bM=a._insertbefore=function(a,b,c){bI(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},bN=a._extractTransform=function(b,c){if(c==null)return b._.transform;c=r(c).replace(/\.{3}|\u2026/g,b._.transform||p);var d=a.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=b._,k=new bQ;j.transform=d||[];if(d)for(var l=0,m=d.length;l<m;l++){var n=d[l],o=n.length,q=r(n[0]).toLowerCase(),s=n[0]!=q,t=s?k.invert():0,u,v,w,x,y;q=="t"&&o==3?s?(u=t.x(0,0),v=t.y(0,0),w=t.x(n[1],n[2]),x=t.y(n[1],n[2]),k.translate(w-u,x-v)):k.translate(n[1],n[2]):q=="r"?o==2?(y=y||b.getBBox(1),k.rotate(n[1],y.x+y.width/2,y.y+y.height/2),e+=n[1]):o==4&&(s?(w=t.x(n[2],n[3]),x=t.y(n[2],n[3]),k.rotate(n[1],w,x)):k.rotate(n[1],n[2],n[3]),e+=n[1]):q=="s"?o==2||o==3?(y=y||b.getBBox(1),k.scale(n[1],n[o-1],y.x+y.width/2,y.y+y.height/2),h*=n[1],i*=n[o-1]):o==5&&(s?(w=t.x(n[3],n[4]),x=t.y(n[3],n[4]),k.scale(n[1],n[2],w,x)):k.scale(n[1],n[2],n[3],n[4]),h*=n[1],i*=n[2]):q=="m"&&o==7&&k.add(n[1],n[2],n[3],n[4],n[5],n[6]),j.dirtyT=1,b.matrix=k}b.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,h==1&&i==1&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1},bO=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return a.length==4?[b,0,a[2],a[3]]:[b,0];case"s":return a.length==5?[b,1,1,a[3],a[4]]:a.length==3?[b,1,1]:[b,1]}},bP=a._equaliseTransform=function(b,c){c=r(c).replace(/\.{3}|\u2026/g,b),b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];var d=x(b.length,c.length),e=[],f=[],g=0,h,i,j,k;for(;g<d;g++){j=b[g]||bO(c[g]),k=c[g]||bO(j);if(j[0]!=k[0]||j[0].toLowerCase()=="r"&&(j[2]!=k[2]||j[3]!=k[3])||j[0].toLowerCase()=="s"&&(j[3]!=k[3]||j[4]!=k[4]))return;e[g]=[],f[g]=[];for(h=0,i=x(j.length,k.length);h<i;h++)h in j&&(e[g][h]=j[h]),h in k&&(f[g][h]=k[h])}return{from:e,to:f}};a._getContainer=function(b,c,d,e){var f;f=e==null&&!a.is(b,"object")?h.doc.getElementById(b):b;if(f!=null){if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d};return{container:1,x:b,y:c,width:d,height:e}}},a.pathToRelative=bz,a._engine={},a.path2curve=bG,a.matrix=function(a,b,c,d,e,f){return new bQ(a,b,c,d,e,f)},function(b){function d(a){var b=w.sqrt(c(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}function c(a){return a[0]*a[0]+a[1]*a[1]}b.add=function(a,b,c,d,e,f){var g=[[],[],[]],h=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],i=[[a,c,e],[b,d,f],[0,0,1]],j,k,l,m;a&&a instanceof bQ&&(i=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]);for(j=0;j<3;j++)for(k=0;k<3;k++){m=0;for(l=0;l<3;l++)m+=h[j][l]*i[l][k];g[j][k]=m}this.a=g[0][0],this.b=g[1][0],this.c=g[0][1],this.d=g[1][1],this.e=g[0][2],this.f=g[1][2]},b.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new bQ(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},b.clone=function(){return new bQ(this.a,this.b,this.c,this.d,this.e,this.f)},b.translate=function(a,b){this.add(1,0,0,1,a,b)},b.scale=function(a,b,c,d){b==null&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},b.rotate=function(b,c,d){b=a.rad(b),c=c||0,d=d||0;var e=+w.cos(b).toFixed(9),f=+w.sin(b).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},b.x=function(a,b){return a*this.a+b*this.c+this.e},b.y=function(a,b){return a*this.b+b*this.d+this.f},b.get=function(a){return+this[r.fromCharCode(97+a)].toFixed(4)},b.toString=function(){return a.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},b.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},b.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},b.split=function(){var b={};b.dx=this.e,b.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];b.scalex=w.sqrt(c(e[0])),d(e[0]),b.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*b.shear,e[1][1]-e[0][1]*b.shear],b.scaley=w.sqrt(c(e[1])),d(e[1]),b.shear/=b.scaley;var f=-e[0][1],g=e[1][1];g<0?(b.rotate=a.deg(w.acos(g)),f<0&&(b.rotate=360-b.rotate)):b.rotate=a.deg(w.asin(f)),b.isSimple=!+b.shear.toFixed(9)&&(b.scalex.toFixed(9)==b.scaley.toFixed(9)||!b.rotate),b.isSuperSimple=!+b.shear.toFixed(9)&&b.scalex.toFixed(9)==b.scaley.toFixed(9)&&!b.rotate,b.noRotation=!+b.shear.toFixed(9)&&!b.rotate;return b},b.toTransformString=function(a){var b=a||this[s]();if(b.isSimple){b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4);return(b.dx&&b.dy?"t"+[b.dx,b.dy]:p)+(b.scalex!=1||b.scaley!=1?"s"+[b.scalex,b.scaley,0,0]:p)+(b.rotate?"r"+[b.rotate,0,0]:p)}return"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(bQ.prototype);var bR=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);navigator.vendor=="Apple Computer, Inc."&&(bR&&bR[1]<4||navigator.platform.slice(0,2)=="iP")||navigator.vendor=="Google Inc."&&bR&&bR[1]<8?k.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:k.safari=bd;var bS=function(){this.returnValue=!1},bT=function(){return this.originalEvent.preventDefault()},bU=function(){this.cancelBubble=!0},bV=function(){return this.originalEvent.stopPropagation()},bW=function(){if(h.doc.addEventListener)return function(a,b,c,d){var e=o&&u[b]?u[b]:b,f=function(e){var f=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,i=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,j=e.clientX+i,k=e.clientY+f;if(o&&u[g](b))for(var l=0,m=e.targetTouches&&e.targetTouches.length;l<m;l++)if(e.targetTouches[l].target==a){var n=e;e=e.targetTouches[l],e.originalEvent=n,e.preventDefault=bT,e.stopPropagation=bV;break}return c.call(d,e,j,k)};a.addEventListener(e,f,!1);return function(){a.removeEventListener(e,f,!1);return!0}};if(h.doc.attachEvent)return function(a,b,c,d){var e=function(a){a=a||h.win.event;var b=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;a.preventDefault=a.preventDefault||bS,a.stopPropagation=a.stopPropagation||bU;return c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return!0};return f}}(),bX=[],bY=function(a){var b=a.clientX,c=a.clientY,d=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f,g=bX.length;while(g--){f=bX[g];if(o){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX,c=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();var k=f.el.node,l,m=k.nextSibling,n=k.parentNode,p=k.style.display;h.win.opera&&n.removeChild(k),k.style.display="none",l=f.el.paper.getElementByPoint(b,c),k.style.display=p,h.win.opera&&(m?n.insertBefore(k,m):n.appendChild(k)),l&&eve("drag.over."+f.el.id,f.el,l),b+=e,c+=d,eve("drag.move."+f.el.id,f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},bZ=function(b){a.unmousemove(bY).unmouseup(bZ);var c=bX.length,d;while(c--)d=bX[c],d.el._drag={},eve("drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,b);bX=[]},b$=a.el={};for(var b_=t.length;b_--;)(function(b){a[b]=b$[b]=function(c,d){a.is(c,"function")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:bW(this.shape||this.node||h.doc,b,c,d||this)}));return this},a["un"+b]=b$["un"+b]=function(a){var c=this.events,d=c.length;while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind(),c.splice(d,1),!c.length&&delete this.events;return this}return this}})(t[b_]);b$.data=function(b,c){var d=ba[this.id]=ba[this.id]||{};if(arguments.length==1){if(a.is(b,"object")){for(var e in b)b[g](e)&&this.data(e,b[e]);return this}eve("data.get."+this.id,this,d[b],b);return d[b]}d[b]=c,eve("data.set."+this.id,this,c,b);return this},b$.removeData=function(a){a==null?ba[this.id]={}:ba[this.id]&&delete ba[this.id][a];return this},b$.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},b$.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var ca=[];b$.drag=function(b,c,d,e,f,g){function i(i){(i.originalEvent||i).preventDefault();var j=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,k=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft;this._drag.x=i.clientX+k,this._drag.y=i.clientY+j,this._drag.id=i.identifier,!bX.length&&a.mousemove(bY).mouseup(bZ),bX.push({el:this,move_scope:e,start_scope:f,end_scope:g}),c&&eve.on("drag.start."+this.id,c),b&&eve.on("drag.move."+this.id,b),d&&eve.on("drag.end."+this.id,d),eve("drag.start."+this.id,f||e||this,i.clientX+k,i.clientY+j,i)}this._drag={},ca.push({el:this,start:i}),this.mousedown(i);return this},b$.onDragOver=function(a){a?eve.on("drag.over."+this.id,a):eve.unbind("drag.over."+this.id)},b$.undrag=function(){var b=ca.length;while(b--)ca[b].el==this&&(this.unmousedown(ca[b].start),ca.splice(b,1),eve.unbind("drag.*."+this.id));!ca.length&&a.unmousemove(bY).unmouseup(bZ)},k.circle=function(b,c,d){var e=a._engine.circle(this,b||0,c||0,d||0);this.__set__&&this.__set__.push(e);return e},k.rect=function(b,c,d,e,f){var g=a._engine.rect(this,b||0,c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.ellipse=function(b,c,d,e){var f=a._engine.ellipse(this,b||0,c||0,d||0,e||0);this.__set__&&this.__set__.push(f);return f},k.path=function(b){b&&!a.is(b,D)&&!a.is(b[0],E)&&(b+=p);var c=a._engine.path(a.format[m](a,arguments),this);this.__set__&&this.__set__.push(c);return c},k.image=function(b,c,d,e,f){var g=a._engine.image(this,b||"about:blank",c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.text=function(b,c,d){var e=a._engine.text(this,b||0,c||0,r(d));this.__set__&&this.__set__.push(e);return e},k.set=function(b){!a.is(b,"array")&&(b=Array.prototype.splice.call(arguments,0,arguments.length));var c=new cs(b);this.__set__&&this.__set__.push(c);return c},k.setStart=function(a){this.__set__=a||this.set()},k.setFinish=function(a){var b=this.__set__;delete this.__set__;return b},k.setSize=function(b,c){return a._engine.setSize.call(this,b,c)},k.setViewBox=function(b,c,d,e,f){return a._engine.setViewBox.call(this,b,c,d,e,f)},k.top=k.bottom=null,k.raphael=a;var cb=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,i=b.top+(h.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(h.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:i,x:j}};k.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=h.doc.elementFromPoint(a,b);if(h.win.opera&&e.tagName=="svg"){var f=cb(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var i=d.getIntersectionList(g,null);i.length&&(e=i[i.length-1])}if(!e)return null;while(e.parentNode&&e!=d.parentNode&&!e.raphael)e=e.parentNode;e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null;return e},k.getById=function(a){var b=this.bottom;while(b){if(b.id==a)return b;b=b.next}return null},k.forEach=function(a,b){var c=this.bottom;while(c){if(a.call(b,c)===!1)return this;c=c.next}return this},b$.getBBox=function(a){if(this.removed)return{};var b=this._;if(a){if(b.dirty||!b.bboxwt)this.realPath=bh[this.type](this),b.bboxwt=bx(this.realPath),b.bboxwt.toString=cd,b.dirty=0;return b.bboxwt}if(b.dirty||b.dirtyT||!b.bbox){if(b.dirty||!this.realPath)b.bboxwt=0,this.realPath=bh[this.type](this);b.bbox=bx(bi(this.realPath,this.matrix)),b.bbox.toString=cd,b.dirty=b.dirtyT=0}return b.bbox},b$.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());this.__set__&&this.__set__.push(a);return a},b$.glow=function(a){if(this.type=="text")return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||bh[this.type](this);f=this.matrix?bi(f,this.matrix):f;for(var g=1;g<c+1;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var ce={},cf=function(b,c,d,e,f,g,h,i,j){var k=0,l=100,m=[b,c,d,e,f,g,h,i].join(),n=ce[m],o,p;!n&&(ce[m]=n={data:[]}),n.timer&&clearTimeout(n.timer),n.timer=setTimeout(function(){delete ce[m]},2e3);if(j!=null&&!n.precision){var q=cf(b,c,d,e,f,g,h,i);n.precision=~~q*10,n.data=[]}l=n.precision||l;for(var r=0;r<l+1;r++){n.data[r*l]?p=n.data[r*l]:(p=a.findDotsAtSegment(b,c,d,e,f,g,h,i,r/l),n.data[r*l]=p),r&&(k+=A(A(o.x-p.x,2)+A(o.y-p.y,2),.5));if(j!=null&&k>=j)return p;o=p}if(j==null)return k},cg=function(b,c){return function(d,e,f){d=bG(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M")g=+i[1],h=+i[2];else{j=cf(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cf(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cf(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},ch=cg(1),ci=cg(),cj=cg(0,1);a.getTotalLength=ch,a.getPointAtLength=ci,a.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return cj(a,b).end;var d=cj(a,c,1);return b?cj(d,b).end:d},b$.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return ch(this.attrs.path)}},b$.getPointAtLength=function(a){if(this.type=="path")return ci(this.attrs.path,a)},b$.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var ck=a.easing_formulas={linear:function(a){return a},"<":function(a){return A(a,1.7)},">":function(a){return A(a,.48)},"<>":function(a){var b=.48-a/1.04,c=w.sqrt(.1734+b*b),d=c-b,e=A(z(d),1/3)*(d<0?-1:1),f=-c-b,g=A(z(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return A(2,-10*a)*w.sin((a-.075)*2*B/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};ck.easeIn=ck["ease-in"]=ck["<"],ck.easeOut=ck["ease-out"]=ck[">"],ck.easeInOut=ck["ease-in-out"]=ck["<>"],ck["back-in"]=ck.backIn,ck["back-out"]=ck.backOut;var cl=[],cm=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cn=function(){var b=+(new Date),c=0;for(;c<cl.length;c++){var d=cl[c];if(d.el.removed||d.paused)continue;var e=b-d.start,f=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,o={},p,r={},s;d.initstatus?(e=(d.initstatus*d.anim.top-d.prev)/(d.percent-d.prev)*f,d.status=d.initstatus,delete d.initstatus,d.stop&&cl.splice(c--,1)):d.status=(d.prev+(d.percent-d.prev)*(e/f))/d.anim.top;if(e<0)continue;if(e<f){var t=h(e/f);for(var u in i)if(i[g](u)){switch(U[u]){case C:p=+i[u]+t*f*j[u];break;case"colour":p="rgb("+[co(O(i[u].r+t*f*j[u].r)),co(O(i[u].g+t*f*j[u].g)),co(O(i[u].b+t*f*j[u].b))].join(",")+")";break;case"path":p=[];for(var v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(var x=1,y=i[u][v].length;x<y;x++)p[v][x]=+i[u][v][x]+t*f*j[u][v][x];p[v]=p[v].join(q)}p=p.join(q);break;case"transform":if(j[u].real){p=[];for(v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(x=1,y=i[u][v].length;x<y;x++)p[v][x]=i[u][v][x]+t*f*j[u][v][x]}}else{var z=function(a){return+i[u][a]+t*f*j[u][a]};p=[["m",z(0),z(1),z(2),z(3),z(4),z(5)]]}break;case"csv":if(u=="clip-rect"){p=[],v=4;while(v--)p[v]=+i[u][v]+t*f*j[u][v]}break;default:var A=[][n](i[u]);p=[],v=m.paper.customAttributes[u].length;while(v--)p[v]=+A[v]+t*f*j[u][v]}o[u]=p}m.attr(o),function(a,b,c){setTimeout(function(){eve("anim.frame."+a,b,c)})}(m.id,m,d.anim)}else{(function(b,c,d){setTimeout(function(){eve("anim.frame."+c.id,c,d),eve("anim.finish."+c.id,c,d),a.is(b,"function")&&b.call(c)})})(d.callback,m,d.anim),m.attr(k),cl.splice(c--,1);if(d.repeat>1&&!d.next){for(s in k)k[g](s)&&(r[s]=d.totalOrigin[s]);d.el.attr(r),cr(d.anim,d.el,d.anim.percents[0],null,d.totalOrigin,d.repeat-1)}d.next&&!d.stop&&cr(d.anim,d.el,d.next,null,d.totalOrigin,d.repeat)}}a.svg&&m&&m.paper&&m.paper.safari(),cl.length&&cm(cn)},co=function(a){return a>255?255:a<0?0:a};b$.animateWith=function(b,c,d,e,f,g){var h=d?a.animation(d,e,f,g):c,i=b.status(c);return this.animate(h).status(h,i*c.ms/h.ms)},b$.onAnimation=function(a){a?eve.on("anim.frame."+this.id,a):eve.unbind("anim.frame."+this.id);return this},cq.prototype.delay=function(a){var b=new cq(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cq.prototype.repeat=function(a){var b=new cq(this.anim,this.ms);b.del=this.del,b.times=w.floor(x(a,0))||1;return b},a.animation=function(b,c,d,e){if(b instanceof cq)return b;if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var f={},h,i;for(i in b)b[g](i)&&Q(i)!=i&&Q(i)+"%"!=i&&(h=!0,f[i]=b[i]);if(!h)return new cq(b,c);d&&(f.easing=d),e&&(f.callback=e);return new cq({100:f},c)},b$.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cq?b:a.animation(b,c,d,e);cr(g,f,g.percents[0],null,f.attr());return f},b$.setTime=function(a,b){a&&b!=null&&this.status(a,y(b,a.ms)/a.ms);return this},b$.status=function(a,b){var c=[],d=0,e,f;if(b!=null){cr(a,this,-1,y(b,1));return this}e=cl.length;for(;d<e;d++){f=cl[d];if(f.el.id==this.id&&(!a||f.anim==a)){if(a)return f.status;c.push({anim:f.anim,status:f.status})}}if(a)return 0;return c},b$.pause=function(a){for(var b=0;b<cl.length;b++)cl[b].el.id==this.id&&(!a||cl[b].anim==a)&&eve("anim.pause."+this.id,this,cl[b].anim)!==!1&&(cl[b].paused=!0);return this},b$.resume=function(a){for(var b=0;b<cl.length;b++)if(cl[b].el.id==this.id&&(!a||cl[b].anim==a)){var c=cl[b];eve("anim.resume."+this.id,this,c.anim)!==!1&&(delete c.paused,this.status(c.anim,c.status))}return this},b$.stop=function(a){for(var b=0;b<cl.length;b++)cl[b].el.id==this.id&&(!a||cl[b].anim==a)&&eve("anim.stop."+this.id,this,cl[b].anim)!==!1&&cl.splice(b--,1);return this},b$.toString=function(){return"Raphaël’s object"};var cs=function(a){this.items=[],this.length=0,this.type="set";if(a)for(var b=0,c=a.length;b<c;b++)a[b]&&(a[b].constructor==b$.constructor||a[b].constructor==cs)&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},ct=cs.prototype;ct.push=function(){var a,b;for(var c=0,d=arguments.length;c<d;c++)a=arguments[c],a&&(a.constructor==b$.constructor||a.constructor==cs)&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},ct.pop=function(){this.length&&delete this[this.length--];return this.items.pop()},ct.forEach=function(a,b){for(var c=0,d=this.items.length;c<d;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var cu in b$)b$[g](cu)&&(ct[cu]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][m](c,b)})}}(cu));ct.attr=function(b,c){if(b&&a.is(b,E)&&a.is(b[0],"object"))for(var d=0,e=b.length;d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items.length;f<g;f++)this.items[f].attr(b,c);return this},ct.clear=function(){while(this.length)this.pop()},ct.splice=function(a,b,c){a=a<0?x(this.length+a,0):a,b=x(0,y(this.length-a,b));var d=[],e=[],f=[],g;for(g=2;g<arguments.length;g++)f.push(arguments[g]);for(g=0;g<b;g++)e.push(this[a+g]);for(;g<this.length-a;g++)d.push(this[a+g]);var h=f.length;for(g=0;g<h+d.length;g++)this.items[a+g]=this[a+g]=g<h?f[g]:d[g-h];g=this.items.length=this.length-=b-h;while(this[g])delete this[g++];return new cs(e)},ct.exclude=function(a){for(var b=0,c=this.length;b<c;b++)if(this[b]==a){this.splice(b,1);return!0}},ct.animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items.length,g=f,h,i=this,j;if(!f)return this;e&&(j=function(){!--f&&e.call(i)}),d=a.is(d,D)?d:j;var k=a.animation(b,c,d,j);h=this.items[--g].animate(k);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,k);return this},ct.insertAfter=function(a){var b=this.items.length;while(b--)this.items[b].insertAfter(a);return this},ct.getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}a=y[m](0,a),b=y[m](0,b);return{x:a,y:b,width:x[m](0,c)-a,height:x[m](0,d)-b}},ct.clone=function(a){a=new cs;for(var b=0,c=this.items.length;b<c;b++)a.push(this.items[b].clone());return a},ct.toString=function(){return"Raphaël‘s set"},a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[g](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=R(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[g](e)){var f=a.glyphs[e];b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"};if(f.k)for(var h in f.k)f[g](h)&&(b.glyphs[e].k[h]=f.k[h])}}return a},k.getFont=function(b,c,d,e){e=e||"normal",d=d||"normal",c=+c||{normal:400,bold:700,lighter:300,bolder:800}[c]||400;if(!!a.fonts){var f=a.fonts[b];if(!f){var h=new RegExp("(^|\\s)"+b.replace(/[^\w\d\s+!~.:_-]/g,p)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[g](i)&&h.test(i)){f=a.fonts[i];break}}var j;if(f)for(var k=0,l=f.length;k<l;k++){j=f[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j}},k.print=function(b,d,e,f,g,h,i){h=h||"middle",i=x(y(i||0,1),-1);var j=this.set(),k=r(e)[s](p),l=0,m=p,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var o=f.face.bbox[s](c),q=+o[0],t=+o[1]+(h=="baseline"?o[3]-o[1]+ +f.face.descent:(o[3]-o[1])/2);for(var u=0,v=k.length;u<v;u++){var w=u&&f.glyphs[k[u-1]]||{},z=f.glyphs[k[u]];l+=u?(w.w||f.w)+(w.k&&w.k[k[u]]||0)+f.w*i:0,z&&z.d&&j.push(this.path(z.d).attr({fill:"#000",stroke:"none",transform:[["t",l*n,0]]}))}j.transform(["...s",n,n,q,t,"t",(b-q)/n,(d-t)/n])}return j},k.add=function(b){if(a.is(b,"array")){var c=this.set(),e=0,f=b.length,h;for(;e<f;e++)h=b[e]||{},d[g](h.type)&&c.push(this[h.type]().attr(h))}return c},a.format=function(b,c){var d=a.is(c,E)?[0][n](c):arguments;b&&a.is(b,D)&&d.length-1&&(b=b.replace(e,function(a,b){return d[++b]==null?p:d[b]}));return b||p},a.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),typeof e=="function"&&f&&(e=e()))}),e=(e==null||e==d?a:e)+"";return e};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),a.ninja=function(){i.was?h.win.Raphael=i.is:delete Raphael;return a},a.st=ct,function(b,c,d){function e(){/in/.test(b.readyState)?setTimeout(e,9):a.eve("DOMload")}b.readyState==null&&b.addEventListener&&(b.addEventListener(c,d=function(){b.removeEventListener(c,d,!1),b.readyState="complete"},!1),b.readyState="loading"),e()}(document,"DOMContentLoaded"),i.was?h.win.Raphael=a:Raphael=a,eve.on("DOMload",function(){b=!0})}(),window.Raphael.svg&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=a.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){typeof d=="string"&&(d=q(d));for(var f in e)e[b](f)&&(f.substring(0,6)=="xlink:"?d.setAttributeNS(n,f.substring(6),c(e[f])):d.setAttribute(f,c(e[f])))}else d=a._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(b,e){var j="linear",k=b.id+e,m=.5,n=.5,o=b.node,p=b.paper,r=o.style,s=a._g.doc.getElementById(k);if(!s){e=c(e).replace(a._radial_gradient,function(a,b,c){j="radial";if(b&&c){m=d(b),n=d(c);var e=(n>.5)*2-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&n!=.5&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/);if(j=="linear"){var t=e.shift();t=-d(t);if(isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient);if(!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,j=="radial"?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;x<y;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}q(o,{fill:"url(#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1;return 1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if(d.type=="path"){var g=c(e).toLowerCase().split("-"),h=d.paper,i=f?"end":"start",j=d.node,k=d.attrs,l=k["stroke-width"],n=g.length,r="classic",s,t,u,v,w,x=3,y=3,z=5;while(n--)switch(g[n]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":r=g[n];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}r=="open"?(x+=2,y+=2,z+=2,u=1,v=f?4:1,w={fill:"none",stroke:k.stroke}):(v=u=x/2,w={fill:k.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={};if(r!="none"){var A="raphael-marker-"+r,B="raphael-marker-"+i+r+x+y;a._g.doc.getElementById(A)?p[A]++:(h.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[r],id:A})),p[A]=1);var C=a._g.doc.getElementById(B),D;C?(p[B]++,D=C.getElementsByTagName("use")[0]):(C=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:v,refY:y/2}),D=q(q("use"),{"xlink:href":"#"+A,transform:(f?" rotate(180 "+x/2+" "+y/2+") ":m)+"scale("+x/z+","+y/z+")","stroke-width":1/((x/z+y/z)/2)}),C.appendChild(D),h.defs.appendChild(C),p[B]=1),q(D,w);var E=u*(r!="diamond"&&r!="oval");f?(s=d._.arrows.startdx*l||0,t=a.getTotalLength(k.path)-E*l):(s=E*l,t=a.getTotalLength(k.path)-(d._.arrows.enddx*l||0)),w={},w["marker-"+i]="url(#"+B+")";if(t||s)w.d=Raphael.getSubpath(k.path,s,t);q(j,w),d._.arrows[i+"Path"]=A,d._.arrows[i+"Marker"]=B,d._.arrows[i+"dx"]=E,d._.arrows[i+"Type"]=r,d._.arrows[i+"String"]=e}else f?(s=d._.arrows.startdx*l||0,t=a.getTotalLength(k.path)-s):(s=0,t=a.getTotalLength(k.path)-(d._.arrows.enddx*l||0)),d._.arrows[i+"Path"]&&q(j,{d:Raphael.getSubpath(k.path,s,t)}),delete d._.arrows[i+"Path"],delete d._.arrows[i+"Marker"],delete d._.arrows[i+"dx"],delete d._.arrows[i+"Type"],delete d._.arrows[i+"String"];for(w in p)if(p[b](w)&&!p[w]){var F=a._g.doc.getElementById(w);F&&F.parentNode.removeChild(F)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,b,d){b=u[c(b).toLowerCase()];if(b){var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=b.length;while(h--)g[h]=b[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[b](o)){if(!a._availableAttrs[b](o))continue;var p=f[o];k[o]=p;switch(o){case"blur":d.blur(p);break;case"href":case"title":case"target":var u=i.parentNode;if(u.tagName.toLowerCase()!="a"){var w=q("a");u.insertBefore(w,i),w.appendChild(i),u=w}o=="target"&&p=="blank"?u.setAttributeNS(n,"show","new"):u.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var x=c(p).split(j);if(x.length==4){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var z=q("clipPath"),A=q("rect");z.id=a.createUUID(),q(A,{x:x[0],y:x[1],width:x[2],height:x[3]}),z.appendChild(A),d.paper.defs.appendChild(z),q(i,{"clip-path":"url(#"+z.id+")"}),d.clip=A}if(!p){var B=i.getAttribute("clip-path");if(B){var C=a._g.doc.getElementById(B.replace(/(^url\(#|\)$)/g,l));C&&C.parentNode.removeChild(C),q(i,{"clip-path":l}),delete d.clip}}break;case"path":d.type=="path"&&(q(i,{d:p?k.path=a._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":i.setAttribute(o,p),d._.dirty=1;if(k.fx)o="x",p=k.x;else break;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if(o=="rx"&&d.type=="rect")break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":i.setAttribute(o,p),d._.dirty=1;if(k.fy)o="y",p=k.y;else break;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if(o=="ry"&&d.type=="rect")break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":d.type=="rect"?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":d.type=="image"&&i.setAttributeNS(n,"href",p);break;case"stroke-width":if(d._.sx!=1||d._.sy!=1)p/=g(h(d._.sx),h(d._.sy))||1;d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var D=c(p).match(a._ISURL);if(D){z=q("pattern");var F=q("image");z.id=a.createUUID(),q(z,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(F,{x:0,y:0,"xlink:href":D[1]}),z.appendChild(F),function(b){a._preload(D[1],function(){var a=this.offsetWidth,c=this.offsetHeight;q(b,{width:a,height:c}),q(F,{width:a,height:c}),d.paper.safari()})}(z),d.paper.defs.appendChild(z),i.style.fill="url(#"+z.id+")",q(i,{fill:"url(#"+z.id+")"}),d.pattern=z,d.pattern&&s(d);break}var G=a.getRGB(p);if(!G.error)delete f.gradient,delete k.gradient,!a.is(k.opacity,"undefined")&&a.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!a.is(k["fill-opacity"],"undefined")&&a.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});else if((d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(H){var I=H.getElementsByTagName("stop");q(I[I.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}G[b]("opacity")&&q(i,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(p),i.setAttribute(o,G.hex),o=="stroke"&&G[b]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),o=="stroke"&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":(d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p);break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break};default:o=="font-size"&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if(d.type=="text"&&!!(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){g.text=f.text;while(h.firstChild)h.removeChild(h.firstChild);var j=c(f.text).split("\n"),k=[],m;for(var n=0,o=j.length;n<o;n++)m=q("tspan"),n&&q(m,{dy:i*x,x:g.x}),m.appendChild(a._g.doc.createTextNode(j[n])),h.appendChild(m),k[n]=m}else{k=h.getElementsByTagName("tspan");for(n=0,o=k.length;n<o;n++)n?q(k[n],{dy:i*x,x:g.x}):q(k[0],{dy:0})}q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&a.is(r,"finite")&&q(k[0],{dy:r})}},z=function(b,c){var d=0,e=0;this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=a.matrix(),this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},A=a.el;z.prototype=A,A.constructor=z,a._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);d.type="path",w(d,{fill:"none",stroke:"#000",path:a});return d},A.rotate=function(a,b,e){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this.transform(this._.transform.concat([["r",a,b,e]]));return this},A.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]]));return this},A.translate=function(a,b){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this.transform(this._.transform.concat([["t",a,b]]));return this},A.transform=function(c){var d=this._;if(c==null)return d.transform;a._extractTransform(this,c),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix});if(d.sx!=1||d.sy!=1){var e=this.attrs[b]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},A.hide=function(){!this.removed&&this.paper.safari(this.node.style.display="none");return this},A.show=function(){!this.removed&&this.paper.safari(this.node.style.display="");return this},A.remove=function(){if(!this.removed){var b=this.paper;b.__set__&&b.__set__.exclude(this),k.unbind("*.*."+this.id),this.gradient&&b.defs.removeChild(this.gradient),a._tear(this,b),this.node.parentNode.removeChild(this.node);for(var c in this)this[c]=typeof this[c]=="function"?a._removedFactory(c):null;this.removed=!0}},A._getBBox=function(){if(this.node.style.display=="none"){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}a&&this.hide();return b},A.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;if(c=="transform")return this._.transform;var g=c.split(j),h={};for(var i=0,l=g.length;i<l;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return l-1?h:h[g[0]]}if(d==null&&a.is(c,"array")){h={};for(i=0,l=c.length;i<l;i++)h[c[i]]=this.attr(c[i]);return h}if(d!=null){var m={};m[c]=d}else c!=null&&a.is(c,"object")&&(m=c);for(var n in m)k("attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[b](n)&&m[b](n)&&a.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[b](p)&&(m[p]=o[p])}w(this,m);return this},A.toFront=function(){if(this.removed)return this;this.node.parentNode.tagName.toLowerCase()=="a"?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var b=this.paper;b.top!=this&&a._tofront(this,b);return this},A.toBack=function(){if(this.removed)return this;var b=this.node.parentNode;b.tagName.toLowerCase()=="a"?b.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):b.firstChild!=this.node&&b.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper);var c=this.paper;return this},A.insertAfter=function(b){if(this.removed)return this;var c=b.node||b[b.length-1].node;c.nextSibling?c.parentNode.insertBefore(this.node,c.nextSibling):c.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},A.insertBefore=function(b){if(this.removed)return this;var c=b.node||b[0].node;c.parentNode.insertBefore(this.node,c),a._insertbefore(this,b,this.paper);return this},A.blur=function(b){var c=this;if(+b!==0){var d=q("filter"),e=q("feGaussianBlur");c.attrs.blur=b,d.id=a.createUUID(),q(e,{stdDeviation:+b||1.5}),d.appendChild(e),c.paper.defs.appendChild(d),c._blur=d,q(c.node,{filter:"url(#"+d.id+")"})}else c._blur&&(c._blur.parentNode.removeChild(c._blur),delete c._blur,delete c.attrs.blur),c.node.removeAttribute("filter")},a._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs);return f},a._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs);return h},a._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs);return g},a._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image";return h},a._engine.text=function(b,c,d,e){var f=q("text");b.canvas&&b.canvas.appendChild(f);var g=new z(f,b);g.attrs={x:c,y:d,"text-anchor":"middle",text:e,font:a._availableAttrs.font,stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs);return g},a._engine.setSize=function(a,b){this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox);return this},a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,g=b.height;if(!c)throw new Error("SVG container not found.");var h=q("svg"),i="overflow:hidden;",j;d=d||0,e=e||0,f=f||512,g=g||342,q(h,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),c==1?(h.style.cssText=i+"position:absolute;left:"+d+"px;top:"+e+"px",a._g.doc.body.appendChild(h),j=1):(h.style.cssText=i+"position:relative",c.firstChild?c.insertBefore(h,c.firstChild):c.appendChild(h)),c=new a._Paper,c.width=f,c.height=g,c.canvas=h,c.clear(),c._left=c._top=0,j&&(c.renderfix=function(){}),c.renderfix();return c},a._engine.setViewBox=function(a,b,c,d,e){k("setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=g(c/this.width,d/this.height),h=this.top,i=e?"meet":"xMinYMin",j,l;a==null?(this._vbSize&&(f=1),delete this._vbSize,j="0 0 "+this.width+m+this.height):(this._vbSize=f,j=a+m+b+m+c+m+d),q(this.canvas,{viewBox:j,preserveAspectRatio:i});while(f&&h)l="stroke-width"in h.attrs?h.attrs["stroke-width"]:1,h.attr({"stroke-width":l}),h._.dirty=1,h._.dirtyT=1,h=h.prev;this._viewBox=[a,b,c,d,!!e];return this},a.prototype.renderfix=function(){var a=this.canvas,b=a.style,c=a.getScreenCTM()||a.createSVGMatrix(),d=-c.e%1,e=-c.f%1;if(d||e)d&&(this._left=(this._left+d)%1,b.left=this._left+"px"),e&&(this._top=(this._top+e)%1,b.top=this._top+"px")},a.prototype.clear=function(){a.eve("clear",this);var b=this.canvas;while(b.firstChild)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(a._g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=q("defs"))},a.prototype.remove=function(){k("remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null};var B=a.st;for(var C in A)A[b](C)&&!B[b](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}(window.Raphael),window.Raphael.vml&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=a.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(b){var d=/[ahqstv]/ig,e=a._pathToAbsolute;c(b).match(d)&&(e=a._path2curve),d=/[clmz]/g;if(e==a._pathToAbsolute&&!c(b).match(d)){var g=c(b).replace(q,function(a,b,c){var d=[],e=b.toLowerCase()=="m",g=p[b];c.replace(s,function(a){e&&d.length==2&&(g+=d+p[b=="m"?"l":"L"],d=[]),d.push(f(a*u))});return g+d});return g}var h=e(b),i,j;g=[];for(var k=0,l=h.length;k<l;k++){i=h[k],j=h[k][0].toLowerCase(),j=="z"&&(j="x");for(var m=1,r=i.length;m<r;m++)j+=f(i[m]*u)+(m!=r-1?",":o);g.push(j)}return g.join(n)},y=function(b,c,d){var e=a.matrix();e.rotate(-b,.5,.5);return{dx:e.x(c,d),dy:e.y(c,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q,r=u/b,s=u/c;m.visibility="hidden";if(!!b&&!!c){l.coordsize=i(r)+n+i(s),m.rotation=f*(b*c<0?-1:1);if(f){var t=y(f,d,e);d=t.dx,e=t.dy}b<0&&(p+="x"),c<0&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-r+n+e*-s;if(k||g.fillsize){var v=l.getElementsByTagName(j);v=v&&v[0],l.removeChild(v),k&&(t=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),v.position=t.dx*o+n+t.dy*o),g.fillsize&&(v.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(v)}m.visibility="visible"}};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,b,d){var e=c(b).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";while(g--)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q,r=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),s=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),t=e;for(var y in i)i[b](y)&&(m[y]=i[y]);r&&(m.path=a._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur);if(i.path&&e.type=="path"||r)l.path=x(~c(m.path).toLowerCase().indexOf("r")?a._pathToAbsolute(m.path):m.path),e.type=="image"&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0));"transform"in i&&e.transform(i.transform);if(s){var B=+m.cx,D=+m.cy,E=+m.rx||+m.r||0,G=+m.ry||+m.r||0;l.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((B-E)*u),f((D-G)*u),f((B+E)*u),f((D+G)*u),f(B*u))}if("clip-rect"in i){var H=c(i["clip-rect"]).split(k);if(H.length==4){H[2]=+H[2]+ +H[0],H[3]=+H[3]+ +H[1];var I=l.clipRect||a._g.doc.createElement("div"),J=I.style;J.clip=a.format("rect({1}px {2}px {3}px {0}px)",H),l.clipRect||(J.position="absolute",J.top=0,J.left=0,J.width=e.paper.width+"px",J.height=e.paper.height+"px",l.parentNode.insertBefore(I,l),I.appendChild(l),l.clipRect=I)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var K=e.textpath.style;i.font&&(K.font=i.font),i["font-family"]&&(K.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(K.fontSize=i["font-size"]),i["font-weight"]&&(K.fontWeight=i["font-weight"]),i["font-style"]&&(K.fontStyle=i["font-style"])}"arrow-start"in i&&A(t,i["arrow-start"]),"arrow-end"in i&&A(t,i["arrow-end"],1);if(i.opacity!=null||i["stroke-width"]!=null||i.fill!=null||i.src!=null||i.stroke!=null||i["stroke-width"]!=null||i["stroke-opacity"]!=null||i["fill-opacity"]!=null||i["stroke-dasharray"]!=null||i["stroke-miterlimit"]!=null||i["stroke-linejoin"]!=null||i["stroke-linecap"]!=null){var L=l.getElementsByTagName(j),M=!1;L=L&&L[0],!L&&(M=L=F(j)),e.type=="image"&&i.src&&(L.src=i.src),i.fill&&(L.on=!0);if(L.on==null||i.fill=="none"||i.fill===null)L.on=!1;if(L.on&&i.fill){var N=c(i.fill).match(a._ISURL);if(N){L.parentNode==l&&l.removeChild(L),L.rotate=!0,L.src=N[1],L.type="tile";var O=e.getBBox(1);L.position=O.x+n+O.y,e._.fillpos=[O.x,O.y],a._preload(N[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else L.color=a.getRGB(i.fill).hex,L.src=o,L.type="solid",a.getRGB(i.fill).error&&(t.type in{circle:1,ellipse:1}||c(i.fill).charAt()!="r")&&C(t,i.fill,L)&&(m.fill="none",m.gradient=i.fill,L.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var P=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+a.getRGB(i.fill).o+1||2)-1);P=h(g(P,0),1),L.opacity=P,L.src&&(L.color="none")}l.appendChild(L);var Q=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],T=!1;!Q&&(T=Q=F("stroke"));if(i.stroke&&i.stroke!="none"||i["stroke-width"]||i["stroke-opacity"]!=null||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])Q.on=!0;(i.stroke=="none"||i.stroke===null||Q.on==null||i.stroke==0||i["stroke-width"]==0)&&(Q.on=!1);var U=a.getRGB(i.stroke);Q.on&&i.stroke&&(Q.color=U.hex),P=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+U.o+1||2)-1);var V=(d(i["stroke-width"])||1)*.75;P=h(g(P,0),1),i["stroke-width"]==null&&(V=m["stroke-width"]),i["stroke-width"]&&(Q.weight=V),V&&V<1&&(P*=V)&&(Q.weight=1),Q.opacity=P,i["stroke-linejoin"]&&(Q.joinstyle=i["stroke-linejoin"]||"miter"),Q.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(Q.endcap=i["stroke-linecap"]=="butt"?"flat":i["stroke-linecap"]=="square"?"square":"round");if(i["stroke-dasharray"]){var W={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};Q.dashstyle=W[b](i["stroke-dasharray"])?W[i["stroke-dasharray"]]:o}T&&l.appendChild(Q)}if(t.type=="text"){t.paper.canvas.style.display=o;var X=t.paper.span,Y=100,Z=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=X.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),Z=d(m["font-size"]||Z&&Z[0])||10,p.fontSize=Z*Y+"px",t.textpath.string&&(X.innerHTML=c(t.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var $=X.getBoundingClientRect();t.W=m.w=($.right-$.left)/Y,t.H=m.h=($.bottom-$.top)/Y,t.X=m.x,t.Y=m.y+t.H/2,("x"in i||"y"in i)&&(t.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));var _=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var ba=0,bb=_.length;ba<bb;ba++)if(_[ba]in i){t._.dirty=1;break}switch(m["text-anchor"]){case"start":t.textpath.style["v-text-align"]="left",t.bbx=t.W/2;break;case"end":t.textpath.style["v-text-align"]="right",t.bbx=-t.W/2;break;default:t.textpath.style["v-text-align"]="center",t.bbx=0}t.textpath.style["v-text-kern"]=!0}},C=function(b,f,g){b.attrs=b.attrs||{};var h=b.attrs,i=Math.pow,j,k,l="linear",m=".5 .5";b.attrs.gradient=f,f=c(f).replace(a._radial_gradient,function(a,b,c){l="radial",b&&c&&(b=d(b),c=d(c),i(b-.5,2)+i(c-.5,2)>.25&&(c=e.sqrt(.25-i(b-.5,2))*((c>.5)*2-1)+.5),m=b+n+c);return o}),f=f.split(/\s*\-\s*/);if(l=="linear"){var p=f.shift();p=-d(p);if(isNaN(p))return null}var q=a._parseDots(f);if(!q)return null;b=b.shape||b.node;if(q.length){b.removeChild(g),g.on=!0,g.method="none",g.color=q[0].color,g.color2=q[q.length-1].color;var r=[];for(var s=0,t=q.length;s<t;s++)q[s].offset&&r.push(q[s].offset+n+q[s].color);g.colors=r.length?r.join():"0% "+g.color,l=="radial"?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=m,g.angle=0):(g.type="gradient",g.angle=(270-p)%360),b.appendChild(g)}return 1},D=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=a.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},E=a.el;D.prototype=E,E.constructor=D,E.transform=function(b){if(b==null)return this._.transform;var d=this.paper._viewBoxShift,e=d?"s"+[d.scale,d.scale]+"-1-1t"+[d.dx,d.dy]:o,f;d&&(f=b=c(b).replace(/\.{3}|\u2026/g,this._.transform||o)),a._extractTransform(this,e+b);var g=this.matrix.clone(),h=this.skew,i=this.node,j,k=~c(this.attrs.fill).indexOf("-"),l=!c(this.attrs.fill).indexOf("url(");g.translate(-0.5,-0.5);if(l||k||this.type=="image"){h.matrix="1 0 0 1",h.offset="0 0",j=g.split();if(k&&j.noRotation||!j.isSimple){i.style.filter=g.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;i.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else i.style.filter=o,z(this,j.scalex,j.scaley,j.dx,j.dy,j.rotate)}else i.style.filter=o,h.matrix=c(g),h.offset=g.offset();f&&(this._.transform=f);return this},E.rotate=function(a,b,e){if(this.removed)return this;if(a!=null){a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,b,e]]));return this}},E.translate=function(a,b){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=b),this.transform(this._.transform.concat([["t",a,b]]));return this},E.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this._.dirtyT=1;return this},E.hide=function(){!this.removed&&(this.node.style.display="none");return this},E.show=function(){!this.removed&&(this.node.style.display=o);return this},E._getBBox=function(){if(this.removed)return{};return{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed){this.paper.__set__&&this.paper.__set__.exclude(this),a.eve.unbind("*.*."+this.id),a._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;this.removed=!0}},E.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c==j&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;var g=c.split(k),h={};for(var i=0,m=g.length;i<m;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return m-1?h:h[g[0]]}if(this.attrs&&d==null&&a.is(c,"array")){h={};for(i=0,m=c.length;i<m;i++)h[c[i]]=this.attr(c[i]);return h}var n;d!=null&&(n={},n[c]=d),d==null&&a.is(c,"object")&&(n=c);for(var o in n)l("attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[b](o)&&n[b](o)&&a.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[b](q)&&(n[q]=p[q])}n.text&&this.type=="text"&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&a._tofront(this,this.paper);return this},E.toBack=function(){if(this.removed)return this;this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper));return this},E.insertAfter=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[b.length-1]),b.node.nextSibling?b.node.parentNode.insertBefore(this.node,b.node.nextSibling):b.node.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},E.insertBefore=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[0]),b.node.parentNode.insertBefore(this.node,b.node),a._insertbefore(this,b,this.paper);return this},E.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(r,o),+b!==0?(this.attrs.blur=b,c.filter=d+n+m+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",f(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur)},a._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");f.on=!0,c.appendChild(f),d.skew=f,d.transform(o);return d},a._engine.rect=function(b,c,d,e,f,g){var h=a._rectPath(c,d,e,f,g),i=b.path(h),j=i.attrs;i.X=j.x=c,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect";return i},a._engine.ellipse=function(a,b,c,d,e){var f=a.path(),g=f.attrs;f.X=b-d,f.Y=c-e,f.W=d*2,f.H=e*2,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e});return f},a._engine.circle=function(a,b,c,d){var e=a.path(),f=e.attrs;e.X=b-d,e.Y=c-d,e.W=e.H=d*2,e.type="circle",B(e,{cx:b,cy:c,r:d});return e},a._engine.image=function(b,c,d,e,f,g){var h=a._rectPath(d,e,f,g),i=b.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];k.src=c,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=c,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0);return i},a._engine.text=function(b,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=a.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=c(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,b),l={fill:"#000",stroke:"none",font:a._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=c(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),b.canvas.appendChild(h);var m=F("skew");m.on=!0,h.appendChild(m),k.skew=m,k.transform(o);return k},a._engine.setSize=function(b,c){var d=this.canvas.style;this.width=b,this.height=c,b==+b&&(b+="px"),c==+c&&(c+="px"),d.width=b,d.height=c,d.clip="rect(0 "+b+" "+c+" 0)",this._viewBox&&a._engine.setViewBox.apply(this,this._viewBox);return this},a._engine.setViewBox=function(b,c,d,e,f){a.eve("setViewBox",this,this._viewBox,[b,c,d,e,f]);var h=this.width,i=this.height,j=1/g(d/h,e/i),k,l;f&&(k=i/e,l=h/d,d*k<h&&(b-=(h-d*k)/2/k),e*l<i&&(c-=(i-e*l)/2/l)),this._viewBox=[b,c,d,e,!!f],this._viewBoxShift={dx:-b,dy:-c,scale:j},this.forEach(function(a){a.transform("...")});return this};var F;a._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e,f=b.width,g=b.x,h=b.y;if(!c)throw new Error("VML container not found.");var i=new a._Paper,j=i.canvas=a._g.doc.createElement("div"),k=j.style;g=g||0,h=h||0,f=f||512,d=d||342,i.width=f,i.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),i.coordsize=u*1e3+n+u*1e3,i.coordorigin="0 0",i.span=a._g.doc.createElement("span"),i.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",j.appendChild(i.span),k.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(a._g.doc.body.appendChild(j),k.left=g+"px",k.top=h+"px",k.position="absolute"):c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j),i.renderfix=function(){};return i},a.prototype.clear=function(){a.eve("clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}(window.Raphael);
window.jsonRequest = function(requestURL, callback, requestParameters)
{
	this.send = function()
	{
		if (requestURL)
		{
			var parameters = {};

			parameters['requestURL'] = requestURL;
			parameters['successCallBack'] = successCallBack;
			parameters['failCallBack'] = failCallBack;
			parameters['requestXML'] = false;
			parameters['requestType'] = 'POST';
			parameters['postParameters'] = requestParameters;

			ajaxManager.makeRequest(parameters);
		}
	};
	var successCallBack = function(responseText)
	{
		var parsedData;

		responseStatus = 'invalid';
		responseData = {};

		if (typeof responseText != 'undefined')
		{
			if (parsedData = JSON.parse(responseText))
			{
				if (typeof (parsedData.responseStatus != 'undefined') && typeof (parsedData.responseData != 'undefined'))
				{
					responseStatus = parsedData.responseStatus;
					responseData = parsedData.responseData;
				}
			}
		}
		deliverResponse();
	};
	var failCallBack = function()
	{
		responseStatus = 'invalid';
		responseData = {};
		deliverResponse();
	};
	var deliverResponse = function()
	{
		if (typeof callback == 'function')
		{
			callback(responseStatus, responseData);
		}
	};
	var self = this;

	var responseType = false;
	var responseData = false;
	var responseStatus = false;
};;
window.debugLogics = new function()
{
	this.addRecord = function(text)
	{
		var record = {};
		record['text'] = text;
		records.push(record);
		window.controller.fireEvent('debugInfoUpdate');
	}
	this.getRecords = function()
	{
		return records;
	}
	this.getLastRecord = function()
	{
		return records[records.length-1];
	}
	var self = this;
	var records = new Array();
}
window.debug = function(value)
{
	var text = '';
	if (typeof value == 'object')
	{
		for (var i in value)
		{
			text += i+': '+value[i]+'\n';
		}
	}
	else if (typeof value == 'function')
	{
		text = 'function: '+value[i];
	}
	else
	{
		text = value;
	}
	window.debugLogics.addRecord(text);
};
window.debugComponent = new function()
{
	var debugInfoUpdate = function()
	{
		refreshContents();
	}
	var refreshContents = function()
	{
		if (!componentElement)
		{
			prepareDom();
		}
		componentElement.style.display = 'block';
		var newRecord = window.debugLogics.getLastRecord();
		
		var recordRow = document.createElement('pre');
		recordRow.className = 'debug_block_row';
		recordRow.innerHTML = newRecord.text;
		if (componentElement.firstChild)
		{
			componentElement.insertBefore(recordRow, componentElement.firstChild);
		}
		else
		{
			componentElement.appendChild(recordRow);
		}
	}
	var prepareDom = function()
	{
		componentElement = _('.debug_block')[0];
		if (!componentElement);
		{
			componentElement = document.createElement('div');
			componentElement.className = 'debug_block';
			document.body.appendChild(componentElement);
		}
		eventsManager.addHandler(componentElement, 'click', clickHandler);
	}
	var clickHandler = function()
	{
		componentElement.style.display = 'none';
	}
	var self = this;
	var componentElement = false;
	
	window.controller.addListener('debugInfoUpdate', debugInfoUpdate);
};
window.inputLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.input_block');
		for (var i = 0; i < elements.length; i++)
		{
			new InputComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.textareaLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.textarea_block');
		for (var i = 0; i < elements.length; i++)
		{
			new TextareaComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.feedbackFormLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.feedback_form');
		for (var i = 0; i < elements.length; i++)
		{
			new FeedbackFormComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.scrollGalleryLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.scroll_gallery');
		for (var i = 0; i < elements.length; i++)
		{
			new ScrollGalleryComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.searchLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.search_form');
		for (var i = 0; i < elements.length; i++)
		{
			new SearchFormComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.registrationLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.registration_form');
		for (var i = 0; i < elements.length; i++)
		{
			new RegistrationFormComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.subscriptionLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.subscribe_form');
		for (var i = 0; i < elements.length; i++)
		{
			new SubscriptionFormComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.loginLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.login_block');
		for (var i = 0; i < elements.length; i++)
		{
			new LoginFormComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.productShortLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.product_gallery');
		for (var i=0; i < elements.length; i++)
		{
			new ProductGalleryComponent(elements[i]);
		}
		var elements = _('.product_mini');
		for (var i=0; i < elements.length; i++)
		{
			new ProductGalleryComponent(elements[i]);
		}
		var elements = _('.product_short');
		for (var i=0; i < elements.length; i++)
		{
			new ProductShortComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.productControlsLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.product_details_controls');
		for (var i=0; i < elements.length; i++)
		{
			new ProductControlsComponent(elements[i]);
		}
		
		if (window.urlList)
		{
			var newGallery = new artWebGallery(urlList);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.shoppingBasketLogics = new function()
{
	var initData = function()
	{
		if (window.shoppingBasketData)
		{
			importData(window.shoppingBasketData);
		}
	}
	var importData = function(basketData)
	{
		self.selectedDeliveryTargetId = parseInt(basketData.selectedDeliveryTargetId, 10);
		self.selectedRegionId = parseInt(basketData.selectedRegionId, 10);
		self.selectedCityId = parseInt(basketData.selectedCityId, 10);
		self.selectedDeliveryTypeId = parseInt(basketData.selectedDeliveryTypeId, 10);
		self.productsAmount = parseInt(basketData.productsAmount, 10);
		self.productsPrice = parseFloat(basketData.productsPrice, 10);
		self.totalPrice = parseFloat(basketData.totalPrice, 10);
		self.message = basketData.message;

		elementId = parseInt(basketData.elementId, 10);
		
		var usedIdIndex = {};
		for (var i=0; i<basketData.productsList.length; i++)
		{
			var basketProductId = basketData.productsList[i].basketProductId;
			
			usedIdIndex[basketProductId] = true;
			
			var product = false;
			if (!self.productsIndex[basketProductId])
			{
				product = new shoppingBasketProduct();
				self.productsIndex[basketProductId] = product;
				self.productsList.push(product);
			}
			else
			{
				product = self.productsIndex[basketProductId];
			}
			
			if (product)
			{
				product.updateData(basketData.productsList[i]);
			}
		}
		
		for (var i=0; i<self.productsList.length; i++)
		{
			var basketProductId = self.productsList[i].basketProductId;
			if (typeof usedIdIndex[basketProductId] == 'undefined')
			{
				delete self.productsIndex[basketProductId];
				self.productsList.splice(i, 1);
			}
		}
		
		for (var i=0; i<basketData.regionsList.length; i++)
		{
			var regionId = basketData.regionsList[i].id;
						
			var region = false;
			if (!self.regionsIndex[regionId])
			{
				region = new shoppingBasketRegion();
				self.regionsIndex[regionId] = region;
				self.regionsList.push(region);
			}
			else
			{
				region = self.regionsIndex[regionId];
			}
			
			if (region)
			{
				region.updateData(basketData.regionsList[i]);
			}
		}
		
		self.deliveryTypesList = new Array();
		self.deliveryTypesIndex = {};
		
		for (var i=0; i<basketData.deliveryTypesList.length; i++)
		{
			var deliveryId = basketData.deliveryTypesList[i].id;

			var delivery = new shoppingBasketDelivery();
			self.deliveryTypesIndex[deliveryId] = delivery;
			self.deliveryTypesList.push(delivery);
			
			delivery.updateData(basketData.deliveryTypesList[i]);
		}
		
		window.controller.fireEvent('shoppingBasketUpdated');
	}
	var initComponents = function()
	{
		var elements = _('.shoppingbasket_status');
		for (var i = 0; i < elements.length; i++)
		{
			new ShoppingBasketStatusComponent(elements[i]);
		}
		var elements = _('.shoppingbasket_selection');
		for (var i = 0; i < elements.length; i++)
		{
			new ShoppingBasketSelectionComponent(elements[i]);
		}
	}
	this.changeProductAmount = function(basketProductId, productAmount)
	{
		var parameters = new Array();
		parameters['basketProductId'] = basketProductId;
		parameters['productAmount'] = amount;
		
		sendData('changeAmount', parameters);
	}
	this.addProduct = function(productId, productAmount, productVariation)
	{
		if (typeof productAmount == 'undefined')
		{
			productAmount = 1;
		}
		if (typeof productVariation == 'undefined')
		{
			productVariation = '';
		}
		
		var requestParameters = new Array();
		requestParameters['productId'] = productId;
		requestParameters['productAmount'] = productAmount;
		requestParameters['productVariation'] = productVariation;
		
		sendData('addProduct', requestParameters);
	}
	this.changeAmount = function(basketProductId, productAmount)
	{
		if (typeof productAmount == 'undefined')
		{
			productAmount = 1;
		}
		
		var requestParameters = new Array();
		requestParameters['basketProductId'] = basketProductId;
		requestParameters['productAmount'] = productAmount;
		
		sendData('changeAmount', requestParameters);
	}
	this.removeProduct = function(basketProductId)
	{
		var parameters = new Array();
		parameters['basketProductId'] = basketProductId;
		
		sendData('removeProduct', parameters);
	}
	this.selectDelivery = function(deliveryId)
	{
		var parameters = new Array();
		parameters['deliveryId'] = deliveryId;
		
		sendData('selectDelivery', parameters);
	}
	this.selectDeliveryTargetId = function(deliveryTargetId)
	{
		var parameters = new Array();
		parameters['deliveryTargetId'] = deliveryTargetId;
		
		sendData('selectDeliveryTarget', parameters);
	}
	this.getSelectedRegion = function()
	{
		var result = false;
		if (self.regionsIndex[self.selectedRegionId])
		{
			result = self.regionsIndex[self.selectedRegionId];
		}
		return result;
	}
	this.getSelectedCity = function()
	{
		var result = false;
		if (self.regionsIndex[self.selectedRegionId])
		{
			if (self.regionsIndex[self.selectedRegionId].citiesIndex[self.selectedCityId])
			{
				result = self.regionsIndex[self.selectedRegionId].citiesIndex[self.selectedCityId];
			}
		}
		return result;
	}
	this.getSelectedRegionCitiesList = function()
	{
		var result = false;
		if (self.regionsIndex[self.selectedRegionId])
		{
			result = self.regionsIndex[self.selectedRegionId].citiesList;
		}
		return result;
	}
	var sendData = function(actionName, requestParameters)
	{
		var requestURL = '/ajax/id/'+elementId+'/action/'+actionName;
		var request = new XMLRequest(requestURL, receiveData, requestParameters);

		request.send();
	}
	var receiveData = function(responseStatus, parsedData)
	{
		if (responseStatus == 'success')
		{
			if (typeof parsedData.shoppingBasketData != 'undefined')
			{
				importData(parsedData.shoppingBasketData);
			}
		}
	}
	
	var self = this;
	
	this.selectedDeliveryTargetId = 0;
	this.selectedDeliveryTypeId = 0;
	this.selectedRegionId = 0;
	this.selectedCityId = 0;
	
	this.productsAmount = 0;
	this.productsPrice = 0;
	this.totalPrice = 0;
	this.message = '';
	
	this.productsList = new Array();
	this.productsIndex = {};
	
	this.regionsList = new Array();
	this.regionsIndex = {};
	
	this.deliveryTypesList = new Array();
	this.deliveryTypesIndex = {};
	
	var elementId = false;
	
	var shoppingBasketData = false;
	
	window.controller.addListener('initLogics', initData);
	window.controller.addListener('initDom', initComponents);
}
window.shoppingBasketProduct = function()
{
	this.updateData = function(data)
	{
		importData(data);
		recalculate();
	}
	var importData = function(data)
	{
		self.basketProductId = data.basketProductId;
		self.productId = parseInt(data.productId, 10);
		self.price = parseFloat(data.price, 10);
		self.totalPrice = parseFloat(data.totalPrice, 10);
		self.amount = parseInt(data.amount, 10);
		self.title = data.title;
		self.description = data.description;
	}
	var recalculate = function()
	{
		self.totalPrice = self.price * self.amount;
	}
	var self = this;
	
	this.basketProductId = false;
	this.productId = 0;
	this.price = 0;
	this.totalPrice = 0;
	this.amount = 0;
	this.title = '';
	this.description = '';
}
window.shoppingBasketRegion = function()
{
	this.updateData = function(data)
	{
		importData(data);
	}
	var importData = function(data)
	{
		self.id = parseInt(data.id, 10);
		self.title = data.title;
		self.conditionsText = data.conditionsText;
		
		for (var i=0; i<data.citiesList.length; i++)
		{
			var cityId = data.citiesList[i].id;
			var city = false;
			if (!self.citiesIndex[cityId])
			{
				city = new shoppingBasketRegionCity();
				self.citiesIndex[cityId] = city;
				self.citiesList.push(city);
			}
			else
			{
				city = self.citiesIndex[cityId];
			}
			
			if (city)
			{
				city.updateData(data.citiesList[i]);
			}
		}
		
	}
	var self = this;
	
	this.id = false;
	this.title = '';
	this.conditionsText = '';
	this.citiesList = new Array();
	this.citiesIndex = {};
}
window.shoppingBasketRegionCity = function()
{
	this.updateData = function(data)
	{
		importData(data);
	}
	var importData = function(data)
	{
		self.id = parseInt(data.id, 10);
		self.title = data.title;
	}
	var self = this;
	
	this.id = false;
	this.title = '';
}
window.shoppingBasketDelivery = function()
{
	this.updateData = function(data)
	{
		importData(data);
	}
	var importData = function(data)
	{
		self.id = parseInt(data.id, 10);
		self.price = parseFloat(data.price, 10);
		self.title = data.title;
		self.code = data.code;
	}
	var self = this;
	
	this.id = false;
	this.price = 0;
	this.title = '';
	this.code = '';
};
window.dropDownManager = new function()
{
	this.getDropDown = function(element, parameters)
	{
		if (typeof parameters == 'undefined')
		{
			parameters = {};
		}
		var dropDown = checkDropDown(element);
		if (!dropDown)
		{
			dropDown = manufactureDropDown(element, parameters);
		}
		return dropDown;
	};
	this.updateDropDown = function(element)
	{
		var dropDown = checkDropDown(element);
		if (dropDown)
		{
			dropDown.update();
		}
	};
	this.hideLists = function()
	{
		for (var i = 0; i < dropDownObjectsList.length; i++)
		{
			dropDownObjectsList[i].hideList();
		}
	};
	this.createDropDown = function(parameters)
	{
		var dropDown = new DropDownComponent(false, parameters);
		dropDownObjectsList.push(dropDown);
		return dropDown;
	};
	var manufactureDropDown = function(element, parameters)
	{
		var dropDown = new DropDownComponent(element, parameters);
		dropDownObjectsList.push(dropDown);
		return dropDown;
	};
	var init = function()
	{
		window.eventsManager.addHandler(window, 'click', clickHandler);

		var dropDownElements = _('.dropDownComponent');
		for (var i = 0; i < dropDownElements.length; i++)
		{
			if (!checkDropDown(dropDownElements[i]))
			{
				var dropDownObject = manufactureDropDown(dropDownElements[i]);
				var parent = dropDownElements[i].parentNode;
				parent.insertBefore(dropDownObject.componentElement, dropDownElements[i]);
			}
		}
	};
	var checkDropDown = function(element)
	{
		var result = false;
		for (var i = 0; i < dropDownObjectsList.length; i++)
		{
			if (dropDownObjectsList[i].selectorElement == element)
			{
				result = dropDownObjectsList[i];
				break;
			}
		}
		return result;
	};
	var clickHandler = function()
	{
		for (var i=0; i<dropDownObjectsList.length; i++)
		{
			dropDownObjectsList[i].hideList();
		}
	};

	var self = this;
	var dropDownObjectsList = new Array();

	window.controller.addListener('initDom', init);
};;
window.checkBoxManager = new function()
{
	var init = function()
	{
		var inputElements = _('.artWebCheckBox');
		for (var i = 0; i < inputElements.length; i++)
		{
			createCheckBox(inputElements[i]);
		}
	}
	var createCheckBox = function(inputElement)
	{
		var found = false;
		for (var i = 0; i < checkBoxObjects.length; i++)
		{
			if (checkBoxObjects[i].inputElement == inputElement)
			{
				found = true;
			}
		}
		if (!found)
		{
			var checkBoxObject = new CheckBoxComponent(inputElement);
			checkBoxObjects.push(checkBoxObject);
		}
	}
	var self = this;
	var checkBoxObjects = new Array();
	
	window.controller.addListener('initDom', init);
};
window.radioButtonManager = new function()
{
	var init = function()
	{
		var inputElements = _('.radio_holder');
		for (var i = 0; i < inputElements.length; i++)
		{
			if (!inputElements[i].artWebRadioCreated)
			{
				var radioObject = new RadioButtonComponent(inputElements[i]);
				if (!radioObjects[radioObject.name])
				{
					radioObjects[radioObject.name] = new Array();
				}
				radioObjects[radioObject.name].push(radioObject);
			}
		}
	};
	this.makeRadioButtons = function(parentElement)
	{
		var inputElements = _('.radio_holder', parentElement);
		for (var i = 0; i < inputElements.length; i++)
		{
			if (!inputElements[i].artWebRadioCreated)
			{
				var radioObject = new RadioButtonComponent(inputElements[i]);
				if (!radioObjects[radioObject.name])
				{
					radioObjects[radioObject.name] = new Array();
				}
				radioObjects[radioObject.name].push(radioObject);
			}
		}
	};
	this.changeValue = function(name, value)
	{
		if (radioObjects[name])
		{
			for (var i=0; i<radioObjects[name].length; i++)
			{
				radioObjects[name][i].synchronize(value);
			}
		}
	};
	var radioObjects = {};

	window.controller.addListener('initDom', init);
};;
window.newWindowLinkLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.newwindow_link');
		for (var i = 0; i < elements.length; i++)
		{
			new NewWindowLinkComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.galleriesInfo = {};
window.galleriesLogics = new function()
{
	var initComponents = function()
	{
		for (var id in galleriesInfo)
		{
			var galleryInfo = galleriesInfo[id];
			if (galleryInfo.type == 'slide')
			{
				new SlideGalleryComponent(galleryInfo);
			}
		}
	};
	window.controller.addListener('initDom', initComponents);
};;
window.categoryDetailsLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.category_details');
		for (var i=0; i < elements.length; i++)
		{
			new categoryDetailsComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.selectedCategoryLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.selectedcategories_item');
		for (var i = 0; i < elements.length; i++)
		{
			new SelectedCategoryComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.bannerLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.banner');
		for (var i = 0; i < elements.length; i++)
		{
			new BannerComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.linkListLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.linklist_block');
		for (var i = 0; i < elements.length; i++)
		{
			new LinkListComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.brandsLogics = new function()
{
	var initLogics = function()
	{
		if (typeof window.brandsList != 'undefined' && window.brandsList.length > 0)
		{
			brandsList = window.brandsList;
			window.controller.addListener('initDom', initComponents);
		}
	}
	var initComponents = function()
	{
		var elements = _('.brands_animation');
		for (var i = 0; i < elements.length; i++)
		{
			new BrandsBannerComponent(elements[i]);
		}
	}
	this.getBrandsList = function()
	{
		return brandsList;
	}
	var self = this;
	var brandsList = false;	
	window.controller.addListener('initLogics', initLogics);
};
window.mainMenuLogics = new function()
{
	var initLogics = function()
	{
		if (window.menusInfo)
		{
			for (var i=0; i<window.menusInfo.length; i++)
			{
				menuList.push(window.menusInfo[i]);
				menuIndex[window.menusInfo[i].id] = window.menusInfo[i];
			}
		}
	}
	var initComponents = function()
	{
		var elements = _('.menuitem_block');
		for (var i=0; i<elements.length; i++)
		{
			new MainMenuComponent(elements[i]);
		}
	}
	this.getMenuInfo = function(menuId)
	{
		var result = false;
		if (typeof menuIndex[menuId] != 'undefined')
		{
			result = menuIndex[menuId];
		}
		return result;
	}
	this.getSubMenuInfo = function(menuId)
	{
		var result = false;
		if (typeof childrenListsIndex[menuId] == 'undefined')
		{
			childrenListsIndex[menuId] = new Array();
			for (var i=0; i<menuList.length; i++)
			{
				if (menuList[i].parentId == menuId)
				{
					childrenListsIndex[menuId].push(menuList[i]);
				}
			}
			result = childrenListsIndex[menuId];
		}

		return result;
	}
	var self = this;

	var menuList = new Array();
	var menuIndex = {};
	var childrenListsIndex = {};

	window.controller.addListener('initLogics', initLogics);
	window.controller.addListener('initDom', initComponents);
};
window.accordeonMenuLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.accordeon_menu');
		for (var i = 0; i < elements.length; i++)
		{
			new AccordeonMenu(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
/**
 * Created by JetBrains PhpStorm.
 * User: moroz1999
 * Date: 23.12.11
 * Time: 14:00
 * To change this template use File | Settings | File Templates.
 */
window.roomsLogics = new function ()
{
	var self = this;

	var currentQuery;

	var floorsList;
	var floorsIndex;

	var roomsList;
	var roomsIndex;
	var roomsVectorIndex;

	var categoriesList;
	var categoriesIndex;

	var currentFloorNumber = null;
	var currentCategoryId = null;
	var currentRoomId = null;
	var calculatedRoomsList;

	var initLogics = function ()
	{
		if (typeof window.roomsInfo == 'object')
		{
			importInfo(window.roomsInfo);
			controller.addListener("anchorParametersUpdate", anchorParametersUpdateHandler);

			currentFloorNumber = 1;
		}
	};
	var anchorParametersUpdateHandler = function (parameters)
	{
		var roomsParametersChanged = false;
		if (parameters.category)
		{
			if (categoryChangeHandler(parameters.category))
			{
				roomsParametersChanged = true;
			}
		}
		else
		{
			if (categoryChangeHandler(null))
			{
				roomsParametersChanged = true;
			}
		}
		if (parameters.floor)
		{
			if (floorChangeHandler(parameters.floor))
			{
				roomsParametersChanged = true;
			}
		}

		if (parameters.room)
		{
			if (roomChangeHandler(parameters.room))
			{
				roomsParametersChanged = true;
			}
		}
		else
		{
			if (roomChangeHandler(null))
			{
				roomsParametersChanged = true;
			}
		}
		if (parameters.search)
		{
			if (searchHandler(parameters.search))
			{
				roomsParametersChanged = true;
			}
		}
		else
		{
			if (searchHandler(null))
			{
				roomsParametersChanged = true;
			}
		}
		if (roomsParametersChanged)
		{
			for (var i = 0; i < floorsList.length; i++)
			{
				floorsList[i].recalculateUrl(currentCategoryId, currentQuery, currentRoomId);
			}
			controller.fireEvent('roomsParametersChanged');
		}

		recalculateRoomsList();
	};
	var startHandler = function ()
	{
		controller.fireEvent('roomsParametersChanged');
	};
	var categoryChangeHandler = function (categoryId)
	{
		if (currentCategoryId != categoryId)
		{
			currentCategoryId = categoryId;
			controller.fireEvent('roomsCategoryChanged', currentCategoryId);
			return true;
		}
		return false;
	};
	var searchHandler = function (query)
	{
		if (currentQuery != query)
		{
			currentQuery = query;
			controller.fireEvent('roomsSearchQueryChanged', currentQuery);
			return true;
		}
		return false;
	};
	var floorChangeHandler = function (floorId)
	{
		if (currentFloorNumber != floorId)
		{
			currentFloorNumber = floorId;
			controller.fireEvent('roomsFloorChanged', currentFloorNumber);
			return true;
		}
		return false;
	};
	var roomChangeHandler = function (roomId)
	{
		if (currentRoomId != roomId)
		{
			currentRoomId = roomId;
			controller.fireEvent('roomChanged', currentRoomId);
			return true;
		}
		return false;
	};
	var recalculateRoomsList = function ()
	{
		calculatedRoomsList = new Array();
		if (currentCategoryId)
		{
			for (var i = 0; i < roomsList.length; i++)
			{
				if (roomsList[i].categoryId == currentCategoryId)
				{
					calculatedRoomsList.push(roomsList[i]);
				}
			}
		}
		else if (currentQuery)
		{
			for (var i = 0; i < roomsList.length; i++)
			{
				var expression = new RegExp(currentQuery, 'i');
				if (roomsList[i].title.search(expression) != -1)
				{
					calculatedRoomsList.push(roomsList[i]);
				}
			}
		}
		controller.fireEvent('roomsListRecalculated', calculatedRoomsList);
	};
	var importInfo = function (info)
	{
		if (typeof info.categories == 'object')
		{
			categoriesList = new Array();
			categoriesIndex = {};
			for (var i = 0; i < info.categories.length; i++)
			{
				var category = new RoomsMapCategory(info.categories[i]);
				categoriesList.push(category);
				categoriesIndex[category.id] = category;
			}
		}
		if (typeof info.floors == 'object')
		{
			floorsList = new Array();
			floorsIndex = {};
			for (var i = 0; i < info.floors.length; i++)
			{
				var floor = new RoomsMapFloor(info.floors[i]);
				floorsList.push(floor);
				floorsIndex[floor.number] = floor;
			}
		}
		if (typeof info.rooms == 'object')
		{
			roomsList = new Array();
			roomsIndex = {};
			roomsVectorIndex = {};
			for (var i = 0; i < info.rooms.length; i++)
			{
				var room = new RoomsMapRoom(info.rooms[i]);
				roomsList.push(room);
				roomsIndex[room.id] = room;
				for (var k=0; k<room.vectorId.length; k++)
				{
					roomsVectorIndex[room.vectorId[k]] = room;
				}
			}
		}
	};

	var initComponents = function ()
	{
		var elements = _('.roomsmap_block');
		for (var i = 0; i < elements.length; i++)
		{
			new RoomsMapComponent(elements[i]);
		}
	};
	this.getCategory = function (id)
	{
		var category = false;
		if (typeof categoriesIndex[id] != undefined)
		{
			category = categoriesIndex[id];
		}
		return category;
	};
	this.getRoom = function (id)
	{
		var room = false;
		if (typeof roomsVectorIndex[id] != undefined)
		{
			room = roomsVectorIndex[id];
		}
		return room;
	};
	this.getCurrentRoom = function()
	{
		var result = false;
		if (typeof roomsVectorIndex[currentRoomId] != 'undefined')
		{
			result = roomsVectorIndex[currentRoomId];
		}
		return result;
	};
	this.getRoomByVector = function (id)
	{
		var room = false;
		if (typeof roomsVectorIndex[id] != undefined)
		{
			room = roomsVectorIndex[id];
		}
		return room;
	};
	this.getCurrentFloorNumber = function ()
	{
		return currentFloorNumber;
	};
	this.getCurrentCategoryId = function ()
	{
		return currentCategoryId;
	};
	this.getCurrentQuery = function ()
	{
		return currentQuery;
	};
	this.getCategoriesList = function ()
	{
		return categoriesList;
	};
	this.getRoomsList = function ()
	{
		return calculatedRoomsList;
	};
	this.getFloorsList = function ()
	{
		return floorsList;
	};
	this.getRoomUrl = function(roomId, floor)
	{
		var url = '#room='+roomId+'&floor='+floor;
		if (currentCategoryId)
		{
			url += '&category=' + currentCategoryId;
		}
		if (currentQuery)
		{
			url += '&search=' + currentQuery;
		}
		return url;
	};

	window.controller.addListener('initLogics', initLogics);
	window.controller.addListener('initDom', initComponents);
	window.controller.addListener('startApplication', startHandler);
};
window.RoomsMapCategory = function (info)
{
	var self = this;
	this.id = null;
	this.url = null;
	this.title = null;

	this.colorTop = null;
	this.colorStroke = null;

	this.colorTopOver = null;
	this.colorStrokeOver = null;

	this.colorTopActive = null;
	this.colorStrokeActive = null;

	var init = function ()
	{
		importInfo(info);
	};
	var importInfo = function (importedInfo)
	{
		self.id = parseInt(importedInfo.id, 10);
		self.title = importedInfo.title;
		self.url = '#category=' + self.id;

		self.colorTop = importedInfo.color;
		self.colorDark = calculateColor(self.colorTop, 0.18, false);
		self.colorMedium = calculateColor(self.colorTop, 0.14, false);
		self.colorLight = calculateColor(self.colorTop, 0.2, true);
		self.colorStroke = calculateColor(self.colorTop, 0.1, false);

		self.colorTopOver = calculateColor(self.colorTop, 0.15, true);
		self.colorDarkOver = calculateColor(self.colorTopOver, 0.18, false);
		self.colorMediumOver = calculateColor(self.colorTopOver, 0.14, false);
		self.colorLightOver = calculateColor(self.colorTopOver, 0.2, true);
		self.colorStrokeOver = calculateColor(self.colorTopOver, 0.1, false);

		self.colorTopActive = calculateColor(self.colorTop, 0.3, true);
		self.colorDarkActive = calculateColor(self.colorTopActive, 0.18, false);
		self.colorMediumActive = calculateColor(self.colorTopActive, 0.14, false);
		self.colorLightActive = calculateColor(self.colorTopActive, 0.2, true);
		self.colorStrokeActive = calculateColor(self.colorTopActive, 0.1, false);
	};
	var pad = function (num, totalChars)
	{
		var pad = '0';
		num = num + '';
		while (num.length < totalChars)
		{
			num = pad + num;
		}
		return num;
	};
	var calculateColor = function (color, percentage, lighter)
	{
		var r = parseInt(color.substring(1, 3), 16);
		var g = parseInt(color.substring(3, 5), 16);
		var b = parseInt(color.substring(5, 7), 16);

		if (lighter)
		{
			r = Math.min(r + r * percentage, 255);
			g = Math.min(g + g * percentage, 255);
			b = Math.min(b + b * percentage, 255);
		}
		else
		{
			r = Math.max(r - r * percentage, 0);
			g = Math.max(g - g * percentage, 0);
			b = Math.max(b - b * percentage, 0);
		}

		return '#'+pad(Math.round(r).toString(16), 2)+pad(Math.round(g).toString(16), 2)+pad(Math.round(b).toString(16), 2);
	};
	init();
};
window.RoomsMapFloor = function (info)
{
	var self = this;
	this.number = null;
	this.url = null;
	this.title = null;

	var init = function ()
	{
		importInfo(info);
	};
	var importInfo = function (importedInfo)
	{
		self.number = parseInt(importedInfo.number, 10);
		self.title = importedInfo.title;
		self.url = '#floor=' + self.number;
	};
	this.recalculateUrl = function (currentCategoryId, currentQuery, currentRoomId)
	{
		self.url = '#floor=' + self.number;
		if (currentCategoryId)
		{
			self.url += '&category=' + currentCategoryId;
		}
		if (currentQuery)
		{
			self.url += '&search=' + currentQuery;
		}
		if (currentRoomId)
		{
			self.url += '&room=' + currentRoomId;
		}
	};
	init();
};
window.RoomsMapRoom = function (info)
{
	var self = this;

	this.floor = null;
	this.number = null;
	this.vectorId = null;
	this.categoryId = null;
	this.title = null;
	this.introduction = null;
	this.openedTime = null;
	this.contactInfo = null;
	this.image = null;
	this.logo = null;
	this.id = null;
	this.URL = null;

	this.category = null;

	var init = function ()
	{
		importInfo(info);
	};
	var importInfo = function (importedInfo)
	{
		self.floor = parseInt(importedInfo.floor, 10);
		self.number = parseInt(importedInfo.number, 10);
		self.categoryId = parseInt(importedInfo.categoryId, 10);
		self.vectorId = importedInfo.vectorId;
		self.title = importedInfo.title;
		self.introduction = importedInfo.introduction;
		self.openedTime = importedInfo.openedTime;
		self.contactInfo = importedInfo.contactInfo;
		self.image = importedInfo.image;
		self.logo = importedInfo.logo;
		self.URL = importedInfo.URL;
		self.id = self.floor + '_' + self.number;

		var category = roomsLogics.getCategory(self.categoryId);
		if (category)
		{
			self.category = category;
		}

	};
	init();
};;
window.categorySelectorLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.category_selector');
		for (var i=0; i < elements.length; i++)
		{
			new CategorySelectorComponent(elements[i]);
		}
	};
	window.controller.addListener('initDom', initComponents);
};;
window.scrollPagesLogics = new function ()
{
	var initComponents = function ()
	{
		var elements = _('.scroll_pages_component');
		for (var i = 0; i < elements.length; i++)
		{
			var campaigns = _('.topgallery_campaign', elements[i]);

			var pages = new Array();
			var pageElement;
			var maxHeight = 333;
			var sumHeight = 0;

			var campaignsArray = new Array();
			for (var k = 0; k < campaigns.length; k++)
			{
				campaignsArray.push(campaigns[k]);
			}

			for (var k = 0; k < campaignsArray.length; k++)
			{
				var campaign = campaignsArray[k];
				var height = campaign.offsetHeight;

				if (sumHeight + height > maxHeight && sumHeight != 0)
				{
					sumHeight = 0;
					pageElement = false;
				}

				if (!pageElement)
				{
					pageElement = document.createElement('div');
					pageElement.className = 'topgallery_campaigns_page scroll_page';
					pages.push(pageElement);
				}

				sumHeight += campaign.offsetHeight;

				pageElement.appendChild(campaign);
			}
			var containerElement = _('.scroll_pages_content', elements[i])[0];
			if (containerElement)
			{
				while (containerElement.firstChild)
				{
					containerElement.removeChild(containerElement.firstChild);
				}
				for (var j = 0; j < pages.length; j++)
				{
					containerElement.appendChild(pages[j]);
				}
			}

			new scrollPagesComponent(elements[i]);
		}
	};
	window.controller.addListener('initDom', initComponents);
};;
window.catalogueFilterSearchLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.cataloguefilter_search_form');
		for (var i=0; i < elements.length; i++)
		{
			new CatalogueFilterSearchComponent(elements[i]);
		}
	};
	window.controller.addListener('initDom', initComponents);
};;
function InputComponent(inputBlockElement)
{
	var init = function()
	{
		eventsManager.addHandler(inputBlockElement, 'click', clickHandler);
		
		originalClass = inputBlockElement.className;
		if (inputElement = _('input', inputBlockElement)[0])
		{
			eventsManager.addHandler(inputElement, 'focus', focusHandler);
			eventsManager.addHandler(inputElement, 'blur', blurHandler);
		}

		eventsManager.addHandler(inputBlockElement, 'mouseenter', mouseOverHandler);
		eventsManager.addHandler(inputBlockElement, 'mouseleave', mouseOutHandler);
		
		defaultTextElement = _('.input_block_default', inputBlockElement)[0];
		
		refresh();
	}
	var clickHandler = function(event)
	{
		inputElement.focus();
	}
	var mouseOverHandler = function(event)
	{
		hovered = true;
		refresh();
	}
	var mouseOutHandler = function(event)
	{
		hovered = false;
		refresh();
	}
	var focusHandler = function(event)
	{
		focused = true;
		refresh();
	}
	var blurHandler = function(event)
	{
		focused = false;
		refresh();
	}
	var refresh = function()
	{
		var newClass = originalClass;
		
		if (hovered)
		{
			newClass =  newClass + ' input_block_hovered';
		}
		if (focused)
		{
			newClass =  newClass + ' input_block_focused';
			if (defaultTextElement)
			{
				defaultTextElement.style.display = 'none';
			}
		}
		else
		{
			if (defaultTextElement)
			{
				if (inputElement.value == '')
				{
					defaultTextElement.style.display = 'block';
				}
				else
				{
					defaultTextElement.style.display = 'none';
				}
			}
		}
		inputBlockElement.className = newClass;
	}
	var self = this;
	
	var focused = false;
	var hovered = false;
	
	var originalClass = false;
	var defaultTextElement = false;
	var inputElement = false;
	
	init();
};
function TextareaComponent(textareaBlockElement)
{
	var init = function()
	{
		eventsManager.addHandler(textareaBlockElement, 'click', clickHandler);
		
		originalClass = textareaBlockElement.className;
		if (textareaElement = _('textarea', textareaBlockElement)[0])
		{
			eventsManager.addHandler(textareaElement, 'focus', focusHandler);
			eventsManager.addHandler(textareaElement, 'blur', blurHandler);
		}

		eventsManager.addHandler(textareaBlockElement, 'mouseenter', mouseOverHandler);
		eventsManager.addHandler(textareaBlockElement, 'mouseleave', mouseOutHandler);
		
		defaultTextElement = _('.textarea_block_default', textareaBlockElement)[0];
		
		refresh();
	}
	var clickHandler = function(event)
	{
		textareaElement.focus();
	}
	var mouseOverHandler = function(event)
	{
		hovered = true;
		refresh();
	}
	var mouseOutHandler = function(event)
	{
		hovered = false;
		refresh();
	}
	var focusHandler = function(event)
	{
		focused = true;
		refresh();
	}
	var blurHandler = function(event)
	{
		focused = false;
		refresh();
	}
	var refresh = function()
	{
		var newClass = originalClass;
		
		if (hovered)
		{
			newClass =  newClass + ' textarea_block_hovered';
		}
		if (focused)
		{
			newClass =  newClass + ' textarea_block_focused';
			if (defaultTextElement)
			{
				defaultTextElement.style.display = 'none';
			}
		}
		else
		{
			if (defaultTextElement)
			{
				if (textareaElement.value == '')
				{
					defaultTextElement.style.display = 'block';
				}
				else
				{
					defaultTextElement.style.display = 'none';
				}
			}
		}
		textareaBlockElement.className = newClass;
	}
	var self = this;
	
	var focused = false;
	var hovered = false;
	
	var originalClass = false;
	var defaultTextElement = false;
	var textareaElement = false;
	
	init();
}
;
function FeedbackFormComponent(componentElement)
{
	var init = function()
	{
		if (sendButton = _('.button', componentElement)[0])
		{
			eventsManager.addHandler(sendButton, 'click', sendButtonClickHandler);
		}
	}
	var sendButtonClickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		submit();
	}
	var submit = function()
	{
		componentElement.submit();
	}
	var self = this;
	var sendButton = false;
	init();
}
;
window.FullScreenGalleryComponent = function(imagesInfoList)
{
	var self = this;

	var preloadDelay = 100;
	var sizeCoefficient = 0.9;

	var currentImageId = false;

	var imagesList = new Array();
	var imagesIndex = {};

	var componentElement = false;
	var closeButton = false;
	var imagesElement = false;

	var ie6Detected = false;

	var init = function()
	{
		if (navigator.appVersion.match(/MSIE ([\d.]+);/))
		{
			var version = navigator.appVersion.match(/MSIE ([\d.]+);/)[1];
			if (version == 6)
			{
				ie6Detected = true;
			}
		}

		componentElement = document.createElement('div');
		componentElement.className = 'fullscreen_gallery_block';
		componentElement.style.display = 'none';
		eventsManager.addHandler(componentElement, 'click', self.closeGallery)

		imagesElement = document.createElement('div');
		componentElement.appendChild(imagesElement);

		closeButton = document.createElement('div');
		closeButton.className = 'fullscreen_gallery_close';
		componentElement.appendChild(closeButton);

		for (var i=0; i<imagesInfoList.length; i++)
		{
			if (typeof imagesInfoList[i].src !== 'undefined')
			{
				var imageInfo = {};

				imageInfo.src = imagesInfoList[i].src;
				if (typeof imagesInfoList[i].id !== 'undefined')
				{
					imageInfo.id = imagesInfoList[i].id;
				}
				else
				{
					imageInfo.id = i;
				}

				imageInfo.element = document.createElement('img');
				imageInfo.element.style.display = 'none';
				imageInfo.element.src = imageInfo.src;
				imageInfo.element.className = 'fullscreen_gallery_image';

				imagesList.push(imageInfo);
				imagesIndex[imageInfo.id] = imageInfo;

				imagesElement.appendChild(imageInfo.element);
			}
		}
		if (imagesList.length)
		{
			document.body.appendChild(componentElement);
		}
	}
	this.displayImage = function(imageId)
	{
		if (imagesList.length > 0)
		{
			if (typeof imageId == 'undefined' || typeof imagesIndex[imageId] == 'undefined')
			{
				var imageId = imagesList[0].id;
			}
		}
		currentImageId = imageId;

		var imageInfo = imagesIndex[currentImageId];
		imageInfo.element.style.display = 'block';
		opacityHandler.setOpacity(imageInfo.element, 0);

		componentElement.style.display = 'block';
		DarkLayerComponent.showLayer(self.closeGallery, checkPreloadImage);
	};
	var checkPreloadImage = function()
	{
		var imageInfo = imagesIndex[currentImageId];
		if (imageInfo.element.complete)
		{
			fadeInCurrentImage();
		}
		else
		{
			window.setTimeout(checkPreloadImage, preloadDelay);
		}
	};
	var fadeInCurrentImage = function()
	{
		var imageInfo = imagesIndex[currentImageId];

		var imageWidth = imageInfo.element.offsetWidth;
		var imageHeight = imageInfo.element.offsetHeight;
		var aspectRatio = imageWidth/imageHeight;

		if (window.innerHeight)
		{
			var viewPortWidth = window.innerWidth;
			var viewPortHeight = window.innerHeight;
		}
		else
		{
			var viewPortWidth = document.documentElement.offsetWidth;
			var viewPortHeight = document.documentElement.offsetHeight;
		}

		var resizedWidth = imageWidth;
		var resizedHeight = imageHeight;
		if (resizedWidth > viewPortWidth * sizeCoefficient)
		{
			resizedWidth = viewPortWidth * sizeCoefficient;
			resizedHeight = resizedWidth/aspectRatio;
		}
		if (resizedHeight > viewPortHeight * sizeCoefficient)
		{
			resizedHeight = viewPortHeight * sizeCoefficient;
			resizedWidth = resizedHeight*aspectRatio;
		}

		if (!ie6Detected)
		{
			var positionLeft = (viewPortWidth - resizedWidth) / 2;
			var positionTop = (viewPortHeight - resizedHeight) / 2;
		}
		else
		{

			if (window.pageYOffset)
			{
				var viewPortLeft = window.pageXOffset;
				var viewPortTop = window.pageYOffset;
			}
			else
			{
				var viewPortLeft = document.documentElement.scrollLeft;
				var viewPortTop = document.documentElement.scrollTop;
			}

			var positionLeft = viewPortLeft + (viewPortWidth - resizedWidth) / 2;
			var positionTop = viewPortTop + (viewPortHeight - resizedHeight) / 2;
		}

		imageInfo.element.style.width = resizedWidth + 'px';
		imageInfo.element.style.height = resizedHeight + 'px';
		imageInfo.element.style.left = positionLeft + 'px';
		imageInfo.element.style.top = positionTop + 'px';

		closeButton.style.left = (positionLeft + resizedWidth - closeButton.offsetWidth/2)+ 'px';
		closeButton.style.top = (positionTop - closeButton.offsetHeight/2) + 'px';

		var parameters = {end:1, step:0.1};
		effectsManager.startEffect('opacity', imageInfo.element, parameters);
	};
	this.closeGallery = function()
	{
		componentElement.style.display = 'none';

		var imageInfo = imagesIndex[currentImageId];
		imageInfo.element.style.display = 'none';

		DarkLayerComponent.hideLayer();
	};

	init();
};;
window.ScrollGalleryComponent = function(componentElement)
{
	var init = function()
	{
		var sourceImages = _('.scroll_gallery_sourceimage');
		var imageNumber = 0;
		for (var i = 0; i < sourceImages.length; i++)
		{
			var sourceElement = sourceImages[i];
			var imageElement = false;
			if (imageElement = _('img', sourceElement)[0])
			{
				var imageInfo = {};

				imageInfo['id'] = 'full_'+sourceElement.id;
				imageInfo['number'] = imageNumber;
                if (typeof window.fullImagesIndex[sourceElement.id] != 'undefined')
                {
				    imageInfo['src'] = window.fullImagesIndex[sourceElement.id];
                }
				imageInfo['image'] = sourceElement.href;
				imageInfo['thumbnail'] = imageElement.src;

				imagesInfoList.push(imageInfo);
				imagesInfoIndex[imageInfo.number] = imageInfo;

				imageNumber++;
			}
		}
		while(componentElement.firstChild)
		{
			componentElement.removeChild(componentElement.firstChild);
		}
		if (imagesInfoList.length > 0)
		{
			window.controller.addListener('startApplication', startApplication);

			var imagesContainer = new ScrollGalleryImages(self, imagesInfoList);
			componentElement.appendChild(imagesContainer.componentElement);

			if (imagesInfoList.length > 1)
			{
				var selector = new ScrollGallerySelector(self, imagesInfoList);
				componentElement.appendChild(selector.componentElement);
			}
            fullScreenGallery = new FullScreenGalleryComponent(imagesInfoList);
		}
	};
	var startApplication = function()
	{
		window.controller.fireEvent('scrollGalleryImageSelected', 0);
	};
    this.imageClicked = function(number)
    {
        if (typeof imagesInfoIndex[number] != 'undefined')
        {
            fullScreenGallery.displayImage(imagesInfoIndex[number].id);
        }
    };
	var self = this;
	var imagesInfoList = new Array();
	var imagesInfoIndex = {};
	var fullScreenGallery;

	init();
}

function ScrollGalleryImages(galleryObject, infoList)
{
	var init = function()
	{
		self.componentElement = document.createElement('div');
		self.componentElement.className = 'scrollgallery_images';

		for (var i=0; i<infoList.length; i++)
		{
			var image = new ScrollGalleryImage(infoList[i], galleryObject);
			self.componentElement.appendChild(image.componentElement);
			imagesIndex[image.number] = image;
		}

		window.controller.addListener('scrollGalleryImageSelected', swapPictures);
	}
	var swapPictures = function(newNumber)
	{
		if (newNumber !== currentNumber)
		{
			if (imagesIndex[currentNumber])
			{
				imagesIndex[currentNumber].hide();
			}
			if (imagesIndex[newNumber])
			{
				imagesIndex[newNumber].display();
			}

			currentNumber = newNumber;
		}
	}
	var self = this;
	var currentNumber = false;
	var imagesIndex = {};
	this.componentElement = false;
	init();
}
function ScrollGalleryImage(info, galleryObject)
{
	var init = function()
	{
		self.number = info.number;

		self.componentElement = document.createElement('img');
		self.componentElement.src = info.image;
		self.componentElement.id = info.id;
		self.componentElement.className = 'scrollgallery_image';

		self.componentElement.display = 'block';
		opacityHandler.setOpacity(self.componentElement, 0);
        eventsManager.addHandler(self.componentElement, 'click', clickHandler);
	}
	this.display = function()
	{
		self.componentElement.style.display = 'block';

		var parameters = {end:1, step: 0.05};
		effectsManager.startEffect('opacity', self.componentElement, parameters);
	}
	this.hide = function()
	{
		var parameters = {end:0, step: 0.05};
		effectsManager.startEffect('opacity', self.componentElement, parameters, function(){self.componentElement.style.display = 'none'});
	}
    var clickHandler = function()
    {
        galleryObject.imageClicked(self.number);
    }
	var self = this;
	this.componentElement = false;
	this.number = false;
	init();
}
function ScrollGallerySelector(galleryObject, infoList)
{
	var init = function()
	{
		self.componentElement = document.createElement('div');
		self.componentElement.className = 'scrollgallery_horizontal_selector';

		centerElement = document.createElement('div');
		centerElement.className = 'scrollgallery_horizontal_center';

		self.componentElement.appendChild(centerElement);

		for (var i=0; i<infoList.length; i++)
		{
			var image = new ScrollGalleryThumbnail(infoList[i]);
			centerElement.appendChild(image.componentElement);
		}
		var element = false;

		var scrollLeftButton = new ScrollGalleryLeft(self);
		self.componentElement.appendChild(scrollLeftButton.componentElement);

		var scrollRightButton = new ScrollGalleryRight(self);
		self.componentElement.appendChild(scrollRightButton.componentElement);

	}
	this.scrollUp = function()
	{
		if (centerElement)
		{
			centerElement.scrollTop = centerElement.scrollTop - 3;
			lastTimeout = setTimeout(self.scrollUp, 15);
		}
	}
	this.scrollLeft = function()
	{
		if (centerElement)
		{
			centerElement.scrollLeft = centerElement.scrollLeft - 3;
			lastTimeout = setTimeout(self.scrollLeft, 15);
		}
	}
	this.scrollRight = function()
	{
		if (centerElement)
		{
			centerElement.scrollLeft = centerElement.scrollLeft + 3;
			lastTimeout = setTimeout(self.scrollRight, 15);
		}
	}
	this.scrollDown = function()
	{
		if (centerElement)
		{
			centerElement.scrollTop = centerElement.scrollTop + 3;
			lastTimeout = setTimeout(self.scrollDown, 15);
		}
	}
	this.scrollStop = function()
	{
		if (lastTimeout)
		{
			clearTimeout(lastTimeout);
			lastTimeout = false;
		}
	}
	var self = this;
	this.componentElement = false;
	var centerElement = false;
	var lastTimeout = false;
	init();
}
function ScrollGalleryThumbnail(info)
{
	var init = function()
	{
		self.componentElement = document.createElement('img');
		self.componentElement.src = info.thumbnail;
		self.componentElement.className = 'scrollgallery_thumbnail';
		eventsManager.addHandler(self.componentElement, 'click', clickHandler);
	}
	var clickHandler = function()
	{
		window.controller.fireEvent('scrollGalleryImageSelected', info.number);
	}
	var self = this;
	this.componentElement = false;
	init();
}
function ScrollGalleryUp(selectorObject)
{
	var init = function()
	{
		self.componentElement = document.createElement('a');
		self.componentElement.href = "";
		self.componentElement.className = 'scrollgallery_button_up';

		eventsManager.addHandler(self.componentElement, 'mouseover', overHandler);
		eventsManager.addHandler(self.componentElement, 'mouseout', outHandler);
		eventsManager.addHandler(self.componentElement, 'click', clickHandler);
	}
	var clickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
	}
	var overHandler = function()
	{
		selectorObject.scrollUp();
	}
	var outHandler = function()
	{
		selectorObject.scrollStop();
	}
	var self = this;
	this.componentElement = false;
	init();
}
function ScrollGalleryDown(selectorObject)
{
	var init = function()
	{
		self.componentElement = document.createElement('a');
		self.componentElement.href = "";
		self.componentElement.className = 'scrollgallery_button_down';

		eventsManager.addHandler(self.componentElement, 'mouseover', overHandler);
		eventsManager.addHandler(self.componentElement, 'mouseout', outHandler);
		eventsManager.addHandler(self.componentElement, 'click', clickHandler);
	}
	var clickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
	}
	var overHandler = function()
	{
		selectorObject.scrollDown();
	}
	var outHandler = function()
	{
		selectorObject.scrollStop();
	}
	var self = this;
	this.componentElement = false;
	init();
}
function ScrollGalleryLeft(selectorObject)
{
	var init = function()
	{
		self.componentElement = document.createElement('a');
		self.componentElement.href = "";
		self.componentElement.className = 'scrollgallery_button_left';

		eventsManager.addHandler(self.componentElement, 'mouseover', overHandler);
		eventsManager.addHandler(self.componentElement, 'mouseout', outHandler);
		eventsManager.addHandler(self.componentElement, 'click', clickHandler);
	}
	var clickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
	}
	var overHandler = function()
	{
		selectorObject.scrollLeft();
	}
	var outHandler = function()
	{
		selectorObject.scrollStop();
	}
	var self = this;
	this.componentElement = false;
	init();
}
function ScrollGalleryRight(selectorObject)
{
	var init = function()
	{
		self.componentElement = document.createElement('a');
		self.componentElement.href = "";
		self.componentElement.className = 'scrollgallery_button_right';

		eventsManager.addHandler(self.componentElement, 'mouseover', overHandler);
		eventsManager.addHandler(self.componentElement, 'mouseout', outHandler);
		eventsManager.addHandler(self.componentElement, 'click', clickHandler);
	}
	var clickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
	}
	var overHandler = function()
	{
		selectorObject.scrollRight();
	}
	var outHandler = function()
	{
		selectorObject.scrollStop();
	}
	var self = this;
	this.componentElement = false;
	init();
};
function SearchFormComponent(formElement)
{
	this.init = function()
	{
		this.formElement = formElement;
		if (this.submitButton = _('.search_button', formElement)[0])
		{
			eventsManager.addHandler(this.submitButton, 'click', this.submitForm);
		}
		eventsManager.addHandler(this.formElement, 'keydown', this.checkKey);
	}
	this.checkKey = function(event)
	{
		if (event.keyCode == 13)
		{
			self.submitForm();
		}
	}
	this.submitForm = function(event)
	{
		if (event)
		{
			eventsManager.preventDefaultAction(event);
		}
		self.formElement.submit();
	}
	var self = this;
	
	this.submitButton = null;
	this.formElement = null;
	this.init();
}
;
function RegistrationFormComponent(formElement)
{
	var init = function()
	{
		eventsManager.addHandler(formElement, 'keydown', keyDownHandler);
		if (submitButton = _('.registration_form_submit', formElement)[0])
		{
			eventsManager.addHandler(submitButton, 'click', clickHandler);
		}
	}
	var keyDownHandler = function(event)
	{
		if (event.keyCode == 13)
		{
			formElement.submit();
		}
	}
	var clickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		formElement.submit();
	}
	var self = this;
	
	var submitButton = null;
	init();
}
;
function SubscriptionFormComponent(formElement)
{
	var init = function()
	{
		if (submitButton = _('.subscribe_button', formElement)[0])
		{
			eventsManager.addHandler(submitButton, 'click', submitForm)
		}
	}
	var submitForm = function(event)
	{
		eventsManager.preventDefaultAction(event);
		formElement.submit();
	}
	var self = this;
	
	var submitButton = null;
	init();
};
function LoginFormComponent(componentElement)
{
	var init = function()
	{
		if (formElement = _('.login_form', componentElement)[0])
		{
			if (submitButton = _('.login_form_button', formElement)[0])
			{
				eventsManager.addHandler(submitButton, 'click', submitForm);
			}
			eventsManager.addHandler(formElement, 'keydown', checkKey);
		}
	}
	var checkKey = function(event)
	{
		if (event.keyCode == 13)
		{
			submitForm();
		}
	}
	var submitForm = function(event)
	{
		if (event)
		{
			eventsManager.preventDefaultAction(event);
		}
		formElement.submit();
	}
	var self = this;
	
	var submitButton = null;
	var formElement = null;
	init();
};
function ProductShortComponent(componentElement)
{
	var init = function()
	{
		var popup = new TipPopupComponent(componentElement, window.translations['label_viewproduct']);
		productId = parseInt(componentElement.className.split('productid_')[1], 10);
		if (basketButton = _('.product_short_basket', componentElement)[0])
		{
			eventsManager.addHandler(basketButton, 'click', basketButtonHandler);
		}
		if (detailsButton = _('.product_short_details', componentElement)[0])
		{
			eventsManager.addHandler(detailsButton, 'click', clickHandler);
		}
		if (linkElement = _('.product_short_link', componentElement)[0])
		{
			eventsManager.addHandler(componentElement, 'click', clickHandler);
		}
	}
	var basketButtonHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		eventsManager.cancelBubbling(event);
		
		shoppingBasketLogics.addProduct(productId, 1);
		
		var bubbleComponent = new BubbleComponent(basketButton, window.translations['label_addedtobasket']);
		bubbleComponent.start();
	}
	var clickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		eventsManager.cancelBubbling(event);
		
		document.location.href = linkElement.href;
	}
	var self = this;
	
	var productId = null;
	var basketButton = null;
	var detailsButton = null;
	var linkElement = null;
	
	init();
}
function ProductGalleryComponent(componentElement)
{
	var init = function()
	{
		var popup = new TipPopupComponent(componentElement, window.translations['label_viewproduct']);
	}
	
	var self = this;
	
	init();
};
function ProductControlsComponent(componentElement)
{
	var init = function()
	{
		productId = parseInt(componentElement.className.split('productid_')[1], 10);
		if (basketButton = _('.product_details_button', componentElement)[0])
		{
			eventsManager.addHandler(basketButton, 'click', basketButtonHandler);
		}
		if (amountMinusElement = _('.product_details_amount_minus', componentElement)[0])
		{
			eventsManager.addHandler(amountMinusElement, 'click', minusClickHandler);
		}
		if (amountPlusElement = _('.product_details_amount_plus', componentElement)[0])
		{
			eventsManager.addHandler(amountPlusElement, 'click', plusClickHandler);
		}
		if (amountInput = _('.product_details_amount_input', componentElement)[0])
		{
			eventsManager.addHandler(amountInput, 'change', amountChangeHandler);
		}
		productSelectors = _('.product_details_selection', componentElement);
	}
	var basketButtonHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		eventsManager.cancelBubbling(event);
		
		var variation = '';		
		for (var i=0; i<productSelectors.length; i++)
		{
			if (productSelectors[i].tagName.toLowerCase() == 'select')
			{
				variation = variation+productSelectors[i].value;
				if (i < productSelectors.length-1)
				{
					variation = variation + ', ';
				}
			}
		}
		shoppingBasketLogics.addProduct(productId, amountInput.value, variation);
		
		var bubbleComponent = new BubbleComponent(basketButton, window.translations['label_addedtobasket']);
		bubbleComponent.start();
	}
	var plusClickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		var amount = parseInt(amountInput.value, 10);
		amount = amount + 1;
		amountInput.value = amount;
	}
	var minusClickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		var amount = parseInt(amountInput.value, 10);
		amount = amount - 1;
		
		if (amount < 1)
		{
			amount = 1;
		}
		
		amountInput.value = amount;
	}
	var amountChangeHandler = function()
	{		
		var amount = parseInt(amountInput.value, 10);
		if (isNaN(amount))
		{
			amount = 1;
		}
		if (amountInput.value != amount)
		{
			amountInput.value = amount;
		}
	}
	
	var self = this;
	
	var productId = null;
	var basketButton = null;
	var amountMinusElement = null;
	var amountPlusElement = null;
	var amountInput = null;
	var productSelectors = null;
	
	init();
};
window.ShoppingBasketStatusComponent = function(componentElement)
{
	var init = function()
	{
		emptyTextElement = _('.shoppingbasket_status_empty', componentElement)[0];
		amountElement = _('.shoppingbasket_status_amount', componentElement)[0];
		if (priceElement = _('.shoppingbasket_status_price', componentElement)[0])
		{
			priceValueElement = _('.shoppingbasket_status_price_value', priceElement)[0];
		}
		window.controller.addListener('startApplication', updateData);
		window.controller.addListener('shoppingBasketUpdated', updateData);
	}
	var updateData = function()
	{
		var productsAmount = window.shoppingBasketLogics.productsAmount;
		if (productsAmount > 0)
		{	
			if (emptyTextElement)
			{
				emptyTextElement.style.display = 'none';
			}
			if (priceElement)
			{
				var productsPrice = window.shoppingBasketLogics.productsPrice;
				var text = productsPrice.toFixed(2);
				domHelper.setTextContent(priceValueElement, text);
				priceElement.style.display = 'block';
			}
			if (amountElement)
			{
				
				var text = window.translations['label_basketstatus_amount'].replace('%s', productsAmount);
				domHelper.setTextContent(amountElement, text);
				amountElement.style.display = 'block';
			}
		}
		else
		{
			if (emptyTextElement)
			{
				var text = window.translations['label_basketstatus_empty'];
				domHelper.setTextContent(emptyTextElement, text);
				emptyTextElement.style.display = 'block';
			}
			if (priceElement)
			{
				priceElement.style.display = 'none';
			}
			if (amountElement)
			{
				amountElement.style.display = 'none';
			}
		}
	}
	var self = this;
	
	var emptyTextElement = false;
	var amountElement = false;
	var priceElement = false;
	var priceValueElement = false;
	
	init();
};
window.ShoppingBasketSelectionComponent = function(componentElement)
{
	var init = function()
	{
		messageElement = _('.shoppingbasket_selection_message', componentElement)[0];
		
		var formElement = false;
		if (formElement = _('.shoppingbasket_form_block', componentElement)[0])
		{
			new ShoppingBasketSelectionForm(formElement);
		}
		var tableElement = false;
		if (tableElement = _('.shoppingbasket_productstable', componentElement)[0])
		{
			new ShoppingBasketSelectionTable(tableElement);
		}
		
		window.controller.addListener('startApplication', updateData);
		window.controller.addListener('shoppingBasketUpdated', updateData);
	}
	var updateData = function()
	{
		if (messageElement)
		{
			var message = window.shoppingBasketLogics.message;
			messageElement.innerHTML = message;
		}
	}
	var self = this;
	
	var messageElement = false;
	
	init();
}
window.ShoppingBasketSelectionTable = function(componentElement)
{
	var init = function()
	{
		rowsContainerElement = _('.shoppingbasket_productstable_rows', componentElement)[0];
		
		var element = _('.shoppingbasket_productsprice', componentElement)[0];
		if (element)
		{
			new ShoppingBasketSelectionProductsPrice(element);
		}
		var element = _('.shoppingbasket_deliveries', componentElement)[0];
		if (element)
		{
			new ShoppingBasketSelectionDeliveries(element);
		}
		var element = _('.shoppingbasket_totalprice', componentElement)[0];
		if (element)
		{
			new ShoppingBasketSelectionTotalPrice(element);
		}
		
		window.controller.addListener('startApplication', updateData);
		window.controller.addListener('shoppingBasketUpdated', updateData);
	}
	var updateData = function()
	{
		var products = window.shoppingBasketLogics.productsList;
		if (products.length > 0)
		{
			try
			{
				componentElement.style.display = 'table';
			}
			catch(e)
			{
				componentElement.style.display = 'block';
			}
			var usedIdIndex = {};
			for (var i=0; i<products.length; i++)
			{
				var basketProductId = products[i].basketProductId;			
				usedIdIndex[basketProductId] = true;
				
				var product = false;
				if (!productRowsIndex[basketProductId])
				{
					var element = _('.shoppingbasket_product_'+basketProductId, rowsContainerElement)[0];
					if (element)
					{
						product = new ShoppingBasketSelectionProduct(products[i], element);
						productRowsIndex[basketProductId] = product;
						productRowsList.push(product);
					}
				}
				else
				{
					product = productRowsIndex[basketProductId];
				}
				
				if (product)
				{
					product.updateContents();
				}
			}
			for (var i=0; i<productRowsList.length; i++)
			{
				var basketProductId = productRowsList[i].basketProductId;
				if (typeof usedIdIndex[basketProductId] == 'undefined')
				{
					rowsContainerElement.removeChild(productRowsList[i].componentElement);
					delete productRowsIndex[basketProductId];
					productRowsList.splice(i, 1);
				}
			}
		}
		else
		{
			componentElement.style.display = 'none';
		}
	}
	var self = this;
	
	var rowsContainerElement = false;
	var productRowsList = new Array();
	var productRowsIndex = {};
	
	init();
}
window.ShoppingBasketSelectionProduct = function(initData, initElement)
{
	var init = function()
	{
		self.componentElement = initElement;
		
		productData = initData;
		self.basketProductId = productData.basketProductId;
		
		totalPriceElement = _('.shoppingbasket_product_totalprice_value', self.componentElement)[0];
		if (amountPlusButton = _('.shoppingbasket_product_amount_plus', self.componentElement)[0])
		{
			eventsManager.addHandler(amountPlusButton, 'click', plusClickHandler);
		}
		if (amountMinusButton = _('.shoppingbasket_product_amount_minus', self.componentElement)[0])
		{
			eventsManager.addHandler(amountMinusButton, 'click', minusClickHandler);
		}
		if (amountInput = _('.shoppingbasket_product_amount_input', self.componentElement)[0])
		{
			eventsManager.addHandler(amountInput, 'keyup', amountKeyUpHandler);
			eventsManager.addHandler(amountInput, 'change', amountChangeHandler);
		}
		if (removeButton = _('.shoppingbasket_product_remove_button', self.componentElement)[0])
		{
			eventsManager.addHandler(removeButton, 'click', removeClickHandler);
		}
		self.updateContents();
	}
	var plusClickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		var amount = parseInt(amountInput.value, 10);
		amount = amount + 1;
		amountInput.value = amount;
		
		window.clearTimeout(changeTimeOut);
		changeTimeOut = window.setTimeout(changeAmount, amountUpDelay);
	}
	var minusClickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		var amount = parseInt(amountInput.value, 10);
		amount = amount - 1;
		
		if (amount < 1)
		{
			amount = 1;
		}
		
		amountInput.value = amount;
		
		window.clearTimeout(changeTimeOut);
		changeTimeOut = window.setTimeout(changeAmount, amountUpDelay);
	}
	var amountKeyUpHandler = function()
	{
		window.clearTimeout(changeTimeOut);
		changeTimeOut = window.setTimeout(changeAmount, keyUpDelay);
	}
	var changeAmount = function()
	{
		var amount = parseInt(amountInput.value, 10);
		if (!isNaN(amount) && amount > 0)
		{
			window.shoppingBasketLogics.changeAmount(self.basketProductId, amount);
		}		
	}
	var amountChangeHandler = function()
	{
		window.clearTimeout(changeTimeOut);
		
		var amount = parseInt(amountInput.value, 10);
		if (isNaN(amount) || amount < 1)
		{
			amount = 1;
		}
		if (amountInput.value != amount)
		{
			amountInput.value = amount;
		}
		changeAmount();
	}
	var removeClickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		window.shoppingBasketLogics.removeProduct(self.basketProductId);
	}
	this.updateContents = function()
	{
		window.domHelper.setTextContent(totalPriceElement, productData.totalPrice.toFixed(2));
	}
	var self = this;
	
	
	var productData = false;
	var changeTimeOut = false;
	var keyUpDelay = 400;
	var amountUpDelay = 200;
	
	var totalPriceElement = false;
	var amountPlusButton = false;
	var amountMinusButton = false;
	var amountInput = false;
	
	this.componentElement = false;
	this.basketProductId = false;
	init();
}
window.ShoppingBasketSelectionProductsPrice = function(componentElement)
{
	var init = function()
	{
		if (productsPriceElement = _('.shoppingbasket_productsprice_value', componentElement)[0])
		{		
			window.controller.addListener('startApplication', updateData);
			window.controller.addListener('shoppingBasketUpdated', updateData);
		}
	}
	var updateData = function()
	{
		var productsPrice = window.shoppingBasketLogics.productsPrice;
		domHelper.setTextContent(productsPriceElement, productsPrice.toFixed(2));		
	}
	var self = this;
	
	var productsPriceElement = false;
	
	init();
}
window.ShoppingBasketSelectionTotalPrice = function(componentElement)
{
	var init = function()
	{
		if (totalPriceElement = _('.shoppingbasket_totalprice_value', componentElement)[0])
		{		
			window.controller.addListener('startApplication', updateData);
			window.controller.addListener('shoppingBasketUpdated', updateData);
		}
	}
	var updateData = function()
	{
		var totalPrice = window.shoppingBasketLogics.totalPrice;
		domHelper.setTextContent(totalPriceElement, totalPrice.toFixed(2));
	}
	var self = this;
	
	var productsPriceElement = false;
	
	init();
}

window.ShoppingBasketSelectionDeliveries = function(componentElement)
{
	var init = function()
	{
		window.controller.addListener('startApplication', updateData);
		window.controller.addListener('shoppingBasketUpdated', updateData);
	}
	var updateData = function()
	{
		regionsList = new Array();
		
		var regions = window.shoppingBasketLogics.regionsList;
		for (var i=0; i<regions.length; i++)
		{
			regionsList.push(regions[i]);
		}
		var cities = window.shoppingBasketLogics.getSelectedRegionCitiesList();
		for (var i=0; i<cities.length; i++)
		{
			citiesList.push(cities[i]);
		}
		
		refreshContents();
	}
	var refreshContents = function()
	{
		if (regionsList.length > 0)
		{
			domHelper.removeClass(componentElement, 'hidden');
			
			while(componentElement.firstChild)
			{
				componentElement.removeChild(componentElement.firstChild);
			}
			deliveryRowsIndex = {};
			deliveryRowsList = new Array();
			
			var regionSelectorComponent = new ShoppingBasketSelectionRegionSelector(regionsList);
			
			var deliveryTypes = window.shoppingBasketLogics.deliveryTypesList;
			for (var i=0; i<deliveryTypes.length; i++)
			{
				if (i == 0)
				{
					var delivery = new ShoppingBasketSelectionDelivery(deliveryTypes[i], regionSelectorComponent.componentElement);
				}
				else
				{
					var delivery = new ShoppingBasketSelectionDelivery(deliveryTypes[i]);
				}
				componentElement.appendChild(delivery.componentElement);
				
				deliveryRowsIndex[delivery.id] = delivery;
				deliveryRowsList.push(delivery);
			}
		}
		else
		{
			domHelper.addClass(componentElement, 'hidden');
		}
	}
	var self = this;
	
	var regionsList = new Array();
	var citiesList = new Array();
	
	var deliveryRowsList = new Array();
	var deliveryRowsIndex = {};
	
	init();
}
window.ShoppingBasketSelectionDelivery = function(deliveryData, externalCellElement)
{
	var init = function()
	{
		self.id = deliveryData.id;
		self.componentElement = document.createElement('tr');
		
		if (self.id == window.shoppingBasketLogics.selectedDeliveryTypeId)
		{
			selected = true;
		}
		
		createDomElements();
		refreshContents();
	}
	var createDomElements = function()
	{
		if (typeof externalCellElement != 'undefined')
		{
			self.componentElement.appendChild(externalCellElement);
		}
		
		titleCell = document.createElement('td');
		titleCell.colSpan = '2';
		titleCell.className = 'shoppingbasket_delivery_title';
		self.componentElement.appendChild(titleCell);
		
		priceCell = document.createElement('td');
		priceCell.className = 'shoppingbasket_delivery_price';
		self.componentElement.appendChild(priceCell);
		
		selectorCell = document.createElement('td');
		selectorCell.className = 'shoppingbasket_delivery_selector';
		self.componentElement.appendChild(selectorCell);
		
		radioButton = document.createElement('input');
		radioButton.type = 'radio';
		radioButton.name = 'shoppingbasket_delivery_radiobutton';
		radioButton.value = self.id;
		radioButton.className = 'shoppingbasket_delivery_radiobutton radio_holder';
		
		if (selected)
		{
			radioButton.checked = true;
		}
		
		selectorCell.appendChild(radioButton);
		eventsManager.addHandler(radioButton, 'change', radioChangeHandler);
		window.radioButtonManager.makeRadioButtons(self.componentElement);
	}
	var refreshContents = function()
	{
		window.domHelper.setTextContent(titleCell, deliveryData.title);
		window.domHelper.setTextContent(priceCell, deliveryData.price.toFixed(2)+' '+selectedCurrencyItem.currencyName);
	}
	var radioChangeHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		if (radioButton.checked == true)
		{
			window.shoppingBasketLogics.selectDelivery(self.id);
		}
	}

	var self = this;
	
	var titleCell = false;
	var priceCell = false;
	var selectorCell = false;
	var radioButton = false;
	
	var selected = false;
	
	this.componentElement = false;
	this.id = false;
	init();
}
window.ShoppingBasketSelectionRegionSelector = function(regionsList)
{
	var init = function()
	{
		self.componentElement = document.createElement('td');
		self.componentElement.colSpan = '2';
		self.componentElement.rowSpan = window.shoppingBasketLogics.deliveryTypesList.length;
		self.componentElement.className = 'shoppingbasket_delivery_label';
		
		deliveryTextElement = document.createElement('div');
		deliveryTextElement.className = 'shoppingbasket_delivery_text';
		window.domHelper.setTextContent(deliveryTextElement, window.translations['label_basketdeliveries_select']);
		self.componentElement.appendChild(deliveryTextElement);
		
		regionDropDown = false;
		if (regionsList = window.shoppingBasketLogics.regionsList)
		{		
			var parameters = {};
			parameters.changeCallback = regionDropDownChange;
			parameters.className = 'shoppingbasket_delivery_region_selector';
			parameters.optionsData = new Array();
			for (var i=0;i<regionsList.length;i++)
			{
				var regionData = regionsList[i];
				if (regionData.id == window.shoppingBasketLogics.selectedRegionId)
				{
					parameters.optionsData.push({value:regionData.id, text:regionData.title, selected: true});
				}
				else
				{
					parameters.optionsData.push({value:regionData.id, text:regionData.title, selected: false});
				}
			}
			regionDropDown = window.dropDownManager.createDropDown(parameters);
			self.componentElement.appendChild(regionDropDown.componentElement);
		}
		
		cityDropDown = false;
		var selectedRegion = window.shoppingBasketLogics.getSelectedRegion();
		if (selectedRegion && selectedRegion.citiesList.length > 0)
		{
			var parameters = {};
			parameters.changeCallback = cityDropDownChange;
			parameters.className = 'shoppingbasket_delivery_city_selector';
			parameters.optionsData = new Array();
			for (var i=0;i<selectedRegion.citiesList.length;i++)
			{
				var cityData = selectedRegion.citiesList[i];
				if (cityData.id == window.shoppingBasketLogics.selectedCityId)
				{
					parameters.optionsData.push({value:cityData.id, text:cityData.title, selected: true});
				}
				else
				{
					parameters.optionsData.push({value:cityData.id, text:cityData.title, selected: false});
				}
			}
			cityDropDown = window.dropDownManager.createDropDown(parameters);
			
			self.componentElement.appendChild(cityDropDown.componentElement);
		}
	}
	var updateData = function()
	{
		var totalPrice = window.shoppingBasketLogics.totalPrice;
		domHelper.setTextContent(totalPriceElement, totalPrice.toFixed(2));
	}
	var regionDropDownChange = function()
	{
		window.shoppingBasketLogics.selectDeliveryTargetId(regionDropDown.value);
	}
	var cityDropDownChange = function()
	{
		window.shoppingBasketLogics.selectDeliveryTargetId(cityDropDown.value);
	}
	var self = this;
	var deliveryTextElement = false;
	var regionDropDown = false;
	var cityDropDown = false;
	this.componentElement = false;
	
	init();
}
window.ShoppingBasketSelectionForm = function(componentElement)
{
	var init = function()
	{
		if (formElement = _('.shoppingbasket_form', componentElement)[0])
		{
			if (submitButton = _('.shoppingbasket_form_submit')[0])
			{
				eventsManager.addHandler(submitButton, 'click', submitForm);
				eventsManager.addHandler(formElement, 'keydown', checkKey);
			}
			if (payerCheckBoxElement = _('.shoppingbasket_payer_data_controls input', formElement)[0])
			{
				if (payerDataElement = _('.shoppingbasket_payer_data', formElement)[0])
				{
					eventsManager.addHandler(payerCheckBoxElement, 'change', refresh);
				}
			}
			receiverCityElement = _('.shoppingbasket_receiver_city', formElement)[0];
			receiverRegionElement = _('.shoppingbasket_receiver_region', formElement)[0];
			conditionsTextElement = _('.shoppingbasket_form_conditions_text', formElement)[0];
			
			window.controller.addListener('startApplication', refresh);
			window.controller.addListener('shoppingBasketUpdated', refresh);
		}
	}
	var checkKey = function(event)
	{
		if (event.keyCode == 13)
		{
			formElement.submit();
		}
	}
	var refresh = function(event)
	{
		var products = window.shoppingBasketLogics.productsList;
		if (products.length > 0)
		{
			componentElement.style.display = 'block';
			
			if (payerDataElement)
			{
				if (payerCheckBoxElement.checked == true)
				{
					hidePayerData();
				}
				else
				{
					displayPayerData();
				}
				if (!payerContainerDisplayed)
				{
					payerContainerDisplayed = true;
				}
				else
				{
					payerContainerDisplayed = false;
				}
			}
		}
		else
		{
			componentElement.style.display = 'none';
		}
		var selectedRegion = window.shoppingBasketLogics.getSelectedRegion();
		if (receiverRegionElement)
		{
			receiverRegionElement.value = selectedRegion.title;
		}
		var selectedCity = window.shoppingBasketLogics.getSelectedCity();
		if (receiverCityElement)
		{
			if (selectedCity)
			{
				receiverCityElement.value = selectedCity.title;
			}
			else
			{
				receiverCityElement.value = '';
			}
		}
		if (conditionsTextElement)
		{
			conditionsTextElement.innerHTML = selectedRegion.conditionsText;
		}
	}
	var displayPayerData = function()
	{
		var parameters = {end: payerDataElement.scrollHeight, step: 1, acceleration: 0.5};
		effectsManager.startEffect('slide', payerDataElement, parameters);
	}
	var hidePayerData = function()
	{
		var parameters = {end: 0, step: 0.5, acceleration: 2};
		effectsManager.startEffect('slide', payerDataElement, parameters);
	}
	var submitForm = function(event)
	{
		eventsManager.preventDefaultAction(event);
		formElement.submit();
	}

	var self = this;	
	
	var payerContainerDisplayed = false;
	
	var payerCheckBoxElement = false;
	var payerDataElement = false;
	var receiverRegionElement = false;
	var receiverCityElement = false;
	var conditionsTextElement = false;
	var submitButton = false;
	var formElement = false;
	init();
};
window.BubbleComponent = function(referralElement, content)
{
	var init = function()
	{
		componentElement = document.createElement('div');
		componentElement.className = 'bubble_component';
		componentElement.style.position = 'absolute';
		componentElement.style.display = 'none';
		
		backgroundElement = document.createElement('div');
		backgroundElement.className = 'bubble_background';
		componentElement.appendChild(backgroundElement);
		
		var leftElement = document.createElement('div');
		leftElement.className = 'bubble_block_left';
		backgroundElement.appendChild(leftElement);
		
		var centerElement = document.createElement('div');
		centerElement.className = 'bubble_block_center';
		backgroundElement.appendChild(centerElement);
		
		var rightElement = document.createElement('div');
		rightElement.className = 'bubble_block_right';
		backgroundElement.appendChild(rightElement);

		contentElement = document.createElement('div');
		contentElement.className = 'bubble_content';
		contentElement.innerHTML = content;
		componentElement.appendChild(contentElement);
		
		document.body.appendChild(componentElement);
		
		if (navigator.appVersion.match(/MSIE ([\d.]+);/))
		{
			internetExplorerBackgroundFix(leftElement);
			internetExplorerBackgroundFix(centerElement);
			internetExplorerBackgroundFix(rightElement);
		}
	}
	this.start = function()
	{
		var parentPositions = window.mouseTracker.getElementCoordinates(referralElement);
		
		componentElement.style.visibility = 'hidden';
		componentElement.style.display = 'block';
		
		positionedX = parentPositions.left + referralElement.offsetWidth/2 - componentElement.offsetWidth/2;
		positionedY = parentPositions.top - componentElement.offsetHeight - yOffset/2;
		
		var startX = positionedX;
		var startY = positionedY + yOffset;
		componentElement.style.left = startX + 'px';
		componentElement.style.top = startY + 'px';
		
		componentElement.style.visibility = 'visible';
		
		opacityHandler.setOpacity(contentElement, 0);
		opacityHandler.setOpacity(backgroundElement, 0);
		
		var parameters = {end:1, step: 0.05};
		effectsManager.startEffect('opacity', contentElement, parameters);
		var parameters = {end:1, step: 0.05};
		effectsManager.startEffect('opacity', backgroundElement, parameters);
		
		var parameters = {xTarget: positionedX, yTarget: positionedY, step: 0.05, acceleration: 0.12};
		effectsManager.startEffect('position', componentElement, parameters, wait);
	}
	var wait = function()
	{
		window.setTimeout(completeAnimation, waitDelay);
	}
	var completeAnimation = function()
	{
		var endX = positionedX;
		var endY = positionedY - yOffset;
	
		var parameters = {start: 1, end:0, step: 0.04};
		effectsManager.startEffect('opacity', contentElement, parameters);
		var parameters = {start: 1, end:0, step: 0.04};
		effectsManager.startEffect('opacity', backgroundElement, parameters);
		
		var parameters = {xTarget: endX, yTarget: endY, step: 0.05, acceleration: 0.10};
		effectsManager.startEffect('position', componentElement, parameters, destroyComponent);
	}
	var destroyComponent = function()
	{
		componentElement.parentNode.removeChild(componentElement);
	}
	var internetExplorerBackgroundFix = function(element)
	{
		var fixImage = document.createElement('div');
		fixImage.style.top = '0';
		fixImage.style.left = '0';
		fixImage.style.width = '100%';
		fixImage.style.height = '100%';
		
		var expression = /url\(\"(.*)?\"\)/i;
		
		var result = false;
		if (result = expression.exec(element.currentStyle.backgroundImage))
		{
			var currentBackground = result[1];
		}
		if (currentBackground)
		{
			fixImage.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+currentBackground+'",sizingMethod="scale")';
		}
		element.style.backgroundImage = 'none';
		element.appendChild(fixImage);
	}
	var self = this;
	var waitDelay = 700;
	
	var componentElement = false;
	var backgroundElement = false;
	var contentElement = false;
	
	var positionedX = false;
	var positionedY = false;
	var yOffset = 16;
	init();
};
window.DropDownComponent = function(importedElement, parameters)
{
	var init = function()
	{
		if (typeof parameters != 'undefined')
		{
			parseParameters(parameters);
		}
		if (typeof importedElement == 'object')
		{
			parseSelectElement(importedElement);
		}
		prepareDomStructure();

		window.eventsManager.addHandler(self.selectorElement, 'change', refreshStatus);
		refreshStatus();
	};
	var parseSelectElement = function(importedElement)
	{
		optionsDataList = new Array();
		if (importedElement.tagName == 'select' || importedElement.tagName == 'SELECT')
		{
			self.selectorElement = importedElement;
			for (var i = 0; i < importedElement.options.length; i++)
			{
				var optionElement = importedElement.options[i];

				var optionData = {};
				optionData['value'] = optionElement.value;
				optionData['className'] = optionElement.className;
				optionData['text'] = optionElement.text;
				optionData['selected'] = optionElement.selected;

				optionsDataList.push(optionData);
			}
			importedElement.style.display = 'none';
		}

		customClassName = '';
		var classes = self.selectorElement.className.split(' ');
		for (var i=0; i<classes.length; i++)
		{
			if (classes[i] != 'dropDownComponent')
			{
				customClassName = customClassName+' '+classes[i];
			}
		}
	};
	var parseParameters = function(parameters)
	{
		if (typeof parameters.optionsData != 'undefined')
		{
			optionsDataList = parameters.optionsData;
			for (var i = 0; i < optionsDataList.length; i++)
			{
				var optionData = optionsDataList[i];
			}
		}
		if (typeof parameters.changeCallback != 'undefined')
		{
			changeCallback = parameters.changeCallback;
		}
		if (typeof parameters.className != 'undefined')
		{
			customClassName = parameters.className;
		}
	};
	var prepareDomStructure = function()
	{
		var componentClass = 'dropdown_block';

		if (customClassName != '')
		{
			componentClass += ' '+customClassName;
		}

		self.componentElement = document.createElement('a');
		self.componentElement.href = '';
		self.componentElement.className = componentClass;

		window.eventsManager.addHandler(self.componentElement, 'click', clickHandler);
		window.eventsManager.addHandler(self.componentElement, 'focus', clearSearchTitle);
		window.eventsManager.addHandler(self.componentElement, 'keydown', keyPressHandler);

		var element = document.createElement('span');
		element.className = 'dropdown_block_left';
		self.componentElement.appendChild(element);
		var element = document.createElement('span');
		element.className = 'dropdown_block_center';
		self.componentElement.appendChild(element);
		var element = document.createElement('span');
		element.className = 'dropdown_block_right';
		self.componentElement.appendChild(element);
		var element = document.createElement('span');
		element.className = 'dropdown_arrow';
		self.componentElement.appendChild(element);

		titleElement = document.createElement('span');
		titleElement.className = 'dropdown_title';
		self.componentElement.appendChild(titleElement);

		if (!self.selectorElement)
		{
			self.selectorElement = document.createElement('select');
			fillSelectorElement();
			self.componentElement.appendChild(self.selectorElement);
		}
		self.selectorElement.style.display = 'none';

		if (!optionsDataComponent)
		{
			optionsDataComponent = new DropDownComponentList(self, optionsDataList);
			document.body.appendChild(optionsDataComponent.componentElement);
		}

	};
	var fillSelectorElement = function()
	{
		for (var i=0; i<optionsDataList.length; i++)
		{
			var info = optionsDataList[i];

			var option = document.createElement('option');
			option.value = info.value;
			option.text = info.text;
			if (typeof info.className != 'undefined')
			{
				option.className = info.className;
			}
			option.selected = info.selected;
			try
			{
				self.selectorElement.add(option, null);
			}
			catch(ex)
			{
				self.selectorElement.add(option);
			}
		}
	};
	var clickHandler = function(event)
	{
		window.eventsManager.preventDefaultAction(event);
		window.eventsManager.cancelBubbling(event);

		if (optionsDataComponent.displayed)
		{
			optionsDataComponent.hideComponent();
		}
		else
		{
			window.dropDownManager.hideLists();
			optionsDataComponent.displayComponent();
			self.componentElement.focus(); //fix for chrome losing focus
		}
	};
	var refreshStatus = function()
	{
		self.selectedIndex = self.selectorElement.selectedIndex;

		self.value = self.selectorElement.value;
		self.text = '';
		if (optionsDataList[self.selectedIndex])
		{
			if (typeof optionsDataList[self.selectedIndex].displayText != 'undefined')
			{
				self.text = optionsDataList[self.selectedIndex].displayText;
			}
			else
			{
				self.text = optionsDataList[self.selectedIndex].text;
			}
		}

		setTextContent(titleElement, self.text);

		if (optionsDataComponent)
		{
			optionsDataComponent.updateScroll(self.selectedIndex);
		}
	};
	var keyPressHandler = function(event)
	{
		if (event.keyCode == '40')
		{
			window.eventsManager.preventDefaultAction(event);
			setNextOption();
		}
		if (event.keyCode == '38')
		{
			window.eventsManager.preventDefaultAction(event);
			setPreviousOption();
		}
		if (event.keyCode == '35')
		{
			window.eventsManager.preventDefaultAction(event);
			setLastOption();
		}
		if (event.keyCode == '36')
		{
			window.eventsManager.preventDefaultAction(event);
			setFirstOption();
		}
		if (event.keyCode == '8')
		{
			window.eventsManager.preventDefaultAction(event);
			var title = getCurrentSearchTitle(false);
			setFoundTitle(title);
		}
		if (event.keyCode >= '65' && event.keyCode <= '90' || event.keyCode == '32' || event.keyCode >= '48' && event.keyCode <= '57')
		{
			window.eventsManager.preventDefaultAction(event);
			var letter = String.fromCharCode(event.keyCode);
			var title = getCurrentSearchTitle(letter);
			setFoundTitle(title);
		}
	};
	var getCurrentSearchTitle = function(letter)
	{
		if (letter === false)
		{
			currentSearchTitle = currentSearchTitle.substring(0, currentSearchTitle.length - 1);
		}
		else if (typeof letter !== 'undefined')
		{
			currentSearchTitle = currentSearchTitle+letter;
		}
		return currentSearchTitle;
	};
	var clearSearchTitle = function()
	{
		currentSearchTitle = '';
	};
	var setFoundTitle = function(title)
	{
		var expression = new RegExp('^'+title,'i');

		for (var i=0; i<optionsDataList.length; i++)
		{
			if (expression.test(optionsDataList[i].text))
			{
				self.setValue(optionsDataList[i].value);
				break;
			}
		}
		window.clearTimeout(searchTitleTimeout);
		searchTitleTimeout = window.setTimeout(clearSearchTitle, 1500);
	};
	var setFirstOption = function()
	{
		if (optionsDataList.length > 0)
		{
			self.setSelectedIndex(0);
		}
		clearSearchTitle();
	};
	var setLastOption = function()
	{
		if (optionsDataList.length > 0)
		{
			self.setSelectedIndex(optionsDataList.length-1);
		}
		clearSearchTitle();
	};
	var setNextOption = function()
	{
		if (self.selectedIndex !== false)
		{
			var nextOptionNumber = self.selectedIndex + 1;
			if (nextOptionNumber < optionsDataList.length)
			{
				self.setSelectedIndex(nextOptionNumber);
				clearSearchTitle();
			}
		}
		else
		{
			setFirstOption();
		}
	};
	var setPreviousOption = function()
	{
		if (self.selectedIndex !== false)
		{
			var previousOptionNumber = self.selectedIndex - 1;
			if (previousOptionNumber >= 0)
			{
				self.setSelectedIndex(previousOptionNumber);
				clearSearchTitle();
			}
		}
	};
	var setTextContent = function(element, text)
	{
		while(element.firstChild)
		{
			element.removeChild(element.firstChild);
		}
		element.appendChild(document.createTextNode(text));
	};
	this.setSelectedIndex = function(selectedIndex)
	{
		self.selectorElement.selectedIndex = selectedIndex;
		window.eventsManager.fireEvent(self.selectorElement, 'change');

		if (changeCallback)
		{
			changeCallback(self);
		}
	};
	this.getValue = function()
	{
		return self.selectorElement.value;
	};
	this.setDisabled = function(value)
	{
		self.disabled = value;
		self.selectorElement.disabled = value;
		window.eventsManager.fireEvent(self.selectorElement, 'change');
	};
	this.setValue = function(value)
	{
		self.selectorElement.value = value;
		window.eventsManager.fireEvent(self.selectorElement, 'change');

		if (changeCallback)
		{
			changeCallback(self);
		}
	};
	this.hideList = function()
	{
		if (optionsDataComponent.displayed)
		{
			optionsDataComponent.hideComponent();
		}
	};
	this.update = function()
	{
		parseSelectElement(self.selectorElement);
		if (optionsDataComponent)
		{
			optionsDataComponent.updateInfo(optionsDataList);
		}
		refreshStatus();
	};
	this.updateOptionsData = function(optionsData)
	{
		while (self.selectorElement.firstChild)
		{
			self.selectorElement.removeChild(self.selectorElement.firstChild);
		}
		optionsDataList = optionsData;
		fillSelectorElement();

		optionsDataComponent.updateInfo(optionsDataList);

		window.eventsManager.fireEvent(self.selectorElement, 'change');
	};
	this.displayComponent = function()
	{
		self.componentElement.style.display = 'block';
	};
	this.hideComponent = function()
	{
		self.componentElement.style.display = 'none';
	};
	var self = this;

	//public properties
	this.componentElement = false;
	this.selectedIndex = false;
	this.value = false;
	this.text = false;
	this.disabled = false;
	this.selectorElement = false;

	//dom structure
	var selectedOptionNumber = false;
	var titleElement = false;
	var optionsDataComponent = false;

	//private properties
	var searchTitleTimeout = false;
	var currentSearchTitle = false;
	var changeCallback = false;
	var optionsDataList = new Array();

	var customClassName = '';

	init();
};
window.DropDownComponentList = function(parentObject, initOptionsData)
{
	var init = function()
	{
		prepareDomStructure();
	}
	var prepareDomStructure = function()
	{
		self.componentElement = document.createElement('div');
		self.componentElement.className = 'dropdown_list';
		self.componentElement.style.display = 'none';
		window.eventsManager.addHandler(self.componentElement, 'mousewheel', mouseWheelHandler);

		var element = document.createElement('span');
		element.className = 'dropdown_list_top_left';
		self.componentElement.appendChild(element);
		var element = document.createElement('span');
		element.className = 'dropdown_list_top';
		self.componentElement.appendChild(element);
		var element = document.createElement('span');
		element.className = 'dropdown_list_top_right';
		self.componentElement.appendChild(element);
		var element = document.createElement('span');
		element.className = 'dropdown_list_left';
		self.componentElement.appendChild(element);
		var element = document.createElement('span');
		element.className = 'dropdown_list_center';
		self.componentElement.appendChild(element);
		var element = document.createElement('span');
		element.className = 'dropdown_list_right';
		self.componentElement.appendChild(element);
		var element = document.createElement('span');
		element.className = 'dropdown_list_bottom_left';
		self.componentElement.appendChild(element);
		var element = document.createElement('span');
		element.className = 'dropdown_list_bottom';
		self.componentElement.appendChild(element);
		var element = document.createElement('span');
		element.className = 'dropdown_list_bottom_right';
		self.componentElement.appendChild(element);

		contentElement = document.createElement('span');
		contentElement.className = 'dropdown_list_content';
		self.componentElement.appendChild(contentElement);

		scrollUpButton = document.createElement('span');
		scrollUpButton.className = 'dropdown_list_scrollup';
		self.componentElement.appendChild(scrollUpButton);
		window.eventsManager.addHandler(scrollUpButton, 'mouseover', startScrollUp);
		window.eventsManager.addHandler(scrollUpButton, 'mouseout', stopScroll);

		scrollDownButton = document.createElement('span');
		scrollDownButton.className = 'dropdown_list_scrolldown';
		self.componentElement.appendChild(scrollDownButton);
		window.eventsManager.addHandler(scrollDownButton, 'mouseover', startScrollDown);
		window.eventsManager.addHandler(scrollDownButton, 'mouseout', stopScroll);

		self.updateInfo(initOptionsData);
	}
	var mouseWheelHandler = function(event)
	{
		window.eventsManager.preventDefaultAction(event);
		var delta = window.mouseTracker.getDelta(event);

		contentElement.scrollTop = contentElement.scrollTop - listItemHeight * delta;
	}
	var refreshStatus = function()
	{
		if (listItems.length > 0)
		{
			listItemHeight = listItems[0].componentElement.offsetHeight;
		}

		if (self.componentElement.offsetWidth < parentObject.componentElement.offsetWidth)
		{
			self.componentElement.style.width = parentObject.componentElement.offsetWidth + 'px';
		}
		if (self.componentElement.offsetWidth < self.componentElement.scrollWidth)
		{
			self.componentElement.style.width = parentObject.componentElement.scrollWidth + 'px';
		}

		if (window.pageYOffset)
		{
			var viewPortTop = window.pageYOffset;
		}
		else
		{
			var viewPortTop = document.documentElement.scrollTop;
		}

		if (window.innerHeight)
		{
			var viewPortHeight = window.innerHeight;
		}
		else
		{
			var viewPortHeight = document.documentElement.offsetHeight;
		}
		var dropDownPositions = getElementPositions(parentObject.componentElement);
		var dropDownLeft = dropDownPositions.x;
		var dropDownTop = dropDownPositions.y;
		var dropDownHeight = parentObject.componentElement.offsetHeight;
		var buttonsOffsets = scrollUpButton.offsetHeight + scrollDownButton.offsetHeight;

		//calculate possible list heights
		contentElement.style.height = 'auto';
		var fullHeight = contentElement.offsetHeight;

		var maximumHeightAbove = (dropDownTop - viewPortTop) - buttonsOffsets - screenOffset;
		var maximumHeightBelow = (viewPortTop + viewPortHeight - buttonsOffsets - screenOffset) - (dropDownTop + dropDownHeight);
		var minHeight = listItemHeight * minListItemsCount;

		var appliedHeight = false;
		var position = false;
		if (maximumHeightBelow > maximumHeightAbove || fullHeight < maximumHeightBelow)
		{
			position = 'below';
			if (fullHeight > maximumHeightBelow)
			{
				appliedHeight = maximumHeightBelow;
			}
			else
			{
				appliedHeight = fullHeight;
			}
		}
		else
		{
			position = 'above';
			if (fullHeight > maximumHeightAbove)
			{
				appliedHeight = maximumHeightAbove;
			}
			else
			{
				appliedHeight = fullHeight;
			}
		}
		contentElement.style.height = appliedHeight + 'px';

		//calculate list position
		if (position == 'above')
		{
			var leftPosition = (dropDownLeft);
			var topPosition = dropDownTop - appliedHeight - buttonsOffsets;
		}
		else
		{
			var leftPosition = (dropDownLeft);
			var topPosition = (dropDownTop + dropDownHeight);
		}

		self.componentElement.style.left = leftPosition + 'px';
		self.componentElement.style.top = topPosition + 'px';

		//decide whether scroll button should be displayed
		if (contentElement.scrollHeight > contentElement.offsetHeight)
		{
			scrollUpButton.style.visibility = 'visible';
			scrollDownButton.style.visibility = 'visible';

			if (contentElement.offsetHeight + contentElement.scrollTop < parentObject.selectedIndex * listItemHeight + listItemHeight)
			{
				contentElement.scrollTop = parentObject.selectedIndex * listItemHeight + listItemHeight - contentElement.offsetHeight;
			}
			else if (contentElement.scrollTop > parentObject.selectedIndex * listItemHeight)
			{
				contentElement.scrollTop = parentObject.selectedIndex * listItemHeight;
			}
		}
		else
		{
			scrollUpButton.style.visibility = 'hidden';
			scrollDownButton.style.visibility = 'hidden';
		}
	}
	this.updateScroll = function(selectedIndex)
	{
		if (typeof listItems[selectedIndex] != 'undefined')
		{
			var scrollTop = listItems[selectedIndex].componentElement.offsetTop;
			contentElement.scrollTop = scrollTop;
		}
	}
	var getElementPositions = function(domElement)
	{
		var elementLeft = 0;
		var elementTop = 0;

		if (domElement.offsetParent)
		{
			var elementLeft = domElement.offsetLeft;
			var elementTop = domElement.offsetTop;
			while (domElement = domElement.offsetParent)
			{
				if (domElement.tagName.toLowerCase() != 'body' && domElement.tagName.toLowerCase() != 'html')
				{
					elementLeft += domElement.offsetLeft - domElement.scrollLeft;
					elementTop += domElement.offsetTop - domElement.scrollTop;
				}
				else
				{
					elementLeft += domElement.offsetLeft;
					elementTop += domElement.offsetTop;
				}
			}
		}
		return {x: elementLeft, y: elementTop};
	}
	var startScrollUp = function()
	{
		scrollTimeOut = window.setTimeout(scrollUp, scrollDelay);
	}
	var startScrollDown = function()
	{
		scrollTimeOut = window.setTimeout(scrollDown, scrollDelay);
	}
	var scrollUp = function()
	{
		contentElement.scrollTop = contentElement.scrollTop - scrollAmount;
		scrollTimeOut = window.setTimeout(scrollUp, scrollDelay);
	}
	var scrollDown = function()
	{
		contentElement.scrollTop = contentElement.scrollTop + scrollAmount;
		scrollTimeOut = window.setTimeout(scrollDown, scrollDelay);
	}
	var stopScroll = function()
	{
		window.clearTimeout(scrollTimeOut);
	}
	this.updateInfo = function(updateOptionsData)
	{
		optionsData = updateOptionsData;
		listItems = new Array();
		while (contentElement.firstChild)
		{
			contentElement.removeChild(contentElement.firstChild);
		}
		for (var i=0; i<optionsData.length; i++)
		{
			var listItem = new DropDownComponentListItem(self, optionsData[i]);
			contentElement.appendChild(listItem.componentElement);
			listItems.push(listItem);
		}
	}
	this.itemClicked = function(listItem)
	{
		self.hideComponent();
		parentObject.setValue(listItem.value);
	}
	this.displayComponent = function()
	{
		if (self.componentElement)
		{
			self.componentElement.style.visibility = 'hidden';
			self.componentElement.style.display = 'block';
			refreshStatus();
			self.componentElement.style.visibility = 'visible';
			self.displayed = true;
		}
	}
	this.hideComponent = function()
	{
		if (self.componentElement)
		{
			self.componentElement.style.display = 'none';
			self.displayed = false;
		}
	}
	var self = this;
	var listItems = new Array();

	var screenOffset = 30;
	var listItemHeight = 0;
	var scrollDelay = 25;
	var scrollAmount = 3;
	var scrollTimeOut = false;
	var minListItemsCount = 10;

	var contentElement = false;
	var scrollUpButton = false;
	var scrollDownButton = false;

	var optionsData = false;

	//public properties
	this.componentElement = false;
	this.value = false;
	this.displayed = false;

	init();
};
window.DropDownComponentListItem = function(parentObject, optionData)
{
	var init = function()
	{
		self.value = optionData.value;
		if (typeof optionData.text != 'undefined')
		{
			optionText = optionData.text;
		}
		if (typeof optionData.className != 'undefined')
		{
			customClassName = optionData.className;
		}

		prepareDomStructure();
	}
	var prepareDomStructure = function()
	{
		self.componentElement = document.createElement('a');
		self.componentElement.href = '';

		var newClassName = 'dropdown_option';
		if (customClassName)
		{
			newClassName = newClassName + ' '+customClassName;
		}
		self.componentElement.className = newClassName;

		window.eventsManager.addHandler(self.componentElement, 'click', clickHandler);

		setTextContent(self.componentElement, optionText);
	}
	var clickHandler = function(event)
	{
		window.eventsManager.preventDefaultAction(event);
		window.eventsManager.cancelBubbling(event);
		parentObject.itemClicked(self);
	}
	var setTextContent = function(element, text)
	{
		while(element.firstChild)
		{
			element.removeChild(element.firstChild);
		}
		element.appendChild(document.createTextNode(text));
	}
	var self = this;

	this.componentElement = false;

	this.value = false;

	var optionText = false;
	var customClassName = false;

	init();
};;
function CheckBoxComponent(inputElement)
{
	var importCheckBoxData = function()
	{
		if ((inputElement.tagName == 'input' || inputElement.tagName == 'INPUT') && inputElement.type == 'checkbox')
		{
			inputElement = inputElement;
			checked = inputElement.checked;
		}
		window.eventsManager.addHandler(inputElement, 'change', synchronize);
	}
	var createCheckBox = function()
	{
		checkBox = document.createElement('a');
		checkBox.href = '';
		checkBox.className = 'checkbox';
		if (checked)
		{
			checkBox.className = 'checkbox checked';
		}
		window.eventsManager.addHandler(checkBox, 'click', click);
		checkBox = checkBox;
		
		var parent = inputElement.parentNode;
		parent.insertBefore(checkBox, inputElement);
	}
	var hideInputElement = function()
	{
		inputElement.style.display = 'none';
	}
	var click = function(event)
	{
		window.eventsManager.preventDefaultAction(event);
		if (inputElement.checked)
		{
			inputElement.checked = false;
		}
		else
		{
			inputElement.checked = true;
		}
		window.eventsManager.fireEvent(inputElement, 'change');
	}
	var synchronize = function()
	{
		checked = inputElement.checked;
		if (checked)
		{
			checkBox.className = 'checkbox checked';
		}
		else
		{
			checkBox.className = 'checkbox';
		}
	}
	var self = this;
	var checkBox = null;
	var checked = false;

	importCheckBoxData();
	createCheckBox();
	hideInputElement();
};
function RadioButtonComponent(inputElement)
{
	var importRadioButtonData = function()
	{
		if ((inputElement.tagName == 'input' || inputElement.tagName == 'INPUT') && inputElement.type == 'radio')
		{
			inputElement.artWebRadioCreated = true;
			inputElement = inputElement;
			self.name = inputElement.name;
			self.value = inputElement.value;
			window.eventsManager.addHandler(inputElement, 'change', changeHandler);
		}
	}
	var createRadioButton = function()
	{
		radioButton = document.createElement('a');
		radioButton.href = '';
		radioButton.className = 'radiobutton';
		
		window.eventsManager.addHandler(radioButton, 'click', click);
		radioButton = radioButton;
		
		var parent = inputElement.parentNode;
		parent.insertBefore(radioButton, inputElement);
	}
	var hideInputElement = function()
	{
		inputElement.style.display = 'none';
	}
	var click = function(event)
	{
		window.eventsManager.preventDefaultAction(event);
		inputElement.checked = true;
		
		window.eventsManager.fireEvent(inputElement, 'change');
	}
	var changeHandler = function()
	{
		window.radioButtonManager.changeValue(self.name, self.value);
	}
	this.synchronize = function(value)
	{
		if (typeof value != 'undefined')
		{
			if (inputElement.value == value)
			{
				inputElement.checked = true;
			}
			else
			{
				inputElement.checked = false;
			}
		}
		refresh();
	}
	var refresh = function()
	{
		self.checked = inputElement.checked;
		if (self.checked)
		{
			radioButton.className = 'radiobutton radiobutton_checked';
		}
		else
		{
			radioButton.className = 'radiobutton';
		}
	}
	var self = this;
	var radioButton = null;
	
	this.checked = false;
	this.value = false;
	this.name = false;

	importRadioButtonData();
	createRadioButton();
	hideInputElement();
	refresh();
};
window.NewWindowLinkComponent = function(linkElement)
{
	var init = function()
	{
		eventsManager.addHandler(linkElement, 'click', clickHandler);
	}
	var clickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		window.open(linkElement.href);
	}
	var self = this;
	init();
};
window.SlideGalleryComponent = function (galleryInfo)
{
	var self = this;
	var imagesList = new Array();
	var imagesIndex = new Array();

	var selectorComponent;

	var rotationEnabled = true;

	var currentImageNumber;
	var currentImageId;
	var oldImageId;
	var changeDelay = 4000;

	var componentElement;
	var imagesElement;
	var titleElement;
	var newIndex = 0;

	var init = function ()
	{
		if (componentElement = document.getElementById('slide_gallery_' + galleryInfo.id))
		{
			if (galleryInfo.images)
			{
				initImages();
			}
			if (galleryInfo.displayTitle)
			{
				initGalleryTitle();
			}
			if (galleryInfo.displaySelector)
			{
				initGallerySelector();
			}
		}
		if (imagesList[0])
		{
			switchImage(imagesList[0].id, true);
		}

		if (imagesList.length > 1)
		{
			window.controller.addListener('DOMContentReady', startApplication);
		}
	};
	var initImages = function ()
	{
		if (imagesElement = _('.slide_gallery_images', componentElement)[0])
		{
			for (var i = 0; i < galleryInfo.images.length; i++)
			{
				var imageItem = new SlideGalleryItem(galleryInfo.images[i]);
				imagesElement.appendChild(imageItem.componentElement);
				imagesList.push(imageItem);
				imagesIndex[imageItem.id] = imageItem;
			}
		}
	};
	var initGalleryTitle = function ()
	{
		titleElement = _('.slide_gallery_title', componentElement)[0];
	};
	var initGallerySelector = function ()
	{
		var element = _('.slide_gallery_selector', componentElement)[0];
		if (element)
		{
			selectorComponent = new SlideGallerySelectorComponent(element, galleryInfo, self);
		}
	};
	var startApplication = function ()
	{
		currentImageNumber = 0;
		window.setInterval(recalculate, changeDelay);
	};
	var recalculate = function ()
	{
		if (rotationEnabled)
		{
			currentImageNumber = currentImageNumber + 1;
			if (currentImageNumber >= imagesList.length)
			{
				currentImageNumber = 0;
			}
			var newImageId = imagesList[currentImageNumber].id;
			switchImage(newImageId, false);
		}
	};
	var switchImage = function (newImageId, instantDisplay)
	{
		if (newImageId != currentImageId)
		{
			var oldImage = currentImageId;
			currentImageId = newImageId;

			if (imagesIndex[currentImageId])
			{
				newIndex++;
				imagesIndex[currentImageId].display(newIndex, function(){return function(id){hideImage(id)}(oldImage)}, instantDisplay);
			}
			if (titleElement)
			{
				titleElement.innerHTML = imagesIndex[currentImageId].title;
			}
			if (selectorComponent)
			{
				selectorComponent.enableButton(currentImageId);
			}
		}
	};
	var hideImage = function (imageId)
	{
		if (imageId != currentImageId)
		{
			if (imagesIndex[imageId])
			{
				imagesIndex[imageId].hide();
			}
		}
	};
	this.selectImage = function(imageId)
	{
		rotationEnabled = false;
		switchImage(imageId, false);
	};

	init();
};
window.SlideGalleryItem = function (imageInfo)
{
	this.id = null;
	this.title = null;

	var self = this;
	var componentElement;

	var init = function ()
	{

		self.id = imageInfo.id;
		self.title = imageInfo.title;

		componentElement = document.createElement('img');
		componentElement.src = imageInfo.bigImage;
		componentElement.className = 'slide_gallery_item';
		componentElement.style.display = 'block';
		opacityHandler.setOpacity(componentElement, 0);

		self.componentElement = componentElement;
	};
	this.display = function (newIndex, callback, instantDisplay)
	{
		if (!instantDisplay)
		{
			opacityHandler.setOpacity(componentElement, 0);
			componentElement.style.display = 'block';
			componentElement.style.zIndex = newIndex;

			var parameters = {end:1, step:0.010};
			effectsManager.startEffect('opacity', componentElement, parameters, callback);
		}
		else
		{
			opacityHandler.setOpacity(componentElement, 1);
			componentElement.style.zIndex = newIndex;
		}
	};
	this.hide = function ()
	{
		componentElement.style.display = 'none';
	};

	init();
};
window.SlideGallerySelectorComponent = function (componentElement, galleryInfo, parentComponent)
{
	var self = this;
	var buttonsList = new Array();
	var init = function ()
	{
		for (var i = 0; i < galleryInfo.images.length; i++)
		{
			var item = new SlideGallerySelectorItemComponent(galleryInfo.images[i], self);
			componentElement.appendChild(item.componentElement);

			buttonsList.push(item);
		}
	};
	this.enableButton = function (imageId)
	{
		for (var i = 0; i < buttonsList.length; i++)
		{
			if (buttonsList[i].id == imageId)
			{
				buttonsList[i].setActive();
			}
			else
			{
				buttonsList[i].setInactive();
			}
		}
	};
	this.imageClicked = function (imageId)
	{
		parentComponent.selectImage(imageId);
	};
	init();
};
window.SlideGallerySelectorItemComponent = function (imageInfo, parentComponent)
{
	this.componentElement = null;
	this.id = null;
	var self = this;
	var componentElement;

	var init = function ()
	{
		self.id = imageInfo.id;

		componentElement = document.createElement('div');
		componentElement.className = 'slidegallery_selector_item';
		self.componentElement = componentElement;

		window.eventsManager.addHandler(componentElement, 'click', clickHandler)
	};
	var clickHandler = function ()
	{
		parentComponent.imageClicked(self.id);
	};
	this.setActive = function ()
	{
		domHelper.addClass(componentElement, 'slidegallery_selector_item_active');
	};
	this.setInactive = function ()
	{
		domHelper.removeClass(componentElement, 'slidegallery_selector_item_active');
	};
	init();
};;
function categoryDetailsComponent(componentElement)
{
	var init = function()
	{
		var elements = false;
		if (elements = _('select.category_details_filter', componentElement))
		{
			for (var i=0; i<elements.length;i++)
			{
				var filterSelector = new categoryDetailsFilter(elements[i], self);
				filtersList.push(filterSelector);
			}
		}
		if (elements = _('.category_details_brandfilter', componentElement))
		{
			for (var i=0; i<elements.length;i++)
			{
				var brandSelector = new categoryDetailsBrand(elements[i], self);
				brandsList.push(brandSelector);
			}
		}
	}
	this.filterChanged = function()
	{
		var url = window.currentElementURL;
		
		var filterValues = new Array();
		for (var i=0; i<filtersList.length; i++)
		{
			var value = filtersList[i].getValue();
			if (value != '')
			{
				filterValues.push(value);
			}
		}
		if (filterValues.length > 0)
		{
			url += 'filters/'+filterValues.join(';')+'/';
		}
		
		var brandsIdList = new Array();
		for (var i=0; i<brandsList.length; i++)
		{
			if (brandsList[i].selected)
			{
				brandsIdList.push(brandsList[i].id);
			}
		}
		if (brandsIdList.length > 0)
		{
			url += 'brandfilter/'+brandsIdList.join(';')+'/';
		}
		document.location.href = url;
	}
	this.brandChanged = function(newBrandId)
	{
		for (var i=0; i<brandsList.length; i++)
		{
			if (brandsList[i].id != newBrandId)
			{
				brandsList[i].selected = false;
			}
		}
		self.filterChanged();
	}
	var self = this;
	
	var filtersList = new Array();
	var brandsList = new Array();
	
	init();
}
function categoryDetailsFilter(componentElement, parentObject)
{
	var init = function()
	{
		eventsManager.addHandler(componentElement, 'change', changeHandler);
	}
	var changeHandler = function()
	{
		parentObject.filterChanged();
	}
	this.getValue = function()
	{
		return componentElement.value;
	}
	var self = this;
	init();
}
function categoryDetailsBrand(componentElement, parentObject)
{
	var init = function()
	{
		self.id = parseInt(componentElement.className.split('brandid_')[1], 10);
		if (componentElement.className.search('brandfilter_selected') != '-1')
		{
			self.selected = true;
			var popup = new TipPopupComponent(componentElement, window.translations['brandfilter_filterproducts_off']);
		}
		else
		{
			var popup = new TipPopupComponent(componentElement, window.translations['brandfilter_filterproducts_on']);
		}
		eventsManager.addHandler(componentElement, 'click', clickHandler);
	}
	var clickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		if (!self.selected)
		{
			self.selected = true;
		}
		else
		{
			self.selected = false;
		}
		
		parentObject.brandChanged(self.id);
	}
	var self = this;
	this.id = false;
	this.selected = false;
	init();
};
function SelectedCategoryComponent(componentElement)
{
	var init = function()
	{
		if (navigator.appVersion.match(/MSIE ([\d.]+);/))
		{
			var version = navigator.appVersion.match(/MSIE ([\d.]+);/)[1];
			if (version == 8 && version < 9)
			{
				disableOpacity =  true;
			}
		}
		if (componentElement.className.search('selectedcategories_full') == -1)
		{
			if (bottomElement = _('.selectedcategories_item_bottom', componentElement)[0])
			{
				if (!disableOpacity)
				{
					opacityHandler.setOpacity(bottomElement, 0);
				}
				eventsManager.addHandler(componentElement, 'mouseenter', mouseEnterHandler);
				eventsManager.addHandler(componentElement, 'mouseleave', mouseLeaveHandler);
			}
		}
	}
	var mouseEnterHandler = function()
	{
		displayTimeout = window.setTimeout(display, displayDelay);
	}
	var mouseLeaveHandler = function()
	{
		clearTimeout(displayTimeout);
		if (displayed)
		{
			hide();
		}
	}
	var display = function()
	{
		displayed = true;
		var parameters = {end: 155, step: 1, acceleration: 0.7};
		effectsManager.startEffect('slide', bottomElement, parameters);
		
		if (!disableOpacity)
		{
			var parameters = {end: 1, step: 0.04};
			effectsManager.startEffect('opacity', bottomElement, parameters);
		}
	}
	var hide = function()
	{
		displayed = false;
		var parameters = {start: 155, end: 0, step: 1, acceleration: 0.4};
		effectsManager.queueEffect('slide', bottomElement, parameters);
		
		if (!disableOpacity)
		{
			var parameters = {start: 1, end: 0, step: 0.05};
			effectsManager.queueEffect('opacity', bottomElement, parameters);
		}
	}
	var bottomElement = false;
	var displayed = false;
	var displayTimeout = false;
	var displayDelay = 500;
	var disableOpacity = false;
	
	init();
}
;
function BannerComponent(componentElement)
{
	var init = function()
	{
		if (componentElement.href)
		{
			eventsManager.addHandler(componentElement, 'click', clickHandler);
		}
	}
	var clickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		window.open(componentElement.href);
	}
	var self = this;
	init();
}
;
window.TipPopupComponent = function(referralElement)
{
	var self = this;

	var componentElement;
	var contentElement;
	var popupOffset = 3;
	var displayed = false;
	var fixedX = false;
	var fixedY = false;

	var init = function()
	{
		createDomElements();
		window.eventsManager.addHandler(referralElement, 'mousemove', moveHandler);
	};
	var createDomElements = function()
	{
		opacityHandler.setOpacity(componentElement, 0);

		componentElement = document.createElement('div');
		componentElement.className = 'tip_popup';
		componentElement.style.display = 'none';

		document.body.appendChild(componentElement);

		var subElement1 = document.createElement('div');
		subElement1.className = 'tip_popup_left';
		componentElement.appendChild(subElement1);
		var subElement2 = document.createElement('div');
		subElement2.className = 'tip_popup_right';
		componentElement.appendChild(subElement2);

		var subElement9 = document.createElement('div');
		subElement9.className = 'tip_popup_center';
		componentElement.appendChild(subElement9);

		if (navigator.appVersion.match(/MSIE ([\d.]+);/))
		{
			var version = navigator.appVersion.match(/MSIE ([\d.]+);/)[1];
			if (version < 9)
			{
				internetExplorerBackgroundFix(subElement1);
				internetExplorerBackgroundFix(subElement2);

				internetExplorerBackgroundFix(subElement9);
			}
		}

		contentElement = document.createElement('div');
		contentElement.className = 'tip_popup_content';
		componentElement.appendChild(contentElement);
	};
	var internetExplorerBackgroundFix = function(element)
	{
		var fixImage = document.createElement('div');
		fixImage.style.top = '0';
		fixImage.style.left = '0';
		fixImage.style.width = '100%';
		fixImage.style.height = '100%';

		var expression = /url\(\"(.*)?\"\)/i;

		var result;
		if (result = expression.exec(element.currentStyle.backgroundImage))
		{
			var currentBackground = result[1];
		}
		if (currentBackground)
		{
			fixImage.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+currentBackground+'",sizingMethod="scale")';
		}
		element.style.backgroundImage = 'none';
		element.appendChild(fixImage);
	};
	var moveHandler = function()
	{
		if (displayed)
		{
			updatePosition();
		}
	};
	this.displayComponent = function()
	{
		displayed = true;

		componentElement.style.display = 'block';
		updatePosition();

		var parameters = {end:1, step: 0.05};
		effectsManager.startEffect('opacity', componentElement, parameters);
	};
	this.hideComponent = function(callBack)
	{
		var completeHideComponent = function()
		{
			displayed = false;
			componentElement.style.display = 'none';
			if (callBack)
			{
				callBack();
			}
		};

		var parameters = {end:0, step: 0.1};
		effectsManager.startEffect('opacity', componentElement, parameters, completeHideComponent);
	};
	var updatePosition = function()
	{
		var popupWidth = componentElement.offsetWidth;
		var popupHeight = componentElement.offsetHeight;

		var xPosition = fixedX;
		if (xPosition === false)
		{
			xPosition = window.mouseTracker.mouseX + popupOffset;
		}
		var yPosition = 0;
		if (fixedY)
		{
			yPosition = fixedY - popupHeight;
		}
		else
		{
			yPosition = window.mouseTracker.mouseY - popupHeight - popupOffset;
		}

		componentElement.style.left = xPosition+'px';
		componentElement.style.top = yPosition+'px';
	};
	this.setText = function(text)
	{
		contentElement.innerHTML = text;
		updatePosition();
	};
	this.setFixedCoordinates = function(x, y)
	{
		fixedX = x;
		fixedY = y;
		updatePosition();
	};

	init();
};;
function LinkListComponent(componentElement)
{
	var init = function()
	{
		var elements = false;
		if (elements = _('.linklistitem_details', componentElement))
		{
			for (var i=0; i<elements.length; i++)
			{
				new LinkListItemComponent(elements[i]);
			}
		}
	};

	init();
}
function LinkListItemComponent(componentElement)
{
	var init = function()
	{
		eventsManager.addHandler(componentElement, 'mouseenter', mouseEnterHandler);
		eventsManager.addHandler(componentElement, 'mouseleave', mouseLeaveHandler);
	};
	var mouseEnterHandler = function()
	{

	};
	var mouseLeaveHandler = function()
	{

	};

	init();
};
window.DarkLayerComponent = new function()
{
	this.showLayer = function(onclickFunction, callback, allowClose)
	{
		if (this.domElement)
		{
			opacityHandler.setOpacity(this.domElement, 0);
			this.domElement.style.display = 'block';

			this.domElement.style.top = '0';
			this.domElement.style.bottom = '0';
			this.domElement.style.left = '0';
			this.domElement.style.right = '0';

			var parameters = {end:this.fullOpacity, step:this.step};

			if (callback)
			{
				effectsManager.startEffect('opacity', this.domElement, parameters, callback);
			}
			else
			{
				effectsManager.startEffect('opacity', this.domElement, parameters);
			}
			if (allowClose != null)
			{
				this.allowClose = allowClose;
			}
			if (onclickFunction)
			{
				window.eventsManager.addHandler(this.domElement, "click", onclickFunction);
			}
			else
			{
				window.eventsManager.addHandler(this.domElement, "click", this.layerClickHandler);
			}
		}
	}
	this.hideLayer = function()
	{
		if (self.allowClose)
		{
			var parameters = {end:0, step: self.step};
			effectsManager.startEffect('opacity', self.domElement, parameters, self.layerClickHandlerStyle);
		}
	}
	this.layerClickHandler = function()
	{
		self.hideLayer();
	}
	this.forceHideLayer = function(callback)
	{
		self.closeCallBack = callback;
		self.allowClose = true;
		self.hideLayer();
	}
	this.layerClickHandlerStyle = function()
	{
		self.domElement.style.display = 'none';
		if (self.closeCallBack)
		{
			var callBack = self.closeCallBack;
			self.closeCallBack = false;
			callBack();
		}
	}
	this.init = function()
	{
		if (self.domElement == null)
		{
			var domElement = document.createElement('div');
			domElement.className = 'dark_layer';
			domElement.style.backgroundColor = self.backgroundColor;
			domElement.style.position = 'absolute';
			domElement.style.top = '0';
			domElement.style.left = '0';
			domElement.style.zIndex = '90';
			domElement.style.display = 'none';
			self.domElement = domElement;
			document.body.appendChild(domElement);
		}
	}

	var self = this;
	this.closeCallBack = false;
	this.domElement = null;
	this.fullOpacity = 0.6;
	this.step = 0.03;
	this.allowClose = true;
	this.backgroundColor = '#000000';
	window.controller.addListener("initDom", this.init);
};
window.MainMenuComponent = function(componentElement)
{
	var init = function()
	{
		self.id = parseInt(componentElement.className.split('menuid_')[1], 10);
		if (menuInfo = window.mainMenuLogics.getMenuInfo(self.id))
		{
			window.eventsManager.addHandler(componentElement, 'mouseenter', self.mouseEnterHandler);
			window.eventsManager.addHandler(componentElement, 'mouseleave', self.mouseLeaveHandler);
		}
	};
	this.mouseEnterHandler = function()
	{
		domHelper.addClass(componentElement, 'menuitem_hover');
		if (popupObject)
		{
			popupObject.displayComponent();
		}
	};
	this.mouseLeaveHandler = function(event)
	{
		if (popupObject)
		{
			var hidingRequired = true;

			if (typeof event.relatedTarget == 'undefined' && typeof event.toElement == 'object')
			{
				event.relatedTarget = event.toElement;
			}

			if (event.relatedTarget)
			{
				if (event.relatedTarget == popupObject.componentElement || domHelper.isAChildOf(popupObject.componentElement, event.relatedTarget))
				{
					hidingRequired = false;
				}
				else if (event.relatedTarget == componentElement || domHelper.isAChildOf(componentElement, event.relatedTarget))
				{
					hidingRequired = false;
				}
			}
			if (hidingRequired)
			{
				popupObject.attemptHideComponent();
			}
		}
		domHelper.removeClass(componentElement, 'menuitem_hover');
	};

	var self = this;

	var menuInfo = false;
	var popupObject = false;
	this.id = false;

	init();
};
window.SubMenuPopupComponent = function(subMenusList, menuComponent, referenceElement)
{
	var init = function()
	{
		if (navigator.appVersion.match(/MSIE ([\d.]+);/))
		{
			var version = navigator.appVersion.match(/MSIE ([\d.]+);/)[1];
			if (version < 9)
			{
				useAnimation = false;
			}
		}

		createDomStructure();
		window.eventsManager.addHandler(componentElement, 'mouseenter', menuComponent.mouseEnterHandler);
		window.eventsManager.addHandler(componentElement, 'mouseleave', menuComponent.mouseLeaveHandler);
	};
	var createDomStructure = function()
	{
		componentElement = document.createElement('div');

		componentElement.className = 'submenus_popup_block';

		document.body.appendChild(componentElement);

		backgroundElement = document.createElement('div');
		backgroundElement.className = 'submenus_popup_background';
		if (useAnimation)
		{
			opacityHandler.setOpacity(backgroundElement, 0);
		}
		else
		{
			backgroundElement.style.visibility = 'hidden';
		}
		componentElement.appendChild(backgroundElement);

		var subElement1 = document.createElement('div');
		subElement1.className = 'submenus_popup_top_left';
		backgroundElement.appendChild(subElement1);
		var subElement2 = document.createElement('div');
		subElement2.className = 'submenus_popup_top';
		backgroundElement.appendChild(subElement2);
		var subElement3 = document.createElement('div');
		subElement3.className = 'submenus_popup_top_right';
		backgroundElement.appendChild(subElement3);
		var subElement4 = document.createElement('div');
		subElement4.className = 'submenus_popup_left';
		backgroundElement.appendChild(subElement4);
		var subElement5 = document.createElement('div');
		subElement5.className = 'submenus_popup_center';
		backgroundElement.appendChild(subElement5);
		var subElement6 = document.createElement('div');
		subElement6.className = 'submenus_popup_right';
		backgroundElement.appendChild(subElement6);
		var subElement7 = document.createElement('div');
		subElement7.className = 'submenus_popup_bottom_left';
		backgroundElement.appendChild(subElement7);
		var subElement8 = document.createElement('div');
		subElement8.className = 'submenus_popup_bottom';
		backgroundElement.appendChild(subElement8);
		var subElement9 = document.createElement('div');
		subElement9.className = 'submenus_popup_bottom_right';
		backgroundElement.appendChild(subElement9);

		arrowElement = document.createElement('div');
		arrowElement.className = 'submenus_popup_arrow';
		backgroundElement.appendChild(arrowElement);

		contentElement = document.createElement('div');
		contentElement.className = 'submenus_popup_content';
		if (useAnimation)
		{
			opacityHandler.setOpacity(contentElement, 0);
		}
		else
		{
			contentElement.style.visibility = 'hidden';
		}
		componentElement.appendChild(contentElement);

		for (var i = 0; i < subMenusList.length; i++)
		{
			var subMenu = new SubMenusPopupItemComponent(subMenusList[i]);
			contentElement.appendChild(subMenu.componentElement);
		}
		self.componentElement = componentElement;
	};
	this.displayComponent = function()
	{
		window.clearTimeout(hideTimeout);
		if (!displayed)
		{
			displayed = true;

			var menuWidth = referenceElement.offsetWidth;
			var menuHeight = referenceElement.offsetHeight;

			componentElement.style.display = 'block';
			componentElement.style.width = componentElement.offsetWidth+'px';

			var positions = window.domHelper.getElementPositions(referenceElement);
			componentElement.style.left = positions.x + 'px';
			componentElement.style.top = (positions.y + menuHeight) + 'px';

			if (componentElement.offsetWidth < menuWidth + 6)
			{
				componentElement.style.width = (menuWidth + 6) + 'px';
			}

			if (useAnimation)
			{
				effectsManager.startEffect('opacity', backgroundElement, {end:1, step:0.05});
				effectsManager.startEffect('opacity', contentElement, {end:1, step:0.05});
			}
			else
			{
				backgroundElement.style.visibility = 'visible';
				contentElement.style.visibility = 'visible';
			}
		}
	};
	this.attemptHideComponent = function()
	{
		hideTimeout = window.setTimeout(startHideComponent, 300);
	};
	var startHideComponent = function()
	{
		displayed = false;
		if (useAnimation)
		{
			effectsManager.startEffect('opacity', backgroundElement, {end:0, step:0.10});
			effectsManager.startEffect('opacity', contentElement, {end:0, step:0.10}, hideComponent);
		}
		else
		{
			backgroundElement.style.visibility = 'hidden';
			contentElement.style.visibility = 'hidden';
			hideComponent();
		}
	};
	var hideComponent = function()
	{
		if (!displayed)
		{
			componentElement.style.display = 'none';
		}
	};

	var self = this;
	var componentElement = null;
	var backgroundElement = null;
	var contentElement = null;
	var arrowElement = null;
	var displayed = false;
	var hideTimeout = false;
	var useAnimation = true;

	this.componentElement = false;

	init();
};
window.SubMenusPopupItemComponent = function(menuInfo)
{
	var init = function()
	{
		self.componentElement = document.createElement('a');
		self.componentElement.href = menuInfo.URL;
		self.componentElement.className = 'submenus_popup_item';

		var subElement1 = document.createElement('div');
		subElement1.className = 'submenus_popup_item_left';
		self.componentElement.appendChild(subElement1);
		var subElement2 = document.createElement('div');
		subElement2.className = 'submenus_popup_item_center';
		self.componentElement.appendChild(subElement2);
		var contentElement = document.createElement('div');
		contentElement.className = 'submenus_popup_item_content';
		self.componentElement.appendChild(contentElement);

		domHelper.setTextContent(contentElement, menuInfo.title);
	};
	var self = this;
	this.componentElement = false;

	init();
};;
function AccordeonMenu(componentElement)
{
	var init = function()
	{
		var elements = _('.accordeon_menu_item', componentElement);
		for (var i=0; i<elements.length; i++)
		{
			new AccordeonMenuItem(elements[i]);
		}
	}

	var self = this;

	init();
}
function AccordeonMenuItem(componentElement)
{
	var init = function()
	{
		if (componentElement.className.search('accordeon_menu_item_active') == -1)
		{
			if (titleElement = _('.accordeon_menu_item_title', componentElement)[0])
			{
				if (contentElement = _('.accordeon_menu_item_submenu', componentElement)[0])
				{
					eventsManager.addHandler(componentElement, 'mouseenter', mouseOverHandler);
					eventsManager.addHandler(componentElement, 'mouseleave', mouseOutHandler);
				}
			}
		}
	};
	var mouseOverHandler = function()
	{
		var parameters = {end: contentElement.scrollHeight, step: 1, acceleration: 0.5};
		effectsManager.startEffect('slide', contentElement, parameters);
	};
	var mouseOutHandler = function()
	{
		var parameters = {end: 0, step: 1, acceleration: 0.5};
		effectsManager.startEffect('slide', contentElement, parameters);
	};

	var titleElement = false;
	var contentElement = false;

	init();
};
/**
 * Created by JetBrains PhpStorm.
 * User: moroz1999
 * Date: 23.12.11
 * Time: 14:03
 * To change this template use File | Settings | File Templates.
 */
window.RoomsMapComponent = function (componentElement)
{
	var leftElement;
	var roomSearchComponent;
	var categoriesSelectorComponent;
	var categoriesListComponent;
	var roomsListComponent;

	var rightElement;
	var roomInfoComponent;
	var roomsFloorSelectorComponent;
	var roomsFloorMapsComponent;

	var init = function ()
	{
		var element;
		if (leftElement = _('.roomsmap_left', componentElement)[0])
		{
			if (element = _('.roomsmap_search_block', leftElement)[0])
			{
				roomSearchComponent = new RoomSearchComponent(element);
			}

			if (element = _('.roomsmap_category_selector_block', leftElement)[0])
			{
				categoriesSelectorComponent = new RoomCategoriesSelectorComponent(element);
			}

			if (element = _('.roomsmap_categorieslist', leftElement)[0])
			{
				categoriesListComponent = new RoomCategoriesListComponent(element);
			}

			if (element = _('.roomsmap_roomslist', leftElement)[0])
			{
				roomsListComponent = new RoomsListComponent(element);
			}
		}
		if (rightElement = _('.roomsmap_right', componentElement)[0])
		{
			if (element = _('.roomsmap_roominfo', rightElement)[0])
			{
				roomInfoComponent = new RoomInfoComponent(element);
			}
			if (element = _('.roomsmap_floors_selector', rightElement)[0])
			{
				roomsFloorSelectorComponent = new RoomsFloorSelectorComponent(element);
			}
			if (element = _('.roomsmap_floors', rightElement)[0])
			{
				roomsFloorMapsComponent = new RoomsFloorMapsComponent(element);
			}
		}
	};
	init();
};

window.RoomSearchComponent = function (componentElement)
{
	var self = this;
	var inputElement;
	var submitElement;

	this.componentElement = null;

	var init = function ()
	{
		createDomStructure();
	};
	var createDomStructure = function ()
	{
		self.componentElement = componentElement;

		if (inputElement = _('.roomsmap_search_input')[0])
		{
			window.eventsManager.addHandler(inputElement, 'change', inputChangeHandler);
		}

		if (submitElement = _('.roomsmap_search_submit')[0])
		{
			window.eventsManager.addHandler(submitElement, 'click', submitClickHandler);
		}

		window.controller.addListener('roomsSearchQueryChanged', queryChangeHandler);
		window.controller.addListener('roomsCategoryChanged', categoryChangeHandler);

	};
	var inputChangeHandler = function ()
	{
		var value = inputElement.value;
		document.location.href = '#search=' + value;
	};
	var submitClickHandler = function ()
	{
		var value = inputElement.value;
		document.location.href = '#search=' + value;
	};
	var categoryChangeHandler = function ()
	{
		inputElement.value = '';
	};
	var queryChangeHandler = function (query)
	{
		if (inputElement.value != query)
		{
			inputElement.value = query;
		}
	};

	init();
};
window.RoomCategoriesSelectorComponent = function (componentElement)
{
	var self = this;
	var selectorElement;
	var dropDownComponent;

	this.componentElement = null;

	var init = function ()
	{
		createDomStructure();
		fillContents();
		dropDownComponent = dropDownManager.getDropDown(selectorElement, {'changeCallback':selectorChangeHandler});
		componentElement.appendChild(dropDownComponent.componentElement);

		window.controller.addListener('roomsParametersChanged', parametersChangeHandler);
	};
	var createDomStructure = function ()
	{
		self.componentElement = componentElement;
		selectorElement = _('.roomsmap_category_selector', componentElement)[0]
	};
	var fillContents = function ()
	{
		var option = document.createElement('option');
		option.value = '';
		option.text = window.translations['roomsmap.allcategories'];
		try
		{
			selectorElement.add(option, null);
		}
		catch (ex)
		{
			selectorElement.add(option);
		}

		var categoriesList = window.roomsLogics.getCategoriesList();
		for (var i = 0; i < categoriesList.length; i++)
		{
			var info = categoriesList[i];
			option = document.createElement('option');
			option.value = info.id;
			option.text = info.title;
			try
			{
				selectorElement.add(option, null);
			}
			catch (ex)
			{
				selectorElement.add(option);
			}
		}
	};
	var selectorChangeHandler = function ()
	{
		var category = window.roomsLogics.getCategory(selectorElement.value);
		if (category)
		{
			document.location.href = category.url;
		}
		else
		{
			document.location.href = '#';
		}
	};
	var parametersChangeHandler = function ()
	{
		var categoryId = window.roomsLogics.getCurrentCategoryId();
		var query = window.roomsLogics.getCurrentQuery();

		selectorElement.value = categoryId;
		eventsManager.fireEvent(selectorElement, 'change');

		if (categoryId || query)
		{
			displayComponent();
		}
		else
		{
			hideComponent();
		}
	};
	var displayComponent = function ()
	{
		componentElement.style.display = 'block';
	};
	var hideComponent = function ()
	{
		componentElement.style.display = 'none';
	};
	init();
};

window.RoomCategoriesListComponent = function (componentElement)
{
	var self = this;
	var contentElement;
	this.componentElement = null;

	var init = function ()
	{
		createDomStructure();
		fillContents();
		window.controller.addListener('roomsParametersChanged', parametersChangeHandler);
	};
	var createDomStructure = function ()
	{
		self.componentElement = componentElement;
		contentElement = _('.roomsmap_categorieslist_content', componentElement)[0];
	};
	var fillContents = function ()
	{
		var categoriesList = window.roomsLogics.getCategoriesList();
		for (var i = 0; i < categoriesList.length; i++)
		{
			var category = new RoomCategoriesListItemComponent(categoriesList[i]);
			contentElement.appendChild(category.componentElement);
		}
	};
	var parametersChangeHandler = function ()
	{
		var categoryId = window.roomsLogics.getCurrentCategoryId();
		var query = window.roomsLogics.getCurrentQuery();
		if (categoryId || query)
		{
			hideComponent();
		}
		else
		{
			displayComponent();
		}
	};

	var displayComponent = function ()
	{
		componentElement.style.display = 'block';
	};
	var hideComponent = function ()
	{
		componentElement.style.display = 'none';
	};

	init();
};

window.RoomCategoriesListItemComponent = function (info)
{
	var self = this;
	var componentElement;

	this.componentElement = null;

	var init = function ()
	{
		createDomStructure();
		fillContents();
	};
	var createDomStructure = function ()
	{
		componentElement = document.createElement('a');
		componentElement.className = 'roomsmap_category red_block_category';
		self.componentElement = componentElement;
	};
	var fillContents = function ()
	{
		self.componentElement.innerHTML = info.title;
		self.componentElement.href = info.url;
	};

	init();
};

window.RoomsListComponent = function (componentElement)
{
	var self = this;
	var floorComponents;
	var contentElement;

	this.componentElement = null;

	var init = function ()
	{
		createDomStructure();
		window.controller.addListener('roomsParametersChanged', parametersChangeHandler);
		window.controller.addListener('roomsListRecalculated', listRecalculateHandler);
	};
	var createDomStructure = function ()
	{
		self.componentElement = componentElement;
		contentElement = _('.roomsmap_roomslist_content', componentElement)[0];

		floorComponents = new Array();
		var floorsList = window.roomsLogics.getFloorsList();
		for (var i = 0; i < floorsList.length; i++)
		{
			var floor = new RoomsListFloorComponent(floorsList[i]);
			floorComponents.push(floor);
			contentElement.appendChild(floor.componentElement);
		}
	};
	var parametersChangeHandler = function ()
	{
		var categoryId = window.roomsLogics.getCurrentCategoryId();
		var query = window.roomsLogics.getCurrentQuery();
		if (categoryId || query)
		{
			displayComponent();
		}
		else
		{
			hideComponent();
		}
	};
	var listRecalculateHandler = function ()
	{
		var roomsList = window.roomsLogics.getRoomsList();

		var index = {
			0:new Array(),
			1:new Array(),
			2:new Array()
		};

		for (var i = 0; i < roomsList.length; i++)
		{
			index[roomsList[i].floor].push(roomsList[i]);
		}

		for (var i = 0; i < floorComponents.length; i++)
		{
			var floor = floorComponents[i];
			floor.setRoomsList(index[floor.number]);
		}
	};
	var displayComponent = function ()
	{
		componentElement.style.display = 'block';
	};
	var hideComponent = function ()
	{
		componentElement.style.display = 'none';
	};

	init();
};

window.RoomsListFloorComponent = function (info)
{
	var self = this;
	var componentElement;
	var titleElement;
	var roomsElement;

	this.componentElement = null;
	this.number = null;

	var init = function ()
	{
		self.number = info.number;
		createDomStructure();
		fillContents();

		controller.addListener('roomsParametersChanged', parametersChangeHandler);
	};
	var createDomStructure = function ()
	{
		componentElement = document.createElement('div');
		componentElement.className = 'roomsmap_floorinfo';
		self.componentElement = componentElement;

		titleElement = document.createElement('a');
		titleElement.className = 'roomsmap_floorinfo_title';
		componentElement.appendChild(titleElement);

		roomsElement = document.createElement('div');
		roomsElement.className = 'roomsmap_floorinfo_rooms';
		componentElement.appendChild(roomsElement);
	};
	var fillContents = function ()
	{
		titleElement.innerHTML = info.title;
		titleElement.href = info.url;
	};
	this.setRoomsList = function (roomsList)
	{
		if (roomsList.length > 0)
		{
			while (roomsElement.firstChild)
			{
				roomsElement.removeChild(roomsElement.firstChild);
			}
			for (var i = 0; i < roomsList.length; i++)
			{
				var room = new RoomsListItemComponent(roomsList[i], self.number);
				roomsElement.appendChild(room.componentElement);
			}
			displayComponent();
		}
		else
		{
			hideComponent();
		}
	};
	var parametersChangeHandler = function ()
	{
		titleElement.href = info.url;
	};
	var displayComponent = function ()
	{
		componentElement.style.display = 'block';
	};
	var hideComponent = function ()
	{
		componentElement.style.display = 'none';
	};
	init();
};

window.RoomsListItemComponent = function (info, floor)
{
	var self = this;
	var componentElement;

	this.componentElement = null;

	var init = function ()
	{
		createDomStructure();
		fillContents();
	};
	var createDomStructure = function ()
	{
		componentElement = document.createElement('a');
		componentElement.className = 'roomsmap_room red_block_shop';
		self.componentElement = componentElement;
	};
	var fillContents = function ()
	{
		self.componentElement.innerHTML = info.title;
		self.componentElement.href = roomsLogics.getRoomUrl(info.id, floor);
	};

	init();
};

window.RoomInfoComponent = function (componentElement)
{
	var defaultElement;
	var contentElement;

	var logoElement;
	var imageElement;
	var titleElement;
	var textElement;
	var openedTimeElement;
	var contactInfoElement;
	var buttonElement;

	var init = function ()
	{
		createDomStructure();

		contentElement.style.display = 'none';
		defaultElement.style.display = 'block';

		window.controller.addListener('roomChanged', roomChangeHandler);
	};
	var createDomStructure = function ()
	{
		defaultElement = _('.roomsmap_roominfo_default', componentElement)[0];
		contentElement = _('.roomsmap_roominfo_content', componentElement)[0];

		logoElement = _('.shop_short_logo', contentElement)[0];
		imageElement = _('.shop_short_image', contentElement)[0];
		titleElement = _('.shop_short_title', contentElement)[0];
		textElement = _('.shop_short_text', contentElement)[0];
		openedTimeElement = _('.shop_short_openedtime', contentElement)[0];
		contactInfoElement = _('.shop_short_contactinfo', contentElement)[0];
		buttonElement = _('.shop_short_readmore', contentElement)[0];
	};
	var roomChangeHandler = function (id)
	{
		var roomInfo = roomsLogics.getRoom(id);
		if (id)
		{
			titleElement.innerHTML = roomInfo.title;
			textElement.innerHTML = roomInfo.introduction;
			openedTimeElement.innerHTML = roomInfo.openedTime;
			contactInfoElement.innerHTML = roomInfo.contactInfo;
			buttonElement.href = roomInfo.URL;

			if (roomInfo.image != '')
			{
				imageElement.src = roomInfo.image;
				imageElement.style.display = 'block';
			}
			else
			{
				imageElement.style.display = 'none';
			}
			if (roomInfo.logo != '')
			{
				logoElement.src = roomInfo.logo;
				logoElement.style.display = 'block';
			}
			else
			{
				logoElement.style.display = 'none';
			}

			defaultElement.style.display = 'none';
			contentElement.style.display = 'block';
		}
		else
		{
			contentElement.style.display = 'none';
			defaultElement.style.display = 'block';
		}
	};

	init();
};
window.RoomsFloorSelectorComponent = function (componentElement)
{
	var self = this;
	var floors = new Array();

	var init = function ()
	{
		createDomStructure();
	};
	var createDomStructure = function ()
	{
		var floorsList = roomsLogics.getFloorsList();
		for (var i = 0; i < floorsList.length; i++)
		{
			var floor = new RoomsFloorSelectorItemComponent(floorsList[i]);
			componentElement.appendChild(floor.componentElement);
			floors.push(floor);
		}
	};
	init();
};
window.RoomsFloorSelectorItemComponent = function (floorInfo)
{
	var self = this;
	var componentElement;
	var textElement;
	var selected = false;

	this.componentElement = null;
	var init = function ()
	{
		createDomStructure();
		controller.addListener('roomsParametersChanged', parametersChangeHandler);
	};
	var createDomStructure = function ()
	{
		componentElement = document.createElement('a');
		componentElement.href = floorInfo.url;
		componentElement.className = 'roomsmap_floors_selector_item';
		self.componentElement = componentElement;

		var element = document.createElement('span');
		element.className = 'roomsmap_floors_selector_item_left';
		componentElement.appendChild(element);

		element = document.createElement('span');
		element.className = 'roomsmap_floors_selector_item_center';
		componentElement.appendChild(element);

		element = document.createElement('span');
		element.className = 'roomsmap_floors_selector_item_right';
		componentElement.appendChild(element);

		textElement = document.createElement('div');
		textElement.className = 'roomsmap_floors_selector_item_title';
		textElement.innerHTML = floorInfo.title;
		componentElement.appendChild(textElement);
	};
	var parametersChangeHandler = function ()
	{
		componentElement.href = floorInfo.url;
		var floor = window.roomsLogics.getCurrentFloorNumber();
		if (floor == floorInfo.number)
		{
			selected = true;
		}
		else
		{
			selected = false;
		}
		refreshComponent();
	};
	var refreshComponent = function ()
	{
		if (selected)
		{
			domHelper.addClass(componentElement, 'selected');
		}
		else
		{
			domHelper.removeClass(componentElement, 'selected');
		}
	};
	init();
};
window.RoomsFloorMapsComponent = function (componentElement)
{
	var self = this;
	var infoHeight = 200;
	var iconsHeight = 98;
	var minHeight = 400;
	var floors = new Array();

	var init = function ()
	{
		createDomStructure();
		window.controller.addListener('startApplication', alignSizes);
		window.eventsManager.addHandler(window, 'resize', alignSizes);
	};
	var createDomStructure = function ()
	{
		var floorsList = roomsLogics.getFloorsList();
		for (var i = 0; i < floorsList.length; i++)
		{
			var floor = new RoomsFloorMapComponent(floorsList[i]);
			componentElement.appendChild(floor.componentElement);
			floors.push(floor);
		}
	};
	var alignSizes = function ()
	{
		var viewPortHeight = 0;
		var viewPortWidth = 0;
		if (window.innerHeight)
		{
			viewPortHeight = window.innerHeight;
			viewPortWidth = window.innerWidth;
		}
		else
		{
			viewPortWidth = document.documentElement.offsetWidth;
			viewPortHeight = document.documentElement.offsetHeight;
		}
		componentElement.style.width = 'auto';

		var width = Math.round(componentElement.parentNode.offsetWidth);
		if (width > viewPortWidth)
		{
			width = viewPortWidth;
		}

		var height = Math.round(viewPortHeight - infoHeight - iconsHeight);

		if (height < minHeight)
		{
			height = minHeight;
		}

		componentElement.style.width = width + 'px';
		componentElement.style.height = height + 'px';

		for (var i = 0; i < floors.length; i++)
		{
			floors[i].setSizes(width, height);
		}
	};

	init();
};

window.RoomsFloorMapComponent = function (info)
{
	var self = this;
	var vectorsInfo;
	var componentElement;

	var paper;
	var allElements;
	var label;
	var padding = 30;
	var maxWidth = 0;
	var maxHeight = 0;

	var viewBoxWidth;
	var viewBoxHeight;

	this.componentElement = null;

	var init = function ()
	{
		if (typeof window.vectorsInfo[info.number] != 'undefined')
		{
			vectorsInfo = window.vectorsInfo[info.number];

			viewBoxWidth = vectorsInfo.dimensions.width;
			viewBoxHeight = vectorsInfo.dimensions.height;

			createDomStructure();
			window.controller.addListener('roomsParametersChanged', parametersChangeHandler);
		}
	};
	var createDomStructure = function ()
	{
		componentElement = document.createElement('div');
		componentElement.className = 'roomsmap_floor';
		self.componentElement = componentElement;

		paper = new Raphael(componentElement, viewBoxWidth, viewBoxHeight);
		paper.setViewBox(0, 0, viewBoxWidth, viewBoxHeight);

		allElements = paper.set();

		var masterBackground = paper.rect(0, 0, viewBoxWidth, viewBoxHeight);
		masterBackground.attr({'fill':'#ffffff', 'stroke-width':'0', 'opacity':'0'});
		allElements.push(masterBackground);

		for (var i = 0; i < vectorsInfo.rooms.length; i++)
		{
			if (vectorsInfo.rooms[i].id == 'background')
			{
				var background = new RoomsFloorBackgroundComponent(vectorsInfo.rooms[i], paper);
				allElements.push(background.elementsSet);
			}
			else
			{
				var room = new RoomsFloorRoomComponent(vectorsInfo.rooms[i], paper, info.number);
				allElements.push(room.elementsSet);
			}
		}
		label = new RoomsFloorLabelComponent(componentElement, viewBoxWidth, viewBoxHeight, paper, info.number);
	};
	var parametersChangeHandler = function ()
	{
		var floor = window.roomsLogics.getCurrentFloorNumber();
		if (floor == info.number)
		{
			displayComponent();
		}
		else
		{
			hideComponent();
		}
	};
	var displayComponent = function ()
	{
		componentElement.style.display = 'block';
		alignSizes();
		label.displayComponent();
	};
	var hideComponent = function ()
	{
		componentElement.style.display = 'none';
		label.hideComponent();
	};
	self.setSizes = function (newMaxWidth, newMaxHeight)
	{
		maxWidth = newMaxWidth;
		maxHeight = newMaxHeight;

		alignSizes();
	};
	var alignSizes = function ()
	{
		var paddedWidth = maxWidth - padding * 2;
		var paddedHeight = maxHeight - padding * 2;
		var width = paddedWidth;
		var height = Math.round(viewBoxHeight * paddedWidth / viewBoxWidth);

		var left = 0;
		var top = 0;

		if (height > paddedHeight)
		{
			height = paddedHeight;
			width = Math.round(viewBoxWidth * paddedHeight / viewBoxHeight);
		}

		left = Math.round((maxWidth - width) / 2);
		top = Math.round((maxHeight - height) / 2);

		componentElement.style.width = width + 'px';
		componentElement.style.height = height + 'px';
		componentElement.style.left = left + 'px';
		componentElement.style.top = top + 'px';

		var positions = domHelper.getElementPositions(componentElement);
		paper.setSize(width, height);
		if (label)
		{
			label.setSize(positions.x, positions.y, width, height);
		}
	};

	init();
};

window.RoomsFloorRoomComponent = function (vectorInfo, paper, floor)
{
	this.elementsSet = null;
	var self = this;
	var speed = 300;
	var wallsSets = {
		'all':null,
		'top':null,
		'wallsdark':null,
		'wallslight':null,
		'wallsmedium':null,
		'static1':null,
		'static2':null
	};
	var roomInfo;
	var enabled;
	var active;
	var selected;
	var mouseOver;

	var enabledStyle = {
		'cursor':'pointer',
		'stroke-width':1,
		'stroke-linejoin':'round'
	};
	var disabledStyle = {
		'cursor':'default',
		'stroke':'none',
		'stroke-linejoin':'round'
	};
	var init = function ()
	{
		enabled = false;
		active = false;
		selected = false;
		createShapesSets();

		if (roomInfo = roomsLogics.getRoomByVector(vectorInfo.id))
		{
			enabled = true;
			active = true;
			wallsSets['all'].mouseover(mouseOverHandler);
			wallsSets['all'].mouseout(mouseOutHandler);
			wallsSets['all'].click(clickHandler);
			controller.addListener('roomsCategoryChanged', roomsCategoryChangeHandler);
			controller.addListener('roomChanged', roomChangedHandler);

			wallsSets['top'].attr({'fill':roomInfo.category.colorTop, 'stroke':roomInfo.category.colorStroke});
			wallsSets['wallsdark'].attr({'fill':roomInfo.category.colorDark, 'stroke':roomInfo.category.colorStroke});
			wallsSets['wallslight'].attr({'fill':roomInfo.category.colorLight, 'stroke':roomInfo.category.colorStroke});
			wallsSets['wallsmedium'].attr({'fill':roomInfo.category.colorMedium, 'stroke':roomInfo.category.colorStroke});

		}
		if (!roomInfo)
		{
			wallsSets['all'].attr(disabledStyle);
			refreshComponent();
		}
	};
	var createShapesSets = function ()
	{
		self.elementsSet = paper.set();
		wallsSets['all'] = paper.set();
		wallsSets['top'] = paper.set();
		wallsSets['wallsdark'] = paper.set();
		wallsSets['wallslight'] = paper.set();
		wallsSets['wallsmedium'] = paper.set();
		wallsSets['static1'] = paper.set();
		wallsSets['static2'] = paper.set();

		for (var wallType in vectorInfo.walls)
		{
			for (var k = 0; k < vectorInfo.walls[wallType].length; k++)
			{
				var pathInfo = vectorInfo.walls[wallType][k].path;
				var path = paper.path(pathInfo);
				path.attr(enabledStyle);

				wallsSets[wallType].push(path);
				wallsSets['all'].push(path);
				self.elementsSet.push(path);
			}
		}
		for (var iconType in vectorInfo.icons)
		{
			for (var k = 0; k < vectorInfo.icons[iconType].length; k++)
			{
				var iconInfo = vectorInfo.icons[iconType][k];
				var image = paper.image(iconInfo['href'], iconInfo['x'], iconInfo['y'], iconInfo['width'], iconInfo['height']);

				wallsSets['all'].push(image);
				self.elementsSet.push(image);
			}
		}

		wallsSets['static1'].attr({'fill':'#555565', 'stroke':'none'});
		wallsSets['static2'].attr({'fill':'#77777f', 'stroke':'none'});
	};
	var mouseOverHandler = function ()
	{
		mouseOver = true;
		refreshComponent();
		controller.fireEvent('roomComponentMouseOver', {'room':roomInfo, 'floor': floor, 'vector':wallsSets['all']});
	};
	var mouseOutHandler = function ()
	{
		mouseOver = false;
		refreshComponent();
		controller.fireEvent('roomComponentMouseOut', {'room':roomInfo, 'floor': floor, 'vector':wallsSets['all']});
	};
	var roomChangedHandler = function (roomId)
	{
		if (roomId == vectorInfo.id)
		{
			selected = true;
			refreshComponent();
			controller.fireEvent('roomComponentSelected', {'room':roomInfo, 'floor': floor, 'vector':wallsSets['all']});
		}
		else
		{
			selected = false;
			refreshComponent();
		}
	};
	var clickHandler = function ()
	{
		document.location.href = roomsLogics.getRoomUrl(vectorInfo.id, floor);
	};
	var roomsCategoryChangeHandler = function (categoryId)
	{
		if (categoryId == roomInfo.categoryId || categoryId == null)
		{
			active = true;
		}
		else
		{
			active = false;
		}
		refreshComponent();
	};
	var refreshComponent = function ()
	{
		if (selected)
		{
			wallsSets['top'].animate({'fill':roomInfo.category.colorTopActive, 'stroke':roomInfo.category.colorStrokeActive}, speed, 'easeOut');
			wallsSets['wallsdark'].animate({'fill':roomInfo.category.colorDarkActive, 'stroke':roomInfo.category.colorStrokeActive}, speed, 'easeOut');
			wallsSets['wallslight'].animate({'fill':roomInfo.category.colorLightActive, 'stroke':roomInfo.category.colorStrokeActive}, speed, 'easeOut');
			wallsSets['wallsmedium'].animate({'fill':roomInfo.category.colorMediumActive, 'stroke':roomInfo.category.colorStrokeActive}, speed, 'easeOut');
		}
		else if (mouseOver)
		{
			wallsSets['top'].animate({'fill':roomInfo.category.colorTopOver, 'stroke':roomInfo.category.colorStrokeOver}, speed, 'easeOut');
			wallsSets['wallsdark'].animate({'fill':roomInfo.category.colorDarkOver, 'stroke':roomInfo.category.colorStrokeOver}, speed, 'easeOut');
			wallsSets['wallslight'].animate({'fill':roomInfo.category.colorLightOver, 'stroke':roomInfo.category.colorStrokeOver}, speed, 'easeOut');
			wallsSets['wallsmedium'].animate({'fill':roomInfo.category.colorMediumOver, 'stroke':roomInfo.category.colorStrokeOver}, speed, 'easeOut');
		}
		else if (active)
		{
			wallsSets['top'].animate({'fill':roomInfo.category.colorTop, 'stroke':roomInfo.category.colorStroke}, speed, 'easeOut');
			wallsSets['wallsdark'].animate({'fill':roomInfo.category.colorDark, 'stroke':roomInfo.category.colorStroke}, speed, 'easeOut');
			wallsSets['wallslight'].animate({'fill':roomInfo.category.colorLight, 'stroke':roomInfo.category.colorStroke}, speed, 'easeOut');
			wallsSets['wallsmedium'].animate({'fill':roomInfo.category.colorMedium, 'stroke':roomInfo.category.colorStroke}, speed, 'easeOut');
		}
		else if (enabled)
		{
			wallsSets['top'].animate({'fill':'#f0f0f7', 'stroke':'#dedeea'}, speed, 'easeOut');
			wallsSets['wallsdark'].animate({'fill':'#b9b9c3', 'stroke':'#dedeea'}, speed, 'easeOut');
			wallsSets['wallslight'].animate({'fill':'#ffffff', 'stroke':'#dedeea'}, speed, 'easeOut');
			wallsSets['wallsmedium'].animate({'fill':'#f0f0f7', 'stroke':'#dedeea'}, speed, 'easeOut');
		}
		else
		{
			wallsSets['top'].attr({'fill':'#f0f0f7', 'stroke':'#dedeea'});
			wallsSets['wallsdark'].attr({'fill':'#b9b9c3', 'stroke':'#dedeea'});
			wallsSets['wallslight'].attr({'fill':'#ffffff', 'stroke':'#dedeea'});
			wallsSets['wallsmedium'].attr({'fill':'#f0f0f7', 'stroke':'#dedeea'});
		}
	};

	init();
};

window.RoomsFloorBackgroundComponent = function (vectorInfo, paper)
{
	this.elementsSet = null;

	var self = this;
	var wallsSets = {};
	var enabledStyle =
	{
		'stroke':'none'
	};

	var init = function ()
	{
		self.elementsSet = paper.set();
		wallsSets['all'] = paper.set();
		wallsSets['top'] = paper.set();
		wallsSets['wallsdark'] = paper.set();
		wallsSets['wallslight'] = paper.set();
		wallsSets['wallsmedium'] = paper.set();
		wallsSets['static1'] = paper.set();
		wallsSets['static2'] = paper.set();

		for (var wallType in vectorInfo.walls)
		{
			for (var k = 0; k < vectorInfo.walls[wallType].length; k++)
			{
				var pathInfo = vectorInfo.walls[wallType][k].path;
				var path = paper.path(pathInfo);

				path.attr(enabledStyle);

				wallsSets[wallType].push(path);
				wallsSets['all'].push(path);
				self.elementsSet.push(path);
			}
		}
		wallsSets['top'].attr({'fill':'#e0e2e4'});
		wallsSets['wallsdark'].attr({'fill':'#ccced0'});
		wallsSets['wallslight'].attr({'fill':'#d6d8da'});
		wallsSets['wallsmedium'].attr({'fill':'#d6d8da'});

		wallsSets['static1'].attr({'fill':'#555565', 'stroke':'none'});
		wallsSets['static2'].attr({'fill':'#77777f', 'stroke':'none'});

		for (var iconType in vectorInfo.icons)
		{
			for (var k = 0; k < vectorInfo.icons[iconType].length; k++)
			{
				var iconInfo = vectorInfo.icons[iconType][k];
				var image = paper.image(iconInfo['href'], iconInfo['x'], iconInfo['y'], iconInfo['width'], iconInfo['height']);
				self.elementsSet.push(image);
			}
		}

	};
	init();
};
window.RoomsFloorLabelComponent = function (parentElement, viewBoxWidth, viewBoxHeight, paper, floorNumber)
{
	var popupComponent;

	var ieFix = false;

	var parentX;
	var parentY;

	var parentWidth;
	var parentHeight;

	var currentSelectedVector;
	var currentOverRoom;
	var currentRoomTimeout;

	var init = function ()
	{
		if (navigator.appVersion.match(/MSIE ([\d.]+);/))
		{
			var version = navigator.appVersion.match(/MSIE ([\d.]+);/)[1];
			if (version < 9)
			{
				ieFix = true;
			}
		}

		popupComponent = new TipPopupComponent(parentElement);
		controller.addListener('roomComponentMouseOver', roomComponentMouseOver);
		controller.addListener('roomComponentMouseOut', roomComponentMouseOut);
		controller.addListener('roomComponentSelected', roomComponentSelected);
	};
	this.hideComponent = function ()
	{
		popupComponent.hideComponent();
	};
	this.displayComponent = function ()
	{
		displayCurrentRoom();
	};
	var roomComponentSelected = function (info)
	{
		if (floorNumber == info.floor)
		{
			currentSelectedVector = info.vector;
			var currentFloorNumber = roomsLogics.getCurrentFloorNumber();

			if (currentFloorNumber == floorNumber)
			{
				displayCurrentRoom();
			}
		}
		else
		{
			currentSelectedVector = null;
		}
	};
	var roomComponentMouseOver = function (info)
	{
		if (floorNumber == info.floor)
		{
			window.clearTimeout(currentRoomTimeout);
			currentOverRoom = info;

			popupComponent.setFixedCoordinates(false, false);
			popupComponent.setText(info.room.title);
			popupComponent.displayComponent();
		}
	};
	var roomComponentMouseOut = function (info)
	{
		if (floorNumber == info.floor)
		{
			currentOverRoom = null;
			popupComponent.hideComponent(mouseOutCallback);
		}
	};
	var mouseOutCallback = function ()
	{
		if (!currentOverRoom)
		{
			currentRoomTimeout = window.setTimeout(displayCurrentRoom, 500);
		}
	};
	var displayCurrentRoom = function ()
	{
		if (currentSelectedVector)
		{
			var currentSelectedRoom = window.roomsLogics.getCurrentRoom();

			if (!currentOverRoom || currentOverRoom.room.id != currentSelectedRoom.id)
			{
				popupComponent.setText(currentSelectedRoom.title);

				var vectorInfo = currentSelectedVector.getBBox();

				var coeffX = viewBoxWidth / parentWidth;
				var coeffY = viewBoxHeight / parentHeight;

				if (ieFix)
				{
					coeffX = 1;
					coeffY = 1;
				}
				var vectorX = vectorInfo.x + vectorInfo.width / 2;
				var vectorY = vectorInfo.y + vectorInfo.height / 2;

				var x = parentX + vectorX / coeffX;
				var y = parentY + vectorY / coeffY;

				popupComponent.setFixedCoordinates(x, y);
				popupComponent.displayComponent();
			}
		}
	};
	this.setSize = function (newParentX, newParentY, newWidth, newHeight)
	{
		parentWidth = newWidth;
		parentHeight = newHeight;

		parentX = newParentX;
		parentY = newParentY;
	};

	init();
};;
function CategorySelectorComponent(componentElement)
{
	var init = function()
	{
		eventsManager.addHandler(componentElement, 'change', changeHandler)
	};
	var changeHandler = function()
	{
		document.location.href = componentElement.value;
	};
	init();
};
window.scrollPagesComponent = function (componentElement)
{
	var self = this;
	var selectedNumber = 0;
	var rotateDelay = 4500;
	var interval;

	var previousButton = false;
	var nextButton = false;
	var pageElements = false;
	var containerElement = false;
	var contentElement = false;

	var init = function ()
	{
		selectedNumber = 0;
		if (pageElements = _('.scroll_page', componentElement))
		{
			if (containerElement = _('.scroll_pages_container', componentElement)[0])
			{
				if (contentElement = _('.scroll_pages_content', componentElement)[0])
				{
					var leftPosition = 0;
					for (var i = 0; i < pageElements.length; i++)
					{
						pageElements[i].style.left = leftPosition+'px';
						pageElements[i].style.top = '0';
						pageElements[i].style.position = 'absolute';

						leftPosition += pageElements[i].offsetWidth;
					}

					contentElement.style.width = leftPosition + 'px';
					containerElement.scrollLeft = 0;
				}
			}
		}

		if (previousButton = _('.scroll_pages_previous', componentElement)[0])
		{
			eventsManager.addHandler(previousButton, 'click', previousClickHandler);
		}
		if (nextButton = _('.scroll_pages_next', componentElement)[0])
		{
			eventsManager.addHandler(nextButton, 'click', nextClickHandler);
		}
		interval = window.setInterval(showNextPage, rotateDelay);
	};
	var changePage = function (newNumber)
	{
		if (newNumber != selectedNumber && pageElements[newNumber])
		{
			var newPage = pageElements[newNumber];
			var endScrollLeft = newPage.offsetLeft;

			var parameters = {end:endScrollLeft, step:0.5, acceleration:0.5};
			effectsManager.startEffect('scrollx', containerElement, parameters);

			selectedNumber = newNumber;
		}
	};
	var previousClickHandler = function (event)
	{
		eventsManager.preventDefaultAction(event);
		stopRotation();
		var newNumber = selectedNumber - 1;
		if (newNumber < 0)
		{
			newNumber = pageElements.length - 1;
		}

		changePage(newNumber);
	};
	var nextClickHandler = function (event)
	{
		eventsManager.preventDefaultAction(event);
		stopRotation();
		showNextPage();
	};
	var stopRotation = function ()
	{
		window.clearInterval(interval);
	};
	var showNextPage = function ()
	{
		var newNumber = selectedNumber + 1;
		if (newNumber == pageElements.length)
		{
			newNumber = 0;
		}
		changePage(newNumber);
	};

	init();
};;
function CatalogueFilterSearchComponent(componentElement)
{
	var init = function()
	{
		if (sendButton = _('.button', componentElement)[0])
		{
			eventsManager.addHandler(sendButton, 'click', sendButtonClickHandler);
		}
	};
	var sendButtonClickHandler = function(event)
	{
		eventsManager.preventDefaultAction(event);
		submit();
	};
	var submit = function()
	{
		componentElement.submit();
	};

	var sendButton = false;
	init();
}
;

