/**
 * BrutForms — stylized selects, radio-buttons and checkboxes
 * Version: 0.3.1 (16.06.2010)
 * @author seva <seva321_at_gmail.com>
 * License: Public Domain
 */
function brutforms(){
	/**
	 * Массив с чекбоксами
	 * @type {Array}
	 */
	var _checkboxes_ = new Array();
	/**
	 * Массив с радио
	 * @type {Array}
	 */
	var _radios_ = new Array();
	/**
	 * Массив с видимой часть псевдо-селектора
	 * @type {Array}
	 */
	var _text_layer_ = new Array();
	/**
	 * Массив с псевдо-option элементами
	 * @type {Array}
	 */
	var _fake_a_ = new Array();
	/**
	 * Массив со списком псевдо-option элементов
	 * @type {Array}
	 */
	var _select_list_ = new Array();
	/**
	 * Все формы на странице
	 * @type {NodeList}
	 */
	var forms = document.getElementsByTagName('FORM');
	
	// проходимся по всем формам 
	for(var i=0; i<forms.length; i++){
		
		//берем только с нужным классом
		if(/brutforms/.test(forms.item(i).className.toLowerCase())){
			/**
			 * Все input-элементы
			 * @type {NodeList}
			 */
			var inputs = forms[i].getElementsByTagName('INPUT');
	
			// перебираем все input-ы
			for(var e=0; e<inputs.length; e++){
				
				//ловим checkbox-ы
				if(inputs.item(e).type.toLowerCase() == 'checkbox'){
					
					//запихиваем в массив с checkbox-ами
					_checkboxes_.push(inputs.item(e));
					
					//присваиваем родительскому блоку css-класс с параметрами отображения псевдо-checkbox-ов
					inputs.item(e).parentNode.className += ' pseudo_checkbox';
					
					if(inputs.item(e).checked){
						
						//присваиваем класс родителю
						inputs.item(e).parentNode.className +=' pseudo_checkbox_checked';
					}
					
				}
				
				//ловим radio
				else if(inputs.item(e).type.toLowerCase() == 'radio'){
					
					//запихиваем в массив с radio-ами
					_radios_.push(inputs.item(e));
					
					//присваиваем родительскому блоку css-класс с параметрами отображения псевдо-radio
					inputs.item(e).parentNode.className += ' pseudo_radio';
					
					//если отмечен
					if(inputs.item(e).checked){
						
						//присваиваем класс родителю
						inputs.item(e).parentNode.className +=' pseudo_radio_checked';
					}
				}
				
				
			}
			
			/**
			 * Все селекты на странице
			 * @type {NodeList}
			 */
			var selects = forms[i].getElementsByTagName('SELECT');
			
			//если есть
			if(selects){
				
				// перебираем все
				for(var e=0; e<selects.length; e++){
					
					
					
					//если текущий селект еще не испорчен
					if (selects.item(e).className != "hidden_select" && selects.item(e).className != "no_style") {
						
						//класс здесь как флаг
						selects.item(e).className = "hidden_select";
						
						/**
						 * реальный блок-родитель
						 * @type {Element}
						 */
						var real_parent = selects.item(e).parentNode;
						real_parent.style.position = 'relative';
						
						
						/**
						 * создаем блок-родитель
						 * @type {Element}
						 */
						var select_wrapper = document.createElement('div');
						
						//присваиваем родительскому блоку css-класс с параметрами отображения
						select_wrapper.className += ' s_wrap';
						
						//добавляем реальный select в созданный блок
						//select_wrapper.appendChild(selects.item(e));
						
						//присваиваем id (аналогичный name у пседво-опции)
						selects.item(e).id = 'f_' + i + '_s_' + e;
					
						//присваиваем родительскому блоку ширину
						if(selects.item(e).style.width){
							selects.item(e).parentNode.style.width = selects.item(e).style.width;
						}
						
						/**
						 * значение атрибута onchange у настоящего селекта
						 * @type {String}
						 */
						var psevent = selects.item(e).getAttribute('onchange');
						//дублируем его на onblur
						selects.item(e).setAttribute('onblur', psevent);
						
						/**
						 * видимая часть селекта
						 * @type {Element}
						 */
						var text_layer = document.createElement('span');
						
						//устанавливаем css-класс 
						text_layer.className = 'fake_text';
					
						//добавляем в массив 
						_text_layer_.push(text_layer);
						
						//добавляем фейковый элемент в дерево
						select_wrapper.appendChild(text_layer);
						
						/**
						 * список опций
						 * @type {Element}
						 */
						var option_list = document.createElement('ul');
						
						//присваиваем css-класс
						option_list.className = 'fake_ul';
						
						//добавляем в массив
						_select_list_.push(option_list);
					
						/**
						 * опции в реальном селекта
						 * @type {NodeList}
						 */
						var opts = selects.item(e).options;
					
						//перебираем все
						for(var o=0; o<opts.length; o++){
							
							//если текущая опция выбрана
							if(opts.item(o).selected){
								
								//её значение записываем в видимую часть
								text_layer.innerHTML = opts.item(o).innerHTML;
							}
							
							//присваиваем id
							opts.item(o).id = 'fake_' + e + '_' + o;
							
							/**
						 	* элемент псевдо-списка
						 	* @type {Element}
						 	*/
							var f_li = document.createElement('li');
							
							/**
						 	* ссылка в псевдо-списке
						 	* @type {Element}
						 	*/
							var f_a = document.createElement('a');
							
							//присваиваем атрибуты
							//никуда не ходить
							f_a.href='javascript:void(0)';
							
							//rel такой же, как и id у option
							f_a.rel='fake_' + e + '_' + o;
							
							//имя с порядковым номером селекта, аналогичное id реального селекта
							f_a.name='f_' + i + '_s_' + e;
							
							//копируем содержимое option
							f_a.innerHTML = opts.item(o).innerHTML;
							
							//добавляем в массив 
							_fake_a_.push(f_a);
							
							//добавляем ссылку в элемент псевдо-списка
							f_li.appendChild(f_a);
							
							//добавляем элемент псевдо-списка в список опций
							option_list.appendChild(f_li);
						}
					
						//записываем все в родителя
						select_wrapper.appendChild(option_list);
						
						real_parent.appendChild(select_wrapper);
					
					}
				}
			}
		}
	}
	
	//перебираем все видимые части селекторов
	for(var i=0; i<_text_layer_.length; i++){
		_text_layer_[i].onclick = /* ловим клики */ function(){
			
			//убираем выделение
			this.blur();
			
			/**
			 * Список с опциями
			 * @type {Element}
			 */
			var list = this.parentNode.getElementsByTagName('UL').item(0);
			
			//если невиден
			if(list.style.display != 'block'){
				
				//показываем
				list.style.display = 'block';
			}
			else{
				
				//иначе скрываем 
				list.style.display = 'none';
			}
		}
	}
	
	//перебираем все псевдо-опции в списке
	for(var i=0; i<_fake_a_.length; i++){
		
		//ловим клик
		_fake_a_[i].onclick = function(){
			
			//убираем выделение
			this.blur();
			
			/**
			 * id реальной опции
			 * @type {String}
			 */
			var target = this.rel;
			
			/**
			 * реальный селект
			 * @type {Element}
			 */
			var original = document.getElementById(this.name);
			
			/**
			 * Список реальных опций
			 * @type {NodeList}
			 */
			var clean = document.getElementById(this.name).options;
			
			//перебираем все
			for(var o=0; o<clean.length; o++){
				
				//текущий id не равен целевому
				if(clean.item(o).id != target){
					
					//присваиваем невыделен
					clean.item(o).selected = false;
				}
				else{
					//присваиваем выделен
					clean.item(o).selected = true;
					
					/**
					 * Текущая вдимая область
					 * @type {Element}
					 */
					var ins_text = this.parentNode.parentNode.parentNode.getElementsByTagName('SPAN')[0];
					
					//копируем в видимую область описание опции
					ins_text.innerHTML = clean.item(o).innerHTML;
					
					//фокусируемся на реальном селекте 
					original.focus();
					
					//сводим фокус
					original.blur();
					
					//скрывем список опций
					this.parentNode.parentNode.style.display = 'none';
				}
			}
		}
	}
	
	/* Checkboxes */
	/**
	 * смена отметки чекбоксов
	 * @type {Function}
	 */
	var check_decorator = function(e){
		var node;
        if(e.target){node=e.target;}
        else if(e.srcElement){node=e.srcElement;}
		
        //если отмечен
		if(node.checked){
			
			//меняем класс родителю
			node.parentNode.className += ' pseudo_checkbox_checked';
		}
		else{
			
			//иначе убираем класс активности
			node.parentNode.className = node.parentNode.className.replace(' pseudo_checkbox_checked', '');
		}
	}
		
	//перебираем все чекбоксы
	for(var i=0; i<_checkboxes_.length; i++){
		
		//добавляем событие
		if(_checkboxes_[i].attachEvent){
			_checkboxes_[i].attachEvent("onclick", check_decorator);
		}
		else if(_checkboxes_[i].addEventListener){
			_checkboxes_[i].addEventListener('click', check_decorator, false);
		}
	}
	
	
	
	/* Radios */
	/**
	 * смена отметки radio
	 * @type {Function}
	 */
	var radio_decorator = function(e){
		var node;
        if(e.target){node=e.target;}
        else if(e.srcElement){node=e.srcElement;}
        
		for(var i=0; i<_radios_.length; i++){
				
			//проверяем группу
			if(_radios_[i].name == node.name){
				
				//убираем отметку во всей группе
				_radios_[i].parentNode.className = _radios_[i].parentNode.className.replace(' pseudo_radio_checked', '');
			}
		}
		
		//текущую помечаем как выделенную
		node.parentNode.className+=' pseudo_radio_checked';
	}
	
	
	//перебираем все радио
	for(var i=0; i<_radios_.length; i++){
		
		//добавляем событие
		if(_radios_[i].attachEvent){
			_radios_[i].attachEvent("onclick", radio_decorator);
		}
		else if(_radios_[i].addEventListener){
			_radios_[i].addEventListener('click', radio_decorator, false);
		}
	}
	
	//для псевдо-селекта
	document.onmouseup = function(ev){
		
		var ev = ev || window.event;
		var target = ev.target || ev.srcElement;
		
		if(target.className == 'fake_ul'){ return; }
		
		//перебираем все выпадающие списки ul
		for(var i=0; i<_select_list_.length; i++){
			
			//если виден 
			if(_select_list_[i].style.display=='block'){
				
				//скрыть список
				_select_list_[i].style.display='none'
			}
		}
	}
}


//INIT
window.addEvent('domready', function() {
	brutforms();
});

