/**
 * dollarConflict Replaced -> $j
 */


var domSlider = jClass.extend({
	appName:'domSlider',
	elements: null,
	options: {
		mode:'siblings',
		hideonload:true,
		hideonloadexcept:[
			
		],
		button:{
			position:'into',
			type:'span',
			text:'click me',
			classes:[
				'toggleButton',
				'toggledButton'
			],
			show:'always' /*always,notempty*/
		}
	},
	init: function(elements,options) {
		var options = $j.extend(true,this.options,options);
		this.options = options;
		this.elements = $j(elements);

		if(this.elements.length != 0){
			this.prepare();
		}else{
			this.log(this.appName+' :no elements ');
		}
	},
	prepare:function(){
		this.elements.each(
			$j.shove(function(index,el){
				var button = this.getButton();
				switch(this.options.mode){
					case 'siblings':
						var content = $j(el).siblings(this.options.content);
					break;
					case 'childs':
						var content = $j(el).children(this.options.content);
					break;
				}
				
				if(this.options.hideonload) {
					/* either hide all, or only hide if we defined some classes we will ignore */
					var hide = true;
					if(this.options.hideonloadexcept.length > 0){
						/*search for ignored classes, if we find them we don't hide the content*/
						 for(var i=0;i<this.options.hideonloadexcept.length;i++) {
							
							var tmpClass = this.options.hideonloadexcept[i];
							/*get classes from element and split*/
							var elClasses = $j(el).attr('class').split(' ');
							/*check each class for a match */
							for(var i=0;i<elClasses.length;i++) {
								if(elClasses[i] == tmpClass){
									hide = false;
								}
							}
						};	
						
						
					}
					/*hide, either if we hide all, or if we haven't found classes which we don't close*/
					if(hide == true){
						content.hide();
					}
				}
				/* add functionality for toggle classes*/
				button.click($j.shove(function(ev){
					ev.stopPropagation(); 
					if(this.options.button.classes.length == 2){
						$j(button).toggleClass(this.options.button.classes[0]);
						$j(button).toggleClass(this.options.button.classes[1]);
					}
				},this));
				
				$j(el).click($j.shove(function(){
					if (this.content.is(":hidden")){
						button.addClass(this.pObj.options.button.classes[1]);
					    button.removeClass(this.pObj.options.button.classes[0]);
					    this.content.slideDown("slow");
					} else {
					    button.addClass(this.pObj.options.button.classes[0]);
					    button.removeClass(this.pObj.options.button.classes[1]);
					    this.content.slideUp("slow");
					} 
				},{content:content,pObj:this}));
				
				button.click($j.shove(function(){
					if (this.is(":hidden")){
					    this.slideDown("slow");
					} else {
					    this.slideUp("slow");
					} 
				},content));
				if( this.options.button.show == 'always' || 
					(this.options.button.show == 'notempty' && content.length > 0)){		
					switch(this.options.button.position){
						case 'into':
							$j(el).append(button);
						break;
						case 'after':
							$j(el).after(button);
						break;
						case 'before':
							$j(el).before(button);	
						break;
						default:
							$j(el).append(button);
					}
				}
		},this));
	},
	getButton:function(){
		if(this.options.button.type =="button") this.options.button.type="span"; 
		var button = $j("<"+this.options.button.type+">").addClass(this.options.button.classes[0]).text(this.options.button.text);
		return button;
	},
	log:function(msg){
		if(console){
			console.log(msg);
		} else {
			alert(msg);
		}
	}
});
