
var Common = {

	// Common classes methods
	
	Class : {
		
		match : function(
			oElement,
			sClassName
			) {
	
			return (oElement.className && oElement.className.match(new RegExp('(^|\\s+)(' + sClassName + ')($|\\s+)')))? true : false;	
		
		},
		
		add : function(
			oElement,
			sClassName
			) {

			if(!Common.Class.match(oElement, sClassName)) {
				oElement.className += ' ' + sClassName;
			}
			
		},
		
		replace : function(
			oElement,
			sClassNameFrom,
			sClassNameTo
			) {
			
			if(Common.Class.match(oElement, sClassNameFrom)) {
				oElement.className = (oElement.className.replace( new RegExp("(^|\\s+)(" + sClassNameFrom + "|" + sClassNameTo + ")($|\\s+)", "g"), "$1" ) + ' ' + sClassNameTo ).replace( /^\s+/, '');
			}
			else {
				Common.Class.add(oElement, sClassNameTo);
			}			
			
		},
		
		remove : function(
			oElement,
			sClassName
			) {
	
			oElement.className = oElement.className.replace(new RegExp('(.*)(^|\\s+)(' + sClassName + ')($|\\s+)(.*)'), '$1$4$5').replace(/(^)\s/, '$1');	
			
		}
		
	},
		
	
	// Common event's methods
	
	Event : {
	
		aObservers : [],

		add : function(
			mElement,
			mEventType,
			fEventFunction
			) {
						
			if(mElement.length && mElement.sort) {
			
				for(var i = 0; i < mElement.length; i++) {
					this.add(mElement[i], mEventType, fEventFunction);
				}
				
				return;
				
			}
			
			if(!mEventType.match && mEventType.length) {
				
				for(var i = 0; i < mEventType.length; i++) {
					this.add(mElement, mEventType[i], fEventFunction);
				}
								
				return;				
				
			}			
			
			if(mElement.addEventListener) {							
				mElement.addEventListener(
					mEventType,
					fEventFunction,
					false		
					);
			}
			else if(mElement.attachEvent) {				
							
				if(this.aObservers.length == 0) {
					
					this.aObservers.push([mElement, mEventType, fEventFunction]);
									
					this.add(
						window,
						'unload',
						Common.Event.detachObservers
						);
					
				}
				else {
					this.aObservers.push([mElement, mEventType, fEventFunction]);
				}
					
				mElement.attachEvent('on' + mEventType, fEventFunction);				
				
				
			}
	
		},	

		remove : function(
			mElement,
			mEventType,
			fEventFunction
			) {
			
			if(mElement.length && mElement.sort) {
				
				for(var i = 0; i < mElement.length; i++) {
					this.remove(mElement[i], mEventType, fEventFunction);
				}				
				
				return;				
				
			}
			
			if(!mEventType.match && mEventType.length) {
				
				for(var i = 0; i < mEventType.length; i++) {
					this.remove(mElement, mEventType[i], fEventFunction);
				}				
				
				return;				
				
			}			
		
			if(mElement.removeEventListener) {
				mElement.removeEventListener(
					mEventType,
					fEventFunction,
					false
					);
			}
			else if(mElement.detachEvent) {			
				mElement.detachEvent(
					'on' + mEventType,
					fEventFunction
					);									
			}
			
		},
		
		detachObservers : function() {			
			
			for(var i = 0, iLength = Common.Event.aObservers.length; i < iLength; i++) {	
				
				Common.Event.remove(
					Common.Event.aObservers[i][0],
					Common.Event.aObservers[i][1],
					Common.Event.aObservers[i][2]
					);
					
				Common.Event.aObservers[i][0] = null;
					
			}					
			
			Common.Event.aObservers.length = 0;
			
		},
		
		cancel : function(oEvent) {
					
			var oEvent = oEvent? oEvent : window.event;
			
			oEvent.cancelBubble = true;
			oEvent.returnValue = false;
			
			if(oEvent.cancelable){
				
				oEvent.preventDefault();
				oEvent.stopPropagation();
				
			}
			
			return false;
			
		},
		
		normalize : function(oEvent) {
						
			var oEvent = oEvent? oEvent : window.event;
			
			if(oEvent && oEvent.srcElement && !window.opera) {									
				oEvent.target = oEvent.srcElement;				
			}
			
			if(oEvent){
				
				oEvent.iKeyCode = oEvent.keyCode?
					oEvent.keyCode :
					(oEvent.which? oEvent.which : null)
					;
							
				if(oEvent.wheelDelta) {
									
					oEvent.iMouseWheelDelta = oEvent.wheelDelta / 120;
					
					if(window.opera) {
						oEvent.iMouseWheelDelta *= -1;
					}
					
				}
				else if(oEvent.detail) {
					oEvent.iMouseWheelDelta = -oEvent.detail / 3;
				}
				
			}
			
			return oEvent;
		
		},
		
		getAbsoluteCoords : function(oEvent) {

			var
				oEvent = oEvent? oEvent : window.event,
				oResult = {
					iLeft : 0,
					iTop  : 0
					}
				;

			if(oEvent.pageX || oEvent.pageY) {
  
				oResult.iLeft = oEvent.pageX;
				oResult.iTop = oEvent.pageY;
				
			}
			else if(oEvent.clientX || oEvent.clientY) {
	
				oResult.iLeft = oEvent.clientX + document.body.scrollLeft - document.body.clientLeft;
				oResult.iTop = oEvent.clientY + document.body.scrollTop - document.body.clientTop;

				if(document.body.parentElement && document.body.parentElement.clientLeft) {
		
					var oBodyParent = document.body.parentElement;
		
					oResult.iLeft += oBodyParent.scrollLeft - oBodyParent.clientLeft;
					oResult.iTop += oBodyParent.scrollTop - oBodyParent.clientTop;  
			
				}
		
			}
			
			return oResult;
			
		}
		
	},	
	
	
	// Common DOM's methods
	
	Dom : {
			
		NODE_TYPE_ELEMENT : 1,
		NODE_TYPE_TEXT    : 3,
		
		getAbsoluteCoords : function(oElement) {
			
			var oResult = {
				iTop  : 0,
				iLeft : 0
				};
	
			while(oElement) {
	
				oResult.iTop += oElement.offsetTop;
				oResult.iLeft += oElement.offsetLeft;
		
				oElement = oElement.offsetParent;
		
			}
		
			return oResult;
			
		},				
				
		getAttribute : function(
			oElement,
			sName
			) {			
				
			if(oElement.attributes) {			
				for(var i = 0, iLength = oElement.attributes.length; i < iLength; i++){
					if(oElement.attributes[i].nodeName == sName) {
						return oElement.attributes[i].nodeValue;
					}				
				}				
			}
			
			return oElement.getAttribute(sName);

		},
		
		getElementsByClassName : function(
			oElement,
			sClassName,
			sTagName,
			bRecursion
			) {
				
			var
				aResult = [],
				sTagName = sTagName || '*';
				;
			
			if(!bRecursion) {
			
				if(document.evaluate) {				
					
					oQueryResult = document.evaluate(
						'.//' + sTagName + '[contains(concat(\' \', @class, \' \'), \' ' + sClassName + ' \')]',
						oElement,
						null,
						XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
						null
						);
				
					for(var i = 0, iLength = oQueryResult.snapshotLength; i < iLength; i++) {
						aResult.push(oQueryResult.snapshotItem(i));
					}
				 
				 	return aResult;
				
				}												
			
				var aDescendants = oElement.getElementsByTagName(sTagName);
			
				if(aDescendants.length > 0 ||
					sTagName != '*'
					) {
					
					for(var i = 0, iLength = aDescendants.length, oDescendant; i < iLength; i++) {
					
						oDescendant = aDescendants[i];
					
						if(Common.Class.match(oDescendant, sClassName)) {
							aResult.push(oDescendant);						
						}
							
					}
				
					return aResult;
					
				}
				
			}
			
			for(var i = 0, iLength = oElement.childNodes.length, oChild; i < iLength; i++) {
				
				oChild = oElement.childNodes[i];
				
				if(oChild.nodeType != Common.Dom.NODE_TYPE_ELEMENT) {
					continue;
				}
				
				if(Common.Class.match(oChild, sClassName)) {
					aResult.push(oChild);						
				}
				
				aResult = aResult.concat(
					this.getElementsByClassName(
						oChild,
						sClassName,
						sTagName,			
						true
						)
					);
				
			}
			
			return aResult;
				
		}
		
	},
		
	// Common cookie's methods
	
	Cookie : {
	
		set : function(sName, sValue, sExpire, sPath) {
		
			document.cookie = sName + '=' + (window.encodeURI? encodeURI(sValue) : escape(sValue)) +
				((sExpire == null)? '' : ('; expires=' + sExpire.toGMTString())) +
				((sPath == null)? '' : ('; path=' + sPath));
		
		},
		
		get : function(sName) {
		
			var sSearch = sName + '=';
			
			if(document.cookie.length > 0) {
			
				var iOffset = document.cookie.indexOf(sSearch);
				
				if(iOffset != -1) {
				
					iOffset += sSearch.length;
			
					var iEnd = document.cookie.indexOf(';', iOffset);
			
					if(iEnd == -1) {
						iEnd = document.cookie.length;
					}
					
					return window.decodeURI?
						decodeURI(document.cookie.substring(iOffset, iEnd)) :
						unescape(document.cookie.substring(iOffset, iEnd))
						;
					
				}
			}
			
			return '';			
		
		}
	
	},
	
	
	// Common object's methods

	Object : {
				
		extend : function(			
			oDestination,
			oSource,
			bReplace
			) {				
		
			for(var i in oSource) {
				if(bReplace || !oDestination[i]) {
					oDestination[i] = oSource[i];
				}
			}
		
			return oDestination;
		
		}
		
	},
	

	Utils : {
	
		oPopupDefaults : {	
	
			iWidth      : 540,
			iHeight     : 600,
			sToolbar    : 'no',
			sMenubar    : 'no',
			sResizeable : 'yes',
			sScrollbars : 'yes',
			sStatus     : 'yes'
	
		},
	
		popup : function(
			sUrl,
			sName,
			oOptions,
			bReplace
			) {
		
			oOptions = Common.Object.extend(
				Common.Utils.oPopupDefaults,
				oOptions,
				true
				);
		
			var iLeftOffset = screen.availWidth / 2 - oOptions.iWidth / 2;
			var iTopOffset = screen.availHeight / 2 - oOptions.iHeight / 2;			
		
			oNewWindow = window.open(
				sUrl,
				sName,
				'left=' + iLeftOffset + ', ' +
				'top = ' + iTopOffset + ', ' +
				'width=' + oOptions.iWidth + ', ' +
				'height=' + oOptions.iHeight + ', ' +
				'menubar=' + oOptions.sMenubar + ', ' +
				'toolbar=' + oOptions.sToolbar + ', ' +
				'resizable=' + oOptions.sResizeable + ', ' +
				'scrollbars=' + oOptions.sScrollbars + ', ' +
				'status=' + oOptions.sStatus
				);
			
			if(sUrl.match(/\.(gif|jpe?g|png)$/i)) {
		
				oNewWindow.document.open();
			
				oNewWindow.document.write('<html><head></head><body style="background: #FFF; margin: 0px; padding: 0px;">' +
					'<table cellpadding="0" cellspacing="0" border="0" width="100%" height="100%"><tr><td align="center">' + 
					'<img src="' + sUrl + '" />' +
					'</td></tr></table></body></html>'
					);
				
				oNewWindow.document.close();
		
			}
			
			oNewWindow.focus();				

			return false;
			
		},
		
		aNavigationLinks : [
			{										
				sRel     : 'next',
				iKeyCode : 0x25,	
				sHref    : ''
			},
			{
				sRel     : 'prev',
				iKeyCode : 0x27,	
				sHref    : ''
			},
			{
				sRel     : 'up',
				iKeyCode : 0x26,	
				sHref    : ''
			},
			{
				sRel     : 'down',			
				iKeyCode : 0x28,
				sHref    : ''
			},
			{
				sRel     : 'home',			
				iKeyCode : 0x24,	
				sHref    : '/'
			}
		],
		
		keyNavigationInit : function() {
			
			var aLinkElements = document.getElementsByTagName('link');						
			
			for(var i = 0, sRel; i < aLinkElements.length; i++) {							
				
				sRel = aLinkElements[i].rel;
				
				for(var j = 0; j < this.aNavigationLinks.length; j++) {
					if(this.aNavigationLinks[j].sRel == sRel) {
											
						this.aNavigationLinks[j].sHref = aLinkElements[i].href;
						break;
						
					}
				}												
				
			}
			
			Common.Event.add(
				document,
				'keydown',
				function(oEvent) {					
					
					var oEvent = Common.Event.normalize(oEvent);
					
					if(!oEvent.ctrlKey) {
						return true;
					}
					
					var aLinks = Common.Utils.aNavigationLinks;
					
					for(var i = 0; i < aLinks.length; i++) {
						if(aLinks[i].iKeyCode == oEvent.iKeyCode &&
							aLinks[i].sHref != ''
							) {								
							document.location = aLinks[i].sHref;
						}
					}
					
				}
				);
			
		}
		
	}

}





















