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.postParameters == 'object')
		{
			postParameters = parameters.postParameters;
		}
		else
		{
			postParameters = {};
		}
		
		if (typeof parameters.successCallBack == 'function')
		{
			successCallBack = parameters.successCallBack;
		}
		else
		{
			successCallBack = false;
		}
		if (typeof parameters.failCallBack == 'function')
		{
			failCallBack = parameters.failCallBack;
		}
		else
		{
			failCallBack = false;
		}
		
		XMLHttpResource = getXMLHttpRequestObject();
	}
	this.makeRequest = function()
	{
		if (requestType == 'POST')
		{
			postParametersString = '';
			for (var index in postParameters)
			{
				postParametersString = postParametersString + index + '=' + postParameters[index] + '&';
			}
			
			XMLHttpResource.open("POST", requestURL, true);
			XMLHttpResource.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			XMLHttpResource.setRequestHeader("Content-length", postParametersString.length);
			XMLHttpResource.onreadystatechange = catchRequestAnswer;
			
			XMLHttpResource.send(postParametersString); 
		}
		else
		{
			XMLHttpResource.open("GET", requestURL, true);
			XMLHttpResource.onreadystatechange = catchRequestAnswer;
			
			XMLHttpResource.send(); 
		}
		queryTime = getCurrentTime();
		failureCheckTimeOut = window.setTimeout(requestTimeOutHandler, failureDelay);
	}
	var catchRequestAnswer = function()
	{
		if (status == null)
		{
			if (XMLHttpResource.readyState == 4)
			{
				window.clearTimeout(failureCheckTimeOut);
				if (XMLHttpResource.status == 200)
				{
					status = 'success';
					answerTime = getCurrentTime();
					
					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 getCurrentTime = function()
	{
		var currentTime = new Date();
		var hours = formatNumber(currentTime.getHours(), 2);
		var minutes = formatNumber(currentTime.getMinutes(), 2);
		var seconds = formatNumber(currentTime.getSeconds(), 2);
		var milliseconds = formatNumber(currentTime.getMilliseconds(), 3);

		return hours+':'+minutes+':'+seconds;
	}

	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 queryTime = '--:--:--';
	var answerTime = '--:--:--';
	var XMLHttpResource = null;
	
	
	var requestURL = false;
	var requestXML = false;
	var requestType = false;
	var successCallBack = false;
	var failCallBack = false;
	var postParameters = false;
	
	init();
};
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;
	}
};
window.artWebEffectsManager = 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};
};
window.eventsManager = new function()
{
	var init = function()
	{
		self.fireEvent = fireEvent_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;
				}
			}
		}
	}
	this.getEventTarget = function(event) 
	{
		var eventElement = null;
		if (event.target)
		{
			eventElement = event.target;
		}
		else if (event.srcElement)
		{
			eventElement = event.srcElement;
		}
		return eventElement;
	}
	this.addHandler = function(object, event, handler) 
	{
		if (object == null || typeof object != 'object' && typeof object != 'function')
		{
			return false;
		}
		if (handler == null || typeof handler != 'function')
		{
			return false;
		}
		if (object.addEventListener)
		{
			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);
		} 
		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;
		}
		return true;
	}
	this.fireEvent = false;
	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;
	init();
};
window.mouseTracker = new function()
{
	this.init = function()
	{
		window.eventsManager.addHandler(document, 'mousemove', this.captureMouseCoordinates);
	}
	this.captureMouseCoordinates = function(event)
	{
		var mouseX = 0;
		var mouseY = 0;
		var IE = document.all?true:false;
		if (!IE)
		{
			mouseX = event.pageX;
			mouseY = event.pageY;
		}
		else
		{
			mouseX = window.event.clientX + document.documentElement.scrollLeft;
			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.init();
}

window.customMouseTracker = function(documentObject)
{
	this.init = function()
	{
		if (documentObject)
		{
			this.documentObject = documentObject;
			if (documentObject.contentWindow)
			{
				eventsManager.addHandler(documentObject.contentWindow.document, 'mousemove', this.captureMouseCoordinates);
			}
			else
			{
				eventsManager.addHandler(documentObject, 'mousemove', this.captureMouseCoordinates);
			}
		}
	}
	this.captureMouseCoordinates = function(event)
	{
		var mouseX = 0;
		var mouseY = 0;
		var IE = document.all?true:false;
		if (!IE)
		{
			mouseX = event.pageX;
			mouseY = event.pageY;
		}
		else
		{
			mouseX = self.documentObject.contentWindow.event.clientX;
			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.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;
			}
		}
		
		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 = {};
	this.events = eventsIndex;
	init();
};
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;
};
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.debugLogics = new function()
{
	this.addRecord = function(text)
	{
		var record = {};
		record['text'] = text;
		records.push(record);
		window.controller.fireEvent('debugInfoUpdate');
	}
	this.getRecords = function()
	{
		return records;
	}
	var self = this;
	var records = new Array();
}
window.debug = function(text)
{
	window.debugLogics.addRecord(text);
};
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.searchLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.search_form');
		for (var i = 0; i < elements.length; i++)
		{
			new SearchFormComponent(elements[i]);
		}
		var elements = _('.detailedsearch_block');
		for (var i = 0; i < elements.length; i++)
		{
			new DetailedSearchFormComponent(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.loginLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.login_form');
		for (var i = 0; i < elements.length; i++)
		{
			new LoginFormComponent(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
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.feedbackFormLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.gallery_pictures');
		for (var i = 0; i < elements.length; i++)
		{
			new artWebZXGallery(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.votesLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.vote_controls');
		for (var i=0; i<elements.length; i++)
		{
			new VoteControls(elements[i]);
		}
	};
	var receiveData = function(responseStatus, responseData)
	{
		if (responseData)
		{
			if (responseData.zxPicture)
			{
				var zxPictureData = responseData.zxPicture;
				controller.fireEvent('zxPictureVoteRecalculated', zxPictureData);
			}
		}
	};
	this.makeVote = function(elementId, vote)
	{
		var url = '/ajax/id/'+elementId+'/action/vote/value/'+vote;
		var request = new jsonRequest(url, receiveData);
		request.send();
	};
	window.controller.addListener('initDom', initComponents);
};;
window.commentFormLogics = new function()
{
	var initComponents = function()
	{
		var elements = _('.comment_form');
		for (var i = 0; i < elements.length; i++)
		{
			new CommentForm(elements[i]);
		}
	}
	window.controller.addListener('initDom', initComponents);
};
window.debugComponent = new function()
{
	var initHandler = function()
	{
		componentElement = _('.debugBlock')[0];
		if (!componentElement)
		{
			componentElement = document.createElement('div');
			componentElement.className = 'debugBlock';
			componentElement.style.display = 'none';
			document.body.appendChild(componentElement);
		}
		eventsManager.addHandler(componentElement, 'click', clickHandler);
		window.controller.addListener('debugInfoUpdate', refreshContents);
	}
	var refreshContents = function()
	{
		componentElement.style.display = 'block';
		while (componentElement.firstChild)
		{
			componentElement.removeChild(componentElement.firstChild);
		}
		var records = window.debugLogics.getRecords();
		for (var i=0; i<records.length; i++)
		{
			var recordRow = document.createElement('div');
			recordRow.innerHTML = records[i].text;
			componentElement.appendChild(recordRow);
		}
	}
	var clickHandler = function()
	{
		componentElement.style.display = 'none';
	}
	var self = this;
	var componentElement = false;
	
	window.controller.addListener('initDom', initHandler);
};
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(element)
{
	this.submit = function(event)
	{
		eventsManager.preventDefaultAction(event);
		self.element.submit();
	}
	this.init = function()
	{
		var sendButton = _('.button', this.element)[0];
		eventsManager.addHandler(sendButton, 'click', this.submit);
	}
	var self = this;
	this.element = element;
	this.init();
}
;
function SearchFormComponent(formElement)
{
	var init = function()
	{
		if (submitButton = _('.search_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 submitButton = null;
	init();
}
function DetailedSearchFormComponent(componentElement)
{
	var formElement = null;

	var titleInput = null;
	var startYearInput = null;
	var endYearInput = null;
	var ratingInput = null;
	var partyPlaceInput = null;
	var pictureTypeSelect = null;
	var sortParameterSelect = null;
	var sortOrderSelect = null;

	var submitButton = null;

	var init = function()
	{
		if (formElement = _('.detailedsearch_form', componentElement)[0])
		{
			titleInput = _('.detailedsearch_title', formElement)[0];
			startYearInput = _('.detailedsearch_startyear', formElement)[0];
			endYearInput = _('.detailedsearch_endyear', formElement)[0];
			ratingInput = _('.detailedsearch_rating', formElement)[0];
			partyPlaceInput = _('.detailedsearch_partyplace', formElement)[0];
			pictureTypeSelect = _('.detailedsearch_picturetype', formElement)[0];
			sortParameterSelect = _('.detailedsearch_sortparameter', formElement)[0];
			sortOrderSelect = _('.detailedsearch_sortorder', formElement)[0];
			if (submitButton = _('.detailedsearch_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);
		}
		var url = formElement.getAttribute('action');

		if (titleInput.value != '')
		{
			url += 'titleWord/' + titleInput.value + '/';
		}
		if (startYearInput.value != '')
		{
			url += 'startYear/' + startYearInput.value + '/';
		}
		if (endYearInput.value != '')
		{
			url += 'endYear/' + endYearInput.value + '/';
		}
		if (ratingInput.value != '')
		{
			url += 'rating/' + ratingInput.value + '/';
		}
		if (partyPlaceInput.value != '')
		{
			url += 'partyPlace/' + partyPlaceInput.value + '/';
		}
		if (pictureTypeSelect.value != '')
		{
			url += 'pictureType/' + pictureTypeSelect.value + '/';
		}
		if (sortParameterSelect.value != '')
		{
			url += 'sortParameter/' + sortParameterSelect.value + '/';
		}
		if (sortOrderSelect.value != '')
		{
			url += 'sortOrder/' + sortOrderSelect.value + '/';
		}
		url += 'page/1/';
		document.location.href = url;
	};
	init();
}
;
function RegistrationFormComponent(formElement)
{
	var init = function()
	{
		eventsManager.addHandler(formElement, 'keydown', keyDownHandler);
		if (submitButton = _('.button', 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 LoginFormComponent(formElement)
{
	var init = function()
	{		
		if (submitButton = _('a.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;
	init();
};
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.artWebDarkLayer = new function()
{
	this.showLayer = function(onclickFunction, callback)
	{
		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)
		{
			artWebEffectsManager.startEffect('opacity', this.domElement, parameters, callback);
		}
		else
		{
			artWebEffectsManager.startEffect('opacity', this.domElement, parameters);
		}
		
		if (typeof allowClose != 'undefined')
		{
			this.allowClose = allowClose;
		}
		
		if (onclickFunction)
		{
			eventsManager.addHandler(this.domElement, "click", onclickFunction);
		}
		else
		{
			eventsManager.addHandler(this.domElement, "click", this.layerClickHandler);
		}
	}
	this.hideLayer = function()
	{
		if (self.allowClose)
		{
			var parameters = {end:0, step: self.step};
			artWebEffectsManager.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.9;
	this.step = 0.05;
	this.allowClose = true;
	this.backgroundColor = '#000000';
	window.controller.addListener('initDom', this.init);
};
window.artWebZXGallery = function(galleryElement)
{
	this.init = function()
	{
		this.galleryElement = galleryElement;
		this.parentId = this.galleryElement.id.split('_')[1];
		
		if (window.galleryPictures[this.parentId])
		{
			this.galleryPictures = window.galleryPictures[this.parentId];
			this.createDomStructure();
			var imagesElements = _('.zxgallery_item', self.galleryElement);
			for (var i=0; i<imagesElements.length; i++)
			{
				self.contentImagesList.push(new artWebAuthorImage(imagesElements[i], this));
			}
		}
		eventsManager.addHandler(window, 'keydown', self.keyDownHandler);
	}
	this.createDomStructure = function()
	{
		this.componentElement = document.createElement('div');
		this.componentElement.style.display = 'none';
		this.componentElement.style.position = 'fixed';
		this.componentElement.style.top = '0';
		this.componentElement.style.left = '0';
		this.componentElement.style.width = '990px';
		this.componentElement.style.height = '100%';
		this.componentElement.style.zIndex = '100';
		eventsManager.addHandler(this.componentElement, 'click', this.hideComponent);
		
		this.bigImageContainer = document.createElement('div');
		this.bigImageContainer.style.position = 'absolute';
		this.bigImageContainer.style.top = '0';
		this.bigImageContainer.style.left = '0';
		this.bigImageContainer.style.width = '640px';
		this.bigImageContainer.style.height = '480px';
		
		this.interlaceLayer = document.createElement('div');
		this.interlaceLayer.className = 'interlace25';
		this.interlaceLayer.style.height = '100%';
		this.interlaceLayer.style.width = '100%';
		this.interlaceLayer.style.position = 'absolute';
		this.interlaceLayer.style.left = '0';
		this.interlaceLayer.style.top = '0';
		this.interlaceLayer.style.zIndex = '110';
		this.bigImageContainer.appendChild(this.interlaceLayer);
		
		this.componentElement.appendChild(this.bigImageContainer);
		
		this.titleBlock = document.createElement('div');
		this.titleBlock.className = 'fullscreen_title';
		this.titleBlock.style.position = 'absolute';
		this.titleBlock.style.top = '500px';
		this.titleBlock.style.left = '25px';
		
		this.componentElement.appendChild(this.titleBlock);
		
		this.thumbnailsContainer = document.createElement('div');
		this.thumbnailsContainer.style.position = 'absolute';
		this.thumbnailsContainer.style.top = '0';
		this.thumbnailsContainer.style.bottom = '0';
		this.thumbnailsContainer.style.right = '0';
		this.thumbnailsContainer.style.width = '335px';
		this.thumbnailsContainer.style.overflow = 'auto';
		
		this.componentElement.appendChild(this.thumbnailsContainer);
		
		for (var i in this.galleryPictures)
		{
			var imageInfo = window.imageInfoIndex[this.galleryPictures[i]];
			var thumbnail = new artWebAuthorThumbnail(imageInfo, self);
			this.thumbnailsContainer.appendChild(thumbnail.componentElement);
			
			this.thumbnailsList.push(thumbnail);
			this.thumbnailsIndex[thumbnail.id] = thumbnail;
		}
		
		document.body.appendChild(this.componentElement);
	}
	this.markActiveThumbnail = function()
	{
		if (this.previousImageId && this.currentImageId != this.previousImageId)
		{
			if (this.thumbnailsIndex[this.previousImageId])
			{
				this.thumbnailsIndex[this.previousImageId].markInactive();
			}
		}
		if (this.currentImageId)
		{
			if (this.thumbnailsIndex[this.currentImageId])
			{
				this.thumbnailsIndex[this.currentImageId].markActive();
			}
		}
	}
	this.showImage = function(imageId)
	{
		if (this.currentImageId)
		{
			this.previousImageId = this.currentImageId;
			if (this.largeImagesIndex[this.previousImageId])
			{
				this.largeImagesIndex[this.previousImageId].componentElement.style.zIndex = '5';
			}
		}
		this.currentImageId = imageId;
		
		this.markActiveThumbnail();
		
		if (!this.displayed)
		{
			this.hidePreviousImage();
			window.artWebDarkLayer.showLayer(this.hideComponent, this.displayComponent, true);
		}
		else
		{
			if (this.previousImageId != this.currentImageId)
			{
				this.checkImageObject();
			}
		}
	}
	this.displayComponent = function()
	{
		self.componentElement.style.display = 'block';
		
		if (window.pageYOffset)
		{
			var viewPortLeft = window.pageXOffset;
			var viewPortTop = window.pageYOffset;
		}
		else
		{
			var viewPortLeft = document.documentElement.scrollLeft;
			var viewPortTop = document.documentElement.scrollTop;
		}
		
		if (window.innerHeight)
		{
			var viewPortWidth = window.innerWidth;
			var viewPortHeight = window.innerHeight;
		}
		else
		{
			var viewPortWidth = document.documentElement.offsetWidth;
			var viewPortHeight = document.documentElement.offsetHeight;
		}
		self.componentElement.style.left = viewPortLeft + (viewPortWidth - self.componentElement.offsetWidth)/2 + 'px';
		
		self.displayed = true;
		self.checkImageObject();
	}
	this.checkImageObject = function()
	{
		this.hideContentImages();
		var currentImageId = self.currentImageId;
		if (!self.largeImagesIndex[currentImageId])
		{
			if (window.imageInfoIndex[currentImageId])
			{
				var imageInfo = window.imageInfoIndex[currentImageId];
				var largeImageObject = new artWebAuthorLargeImage(imageInfo, self);
				self.largeImagesIndex[currentImageId] = largeImageObject;
				self.bigImageContainer.appendChild(largeImageObject.componentElement);
				self.titleBlock.textContent = largeImageObject.title;
			}
		}
		if (self.largeImagesIndex[currentImageId])
		{
			self.largeImagesIndex[currentImageId].checkPreload();
		}
	}
	this.displayContentImages = function()
	{
		for (var i=0; i<self.contentImagesList.length; i++)
		{
			self.contentImagesList[i].displayComponent();
		}
	}
	this.hideContentImages = function()
	{
		for (var i=0; i<self.contentImagesList.length; i++)
		{
			self.contentImagesList[i].hideComponent();
		}
	}
	this.hidePreviousImage = function()
	{
		for (var index in self.largeImagesIndex)
		{
			if (index != self.currentImageId)
			{
				self.largeImagesIndex[index].hideComponent();
			}
		}
	}
	this.hideComponent = function()
	{
		self.displayContentImages();
		self.componentElement.style.display = 'none';
		self.displayed = false;
		window.artWebDarkLayer.hideLayer();
	}
	this.keyDownHandler = function(event)
	{
		if (self.displayed)
		{
			if (event.keyCode == '27')
			{
				eventsManager.preventDefaultAction(event);
				self.hideComponent();
			}
			if (event.keyCode == '32')
			{
				eventsManager.preventDefaultAction(event);
				self.showNextImage();
			}
		}
	}
	this.showNextImage = function()
	{
		var nextImage = 0;
		
		if (self.currentImageId)
		{
			for (var i=0; i<self.thumbnailsList.length; i++)
			{
				if (self.thumbnailsList[i].id == self.currentImageId)
				{
					nextImage = i+1;
					break;
				}
			}
		}

		if (nextImage >= self.thumbnailsList.length)
		{
			nextImage = 0;
		}
		self.showImage(self.thumbnailsList[nextImage].id);
	}
	var self = this;
	
	this.displayed = false;
	this.parentId = false;
	this.galleryPictures = false;
	
	this.currentImageId = false;
	this.previousImageId = false;
	
	this.galleryElement = false;
	this.componentElement = false;
	this.interlaceLayer = false;
	this.bigImageContainer = false;
	this.thumbnailsContainer = false;
	
	this.largeImagesIndex = {};
	this.contentImagesList = new Array();
	this.thumbnailsList = new Array();
	this.thumbnailsIndex = {};
	
	this.init();
}
window.artWebAuthorImage = function(componentElement, parentComponent)
{
	this.init = function()
	{
		this.componentElement = componentElement;
		this.parentComponent = parentComponent;
		
		this.id = this.componentElement.id.split('_')[1];
		
		self.componentElement.style.cursor = 'pointer';
		
		eventsManager.addHandler(this.componentElement, 'click', this.clickHandler);
		eventsManager.addHandler(this.componentElement, 'mouseenter', this.mouseEnterHandler);
		eventsManager.addHandler(this.componentElement, 'mouseleave', this.mouseLeaveHandler);
	}
	this.clickHandler = function()
	{
		self.parentComponent.showImage(self.id);
	}
	this.displayComponent = function()
	{
		self.componentElement.style.visibility = 'visible';
	}
	this.hideComponent = function()
	{
		self.componentElement.style.visibility = 'hidden';
	}
	this.mouseEnterHandler = function(event)
	{
		self.componentElement.style.border = '1px solid #809ECF';
	}
	this.mouseLeaveHandler = function(event)
	{
		self.componentElement.style.border = '1px solid #000000';
	}
	var self = this;
	
	this.id = false;
	
	this.componentElement = false;
	this.parentComponent = false;
	this.init();
}
window.artWebAuthorThumbnail = function(imageInfo, parentComponent)
{
	this.init = function()
	{
		this.componentElement = document.createElement('div');
		
		this.active = false;
		
		this.componentElement.style.width = '64px';
		this.componentElement.style.padding = '4px';
		this.componentElement.style.margin = '2px';
		this.componentElement.style.border = '1px solid #000000';
		this.componentElement.style.display = 'inline-block';
		
		this.imageElement = document.createElement('img');
		this.imageElement.src = imageInfo.smallImage;
		this.imageElement.style.display = 'block';
		
		this.componentElement.appendChild(this.imageElement);
		this.parentComponent = parentComponent;
		
		this.id = imageInfo.id;
	
		eventsManager.addHandler(this.componentElement, 'click', this.clickHandler);
		eventsManager.addHandler(this.componentElement, 'mouseenter', this.mouseEnterHandler);
		eventsManager.addHandler(this.componentElement, 'mouseleave', this.mouseLeaveHandler);
		
		this.refreshStatus();
	}
	this.clickHandler = function(event)
	{
		eventsManager.cancelBubbling(event);
		self.parentComponent.showImage(self.id);
	}
	this.mouseEnterHandler = function(event)
	{
		self.hovered = true;
		self.refreshStatus();
	}
	this.mouseLeaveHandler = function(event)
	{
		self.hovered = false;
		self.refreshStatus();
	}
	this.markActive = function()
	{
		this.active = true;
		this.refreshStatus();
	}
	this.markInactive = function()
	{
		this.active = false;
		this.refreshStatus();
	}
	this.refreshStatus = function()
	{
		if (self.active)
		{
			this.componentElement.style.cursor = 'auto';
			self.componentElement.style.border = '1px solid #809ECF';
		}
		else
		{
			this.componentElement.style.cursor = 'pointer';
			if (self.hovered)
			{
				self.componentElement.style.border = '1px solid #809ECF';
			}
			else
			{
				self.componentElement.style.border = '1px solid #000000';
			}
		}	
	}
	var self = this;
	
	this.id = false;
	this.active = false;
	this.hovered = false;
	this.componentElement = false;
	this.parentComponent = false;
	this.init();
}
window.artWebAuthorLargeImage = function(imageInfo, parentComponent)
{
	this.init = function()
	{
		this.componentElement = document.createElement('img');
		this.componentElement.src = imageInfo.largeImage;

		this.componentElement.style.position = 'absolute';
		this.componentElement.style.left = '0';
		this.componentElement.style.top = '0';
		this.componentElement.style.zIndex = '10';
		this.componentElement.style.cursor = 'pointer';
		opacityHandler.setOpacity(self.componentElement, 0);
		this.componentElement.style.display = 'block';
		
		this.parentComponent = parentComponent;
		
		this.id = imageInfo.id;
		this.title = imageInfo.title;
		
		eventsManager.addHandler(this.componentElement, 'click', this.clickHandler);
	}
	this.displayComponent = function()
	{
		opacityHandler.setOpacity(self.componentElement, 0);
		self.componentElement.style.display = 'block';
		self.componentElement.style.zIndex = '15';
		
		var parameters = {end:1, step: 0.05};
		artWebEffectsManager.startEffect('opacity', self.componentElement, parameters, self.parentComponent.hidePreviousImage);
	}
	this.checkPreload = function()
	{
		if (!self.componentElement.complete)
		{
			window.setTimeout(self.checkPreload, 200);
		}
		else
		{
			self.displayComponent();
		}
	}
	this.hideComponent = function()
	{
		self.componentElement.style.display = 'none';
	}
	this.clickHandler = function(event)
	{
		eventsManager.cancelBubbling(event);
		self.parentComponent.showNextImage();
	}
	var self = this;
	
	this.id = false;
	
	this.componentElement = false;
	this.parentComponent = false;
	this.init();
};
function VoteControls(componentElement)
{
	var init = function()
	{
		if (starsElement = _('.vote_controls_stars', componentElement)[0])
		{
			userVoteElement = _('.vote_controls_uservote', componentElement)[0];
			if (starsElement.className.search('vote_controls_voted') != -1)
			{
				voted = true;
				voteValueElement = _('.vote_controls_value', componentElement)[0];
			}
			else
			{
				voteValueElement = document.createElement('div');
				voteValueElement.className = 'vote_controls_value';
				starsElement.appendChild(voteValueElement);
			}

				if (componentElement.id.search('vote_id_') != -1)
				{
					pictureId = componentElement.id.split('_')[2];
				}

			for (var i=0; i<maxVote; i++)
			{
				var starElement = document.createElement('div');
				starElement.className = 'vote_controls_star';
				starElement.style.left = (i*12)+'px';
				starsElement.appendChild(starElement);

				if (window.userName != 'anonymous')
				{
					eventsManager.addHandler(starElement, 'click', function(i){return function(){clickHandler(i+1);};}(i));
					eventsManager.addHandler(starElement, 'mouseover', function(i){return function(){mouseOverHandler(i+1);};}(i));
				}
				starElements.push(starElement);
			}
			if (window.userName == 'anonymous')
			{
				var popup = new TipPopup(componentElement, window.translations['label_registration_required']);
			}
			else
			{
				eventsManager.addHandler(starsElement, 'mouseout', mouseOutHandler);
				controller.addListener('zxPictureVoteRecalculated', voteCalculatedHandler);
			}
		}

	};
	var voteCalculatedHandler = function(zxPictureData)
	{
		if (zxPictureData.id == pictureId)
		{
			var votes = zxPictureData.votes;
			voteValueElement.style.width = zxPictureData.votePercent+'%';
			starsElement.className = 'vote_controls_stars vote_controls_voted';

			userVoteElement.innerHTML = zxPictureData.userVote+' <span class="vote_controls_uservote_delimiter">/</span> ';
		}
	};
	var mouseOverHandler = function(number)
	{
		starsHovered = number;
		refresh();
	};
	var mouseOutHandler = function()
	{
		starsHovered = 0;
		refresh();
	};
	var clickHandler = function(number)
	{
		votesLogics.makeVote(pictureId, number)
	};
	var refresh = function()
	{
		for (var i=0; i<starElements.length; i++)
		{
			if (i<starsHovered)
			{
				starElements[i].className = 'vote_controls_star vote_controls_star_gold';
			}
			else
			{
				starElements[i].className = 'vote_controls_star';
			}
		}

	};

	var pictureId = false;
	var voted = false;

	var voteValueElement;
	var starsElement;
	var userVoteElement;
	var starElements = new Array();
	var starsHovered = 0;
	var maxVote = 5;

	init();
};;
window.TipPopup = function(referralElement, popupText)
{
	var init = function()
	{
		createDomElements();
		window.eventsManager.addHandler(referralElement, 'mousemove', moveHandler);
		window.eventsManager.addHandler(referralElement, 'mouseenter', enterHandler);
		window.eventsManager.addHandler(referralElement, 'mouseleave', leaveHandler);
	}
	var moveHandler = function()
	{
		if (displayed)
		{
			updatePosition();
		}
	}
	var createDomElements = function()
	{
		componentElement = document.createElement('div');
		componentElement.className = 'tip_popup';
		componentElement.style.display = 'none';
		componentElement = componentElement;
		
		document.body.appendChild(componentElement);
		
		var contentElement = document.createElement('div');
		contentElement.className = 'popup_content';
		componentElement.appendChild(contentElement);
		
		setTextContent(contentElement, popupText);
	}
	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 enterHandler = function()
	{
		displayTimeout = window.setTimeout(displayComponent, displayDelay);
	}
	var leaveHandler = function()
	{
		window.clearTimeout(displayTimeout);
		
		var parameters = {end:0, step: 0.1};
		artWebEffectsManager.startEffect('opacity', componentElement, parameters, hideComponent);
	}
	var displayComponent = function()
	{
		displayed = true;
		
		componentElement.style.display = 'block';
		opacityHandler.setOpacity(componentElement, 0);
		
		updatePosition();
		
		var parameters = {end:1, step: 0.05};
		artWebEffectsManager.startEffect('opacity', componentElement, parameters);
	}
	var hideComponent = function()
	{
		displayed = false;
		componentElement.style.display = 'none';
	}
	var updatePosition = function()
	{
		var popupWidth = componentElement.offsetWidth;
		var popupHeight = componentElement.offsetHeight;
		
		var xPosition = window.mouseTracker.mouseX + popupOffset;
		var yPosition = window.mouseTracker.mouseY - popupHeight - popupOffset;
		
		componentElement.style.left = xPosition+'px';
		componentElement.style.top = yPosition+'px';
	}
	var setTextContent = function(element, text)
	{
		while(element.firstChild)
		{
			element.removeChild(element.firstChild);
		}
		var textNode = document.createTextNode(text);
		element.appendChild(textNode);
	}
	var self = this;
	
	var componentElement = false;
	var popupOffset = 12;
	var displayDelay = 500;
	var displayed = false;
	var displayTimeout = false;
	
	init();
};
function CommentForm(element)
{
	this.submit = function(event)
	{
		if (window.localStorage)
		{
			if (self.nameInput.value != '')
			{
				var name = self.nameInput.value;
				window.localStorage.setItem('comment_form_name', name);
			}
			if (self.emailInput.value != '')
			{
				var email = self.emailInput.value;
				window.localStorage.setItem('comment_form_email', email);
			}
			if (self.websiteInput.value != '')
			{
				var website = self.websiteInput.value;
				window.localStorage.setItem('comment_form_website', website);
			}
		}
		self.randomInput.value = window.someRandomValue;
		self.element.submit();
	}
	this.init = function()
	{
		var sendButton = _('.form_button', this.element)[0];
		this.randomInput = _('.comment_form_random', this.element)[0];
		this.nameInput = _('.comment_form_name', this.element)[0];
		this.emailInput = _('.comment_form_email', this.element)[0];
		this.websiteInput = _('.comment_form_website', this.element)[0];
		eventsManager.addHandler(sendButton, 'click', this.submit);
		
		if (window.localStorage)
		{
			if (this.nameInput.value == '')
			{
				var name = window.localStorage.getItem('comment_form_name');
				this.nameInput.value = name;
			}
			if (this.emailInput.value == '')
			{
				var email = window.localStorage.getItem('comment_form_email');
				this.emailInput.value = email;
			}
			if (this.websiteInput.value == '')
			{
				var website = window.localStorage.getItem('comment_form_website');
				this.websiteInput.value = website;
			}
		}
	}
	var self = this;
	this.element = element;
	this.randomInput = false;
	this.nameInput = false;
	this.emailInput = false;
	this.websiteInput = false;
	this.init();
};

