﻿//Шаблон комментария    

    ///<description></description>
    ///<params
    ///  <param name=""></param>
    ///  <param name=""></param>
    ///</params>
    ///<return></return>
    
///<description>Конструктор контрола</description>
///<params>
///  <param name="conteiner">ИД контейнера куда будут добавляться контролы.</param>
///  <param name="data">Данные которые необходимо отобразить в формате "ИД:значение;ИД:значение"</param>
///  <param name="contentType">Тип контента - строка учавствует в формировании имени контрола.</param>
///  <param name="selected">Значение которое выбрано по умолчанию.</param>
///  <param name="clickHandler">Делегат на функцию которая обрабатывает клик на элементе. Прототип function(указатель на DIRadioGroup, ид, текст)</param>
///  <param name="selectedCss">CSS стиль для выбранного элемента.</param>
///  <param name="unselectedCss">CSS стиль для невыбранного элемента.</param>
///</params>
DIRadioGroup = function(conteiner, data, contentType, selected, clickHandler, selectedCss, unselectedCss, separator) {
	this._conteiner = document.getElementById(conteiner);
	this._value = null;
	this._currentSelected = null;
	this._clickHandler = null;
	if (clickHandler) {
		this._clickHandler = [clickHandler];
	}
	this._selectedCss = selectedCss;
	this._unselectedCss = unselectedCss;
	this._accordion = null;
	this._name = contentType;

	this._separator = ";";
	if (separator) this._separator = separator;
	this._div = this.create(contentType, selected, data);
	this._tableId = null;
	this._isRequired = false;
}

