var defaultoptions = {duration: 250, transition: 'expo:out', link: 'cancel'},
	notifier, control, newsSlide, imagesSlide, checkForm, windowScroll, panels, letterFX, ajaxNews, avatarChanger, showcase;

var FXHelper = new Class(
{
	getFXStyles : function(FX)
	{
		return $H(FX).getKeys();
	}
});

var ImageLoader = new Class(
{
	Implements : Options,
	
	options :
	{
		'milkbox' : true,
		'opacity' : 0.8,
		'height' : false
	},
	
	initialize : function(elements,options)
	{
		this.elements = $$($pick($(elements),$$(elements)));
		
		if(this.elements.length > 0)
		{
			this.setOptions(options);
			this.initImages();
			this.initLoading();
		}
	},
	
	initImages : function()
	{
		var elements = this.elements,
			opt = this.options;
		
		this.images = elements.getElement('img');
		this.imagesLink = elements.getElement('a');
		this.imagesURL = []; 
		this.imagesWidth = [];
		
		//if an image exists
		if(this.images.clean().length > 0)
		{
			this.images.each(function(img,i)
			{
				this.imagesURL[i] = img.get('src');
				this.imagesWidth[i] = img.get('width').toInt();
				img.dispose();
			},this);
		}
		
		//if image is in the bg
		else
		{
			var elemDiv = elements.getElement('div');
			
			if(elemDiv.length > 0)
			{
				elemDiv.each(function(elem,i)
				{
					
					this.imagesURL[i] = elem.getStyle('background-image').replace(/url\("?([^\)]+)"?\)/,'$1').replace('"','');
					this.imagesWidth[i] = elem.getSize().x;
					elem.setStyle('background-image','none');
				},this);
			}
		}
		
		this.imageAssets = new Asset.images(this.imagesURL, 
		{
			onProgress : function(c,index)
			{
				var imageChain = new Chain(), 
					that = this;
				
				imageChain.chain(
					function() { that.hideLoading(index,this); },
					function() { that.showImage(index,this); },
					function() { that.prepareImageLink(index); }
				);
				
				imageChain.callChain();
				
			}.bind(this)
		});
	},
	
	showImage : function(index,chain)
	{
		var element = this.elements[index],
			imageURL = this.imagesURL[index],
			opacity = this.options.opacity;
			
		element.setStyle('background',['#222 url('+ imageURL +') no-repeat center center'].join('')).set('tween',{onComplete:function(){ chain.callChain();}}).fade(opacity);
	},
	
	hideLoading : function(index,chain)
	{
		var element = this.elements[index],
			loading = element.getElement('.loading');
		
		loading.destroy();
		element.set('tween',$merge(defaultoptions,{onComplete : function(){ chain.callChain(); }})).fade('out');
	},
	
	prepareImageLink : function(index)
	{
		var element = this.elements[index],
			imageLink = this.imagesLink[index],
			optMilkbox = this.options.milkbox,
			height = this.options.height;
			
		if($defined(imageLink))
		{
			var morphFX = (height != false) ? {'display' : 'block', 'height' : height} : {'display' : 'block'};
			
			imageLink.setStyles(morphFX).inject($pick(element.getElement('div'),element));
			
			if(optMilkbox && typeof milkbox != 'undefined')
			{
				milkbox.reloadGalleries();
			}
		}
	},
	
	initLoading : function()
	{
		var loading = new Element('div',{'slide':defaultoptions, 'class':'loading','html':'loading...','styles':{'position':'absolute','top':0,'left':0,'color':'#fff','font-size':12,'font-weight':'bold'}});
		
		this.elements.each(function(div,i)
		{
			div.setStyle('position','relative').grab(loading.clone());
			
			if(this.images.clean().length > 0)
			{
				div.setStyle('width',this.imagesWidth[i]);
			}
			
		},this);
	},
	
	getImagesWidth : function()
	{
		return this.imagesWidth;
	}
});

var Showcase = new Class(
{
	Implements: Options,
	
	options :
	{
		'wrapper' : 'showcasewrapper',
		'dividers' : 'showcaseitems',
		'height' : 133,
		'margin' : 5,
		'borderWidth' : 5,
		'padding' : 10,
		'borderColor' : '#222',
		'borderCurve' : true,
		'milkbox' : true,
		'opacity' : 0.7
	},
	
	initialize : function(container,options)
	{
		this.container = $(container);
		
		if($defined(this.container))
		{
			this.setOptions(options);
			this.initContainer();
			this.initDividers();
			this.initWrapper();
			this.initImages();
			this.setContainerWidth();
			this.initDividerEffects();
		}
	},
	
	initWrapper : function()
	{
		this.wrapper = new Element('div',{id:this.options.wrapper, styles:{'overflow':'auto','overflow-y':'hidden','margin':'auto'}}).inject(this.container,'before').grab(this.container);
	},
	
	initContainer : function()
	{
		this.container.setStyles({'overflow':'hidden', 'padding' : this.options.padding});		
	},
	
	initDividers : function()
	{
		this.dividers = this.container.getElements('div');
		
		if(this.dividers.length > 0)
		{
			this.dividers.setStyles(
			{
				'border-width' : this.options.borderWidth, 
				'border-color' : this.options.borderColor, 
				'border-style': 'solid', 
				'float' : 'left',
				'margin' : this.options.margin,
				'height' : this.options.height,
				'background-color' : '#222'
			})
			.addClass(this.options.dividers)
			.each(function(div,i)
			{
				div.store('index',i);
			});
			
			this.clearElement = new Element('div',{'class':'clear','font-size': 0, 'height' : 0, 'display' : 'none'}).inject(this.container);
		}
	},
	
	initImages : function()
	{
		this.imageLoader = new ImageLoader(this.dividers,this.options);
	},
	
	initDividerEffects : function()
	{
		var opt = this.options, that = this;
		this.dividers.set('morph',defaultoptions).addEvents(
		{
			'mouseenter' : function()
			{
				this.morph({'border-width':(opt.borderWidth+opt.margin),'margin':0,'opacity':1});
			},
			
			'mouseleave' : function()
			{
				this.morph({'border-width':opt.borderWidth,'margin':opt.margin,'opacity': opt.opacity});
			}
			
		});
	},
	
	setContainerWidth : function()
	{
		this.containerWidth = this.imageLoader.getImagesWidth().sum() + (this.dividers.length * ((this.options.margin*2) + (this.options.borderWidth*2)));
		this.container.setStyle('width',this.containerWidth);
	}
	
});

