var domMSlider = new Class({
	appName:'domMSlider',
	Implements:[Options,Events],
	elements: null,
	options: {
		mode:'siblings',
		hideonload:true,
		content:'.slideableContent',
		linkhead:true,
		button:{
			position:'into',
			type:'span',
			text:'click me',
			classes:[
				'slideOpen',
				'slideClosed'
			]
		}
	},
	initialize:function(elm,opt){
		this.setOptions(opt);
		this.elements = $$(elm);

		if(this.elements.length > 0){
			this.prepare();
		}else{
			this.log('no elements');
		}
	},
	prepare:function(){
		var elements = this.elements;
		elements.each(function(item,index){
			//determine option.mode for content..
			switch(this.options.mode){
				case 'siblings':
					var content = $(item).getNext(this.options.content);
				break;
				case 'childs':
					var content = $(item).getFirst(this.options.content);
				break;
			}
			if($defined(content)){
				content.slideFx = new Fx.Slide(content, {
				    duration: 500,
				    link:'cancel',
				    transition: Fx.Transitions.Pow.easeOut,
				    onComplete:function(){
						$(content).getParent('div').addClass('slide-content');
					}
				});
				$(content).sliderOpen = true;
			}
			
			//setup button
			if(this.options.button !== false){
				var button = this.getButton(); 
				switch(this.options.button.position){
					case 'into':
						button.inject(item);
					break;
					case 'after':
						button.inject(item,'after');
					break;
					case 'before':
						button.inject(item,'before');	
					break;
					default:
						button.inject(item,this.options.button.position);
				}
				//add functionality to button and head
				button.addEvent('click',function(ev){
					ev.stopPropagation();
					if($(content).sliderOpen == true){
						$(content).sliderOpen = false;
						$(content).slideFx.slideOut();
						$(item).removeClass('is-opened');
						if($defined(button) && $defined(this.options.button.classes)){
							$(button).removeClass(this.options.button.classes[0]);
							$(button).addClass(this.options.button.classes[1]);	
						}
					}else{
						$(content).slideFx.slideIn();
						$(content).sliderOpen = true;
						$(item).addClass('is-opened');
						if($defined(button) && $defined(this.options.button.classes)){
							$(button).removeClass(this.options.button.classes[1]);
							$(button).addClass(this.options.button.classes[0]);		
						}
					}
				}.bind(this));
			}
			//make item clickable for sliding..
			item.addEvents({
				'click':function(ev){
					if($defined($(content).slideFx)){
						if($(content).sliderOpen == true){
							$(content).slideFx.slideOut();
							$(content).sliderOpen = false;
							$(item).removeClass('is-opened');
							if($defined(button) && $defined(this.options.button.classes)){
								$(button).removeClass(this.options.button.classes[0]);
								$(button).addClass(this.options.button.classes[1]);
							}
						}else{
							$(content).slideFx.slideIn();
							$(content).sliderOpen = true;
							$(item).addClass('is-opened');
							if($defined(button) && $defined(this.options.button.classes)){
								$(button).removeClass(this.options.button.classes[1]);
								$(button).addClass(this.options.button.classes[0]);	
							}
						}
					}
				}.bind(this),
				'openslider':function(ev){
					if($defined($(content).slideFx)){
						if($(content).sliderOpen == false){
							$(content).slideFx.slideIn();
							$(item).addClass('is-opened');
							if($defined(button) && $defined(this.options.button.classes)){
								$(button).removeClass(this.options.button.classes[1]);
								$(button).addClass(this.options.button.classes[0]);
							}
						}
					} 
				}.bind(this)
			});
			//check if content should be hidden on load..
			if(this.options.hideonload) item.fireEvent('click');
			
		}.bind(this));
	},
	getButton:function(){
		if(this.options.button.type =="button") this.options.button.type="span"; 
		var button = new Element(this.options.button.type,{
			'class':this.options.button.classes[0],
			'html':this.options.button.text
		}); 
		return button;
	},
	log:function(str){
		//if($defined(console)) console.log(this.appName+': '+str);
	}
});

