var MenuLinks = new Class({
	
	Implements: Options,
	
		options: {
			headers: ['#main h1','#main h2'],
			menu: 'menu'
		},
		
	initialize: function(options){
		this.setOptions(options);
		var str = this.options.headers.join(',');
		this.headers = $$(str);
		this.build();
	},
	
	build: function(){
		this.headers.each(function(header){
			
			this.dressHeader(header);
			this.cloneHeader(header);
		}.bind(this));
	},
	
	dressHeader: function(header){
		var html = header.get('html');
		var ends = [html.indexOf('{'),html.indexOf('}')];
		var id = html.substring(ends[0]+2,ends[1]).replace('.','-');
		html = html.substring(0,ends[0]);
		header.set('id',id).empty();
		var a = new Element('a',{
			'html': html,
			'href': '#'+id
		}).inject(header);
	},
	
	cloneHeader: function(header){
		var clone = header.clone();
		var link = clone.getElement('a');
		var text = link.get('text').split(':')[1].trim();
		clone.empty();
		link.set('text',text).inject(clone);
		if(header.get('tag')=='h1') {
			var newEl = new Element('h4',{'class':'menu-item','html':clone.get('html')});
		} 
		else {
			var newEl = new Element('div',{'class':'menu-item','html':clone.get('html')});
		}
		newEl.inject(document.id(this.options.menu));
	}
	
});

var ConvertSelects = new Class({
  
  Implements: Options,
  
    options: {
      selector: '.convertible',
      trigger: 'new',
			classes: ['converted','text'],
			newText: 'No name'
    },
    
  initialize: function(options){
    this.setOptions(options);
    this.selects = $$(this.options.selector);
    this.attach();
  },
  
  attach: function(){
    this.selects.each(function(select){
      select.addEvent('change',function(){
        if(select.value == this.options.trigger){
          this.convert(select)
        }
      }.bind(this));
    }.bind(this))
  },
  
  convert: function(select){
    var name = select.get('name');
    name = name.split(']');
    new_name = name[0]+'_new'+']';
    var text_field = new Element('input',{
      'type': 'text',
      'name': new_name,
      'class': this.options.classes.join(' '),
			'value': this.options.newText
    }).inject(select,'after');
    var disposed = select.dispose();
    text_field.select();
  }
  
});

var CheckRadios = new Class({
	
	Implements: [Options,Events], 

		options: {
			/* onChecked0: $empty, */
		},

	initialize: function(radios,options){
		this.setOptions(options);
		this.radios = $$(radios);
		this.bound = this.findChecked.bind(this);
		this.attach();
		this.findChecked();
	},
	
	attach: function(){
		this.radios.each(function(radio,index){
			radio.addEvent('click',this.bound);
		}.bind(this));
		return this;
	},
	
	findChecked: function(){
		this.radios.each(function(radio,index){
			if(radio.checked)	{
				this.selected = radio;
				this.fireEvent('checked'+index, this.selected);
			}
		}.bind(this));
		return this;
	}

});

var setTextAreas = function(how){
	var textareas = $$('.convert');
	var spans = $$('span.url').fade('hide');
	if(how == 'shrink'){
		textareas.each(function(textarea){
			textarea.convert('input');
		});
		spans.fade('in');
	} else {
		textareas.each(function(textarea){
			textarea.convert('textarea');
		});
		spans.fade('out')
	}
}

var SelectFilter = new Class({
	
	Implements: [Options,Events], 

		options: {
			namePrefix: 'category_type-',
			displayed: 1
		},

	initialize: function(element, elements, options){
		this.setOptions(options);
		this.element = document.id(element);
		this.elements = $$(elements);
		this.elements.each(function(element,index){
			var search = this.options.namePrefix + this.options.displayed;
			if(!element.hasClass(search)) element.setStyle('display','none').getElement('select').set('disabled',true);
		}.bind(this));
		this.bound = this.filter.bind(this);
		this.attach();
	},
	
	attach: function(){
		this.element.addEvent('change',this.bound);
		return this;
	},
	
	filter: function(){
		var search = this.options.namePrefix + this.element.value;
		this.elements.each(function(element,index){
			if(element.hasClass(search)){
				element.setStyle('display','block');
				element.getElement('select').set('disabled',false);
			} else {
				element.getElement('select').setAttribute('disabled',true);
				element.setStyle('display','none');
			}
		}.bind(this));
		return this;
	}

});

Element.implement({

	convert: function(to){
		var props = this.getProperties('name','id','class','value');
		new Element(to,props).inject(this,'after');
		this.destroy();
	}

});

var ObscureMailto = new Class({
	
	Implements: Options,
	
		options: {
			selector: 'a[href=mailto:]',
			at: '{at}',
			dot: '{dot}'
		},
	
	initialize: function(options){
		this.setOptions(options);
		this.links = $$(this.options.selector);
		this.links.each(function(link,index){
			var oldText = link.get('text');
			var newText = oldText.replace(this.options.at,'@').replace(this.options.dot,'.');
			link.set('text',newText).set('href','mailto:' + newText);
		}.bind(this));
	}
	
});