/* Extensions */

Common.Object.extend(
	Function.prototype,
	{
		
		call : function() {
		
			var
				oObject = arguments[0],
				aArguments = [],
				oResult
				;	
		
			oObject.fFunction = this;
			
			for(var i = 1; i < arguments.length; i++) {
				aArguments[aArguments.length] = 'arguments[' + i + ']';		
			}
		
			eval('oResult = oObject.fFunction(' + aArguments.join(',') + ')');
		
			oObject.fFunction = null;
		
			return oResult;
			
		},

		apply : function() {
    
			var
				oContext,
				oOldProperty,
				aArguments = [],
				oResult			
				;
				    	
    		oContext = arguments.length == 0? window : arguments[0];    	
    	
    		oOldProperty = oContext.__temp;
    	
    		oContext.__temp = this;
    
    		for(var i = 0; i < arguments[1].length; i++) {
    			aArguments[aArguments.length] = 'arguments[1][' + i + ']';
    		}
    	
    		oResult = eval('oContext.__temp(' + aArguments.join(',') + ')');
    	
    		oContext.__temp = oOldProperty;
    	
    		return oResult;
    
		},

		inheritFrom : function(
			BaseClass,
			oOverride
			) {
		
			var Inheritance = function() {};
			
			Inheritance.prototype = BaseClass.prototype;

			this.prototype = new Inheritance();
			this.prototype.constructor = this;
			this.baseConstructor = BaseClass;
			this.superClass = BaseClass.prototype;
			
			if(oOverride) {
				Common.Object.extend(
					this.prototype,
					oOverride,
					true
					);
			}
			
		}
	
	}
	);
		