var AvatarChanger = new Class(
{
	Implements : [Options,FXHelper],
	
	options :
	{
		loader : 'avatarloading',
		loaderContent : '<img src="images/boxloading.gif" alt="" />',
		milkbox : true,
		folder : 'avatar',
		filePrefix : 'image_',
		fileSuffix : '_1',
		fileFormat : 'jpg'
	},
	
	initialize : function(list,frame,options)
	{
		this.list = $(list);
		this.frame = $(frame);
		this.elementsFX = [];
		
		if($defined(this.list) && $defined(this.frame))
		{
			this.setOptions(options);
			this.initLoader();
			this.initList();
			this.initFrame();
		}
	},
	
	initLoader : function()
	{
		this.loader = new Element('div',{id: this.options.loader, html: this.options.loaderContent, 'styles':{ 'overflow' : 'hidden'}}).inject(this.frame,'after');
		this.origLoaderHeight = this.loader.getSize().y;
		this.loader.setStyle('height',0);
		this.elementsFX.include(this.loader);
	},
	
	initFrame : function()
	{
		if(this.options.milkbox)
		{
			this.frame.getElement('a').set({'rel':'milkbox[' + this.options.folder + ']','styles':{'overflow':'hidden'}});
			milkbox.reloadGalleries();
		}
		
		this.origFrameHeight = this.frame.getSize().y;
		this.origFrameBorderWidth = this.frame.getStyle('border-top-width').toInt();
		this.elementsFX.include(this.frame);
		
	},
	
	initList : function()
	{
		var that = this;
		this.list.addEvent('change',function()
		{
			that.changeAvatar(this.get('value'));
		});
	},
	
	changeAvatar : function(id)
	{
		var that = this, 
			imageName = [this.options.folder,'/',this.options.filePrefix,id,this.options.fileSuffix,'.',this.options.fileFormat].join('');
		
		this.changeFX = new Fx.Elements(this.elementsFX, {link:'chain', duration: 500, transition: 'expo:out'}).chain(
			function()
			{
				this.start({1:{'height':0, 'border-width' : 0}});
			},
			function()
			{
				this.start({0:{'height':that.origLoaderHeight}});
			},
			function()
			{
				that.loadImage(imageName,this);
			},
			function()
			{
				that.displayImage(imageName);
				this.callChain();
			},
			function()
			{
				this.start({0:{'height':0}});
			},
			function()
			{	
				this.start({1:{'height':that.origFrameHeight, 'border-width' : that.origFrameBorderWidth}});
			}
		);
		
		this.changeFX.callChain();
	},
	
	loadImage : function(imageName,chain)
	{
		var myImage = new Asset.image(imageName, 
		{
			onload: function() 
			{
				chain.callChain();
			}
		});
	},
	
	displayImage : function(imageName)
	{
		this.frame.setStyle('background','url('+imageName+') no-repeat center center');		
		this.frame.getElement('a').set('href',imageName);
		
		if(this.options.milkbox)
		{
			milkbox.reloadGalleries();
		}
	}
	
	
});