DIRadioGroup.prototype = {
	///<description>Создание котрола</description>
	///<params
	///  <param name="contentType">Тип контента</param>
	///  <param name="selected">Выбранный по умолчанию элемент</param>
	///  <param name="data">Данные, которые надо отобразить</param>
	///</params>
	///<return>Div контрола</return>
	create: function(contentType, selected, data) {
		//Создаем контейнер в котором будет список значений
		var number = DIRadioGroupControllerInstance._count.toString()
		DIRadioGroupControllerInstance._count++;
		var div = document.createElement('ul');
		div.id = 'div_' + contentType + '_number_' + number;
		div.name = div.id;
		var selectedSpan = null;

		selectedSpan = this.build(data, div, selected);

		this._conteiner.appendChild(div);
		//создаем скрытое поле куда будем сохранять результат
		var input = document.createElement('input');
		input.id = 'inp_' + contentType + '_number_' + number;
		input.name = input.id;
		input.setAttribute('type', 'hidden');

		this._value = input;
		div.appendChild(input);
		if (selectedSpan != null) this.selectSpan(selectedSpan);

		return div;
	},

	setCssClass: function(cssClass) {
		this._div.className = cssClass;
	},

	///<description>Создать наполнение контрола</description>
	///<params
	///  <param name="data">Данные</param>
	///  <param name="div">Контрол в который будет добавено наполнение</param>
	///  <param name="selected">Выбранное по умолчанию значение</param>
	///</params>
	///<return>Span, который надо выделить.</return>
	build: function(data, div, selected) {
		var selectedSpan = null;
		if (data == '') {
			return selectedSpan;
		}
		var mas = data.split(this._separator);
		var i = 0;
		//наполняем список значений
		for (i = 0; i < mas.length; i++) {
			var radio = document.createElement('li');
			var values = null;
			if (mas[i].indexOf(':') != -1) {
				values = mas[i].split(':');
			}
			else {
				values = new Array();
				values[0] = mas[i];
				values[1] = mas[i];
			}
			var a = document.createElement('a');
			a.innerHTML = values[1];
			//a.href = '#';
			a.style.cursor = 'pointer';
			a.setAttribute('value', values[0]);
			a.onclick = this.onSpanClick;
			a._controller = this;
			a.className = this._unselectedCss;
			radio.appendChild(a);
			div.appendChild(radio);
			if (selected != null && selected != 'undefined' && selected == values[0]) {
				selectedSpan = a;
			}
		}
		return selectedSpan;
	},

	///<description>Перестраивает наполнение контрола</description>
	///<params
	///  <param name="newData">Новые значения</param>
	///  <param name="selected">Выбраное по умолчанию значение</param>
	///</params>
	rebuild: function(newData, selected) {
		this._value.value = null;
		this._currentSelected = null;
		var arr = new Array();
		var i = 0;
		for (i = 0; i < this._div.childNodes.length; i++) arr[i] = this._div.childNodes[i];
		for (i = 0; i < arr.length; i++) {
			if (arr[i].tagName != 'INPUT') this._div.removeChild(arr[i]);
		}
		var selectedSpan = this.build(newData, this._div, selected);
		if (selectedSpan != null) this.selectSpan(selectedSpan);
	},

	///<description>Обработка клика на span</description>
	onSpanClick: function() {
		this._controller.selectSpan(this);
	},

	///<description>Выделение span-a и запоминание его значения</description>
	///<params
	///  <param name="span">Span который надо выделить</param>
	///</params>
	selectSpan: function(span) {
		if (span._controller._currentSelected != null) {
			span._controller._currentSelected.className = this._unselectedCss;
		}
		span._controller._currentSelected = span;
		span._controller._currentSelected.className = this._selectedCss;
		span._controller._value.value = span._controller._currentSelected.getAttribute('value');
		if (span._controller._clickHandler != null && span._controller._clickHandler != undefined && span._controller._clickHandler.length > 0) {
			var value = span._controller._value.value;
			var text = span._controller._currentSelected.innerHTML;
			for (var j = 0; j < span._controller._clickHandler.length; j++) {
				span._controller._clickHandler[j](span._controller, value, text, this._tableId);
			}
			//span._controller._clickHandler(span._controller, value, text, this._tableId);
		}
		if (this._accordion != null) this._accordion.stateChangedNotify();
	},

	///<description>Выделяет элемент по ИД</description>
	///<params
	///  <param name="value">Ид элемента</param>
	///</params>
	select: function(value) {
		for (var i = 0; i < this._div.childNodes.length; i++) {
			if (this._div.childNodes[i].tagName != 'INPUT') {
				var span = this._div.childNodes[i].childNodes[0];
				if (value == span.innerHTML) {
					this.selectSpan(span);
					break;
				}
			}
		}
	},

	selectByID: function(id) {
		for (var i = 0; i < this._div.childNodes.length; i++) {
			if (this._div.childNodes[i].tagName != 'INPUT') {
				var span = this._div.childNodes[i].childNodes[0];
				if (id == span.getAttribute('value')) {
					this.selectSpan(span);
					break;
				}
			}
		}
	},

	selectByIndex: function(index) {
		var curIndex = 0;
		for (var i = 0; i < this._div.childNodes.length; i++) {
			if (this._div.childNodes[i].tagName != 'INPUT') {
				var span = this._div.childNodes[i].childNodes[0];
				if (curIndex == index) {
					this.selectSpan(span);
					break;
				}
				curIndex++;
			}
		}
	},

	selectValueInRange: function(id, isMinValue) {
		if (!isMinValue) {
			for (var i = 0; i < this._div.childNodes.length; i++) {
				if (this._div.childNodes[i].tagName != 'INPUT') {
					var span = this._div.childNodes[i].childNodes[0];
					if (id <= Number(span.getAttribute('value'))) {
						this.selectSpan(span);
						break;
					}
				}
			}
		}
		else {
			for (var i = this._div.childNodes.length - 1; i >= 0 ; i--) {
				if (this._div.childNodes[i].tagName != 'INPUT') {
					var span = this._div.childNodes[i].childNodes[0];
					if (id >= Number(span.getAttribute('value'))) {
						this.selectSpan(span);
						break;
					}
				}
			}
		}
	},

	///<description>Указать класс для выбранного элемента</description>
	///<params
	///  <param name="cssClass">Имя класса</param>
	///</params>
	setSelectedCss: function(cssClass) {
		this._selectedCss = cssClass;
	},

	///<description>Указать класс для невыбранного элемента</description>
	///<params
	///  <param name="cssClass">Имя класса</param>
	///</params>
	setUnselectedCss: function(cssClass) {
		this._unselectedCss = cssClass;
	},

	setAccordion: function(value) {
		this._accordion = value;
	},

	setClickHandler: function(handler) {
		if (this._clickHandler == null) {
			this._clickHandler = [handler];
		}
		else {
			this._clickHandler.push(handler);
		}
	},

	setChildTableId: function(tableId) {
		this._tableId = tableId;
	},

	getValue: function() {
		return this._value.value;
	},

	getNameValue: function() {
		return this._name + '=' + this._value.value + paramsSeparator;
	},

	setIsRequired: function(value) {
		this._isRequired = value;
	},

	isRequired: function() {
		return this._isRequired;
	},

	isFilled: function() {
		return this._value.value != "";
	},

	restoreState: function(state) {
		return null;
	}
}

//Класс хранящий настройки 
DIRadioGroupController = function () {
    //Количество контролов на форме
    this._count = 0;
}

//Объект с настройками.
DIRadioGroupControllerInstance = new DIRadioGroupController();

//Для динамического назрачения обработчиков событий
if (navigator.userAgent.toLowerCase().indexOf('gecko') != -1) {
    window.attachEvent = function(eventName, delegate) {
        this.addEventListener(eventName.substring(2), delegate, false);
    },

    window.detachEvent = function(eventName, delegate) {
        this.removeEventListener(eventName.substring(2), delegate, false);
    },

    window.document.attachEvent = function(eventName, delegate) {
        this.addEventListener(eventName.substring(2), delegate, false);
    },

    window.document.detachEvent = function(eventName, delegate) {
        this.removeEventListener(eventName.substring(2), delegate, false);
    },

    HTMLElement.prototype.attachEvent = function(eventName, delegate) {
        this.addEventListener(eventName.substring(2), delegate, false);
    },

    HTMLElement.prototype.detachEvent = function(eventName, delegate) {
        this.removeEventListener(eventName.substring(2), delegate, false);
    },

    HTMLElement.prototype.fireEvent = function(eventName, eventInstance) {
        var events = this.ownerDocument.createEvent("events");
        events.initEvent(eventName.substring(2), false, true);
        this.dispatchEvent(ev);
    },

    Event.prototype.__defineGetter__("srcElement", function () {
        var node = this.target;
        while (node.nodeType != 1) node = node.parentNode;
        return node;
    })
 }