function main(){
	var aeInput = document.getElementsByTagName( 'input' );
	for( var i = 0 ; i < aeInput.length ; i++ ){
		if( aeInput[i].getAttribute( 'placeholder' ) ){
			placeholder( aeInput[i], aeInput[i].getAttribute( 'placeholder' ), 'empty' );
		}
	}

	makeSearchExamples();
	makePseudoLinks();
	makeLogoHover();
}



function makeSearchExamples(){
	var eSearch = document.getElementById( 'search' );
	if ( eSearch ) {
		var eSearchInput = Common.Dom.getElementsByClassName(eSearch, 'search_input', 'input')[0];
		var eSearchExamples = Common.Dom.getElementsByClassName(eSearch, 'search_examples', 'div')[0];
		if ( eSearchInput && eSearchExamples ) {
			var aLinks = eSearchExamples.getElementsByTagName('a');
			if (aLinks.length > 0) {
				for (var i = 0, iLength = aLinks.length, oLink; i < iLength; i++) {
					oLink = aLinks[i];
					Common.Class.add( oLink, 'pseudo_link' );
					oLink.onclick = function(evt) { eSearchInput.value = this.innerHTML; return Common.Event.cancel(evt); }
				}
			}
		}
	}
}

function makePseudoLinks() {
	var aPseudoLinks = Common.Dom.getElementsByClassName(document, 'pseudo_link', '*');
	if (aPseudoLinks.length > 0) {
		for(var i = 0, iLength = aPseudoLinks.length, oPseudoLink; i < iLength; i++) {
			oPseudoLink = aPseudoLinks[i];
			oPseudoLink.onmouseover = function() { Common.Class.add(this, 'pseudo_link_hover'); }
			oPseudoLink.onmouseout = function() { Common.Class.remove(this, 'pseudo_link_hover'); }
		}
	}
}