var AjaxNews = new Class(
{
	Implements: [Options,FXHelper],
	
	options	:
	{
		url: 'server.php',
		container : 'newsContainer',
		containerOptions : {duration: 400,transition:'expo:out','link':'cancel'},
		tabOptions : {duration: 400,transition:'expo:out','link':'cancel'},
		loaderOptions : {duration: 1000,transition:'expo:in:out','link':'cancel'},
		articleOptions : {duration: 400, transition: 'expo:out', 'link' : 'cancel'},
		loader : 'newsContainerLoader',
		titles : '.articletitle',
		header : 'ajaxnews',
		tabs : '.tableft',
		returnLinks : '.viewothernews',
		prefix : 'article'
	},
	
	initialize : function(articles,options)
	{
		this.articles = ($defined(articles)) ? $$($pick($(articles),$$(articles))) : $$('.ajaxarticle');
		
		if(this.articles.length > 0)
		{
			this.setOptions(options);
			this.initPanel();
			this.initContainer();
			this.initLoader();
			this.initTitles();
			this.initTabs();
			this.initArticles();
			this.initRequest();
			this.checkURL();
		}
		
	},
	
	initPanel : function()
	{
		this.ajaxPanel = new Element('div',{'id' : 'ajaxPanel'}).inject(document.body);
	},
	
	initContainer : function()
	{
		this.container = new Element('div',{'id' : this.options.container}).inject(this.ajaxPanel);
		this.containerFX = new Fx.Slide(this.container,this.options.containerOptions).hide();
	},
	
	initLoader : function()
	{
		this.loader = new Element('div',{'id' : this.options.loader, 'html' : '<img src="images/boxloading.gif" alt="..." style="vertical-align: middle;" />'}).inject(this.ajaxPanel);
		this.loaderFX = new Fx.Slide(this.loader,this.options.loaderOptions).hide();
	},
	
	initArticles : function()
	{
		this.origArticleHeight = this.articles.getStyle('height').map(function(i){return i.toInt();});
		this.articles.set({'styles':{'position':'relative'}, 'morph' : this.options.articleOptions});
	},
	
	initTabs : function()
	{
		this.tabs = $$(this.options.tabs);
		this.origTabColor = '#777';
		
		var that = this,
			opt = this.options;
		
		this.tabs.set(
		{
			'styles' : 
			{
				'background-color' : this.origTabColor,
				'opacity' : 0,
				'position' : 'absolute',
				'top' : -20,
				'right' : 0,
				'z-index' : 5
			}, 
			'tween' : this.options.tabOptions
		})
		.addEvents(
		{
			'tabBlur' : function()
			{
				this.setStyle('background',that.origTabColor);
				this.fade('out');
			},
			
			'tabFocus' : function()
			{
				this.fade('in');
			},
			
			'tabSelect' : function()
			{
				this.setStyle('background-color','#444');
				this.fade('in');
			}
			
		});
		
	},
	
	initTitles : function()
	{
		this.titles = $$(this.options.titles);
		
		var that = this,
			opt = this.options;
		
		this.titles.setStyles({'cursor':'pointer'}).store('selected',false).addEvents(
		{
			'mouseenter' : function()
			{
				if(!this.retrieve('selected'))
				{
					this.getParent().getElement(opt.tabs).fireEvent('tabFocus');
					this.set('morph',opt.containerOptions).morph({'background-color':['#fff','#777'],'color' : '#fff'});
				}
			},
			
			'mouseleave' : function()
			{
				if(!this.retrieve('selected'))
				{
					this.getParent().getElement(opt.tabs).fireEvent('tabBlur');
					this.set('morph',{duration: 'short', onComplete : function(){ this.setStyle('background-color','transparent'); }.bind(this)}).morph({'color' : '#09f','background-color':'#fff'});
				}
			},
			
			'click' : function()
			{
				if(!this.retrieve('selected'))
				{
					this.getParent().getElement(opt.tabs).fireEvent('tabSelect');
					this.store('selected',true).morph({'background-color' : '#444', 'color' : '#fc0'});
					var article = this.getParent(opt.articles);
					that.movePanel(article);
					that.hideArticles(article);
					that.requestNews(this.get('id'));
				}
			}
		});
		
	},
	
	initRequest : function()
	{
		this.newsRequest = new Request(
		{
			method : 'post',
			url : this.options.url,
			//container: this.container,
			onRequest : function()
			{
				windowScroll.toElement(this.options.header);
				this.showLoading();
				
			}.bind(this),
			onSuccess : function(responseText)
			{
				this.containerDelayFX = this.showContainer.delay(1200,this,responseText);
			}.bind(this)
		});
	},
	
	requestNews : function(id)
	{
		var id = id.split(this.options.prefix).join('');
		this.setURL(id);
		this.newsRequest.send('act=getNews&ID='+id);
	},
	
	movePanel : function(article)
	{
		this.ajaxPanel.inject(article,'after');
	},
	
	hideArticles : function(article)
	{
		var unselected = this.articles.filter(function(x){ return x != article }).reverse();
		
		unselected.setStyle('overflow','hidden').each(function(x,i)
		{
			x.morph.delay(i*50,x,{'height' : 0});
		});
	},
	
	showArticles : function()
	{
		
		this.titles.store('selected',false).fireEvent('mouseleave');
		this.articles.setStyle('overflow','').each(function(article,i){article.morph({'height': this.origArticleHeight[i]});}.bind(this));
		windowScroll.toElement(this.options.header);
	},
	
	showLoading : function()
	{
		this.loaderFX.slideIn();	
	},
	
	showContainer : function(responseText)
	{
		if($defined(responseText))
		{
			this.container.set('html',responseText);
		}
		
		this.loaderFX.slideOut().chain(function(){this.containerFX.slideIn()}.bind(this));	
		
		this.processAjaxContent();
	},
	
	hideContainer : function()
	{
		this.containerFX.slideOut().chain(
			function()
			{
				this.resetURL();
				this.showArticles();
			}.bind(this)
		);
	},
	
	processAjaxContent : function()
	{
		this.container.getElements('img').addEvent('load',function()
		{
			this.containerFX.slideIn();
		}.bind(this));
		
		$$(this.options.returnLinks).addEvents(
		{
			'click' : function(e)
			{
				e.stop();
				this.hideContainer();
				
			}.bind(this)
		});
	},
	
	setURL : function(id)
	{
		window.location.hash = [this.options.prefix,'=',id].join('');
	},
	
	resetURL : function()
	{
		window.location.hash = 'home=true';
	},
	
	checkURL : function()
	{
		if(window.location.hash.contains(this.options.prefix))
		{
			var article = $(window.location.hash.replace(/#([^=]+)=(.+)/,'$1$2'));
			
			article.fireEvent.delay(500,article,'click');
		}
	}
	
});

var LetterFX = new Class(
{
	Implements: [Options,Events,FXHelper],
	
	options :
	{
		hoverFX : {'color' : '#f90'},
		clickFX : {'color' : '#fc0'},
		hoverOptions : {duration: 2000, transition: 'expo:out', 'link': 'cancel'},
		clickOptions: {duration: 1500, transition: 'expo:out', 'link': 'cancel'},
		hoverDelay : 1000,
		onClick : $empty,
		onMouseenter : $empty
	},
	
	initialize : function(elements,options)
	{
		this.fastFX = {duration: 10, transition: 'expo:out', 'link' : 'cancel'};
		this.elements = ($defined(elements)) ? $$($pick($(elements),$$(elements))) : $$('.emphasis');
		
		if(this.elements.length > 0)
		{
			if($defined(options))
			{
				if($defined(options.hoverFX))
				{
					this.options.hoverFX = options.hoverFX;
				}
				
				if($defined(options.clickFX))
				{
					this.options.clickFX = options.clickFX;
				}
			}
			
			this.setOptions(options);
			
			this.initElements();
			this.initHoverEffect();
		}
	
	},
	
	initElements : function()
	{
		var that = this;
		
		this.elements.each(function(element)
		{
			var elementText = element.get('html').replace(/([^\s])/g,'<span>$1</span>');
			element.set('html',elementText);
		});
		
		this.origStyles = this.elements.getElement('span')[0].getStyles(this.getFXStyles(this.options.hoverFX));
		
		this.elements.addEvents(
		{
			'mouseenter' : function()
			{
				this.setStyle('cursor','pointer');
				that.fireEvent('mouseenter');
			},
			
			'click' : function()
			{
				that.clickFX();
			}
		});
	},
	
	initHoverEffect : function()
	{
		var that = this,
			opt = this.options;			
		
		$$(this.elements.getElements('span')).addEvents(
		{
			'mouseenter':function()
			{
				var fxDelay = this.retrieve('fxDelay');
					
				if($defined(fxDelay))
				{
					$clear(fxDelay);
				}
				
				this.set('morph',that.fastFX).morph(opt.hoverFX);
			},
			
			'mouseleave':function()
			{
				
				var hoverFX = $H(opt.hoverFX)
				if(hoverFX.has('background-color') && $H(that.origStyles).get('background-color') == 'transparent')
				{
					this.setStyle.delay(opt.hoverDelay,this,['background-color','transparent']);
				}
				
				var fxDelay = this.set('morph',opt.hoverOptions).morph.delay(opt.hoverDelay,this,that.origStyles);
				this.store('fxDelay',fxDelay);
			}
		});			 
	},
	
	clickFX : function()
	{
		var that = this,
			opt = this.options;
		
		this.fireEvent('click');
		
		$$(this.elements.getElements('span')).set('morph',opt.clickOptions).each(function(span,i)
		{
			var fxDelay = span.retrieve('fxDelay');
					
			if($defined(fxDelay))
			{
				$clear(fxDelay);
			}		
			
			span.set('morph',that.fastFX).morph.delay((i*3)+1,span,opt.clickFX);
			
			var fxDelay = function() { span.set('morph',opt.clickOptions).morph(that.origStyles) }.delay(((i*5)+250));
			span.store('fxDelay',fxDelay);
		});
	}
});

var FXHover = new Class(
{
	Implements : [Options,FXHelper],
	
	options : 
	{
		pointer : true,
		morph : {'color' : '#000', 'background-color' : '#dea'}, 
		fxoptions : defaultoptions
	},
	
	initialize : function(elements,options)
	{
		this.elements = $$($pick($(elements),$$(elements)));//$pick($$(elements),$$($(elements)));
		
		if($defined(options) && $defined(options.morph))
		{
			this.options.morph = options.morph;
		}
		
		if(this.elements.length > 0)
		{
			this.setOptions(options);
			this.prepareElements();
		}
	},
	
	prepareElements : function()
	{
		if(this.elements.length > 0)
		{
			this.setOptions({'origMorph':this.elements[0].getStyles(this.getFXStyles(this.options.morph))});
			var opt = this.options;
			
			this.elements.set('morph',opt.fxoptions).addEvents(
			{
				'mouseenter' : function()
				{
					if(opt.pointer) { this.setStyle('cursor','pointer');	}
					this.morph(opt.morph);
				},
				
				'mouseleave' : function()
				{
					this.morph(opt.origMorph);
				}
			});
		}
	}
});

var Control = new Class(
{
	Implements : [Options, FXHelper],
	
	options : 
	{
		tips : '.tip',
		ajaxForms : '.ajaxform',
		fields : 'input[type=text], input[type=password], textarea, select',
		buttons : 'input[type=submit], input[type=button], .button',
		thumbs : '.thumbnail',
		galleries : '.itemthumb',
		menu : 'menu',
		tagClouds : '.tagcloud',
		tagFields : 'input[name=articleTags]',
		externals : 'a.external',
		redirects : '.gotopage',
		topScrollers : '.scrolltotop',
		fieldFX : {'background-color' : '#fc0', 'color' : '#000'},
		buttonFX : {'background-color' : '#f90', 'color' : '#000'},
		thumbFX : {'border-width' : 8, 'margin' : 2},
		galleryHeight : 22,
		menuFX : {'opacity' : 0.9}
	},
	
	initialize : function(options)
	{
		this.setOptions(options);
		this.attachEvents();
	},
	
	attachEvents : function()
	{
		this.initMenu();
		this.initTextFields();
		this.initButtons();
		this.initAjaxForms();
		this.initTips();
		this.initThumbs();
		this.initGalleries();
		this.initExternals();
		this.initRedirects();
		this.initTagClouds();
		this.initTagFields();
		this.initTopScrollers();
	},
	
	initRedirects : function()
	{
		$$(this.options.redirects).addEvent('change',function()
		{
			window.location = this.get('title') + this.get('value');
		});
	},
	
	initTopScrollers : function()
	{
		$$(this.options.topScrollers).addEvents(
		{
			'click': function(e)
			{
				e = new Event(e).stop();
				windowScroll.toElement(window);
			}
		});
	},
	
	initTagFields : function()
	{
		$$(this.options.tagFields).addEvent('blur',function()
		{
			this.value = this.value.replace(/[^a-zA-Z0-9-\s,]/gi,'');
			this.value = this.value.replace(/\s*,\s*/gi,',');
			this.value = this.value.replace(/,\s*$/,'');
			this.value = this.value.replace(/^\s*,/,'');
			this.value = this.value.replace(/,{2,}/gi,',');
			this.value = this.value.replace(/-{2,}/gi,'-');
			this.value = this.value.replace(/\s{2,}/gi,' ');
			this.value = this.value.replace(/,\s,/gi,',');
			this.value = this.value.clean();
			
		});
	},
	
	initTagClouds : function()
	{
		var tags = $$($$(this.options.tagClouds).getElements('.tag'));
		
		tags.each(function(tag)
		{
			tag.setStyle('font-size',(150.0 * (1.0 + ( 1.5 * tag.get('title').replace(/[^0-9]/gi,'').toInt() - tags.length/2 ) / tags.length ) ) + '%')
		});
		
		tags.addEvents(
		{
			'click' : function(e)
			{
				
				var inputTags = this.getParent().getParent().getElement('input[name=articleTags]');
				
				if($defined(inputTags))
				{
					if(inputTags.value.contains(this.get('html')) == false)
					{
						inputTags.value += ((inputTags.value.length == 0 || inputTags.value.charAt(inputTags.value.length) == ',')?'':',') + this.get('html');
					}
					
					inputTags.value = inputTags.value.clean();
					
					e = new Event(e).stop();
				}
			}
		});
	},
	
	initTips : function()
	{
		this.myTips = new Tips(this.options.tips,
		{
			'className' : 'tool'
		});
	},
	
	initExternals : function()
	{
		$$(this.options.externals).each(function(element,index)
		{
			element.setProperty('target', '_blank');
		});
	},
	
	initMenu : function()
	{
		var menu = $(this.options.menu),
					links = ($defined(menu)) ? menu.getChildren('li') : false;
		
		if($chk(links))
		{	
			links.each(function(element,index)
			{
				var subMenu = element.getElement('ul');
				
				if($defined(subMenu))
				{
					var subMenuFx = new Fx.Morph(subMenu,defaultoptions).set({'display' : 'block', 'opacity' : 0}),
								orig = subMenu.getStyles(this.getFXStyles(this.options.menuFX));
								
					element.addEvents(
					{
						'mouseenter' : function()
						{
							subMenuFx.start(this.options.menuFX);
						}.bind(this),
						
						'mouseleave' : function()
						{
							subMenuFx.start(orig);
						}
					});
				}
				
			},this);
		}
	},
	
	initThumbs : function()
	{
		this.thumbFx = new FXHover(this.options.thumbs,{morph:this.options.thumbFX});
	},
	
	initGalleries : function()
	{
		var that = this,
			galleries = $$(this.options.galleries);
		
		galleries.each(function(element,index)
		{
			var linkFX = new Fx.Morph(element.getElement('a'),{duration:500,transition:'back:out',link:'cancel'}),
				linkHeight = element.getSize().y,
				boxParent = element.getParent('.box'),
				thumbDetails = element.getElement('.thumbdetails'),
				linkTag = element.getElement('a'),
				linkRel = linkTag.get('rel');
				
			if($defined(boxParent))
			{
				var boxEffects = new Fx.Morph(boxParent,defaultoptions);
			}
			
			if($defined(thumbDetails))
			{
				var detailFX = new Fx.Morph(thumbDetails,defaultoptions).set({'opacity':0});
				thumbDetails.setStyle('cursor','pointer').addEvents(
				{
					'click':function(e) 
					{ 
						if($defined(linkRel) && linkRel.contains('milkbox'))
						{
							$$('a[rel='+ linkRel +']').each(function(em,m)
							{
								if(em == linkTag)
								{
									milkbox.showGallery({gallery : linkRel, index: m});
								}
							});
						}
						else
						{
							window.location = linkTag.get('href');
						}
						e = new Event(e).stop();
					}
				});
			}
			
			element.addEvents(
			{
				'mouseenter' : function()
				{
					this.setStyle('opacity',1);
					
					if($defined(detailFX))
					{
						detailFX.start({'opacity' : 0.8});
					}
					
					if($defined(boxEffects))
					{
						boxEffects.start({'margin-top' : -15});
					}
					
					//linkFX.start({'height' : linkHeight + that.options.galleryHeight});
					
					var parentPanel = this.getParent('.panel');
					if($defined(parentPanel) && $defined(parentPanel.retrieve('fx')))
					{
						var panelFX = parentPanel.retrieve('fx');
						panelFX.slideIn.delay(120,panelFX);
					}
				},
				
				'mouseleave' : function()
				{
					this.setStyle('opacity',0.8);
					
					if($defined(detailFX))
					{
						detailFX.start({'opacity' : 0});
					}
					
					if($defined(boxEffects))
					{
						boxEffects.start({'margin-top' : 0});
					}
					
					//linkFX.start({'height' : linkHeight});
					
					var parentPanel = this.getParent('.panel');
					if($defined(parentPanel) && $defined(parentPanel.retrieve('fx')))
					{
						var panelFX = parentPanel.retrieve('fx');
						panelFX.slideIn.delay(120,panelFX);
					}
				}
			});
		});
		
		this.imageLoader = new ImageLoader(galleries);
		
		galleries.fireEvent('mouseleave');
		
	},
	
	initAjaxForms : function()
	{
		if(!$defined($(this.ajaxResult)))
		{
			this.ajaxResult = new Element('div',{'id' : 'ajaxResult', 'styles' : {'height' : 0, 'width' : 0, 'opacity' : 0}}).inject($(document.body));
		}
		
		var ajaxForms = $$(this.options.ajaxForms);
		
		ajaxForms.getElement('input[type=submit]').each(function(elem)
		{
			var submitButton = elem.clone().set('type','hidden').inject(elem,'after');
		});
		
		ajaxForms.store('ajaxRequest',new Request.HTML(	{method: 'post', url : 'server.php', update : 'ajaxResult', onRequest : function() { notifier.display('Your form is being sent. Please wait...'); }})).addEvents(
		{
			'submit' : function(e)
			{
				if(checkForm.isChecking(this))
				{	
					this.retrieve('ajaxRequest').post(this);
				}
				e.stop();
			}
		});
	},
	
	initTextFields : function()
	{
		$$(this.options.fields).each(function(element,index)
		{
			var fx = new Fx.Morph(element, defaultoptions),
				orig = element.getStyles(this.getFXStyles(this.options.fieldFX));
				
			element.addEvents(
			{
				'blur': function()
				{
					fx.start(orig);
				},
			
				'focus': function()
				{
					fx.start(this.options.fieldFX);
				}.bind(this)
			});	
		},this);
	},
	
	initButtons : function()
	{
		this.buttonFX = new FXHover($$(this.options.buttons),{morph:this.options.buttonFX});
	}
});

var Slider = new Class(
{
	Implements: Options,
	
	options : 
	{
		container : 'newsfeed',
		delay : 5000,
		minCount : 3,
		offset : 0,
		hoverColor: '#040'
	},
	
	initialize : function(opt)
	{
		this.setOptions(opt);
		
		if($defined($(this.options.container)))
		{
			this.initContainer();
			this.initElements();
			this.startSlide();
		}
	},
	
	hasEnoughElements : function()
	{
		return this.elements.length > this.options.minCount;
	},
	
	initContainer : function()
	{
		var container = $(this.options.container);
		this.setOptions({'container':container});
		
		var firstElement = container.getChildren()[0];
		var containerHeight = this.options.offset + (firstElement.getSize().y + firstElement.getStyle('margin-top').toInt()) * ((container.getChildren().length >= this.options.minCount) ? this.options.minCount : container.getChildren().length);
		container.setStyles({'overflow' : 'hidden', 'height' : containerHeight});
		container.addEvents(
		{
			'mouseenter' : function()
			{
				this.pauseSlide();
			}.bind(this),
			
			'mouseleave' : function()
			{
				this.startSlide();
			}.bind(this)
		});
	},
	
	initElements : function()
	{
		var that = this;
		
		this.elements = $(this.options.container).getChildren();
		this.elements.addEvents(
		{
			'mouseenter' : function()
			{
				this.setStyles({'background-color' : that.options.hoverColor});
			},
			
			'mouseleave' : function()
			{
				this.setStyles({'background-color' : 'transparent'});
			}
		});
	},
	
	startSlide : function()
	{
		if(this.hasEnoughElements())
		{
			this.slideInterval = this.slideElements.periodical(this.options.delay,this);
		}
	},
	
	slideElements : function()
	{
		var firstElement = this.elements.shift(),
			fxChain = new Fx.Morph(firstElement,{duration: 1000, transition: 'expo:in:out', wait : false});
			
		fxChain.start({'opacity' : 0, 'margin-top' : -(firstElement.getSize().y)}).chain(
			function()
			{
				firstElement.inject($(this.options.container));
				this.elements.push(firstElement);
				fxChain.callChain();
			}.bind(this),
			
			function()
			{
				fxChain.setOptions({duration: 700, transition : 'expo:out'}).start({'opacity' : 1, 'margin-top' : [firstElement.getSize().y,0]});
			}.bind(this)
		);	
	},
	
	pauseSlide : function()
	{
		if(this.hasEnoughElements())
		{
			$clear(this.slideInterval);
		}
	}
});

var Notifier = new Class(
{
	Implements: Options,
	
	options : 
	{
		element : 'notice',
		duration : 250,
		autohide : 20000,
		transition : 'expo:out',
		mainColors : {'background-color': '#0c0', 'color': '#000'},
		errorColors : {'background-color': '#c00', 'color': '#FFF'}
	},
	
	initialize : function(opt)
	{
		this.setOptions(opt);
		this.initElement();	
	},
	
	initElement : function()
	{
		if(!$defined($(this.options.element)))
		{
			var element = new Element('div',{'id' : this.options.element}).inject($(document.body));
		}
		else
		{
			var element = $(this.options.element);
		}
		
		this.setOptions('element',element);
		element.set({'styles' : this.options.mainColors, 'html':'<div class="floatright"><h6>x</h6></div><div class="floatleft"></div><h6>Notification Panel</h6><div class="clear"></div><div class="inside"><div class="message"></div></div>'});
		this.elementFX = new Fx.Slide(element,{duration: this.options.duration, transition: this.options.transition}).hide();
		
		element.addEvents(
		{
			'click' : function()
			{
				this.hideElement();
			}.bind(this),
		
			'mouseenter' : function()
			{
				element.setStyle('cursor','pointer');
				
				if(this.checkAutoHide())
				{
					if($defined(this.slideOutInterval))
					{
						$clear(this.slideOutInterval);
					}
				}
			}.bind(this),
			
			'mouseleave' : function()
			{
				if(this.checkAutoHide())
				{
					this.slideOutInterval = this.hideElement.delay(this.options.autohide,this);
				}
			}.bind(this)
		});
	
	},
	
	checkAutoHide : function()
	{
		return $chk(this.options.autohide);
	},
	
	checkMessageError : function(message)
	{
		if((message.toLowerCase().contains('error')))
		{
			$(this.options.element).setStyles(this.options.errorColors);
		}
		else
		{
			$(this.options.element).setStyles(this.options.mainColors);
		}
	},
	
	setMessage : function(message)
	{
		$(this.options.element).getElement('.message').set('html',message);
	},
	
	display : function(message)
	{
		this.setMessage(message);
		this.checkMessageError(message);
		this.elementFX.slideIn().chain(
			function()
			{
				if(this.checkAutoHide())
				{
					if($defined(this.slideOutInterval))
					{
						$clear(this.slideOutInterval);
					}
					
					this.slideOutInterval = this.hideElement.delay(this.options.autohide,this);
				}
			}.bind(this)
		);
	},
	
	hideElement : function()
	{
		this.elementFX.slideOut();
	}
});

var CheckForm = new Class(
{
	Implements : [Options, FXHelper],
	
	options :
	{
		forms : '.checkform, .ajaxform',
		inputs : 'input[type=text], input[type=password], select, textarea',
		tagFields : 'input[name=articleTags]',
		errorFX : {'background-color' : '#f00', 'color' : '#ffffff' }
	},
	
	initialize : function(options)
	{
		this.setOptions(options);
		
		var that = this;
		
		$$(this.options.forms).addEvent('submit',function(e)
		{
			that.clearErrors(this);
			that.startChecking(this);
			that.initTagFields(this);
			that.validateFields(this);
			that.processValidation(this,e);
		});
	},
	
	addError : function(form,error)
	{
		form.errorResult.include(error);
	},
	
	clearErrors : function(form)
	{
		form.errorResult = [];
	},
	
	fetchErrors : function(form)
	{
		return form.errorResult.join(', ');
	},
	
	startChecking : function(form)
	{
		form.proceed = true;
	},
	
	stopChecking : function(form)
	{
		form.proceed = false;
	},
	
	isChecking : function(form)
	{
		return form.proceed || false;
	},
	
	rules : $H(
	{
		required : function(element)
		{
			if($defined(element.get('title')) && !element.disabled)
			{
				var textvalue = (typeof tinyMCE != 'undefined' && $defined(tinyMCE.get(element.get('id')))) ? tinyMCE.get(element.get('id')).getContent() : textvalue = element.get('value');
				
				if(textvalue.clean() == '')
				{
					return false;
				}
				else
				{
					return true;
				}
			}
			else
			{
				return true;
			}
		},
		
		numeric : function(element)
		{
			if(element.hasClass('numericData'))
			{
				if(element.value.clean() != '' && isNaN(element.value.toFloat()))
				{
					return false;
				}
			}
			else
			{
				return true;
			}
		},
		
		nospaces : function(element)
		{
			if(element.hasClass('noSpaces'))
			{
				if(element.value.clean().contains(' '))
				{
					return false;
				}
				else
				{
					return true;
				}
			}
			else
			{
				return true;
			}
		}
	}),
	
	initTagFields : function(form)
	{
		var tagField = form.getElement(this.options.tagFields);
			
		if($defined(tagField))
		{
			tagField.value = tagField.value.replace(/[^a-zA-Z0-9-\s,]/gi,'').replace(/\s*,\s* /gi,',').replace(/,\s*$/,'').replace(/^\s*,/,'').replace(/,{2,}/gi,',').replace(/-{2,}/gi,'-').replace(/\s{2,}/gi,' ').replace(/,\s,/gi,',').clean();
		}
	},
	
	validateFields : function(form)
	{
		this.rules.each(function(rule)
		{
			if(this.isChecking(form))
			{
				form.getElements(this.options.inputs).set('morph',defaultoptions).each(function(element,index)
				{
					var title = $pick(element.get('title'), element.get('alt'), element.get('name'), element.get('rel'), element.get('tag')),
								orig = element.getStyles(this.getFXStyles(this.options.error));
					
					if(!rule(element))	 
					{
						this.addError(form,title);	
						this.stopChecking(form);
						
						if(element.get('tag') == 'textarea' && typeof tinyMCE != 'undefined' && $defined(tinyMCE.get(element.get('id'))))
						{
							$(tinyMCE.get(element.get('id')).getBody()).set('morph',defaultoptions).morph(this.options.errorFX);
						}
						else
						{
							element.morph(this.options.errorFX);	
						}
					}
					else
					{
						if(element.get('tag') == 'textarea' && typeof tinyMCE != 'undefined' && $defined(tinyMCE.get(element.get('id'))))
						{
							$(tinyMCE.get(element.get('id')).getBody()).set('morph',defaultoptions).morph(orig);
						}
						else
						{
							element.morph(orig);	
						}
					}
				
				},this);
			}
		},this);
	},
	
	processValidation : function(form,e)
	{
		if(!this.isChecking(form))
		{
			notifier.display(['Error: Some of the values you have placed are either missing or invalid. These fields are marked for your reference:<br /><strong>',this.fetchErrors(form),'</strong>'].join(''));
			windowScroll.toElement(form);
			e.stop();
		}
		
	}

});

var Panels = new Class(
{
	Implements : [Options,FXHelper],
	
	options : 
	{
		togglers : '.togglepanel',
		panels : '.panel',
		toggleColors : {'background-color' : '#fc0', 'color' : '#000'},
		tabOptions : {}
	},
	
	initialize : function(options)
	{
		this.setOptions(options);
		this.initPanels();
		this.initTabs();
		this.initTogglers();
	},
	
	initPanels : function()
	{
		this.panelFX = [];

		$$(this.options.panels).each(function(element,index)
		{
			this.panelFX[index] = new Fx.Slide(element,defaultoptions).hide();
			
			element.store('fx',this.panelFX[index]);
			
			if(element.hasClass('openPanel'))
			{
				element.retrieve('fx').show();
			}
			
		},this);
	},
	
	initTabs : function()
	{
		this.tabItems = [];
		$$(this.options.panels).each(function(element,index)
		{
			this.tabItems[index] = new Tabs(element,this.options.tabOptions);
		},this);
	},
	
	initTogglers : function()
	{
		this.toggleFX = [];

		$$(this.options.togglers).each(function(element,index)
		{
			this.toggleFX[index] = new Fx.Morph(element,defaultoptions);
			
			var orig = element.getStyles(this.getFXStyles(this.options.toggleColors)),
					panelFX = this.panelFX[index],
					toggleFX = this.toggleFX[index];
			
			element.addEvents(
			{
				'click' : function()
				{
					this.togglePanel(index);
				}.bind(this),
								
				'mouseenter' : function()
				{
					toggleFX.start(this.options.toggleColors);
				}.bind(this),
				
				'mouseleave' : function()
				{
					toggleFX.start(orig);
				}
			});
			
			if($defined(element.get('rel')) && element.get('rel') == 'open')
			{
				element.fireEvent('click');
			}
			
		},this);
	},
	
	togglePanel : function(index)
	{
		var panelFX = this.panelFX[index];
		
		panelFX.toggle().chain(function()
		{
			if(panelFX.open)
			{
				windowScroll.toElement(panelFX.element);
			}
		});
	},
	
	showPanel : function(panelFX)
	{
		panelFX.slideIn();
	},
	
	hidePanel : function(panelFX)
	{
		panelFX.slideOut();
	},
	
	goToTab : function(panelIndex,itemID,buttonIndex)
	{
		var displayChain = new Chain();
		
		displayChain.chain(
			function()
			{
				this.tabItems[panelIndex].goToTab(itemID,buttonIndex);
				displayChain.callChain();
			}.bind(this),
			function()
			{
				if($defined($(itemID)))
				{
					windowScroll.toElement.delay(800,windowScroll,$(itemID));
				}
			}.bind(this)
		);
		
		displayChain.callChain();
	}
});

var Tabs = new Class(
{
	Implements : [Options,FXHelper],
	
	options : 
	{
		items : '.item',
		collapse : '.collapseTabs',
		buttons : '.tabButton',
		tabs : '.tab',
		hoverFX : {'background-color' : '#09f', 'color' : '#fff'},
		focusFX : {'background-color' : '#def', 'color' : '#000', 'font-size' : 12, 'padding-left' : 30, 'padding-right' : 30},
		blurFX : {'background-color' : '#fff', 'color' : '#09f', 'font-size' : 11, 'padding-left' : 20, 'padding-right' : 20}
	},
	
	initialize : function(element,options)
	{
		this.element = $(element);
		this.setOptions(options);
		
		if($defined(this.element))
		{
			this.initTabs();
			this.initButtons();
			this.initCollapse();
		}
	},
	
	initTabs : function()
	{
		this.tabFX = [];
		this.element.getElements(this.options.items).each(function(element,itemIndex)
		{
			var tabs = element.getElements(this.options.tabs);
			this.tabFX[itemIndex] = [];
			
			tabs.each(function(tab,tabIndex)
			{
				this.tabFX[itemIndex][tabIndex] = new Fx.Slide(tab,defaultoptions).hide();
			},this);
			
		},this);
	},
	
	showTab : function(itemIndex,tabIndex)
	{
		this.tabFX[itemIndex].each(function(fx,index)
		{
			if(index == tabIndex)
			{
				fx.slideIn();
			}
			else
			{
				fx.slideOut();	
			}
		},this);
	},
	
	initButtons : function()
	{
		this.buttonFX = [];
		this.selectedButton = [];
		this.element.getElements(this.options.items).each(function(element,itemIndex)
		{
			var buttons = element.getElements(this.options.buttons);
			
			if(buttons.length > 0)
			{
				this.buttonFX[itemIndex] = new Fx.Elements(buttons,defaultoptions);
				
				buttons.set('morph',defaultoptions).each(function(button,buttonIndex)
				{
					button.addEvents(
					{
						'mouseenter' : function()
						{
							if(this.checkSelectedButton(itemIndex) != buttonIndex)
							{
								button.morph(this.options.hoverFX)
							}
						}.bind(this),
						
						'mouseleave' : function()
						{
							if(this.checkSelectedButton(itemIndex) != buttonIndex)
							{
								button.morph(this.options.blurFX)
							}		
						}.bind(this),
						
						'click' : function()
						{
							this.selectButton(itemIndex,buttonIndex);
							this.fixPanelHeight();
						}.bind(this)
					});
				},this);
				
				this.selectButton(itemIndex,0);
			}
			
		},this);
	},
	
	fixPanelHeight : function()
	{
		var panelFX = this.element.retrieve('fx');
		panelFX.slideIn.delay(panelFX.options.duration,panelFX);
	},
	
	checkSelectedButton : function(itemIndex)
	{
		return this.selectedButton[itemIndex];
	},
	
	selectButton : function(itemIndex,buttonIndex)
	{
		this.selectedButton[itemIndex] = buttonIndex.toInt();
		
		if(this.element.getElements(this.options.items).length > 0)
		{
			var buttons = this.element.getElements(this.options.items)[itemIndex].getElements(this.options.buttons),
						o = {};
							
			o[buttonIndex] = this.options.focusFX;
			
			buttons.each(function(other, deselectIndex) 
			{
				if(buttonIndex != deselectIndex) {
					o[deselectIndex] = this.options.blurFX;
				}
			},this);
		
			this.buttonFX[itemIndex].start(o);
			
			this.showTab(itemIndex,buttonIndex);
		}
	},
	
	initCollapse : function()
	{
		var collapseTabs = this.element.getElements(this.options.collapse)
		
		if(collapseTabs.length > 0)
		{
			collapseTabs.addEvent('click',function(e)
			{
				this.collapseAll();
				e = new Event(e).stop();
				
			}.bind(this));
		}
	},
	
	collapseAll : function()
	{
		this.element.getElements(this.options.items).each(function(element,itemIndex)
		{
			this.selectButton(itemIndex,0);
			this.fixPanelHeight();
		},this);
	},
	
	goToTab : function(itemID,buttonIndex)
	{
		if($defined($(itemID)))
		{
			$(itemID).getElements('.tabButton')[buttonIndex].fireEvent('click');
		}
	}
});

window.addEvent('domready',function()
{
	notifier = new Notifier();
	checkForm = new CheckForm();
	control = new Control();
	newsSlide = new Slider({minCount: 4});
	imagesSlide = new Slider({container : 'imagefeed', delay : 2500, minCount: 4});
	windowScroll = new Fx.Scroll(window,{duration: 1000, transition: 'expo:in:out', link: 'cancel', offset: {'x' : 0, 'y' : -($(notifier.options.element).getSize().y+40)}});
	panels = new Panels();
	letterFX = new LetterFX();
	ajaxNews = new AjaxNews();
	avatarChanger = new AvatarChanger('avatarList','avatar');
	showcase = new Showcase('showcasecontainer');
});

