(function() {
	var isUndefined = function(obj) {
		return typeof obj == 'undefined';
	};
	var isElement = function(node) {
		return Object.isElement(node);
	};
	var execArray = function(fnc) {
		if (!fnc) return;
		var array = new Array;
		if (Object.isFunction(fnc)) return fnc();
		if (!(fnc = $A(fnc)).length) return;
		for (var i = 0; i < fnc.length; array.push('fnc['+(i++)+']'));
		if (array.length) with (array)
			return new Function('fnc','return '+shift()+'('+join(',')+')')(fnc);
	};
	window.SitePage = Class.create({
		/* Page-dependent methods */
		createMapWindow:function(step,width,height,googleMarker) {
			var myself = this;
			Event.observe(document,'dom:loaded',function() {
				Try.these(function() {
					if (!GBrowserIsCompatible()) return;
					Event.observe(window,'unload',GUnload);
					var map = new GMap2(map = $('map-canvas'),{
						size:new GSize(570,405),
						backgroundColor:map.getStyle('background-color')
					}), marker,point,icon,items = $$('div#window div.item'),
						wait,icons = $$('div#window div.icon');
						selector = $$('div#window div.selector').shift();
					map.setCenter(new GLatLng(0,0),15);
					map.enableScrollWheelZoom();
					myself.createSelector(selector,step,icons,items);
					myself.createWindow(void(SitePage.addMethods({
						mapRefresh:function(i,lng,lat) {
							myself.mapLocate(lng,lat);
							selector.setStyle({marginLeft:i*step+'px'});
							items.each(function(node,j) {
								node.setOpacity((j == i)?1:0);
							});
						},
						mapLocate:function(lng,lat) {
							map.panTo(point = new GLatLng(lng,lat));
							if (marker instanceof GMarker) return marker.setLatLng(point);
							(icon = new GIcon(G_DEFAULT_ICON,googleMarker)).iconSize = new GSize(32,32);
							map.addOverlay(marker = new GMarker(point,{clickable:false,icon:icon}));
						}
					})),width,height);
				});
			});
		},
		createBlogCategories:function() {
			Event.observe(window,'load',function() {
				var cats = $$('ul.categories span.wrapper');
				for (var cat,i = 0; cat = cats[i]; i++) {
					var color = new String($(cat.parentNode).getStyle('color')),man = new Utils;
					if (man.getRegExp('^rgb/((/d+), (/d+), (/d+)/)$').match(color)) with (RegExp)
						color = '#'+man.toNumber([$1,$2,$3]).invoke('toColorPart').join('');
					color = !color.match('#')?'#fff':color;
					cat.attachHover([
						'span.count::color(#555>#aaa:8)',
						'span.wrapper::top(-24px>-16px:8)',
						'span.wrapper::left(0px>-8px:8);',
						'a::background-color(#777>'+color+':8)',
						'a::color(#aaa>#fff:8)'
					].join(';'),20).enableObserve();
				}
			});
		},
		/* Common methods */
		createTimeline:function(lang,events) {//return
			Event.observe(window,'load',function() {
				if (lang != 'ru' && lang != 'en') lang = 'en';
				var bounce = 4,range = {start:$A(events).min(function(event) {
					return $D(event.start).shift();
				}),end:$A(events).max(function(event) {
					return $D(event.end).shift();
				})};
				window.setTimeout(function() {
					/* Creating timeline axis */
					var months = (lang == 'ru')?['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь']:
						['January','February','March','April','May','June','July','August','September','October','November','December'],
						dates,axis = new AxisPane('div',{'class':'axis'},{width:'1000px'});
					(dates = $D(range.start,range.end)).each(function(date,i) {
						var fields = new Hash({pin:new Element('div',{'class':'pin'})});
						if (i < dates.length-1) {
							fields.set('date',new Element('div',{'class':'date'}).update(date.getDate()));
							if ($A([0,6]).indexOf(date.getDay())+1) fields.get('date').addClassName('weekend');
							if (date.getDate() < 2 || !i) fields.set('month',new Element('div',{'class':'month'}).update(months[date.getMonth()]));
						} axis.push(new AxisPin('div',{'class':'carrier'},null,fields,date));
					});
					/* Resizing axis & scrolling area */
					function outboundCall(evt,origNode,fnc) {
						var node = evt?evt.toElement || evt.relatedTarget:null;
						node = node?(node.nodeType == 3)?node.parentNode:node:null;
						if (!node || !node.descendantOf(origNode) && node != origNode) fnc();
					} var pxWidth = (dates.length-1)*26,halfContWidth = 936/2;
					var master = $('handle'),cover = $('cover'),scroller = $('timeline'),
						fader = master.attachFader('div::left(0%>-100%:'+Math.round((pxWidth-halfContWidth)/5)+')',10,false);
					$('track').setStyle({width:pxWidth-halfContWidth+'px',left:-pxWidth/2+'px'});
					master.setStyle({marginLeft:pxWidth/2-halfContWidth+'px'});
					axis.setParent(master).getElement().setStyle({width:pxWidth+'px'});
					/* Initializing scrolling engine */
					Event.observe(scroller,'mouseout',function(evt) {
						var node = evt?evt.toElement || evt.relatedTarget:null;
						node = node?(node.nodeType == 3)?node.parentNode:node:null;
						if (!node || !node.descendantOf(scroller) && node != scroller)
							fader.immediateStop();
					});
					Event.observe(scroller,'mousemove',function(evt) {
						var minPrc = 35,maxPrc = 50,minDelay = 5,maxDelay = 40;
						var abs,pos = evt.clientX*100/document.body.clientWidth-maxPrc;
						if ((abs = Math.abs(pos)) >= minPrc) {
							fader.getTransform().setDelay(maxDelay-(abs-minPrc)*(maxDelay-minDelay)/(maxPrc-minPrc))
							if (pos > 0) return fader.playForward();
							else if (pos < 0) return fader.playBackward();
						} else fader.immediateStop();
					});
					/* Preparing timeline bars */
					with (trans = $A([
						'div::color(#000>#f00:15); span::color(#000>#f00:15)',
						'div::color(#f00>#000:15); span::color(#f00>#000:15)'
					])) while (bounce--) splice(1,0,[
						'div::color(#f00>#910a28:15); span::color(#f00>#910a28:15)',
						'div::color(#910a28>#f00:15); span::color(#910a28>#f00:15)'
					]);
					/* Setting 10 hour tolerant date range to avoid issues with no date fading */
					var trans = new Transform(trans.flatten().join('=>'),30),tolerantRange = 36E6;
						helpTrans = new Transform('div.icon::opacity(0>1:15); div.help::opacity(0>1:15)',10),
						workdayTrans = new Transform('div.date::color(#9a9a9a>#000:15); div.date::font-weight(100>900:2)',10),
						weekendTrans = new Transform('div.date::color(#e25776>#000:15); div.date::font-weight(100>900:2)',10);
					new StackPane('div',{'class':'events'},{width:pxWidth+'px'},range.start,range.end,$A(events).collect(function(event,i) {
						var obj,fields = new Hash({help:new Element('div',{'class':'help'}).update(event.help)});
						fields.set('icon',new Element('div',{'class':'png icon'}).addClassName(event.style));
						var bar =  new StackBar('div',{'class':'event'},null,fields,event.start,event.end);
						var fader = (obj = $$('div[id="event-'+(++i)+'"]').shift())?obj.attachFader(trans):undefined;
						$(bar.getElement()).observe('click',function() {
							if (Object.isUndefined(fader)) return false;
							with ($(obj).cumulativeOffset())
								window.scrollTo(left-20,top-20);
							fader.playForward(fader.rewind);
						}).addClassName(event.style);
						return bar;
					})).setParent(master).each(function(bar) {
						var pins = new Hash({start:undefined,end:undefined}),node = bar.invoke('setOpacity',0).invoke('hide').getElement();
						node.attachHover(helpTrans,null,true,null,[bar.invoke,'hide']).enableObserve();
						/* Searching for start & end pins and attaching fader to them */
						axis.each(function(pin) {
							function getFader(pin,date) {
								if (pin.fader instanceof Fader) return pin.fader;
								if (Object.isElement(date = pin.getField('date')))
									return pin.fader = pin.getElement().attachFader(date.hasClassName('weekend')?weekendTrans:workdayTrans);
							} var time = pin.getValue().getTime(),tmStart = bar.getStart(),tmEnd = new Date(bar.getEnd());
							tmEnd.setDate(tmEnd.getDate()-1);
							tmEnd = tmEnd.getTime();
							if (time > tmStart-tolerantRange && time < tmStart+tolerantRange)
								pins.set('start',getFader(pin));
							else if (time > tmEnd-tolerantRange && time < tmEnd+tolerantRange)
								pins.set('end',getFader(pin));
						});
						/* Validating faders */
						pins = pins.each(function(pair) {
							if (pair.value instanceof Fader) return;
							else pins.unset(pair.key);
						}).values();
						node.observe('mouseover',function() {
							bar.invoke('show');
							pins.invoke('playForward');
						}).observe('mouseout',function(evt) {
							outboundCall(evt,node,function() {
								pins.invoke('playBackward');
							});
						});
					});
					cover.attachFader('div::opacity(1>0:15)',10,false).playForward(function() {
						cover.remove();
					});
				},1000);
			});
		},
		showWindow:Prototype.K,
		hideWindow:Prototype.K,
		createWindow:function(commonRefresh,width,height,fncInit) {
			var cover = $('content-cover'),popup = $('window'),
				prepareWindow = function() {
					if (!Object.isElement(popup)) return;
					with ($A([cover,popup]))
						invoke('removeClassName','not-displayed') && invoke('hide');
					var get = function(path) {
							return popup.select(path).shift();
						},loading = get('div.loading'),fader = {
							loading:loading.attachFader('div::opacity(1>0:15)',10,false),
							cover:cover.attachFader('div::opacity(0>0.8:10)',15,false),
							popup:popup.attachFader(null,10,true)
						};
					SitePage.addMethods({
						showWindow:function(refresh /* width,height */ ) {
							execArray(refresh || commonRefresh);
							loading.setOpacity(0.9999).show();
							get('div#content').setStyle({width:'70px',height:'70px'});
							get('table.window').setStyle({top:'-35px'});
							with ([width,height].zip($A(arguments).splice(1,2)).collect(function(item) {
								return parseInt(Object.isNumber(a = item.pop())?a:item.pop()) || 70;
							})) fader.popup.getTransform().setSchema([
								'div#content::width(70px>'+shift()+'px:10)',
								'div#content::height(70px>'+reduce()+'px:10)',
								'table.window::top(-35px>-'+reduce()/2+'px:10)'
							].join(';'));
							return cover.show() && fader.cover.playForward(function() {
								popup.show() && fader.popup.playForward(function() {
									fader.loading.playForward(function() {
										with (fader) [cover,popup,loading].invoke('rewind');
										loading.hide();
									});
								});
							}) && false;
						},
						hideWindow:function() {
							return [cover.setOpacity(0),popup].invoke('hide') && false;
						}
					});
					execArray(fncInit);
				};
			if (Object.isElement(popup)) return prepareWindow();
			Event.observe(document,'dom:loaded',prepareWindow);
		},
		createSelector:function(selector,step,icons,items) {
			if (!isElement(selector)) return;
			var icons = $A(icons),items = $A(items),wait = false,
				trans = new Transform('div::opacity(0>1:15)'),
				faders = items.collect(function(node,i) {
					if (!isElement(node)) return null;
					return node.attachFader(trans,10,false);
				});
			if (faders.length) icons.each(function(node,i) {
				Event.observe(node,'click',function() {
					if (wait?true:void(wait = true)) return;
					var left = parseInt(selector.getStyle('margin-left')),
						str = 'div::margin-left('+left+'px>'+i*step+'px:15)';
					if (isElement(items[i])) items[i].setStyle({zIndex:10});
					if (faders[i] instanceof Fader) faders[i].zip(selector,str).playForward(function() {
						for (var j = 0; j < faders.length; j++) if (isElement(items[j])) 
							items[j].setStyle({zIndex:1,opacity:(j == i)?1:0});
						wait = void(faders[i].unzip(selector).rewind());
					});
				});
			});
		},
		createBlackGallery:function() {
			//var myself = this,hover = null,fader = null;
			var gallery = new Gallery('viewport','items');
			
			
			
			/*/return
			var player = new Player('player','media-handle','media-slider','buffer','inverted',new Transform([
				'div.delim::background-color(#000>#646464:25)',
				'div.handle::background-color(#000>#505050:25)'
			].join(';'),10),new Transform([
				'div.delim::background-color(#646464>#fff:25)',
				'div.handle::background-color(#505050>#fff:25)'
			].join(';'),10));
			//*/
			SitePage.addMethods({
				addItem:gallery.addItem,
				showItem:gallery.showItem,
				itemFader:'img::opacity(0>0.25:15)',
				itemHover:[
					'img.pict::opacity(0.25>0.999:15)',
					'div.description::color(#000>#fff:15)',
					'div.selected-mark::opacity(0.999>0:15)',
					'div.description::left(eval{get{div.thumbnail::width}-get{div.description::width}-8}px>eval{get{div.thumbnail::width}+5}:15 trend{1>3:log})',
					'li::width(get{div.thumbnail::width}>eval{get{div.thumbnail::width}+get{div.description::width}+13}px:15 trend{1>3:log})',
				].join(';'),
				play:function() {
					return false;
				}
			});
			
			return
			Event.observe(window,'load',function() {
				isBusy = false;
				hover = $('info').attachHover(null,10,true);
				fader = $('info').attachFader(null,10,true);
				SitePage.addMethods({
					play:function(obj) {
						if (isBusy) return false;
						isBusy = true;
						if (obj = gallery.getItem(obj)) {
							var setHover = function() {
								$('media-caption').update($(obj.get('caption')).innerHTML);
								$('media-date').update($(obj.get('date')).innerHTML);
								$('media-info').update(obj.get('info'));
								var step,a = parseInt($('info').getHeight()),b = parseInt($('description').getHeight());
								hover.getTransform().setSchema([
									'div#description::color(#000>#fff:'+(step = Math.ceil(0.2*b))+')',
									'div.title::color(#919191>#fff:'+step+')',
									'div[class=delim]::background-color(#808080>#fff:'+step+')',
									'div#description::top('+(a-b)+'px>'+a+'px:'+step+' trend{1>3:log})',
									'div#info::height('+a+'px>'+(b+a)+'px:'+step+' trend{1>3:log})'
								].join(';'));
								$('description').setStyle({top:a+'px'});
								$('info').setStyle({height:b+a+'px'});
								fader.getTransform().setSchema([
									'div#description::color(#000>#919191:30)',
									'function::call{$delay(1000)}',[
										'div#description::color(#919191>#000:'+step+')',
										'div#description::top('+a+'px>'+(a-b)+'px:'+step+' trend{1>3:log})',
										'div#info::height('+(b+a)+'px>'+a+'px:'+step+' trend{1>3:log})'
									].join(';')
								].join('=>'));
								fader.playForward(function() {
									fader.rewind();
									hover.playBackward();
									hover.enableObserve();
									isBusy = false;
								});
							};
							hover.disableObserve();
							hover.playBackward(setHover);
							player.play(obj.get('file'),obj.get('width'),obj.get('height'),obj.get('type') == 'picture');
						} return false;
					}
				});
				$('items-handle').attachFader('div.handle::background-color(#000>#505050:25)',10,false).playForward(function() {
					gallery.attachSlider('items-handle','items-slider').attachHover([
						'div.delim::background-color(#646464>#fff:25)',
						'div.handle::background-color(#505050>#fff:25)'
					].join(';'),10).enableObserve();
					var index = 0,item,address = unescape(location.href).replace(/[\/\\]$/,'');
					while (item = gallery.getItem(index++)) if (address.endsWith(item.get('url'))) break;
					myself.play((--index == gallery.count())?0:index);
				});
			});
		},
		//REWRITE THIS
		gallery:{},
		createWhiteGallery:function(id,items,prefix,popupUpdater){
			Event.observe(document,'dom:loaded',function() {
				var gallery = new PictureGallery(id+'-canvas',new Fader(id+'-cover','div::opacity(0>0.99:20)',10,false)).fromJSON(items).setPathPrefix(prefix).observe('gallery:load',popupUpdater(id+'-popup'));
				APXE.gallery[id] = {}
				APXE.gallery[id].showItem = function(item_id,noScrollTo) {
					try {
						$(id+'-thumbnails').childElements().invoke('removeClassName','selected');
						$$('#'+id+'-thumbnails #'+item_id).pop().addClassName('selected').blur();
						if (!noScrollTo) gallery.scrollTo(null,-48)
						gallery.showItem(item_id);
					} catch(e) {}
					return false;
				};
			});
			APXE.gallery[id] = {showItem:Prototype.K,select:Prototype.K};
		},
		toggleBlock:function(id) {
			$(id).setStyle({display:$(id).getStyle('display') == 'none'?'block':'none'});
		}
	});
})();
document.write('<style>.noscript {display:none}</style>');