function makeLogoHover() {
	var oLogo = document.getElementById( 'logo' );
	var oSiteCaption = document.getElementById( 'site_caption' );
	if ( oLogo && oSiteCaption ) {
		var oLogoLink = oLogo.getElementsByTagName('a')[0];
		if ( oLogoLink ) {
			Common.Event.add( oLogoLink, 'mouseover', function() { Common.Class.add(oSiteCaption, 'hover'); } );
			Common.Event.add( oLogoLink, 'mouseout', function() { Common.Class.remove(oSiteCaption, 'hover'); } );
		}
	}
}




function PopupBlock(oContainer, oLink){

	this.bInit = null;
	this.bKeep = false;

	var me = this;

	// &ETH;&ordm;&ETH;&frac34;&ETH;&frac12;&Ntilde;‚&ETH;µ&ETH;&sup1;&ETH;&frac12;&ETH;µ&Ntilde;ˆ &Ntilde;? &Ntilde;?&ETH;&frac34;&ETH;&acute;&ETH;µ&Ntilde;ˆ&ETH;¶&ETH;&cedil;&ETH;&frac14;&Ntilde;‹&ETH;&frac14; &ETH;±&ETH;»&ETH;&frac34;&ETH;&ordm;&ETH;°
	this.oContainer = oContainer;
	if (this.oContainer) {
		Common.Event.add(this.oContainer, 'click', function(evt){ me.keep(evt); });
	}

	// &Ntilde;?&Ntilde;?&Ntilde;‹&ETH;»&ETH;&ordm;&ETH;° &ETH;°&ETH;&ordm;&Ntilde;‚&ETH;&cedil;&ETH;&sup2;&ETH;&cedil;&Ntilde;ˆ&Ntilde;&#402;&Ntilde;&#381;&Ntilde;‰&ETH;°&Ntilde;? &ETH;±&ETH;»&ETH;&frac34;&ETH;&ordm;
	this.oLink = oLink;
	if (this.oLink) {
		Common.Event.add(this.oLink, 'click', function(evt){ if ( me.toggle(evt) ){ return Common.Event.cancel(evt); } });
	}
}

PopupBlock.prototype.isInit = function(){
	if (this.bInit == null) {
		this.bInit = this.oContainer && this.oLink;
	}
	return this.bInit;
}

PopupBlock.prototype.toggle = function(evt){
	if (this.isInit()) {
		if (Common.Class.match(this.oContainer, 'hidden')) {
			this.show(evt);
		} else {
			this.hide(evt);
		}
		return true;
	} else {
		return false;
	}
}

PopupBlock.prototype.show = function(evt){
	if (this.isInit()) {
		Common.Class.remove(this.oContainer, 'hidden');
		var me = this;
		this.documentClickHandler = function(evt){ me.hide(evt); }
		this.documentKeyDownHandler = function(evt){ me.cancel(evt); }
		Common.Event.add(document, 'click', this.documentClickHandler);
		Common.Event.add(document, 'keydown', this.documentKeyDownHandler);
	}
}

PopupBlock.prototype.keep = function(evt){
	if (this.isInit()) {
		this.bKeep = true;
	}
}

PopupBlock.prototype.hide = function(evt){
	if (this.isInit()) {
		if (this.bKeep) {
			this.bKeep = false;
			return;
		}
		Common.Class.add(this.oContainer, 'hidden');
		Common.Event.remove(document, 'click', this.documentClickHandler);
		Common.Event.remove(document, 'keydown', this.documentKeyDownHandler);
	}
}

PopupBlock.prototype.cancel = function(evt){
	if (this.isInit()) {
		if (window.event) {
			evt = window.event;
		}
		var code = evt.keyCode ? evt.keyCode : evt.which ? evt.which : null;
		if (code == 27) {
			this.hide(evt);
		}
	}
}




function LoginForm() {

	var me = this;

	// &ETH;&ordm;&ETH;&frac34;&ETH;&frac12;&Ntilde;‚&ETH;µ&ETH;&sup1;&ETH;&frac12;&ETH;µ&Ntilde;ˆ &Ntilde;? &Ntilde;„&ETH;&frac34;&Ntilde;ˆ&ETH;&frac14;&ETH;&frac34;&ETH;&sup1;
	var oContainer = document.getElementById('login_form');

	// &ETH;&ordm;&ETH;&frac34;&ETH;&frac12;&Ntilde;‚&ETH;µ&ETH;&sup1;&ETH;&frac12;&ETH;µ&Ntilde;ˆ &Ntilde;?&ETH;&frac34; &Ntilde;?&Ntilde;?&Ntilde;‹&ETH;»&ETH;&ordm;&ETH;&frac34;&ETH;&sup1; &ETH;&frac12;&ETH;° &Ntilde;„&ETH;&frac34;&Ntilde;ˆ&ETH;&frac14;&Ntilde;&#402;
	var oLinkContainer = document.getElementById('login_link');
	var oLink = null;
	if (oLinkContainer) {
		var oLink = oLinkContainer.getElementsByTagName('a')[0];
	}





	// &ETH;&sup2;&Ntilde;‹&ETH;·&ETH;&frac34;&ETH;&sup2; &ETH;&ordm;&ETH;&frac34;&ETH;&frac12;&Ntilde;?&Ntilde;‚&Ntilde;ˆ&Ntilde;&#402;&ETH;&ordm;&Ntilde;‚&ETH;&frac34;&Ntilde;ˆ&ETH;° &ETH;±&ETH;°&ETH;·&ETH;&frac34;&ETH;&sup2;&ETH;&frac34;&ETH;&sup3;&ETH;&frac34; &ETH;&ordm;&ETH;»&ETH;°&Ntilde;?&Ntilde;?&ETH;° PopupBlock
	LoginForm.baseConstructor.call(this, oContainer, oLink);
	
	if (this.oContainer) {
		this.oClose = document.getElementById('login_form_close');
		if (this.oClose) {
			Common.Event.add(this.oClose, 'click', function(evt){ me.hide(evt); return Common.Event.cancel(evt); });
		}
	}
}



LoginForm.inheritFrom(
	PopupBlock,
	{
		xFormCheck : function(){
			if (this.isInit()) {
				if (this.oInput.value != '') {
					if (window.xForm) {
						xForm.init();
					}
				}
				clearInterval(this.iTimer);
			}
		}
	}
);



