var ImageCheckbox = Class.create({
	initialize: function (items, render_type, required_number_of_answers){
		this.required_number_of_answers = required_number_of_answers;
		if (render_type=='table'){
			var table_div = new Element('div');
			var table_size = Math.floor(Math.sqrt(items.length)*-1)*-1;
			var table_tr_div = answer = null;
			var k = 0;
			for (i=1; i<=table_size; i++){
				table_tr_div = new Element('div', { className: 'tr_div' });
				for (g=1; g<=table_size; g++){
					if (k<=(items.length-1)){
						answer = items[k];
						var img = new Element('img', { src: answer.options.file_name, alt: '', title: '', width: answer.options.width, height: answer.options.height });
						var tick_img = new Element('img', { src: '/images/tick.png', alt: '', title: '', width: 16, height: 16, className: 'tick' });
						tick_img.hide();
						img.tick_img_id = tick_img.identify();
						img.observe('click',this.mouseClick.bindAsEventListener(this));
						table_tr_div.insert({ bottom: new Element('div', { className: 'td_div' }).insert(tick_img).insert(img)});
					}
					k++;
				}
				table_div.insert({ bottom: table_tr_div });
			}
			this.el_conteiner = table_div;
		}else {
			var el_conteiner = new Element('ul',{ className: 'image_check_box' });
			items.each(function (answer){
				var img = new Element('img', { src: answer.options.file_name, alt: '', title: '', width: answer.options.width, height: answer.options.height });
				var tick_img = new Element('img', { src: '/images/tick.png', alt: '', title: '', width: 16, height: 16, className: 'tick'});
				tick_img.hide();
				img.tick_img_id = tick_img.identify();
				img.observe('click',this.mouseClick.bindAsEventListener(this));
				el_conteiner.insert({bottom: new Element('li').insert(tick_img).insert( img )});
			}, this);
			this.el_conteiner = el_conteiner;
		}
	},
	mouseClick: function(event){
		var img = Event.element(event);
		if (img.hasClassName('selected')){
			img.removeClassName('selected');
			$(img.tick_img_id).hide();
		}else{
			img.addClassName('selected');
			var img_position = img.positionedOffset();
			var img_dimensions = img.getDimensions();
			var tick_img = $(img.tick_img_id);
			tick_img.show();
			tick_img.style.top = img_position.top + (img_dimensions.height-16-7)+'px';
			tick_img.style.left = img_position.left + (img_dimensions.width-16-7)+'px';
		}
	},
	hasValue: function(){
		var answers_count = false;
		this.el_conteiner.select('img[class=selected]').each(function(){ answers_count++; });
		return this.required_number_of_answers==answers_count ? true : false;
	},
	toElement: function(){ return this.el_conteiner; }
});
var ImageRadioGroup = Class.create({
	initialize: function (items, render_type){
		if (render_type=='table'){
			var table_div = new Element('div');
			var table_size = Math.floor(Math.sqrt(items.length)*-1)*-1;
			var table_tr_div = answer = null;
			var k = 0;
			for (i=1; i<=table_size; i++){
				table_tr_div = new Element('div', { className: 'tr_div' });
				for (g=1; g<=table_size; g++){
					if (k<=(items.length-1)){
						answer = items[k];
						var img = new Element('img', { src: answer.options.file_name, alt: '', title: '', width: answer.options.width, height: answer.options.height });
						var tick_img = new Element('img', { src: '/images/tick.png', alt: '', title: '', width: 16, height: 16, className: 'tick'});
						tick_img.hide();
						img.tick_img_id = tick_img.identify();
						img.observe('click',this.mouseClick.bindAsEventListener(this));
						table_tr_div.insert({ bottom: new Element('div', { className: 'td_div' }).insert(tick_img).insert(img)});
					}
					k++;
				}
				table_div.insert({ bottom: table_tr_div });
			}
			this.el_conteiner = table_div;
		}else {
			var el_conteiner = new Element('ul',{ className: 'image_radio' });
			items.each(function (answer){
				var img = new Element('img', { src: answer.options.file_name, alt: '', title: '', width: answer.options.width, height: answer.options.height });
				var tick_img = new Element('img', { src: '/images/tick.png', alt: '', title: '', width: 16, height: 16, className: 'tick'});
				tick_img.hide();
				img.tick_img_id = tick_img.identify();
				img.observe('click',this.mouseClick.bindAsEventListener(this));
				el_conteiner.insert({bottom: new Element('li').insert(tick_img).insert( img )});
			}, this);
			this.el_conteiner = el_conteiner;
		}
	},
	mouseClick: function(event){
		var img = Event.element(event);
		this.el_conteiner.select('img').each(function(el){
			if (el.hasClassName('tick')){
				el.hide();
			}else{
				el.removeClassName('selected');
			}
		});
		img.addClassName('selected');
		var img_position = img.positionedOffset();
		var img_dimensions = img.getDimensions();
		var tick_img = $(img.tick_img_id);
		tick_img.show();
		tick_img.style.top = img_position.top + (img_dimensions.height-16-7)+'px';
		tick_img.style.left = img_position.left + (img_dimensions.width-16-7)+'px';
	},
	hasValue: function(){
		var result = false;
		this.el_conteiner.select('img[class=selected]').each(function(){ result = true; });
		return result;
	},
	toElement: function(){
		return this.el_conteiner;
	}
});
var Textarea = Class.create({
	initialize: function (){
		var el_conteiner = new Element('div', { className: 'textarea' });
		var textarea_top_right = new Element('div', { className: 'top_right' });
		var textarea_bottom_right = new Element('div', { className: 'bottom_right' });
		var content = new Element('textarea', { cols: 1, rows: 1 });
		textarea_top_right.addClassName('textarea_top_right_button');
		textarea_bottom_right.addClassName('textarea_bottom_right_button');
		content.observe('keyup',this.keyUp.bindAsEventListener(this));
		content.observe('scroll',this.scrollEvent.bindAsEventListener(this));
		var textarea_scroll = new Element('div', { className: 'scroll', style: 'top: 22px; left: '+(450-20)+'px; display: none;' });
		el_conteiner.insert(textarea_scroll).insert(textarea_top_right).insert(textarea_bottom_right).insert( new Element('div', { className: 'textarea_top_side'}).insert(new Element('div', { className: 'right_side' })).insert( new Element('div', { className: 'left_side' }).insert(new Element('div', { className: 'textarea_bottom_side' }).insert(new Element('div', { className: 'top_left' }).insert(new Element('div', { className: 'bottom_left'}).insert(content))))));
		textarea_top_right.content_id = textarea_bottom_right.content_id = textarea_scroll.content_id = content.identify();
		this.content = content;
		new DraggableScroll(textarea_scroll, { elementHeight: 88, maxScrollTopPosition: 22 });
		this.textarea_scroll = textarea_scroll;
		this.el_conteiner = el_conteiner;
		document.observe('click', this.mouseClick.bindAsEventListener(this));
	},
	mouseClick: function (event){
		var el = Event.element(event);
		if (el.hasClassName('textarea_top_right_button')){
			$(el.content_id).scrollTop -= 12;
		}else if (el.hasClassName('textarea_bottom_right_button')){
			$(el.content_id).scrollTop += 12;
		}
	},
	scrollEvent: function(event){
		if (!this.textarea_scroll.is_drag){
			var el = Event.element(event);
			var delta = Math.round((el.scrollTop/(el.scrollHeight-el.clientHeight))*66);
			if (delta>=0&&delta<=66) this.textarea_scroll.style.top = (delta+22)+'px';
		}
	},
	keyUp: function(event){
		var el = Event.element(event);
		if (el.clientHeight < el.scrollHeight){
			this.textarea_scroll.show();
		}else{
			this.textarea_scroll.hide();
		}
	},
	hasValue: function(){
		return this.content.getValue()!='' ? true : false;
	},
	getValue: function(){
		return this.content.getValue();
	},
	clear: function(){
		return this.content.clear();
	},
	toElement: function(){
		return this.el_conteiner;
	}
});
function mouseWheelHandle(event){
	var delta = 0;
	if (!event) event = window.event;
	if (event.wheelDelta) {
		delta = event.wheelDelta/120;
	} else if (event.detail) {
		delta = -event.detail/3;
	}
	if (delta){
		var el = Event.element(event);
		if (el.hasClassName('select_tag_option')){
			Event.stop(event);
			delta = 20*delta;
			var options = el.up();
			options.scrollTop -=delta;
			$(options.scroll_id).style.top = Math.round((options.scrollTop/(options.options_count*20))*81)+'px';
		}
	}
}
if (window.addEventListener) window.addEventListener('DOMMouseScroll', mouseWheelHandle, false);
window.onmousewheel = document.onmousewheel = mouseWheelHandle;
var SelectTag = Class.create({
	initialize: function (items){
		this.options = Object.extend({
			default_value: 'Выберите ответ'
		}, arguments[1] || { });
		var options_tag_content = new Element('div',{ className: 'content', style: 'height: 140px;' });
		options_tag_content.options_count = items.size()-7;
		var select_tag_width = parseInt(this.options.default_value.length)+7;
		var use_selected_value = typeof this.options.selected == 'number';
		var selected_value = '';
		var i=0;
		items.each(function (answer){
			if (answer.options.file_name!=''){
				if ((parseInt(answer.text.length)+7)>select_tag_width) select_tag_width = (parseInt(answer.text.length)+7);
				var opt_val = new Element('p', { className: 'select_tag_option' }).insert(new Element('img', { src: answer.options.file_name, alt: '', title: '', width: answer.options.width, height: answer.options.height, style: 'margin-right: 10px;' })).insert(answer.text);
				if (use_selected_value&&i==this.options.selected) selected_value = opt_val.innerHTML;
				i++;
			}else{
				if (parseInt(answer.text.length)>select_tag_width) select_tag_width = parseInt(answer.text.length);
				var opt_val = new Element('p', { className: 'select_tag_option' }).insert(answer.text);
				selected_value = answer.text;
			}
			if (typeof answer.options.opt_value == 'string') opt_val.opt_value = answer.options.opt_value;
			opt_val.observe('click',this.changeValue.bindAsEventListener(this));
			options_tag_content.insert(opt_val);
		},this);
		select_tag_width *= 8;
		select_tag_width  = (select_tag_width>70 ? select_tag_width : 70);
		options_tag_content.style.width = select_tag_width +'px';
		var el_conteiner = new Element('div', { className: 'select_tag', style: 'width: '+select_tag_width+'px;'});
		var right_side = new Element('div', { className: 'right_side', style: 'width: '+select_tag_width+'px'});
		var tag_value = new Element('p', { className: 'value', style: 'width: '+(select_tag_width-30)+'px'}).update(use_selected_value ? selected_value : this.options.default_value);
		document.observe('click', this.mouseClick.bindAsEventListener(this));
		var options_tag = new Element('div', { className: 'select_tag_options', style: 'display: none; width: '+select_tag_width+'px; height: 145px;' });
		options_tag.select_tag_id = el_conteiner.identify();
		var options_tag_scroll = new Element('div', { className: 'scroll', style: 'top: 0px; left: '+(select_tag_width-20)+'px;' });
		options_tag_content.tag_value_id = tag_value.identify();
		options_tag_content.scroll_id = options_tag_scroll.identify();
		options_tag_scroll.content_id = options_tag_content.identify();
		new DraggableScroll(options_tag_scroll);
		items = $A(items);
		
		options_tag.insert(options_tag_scroll).insert(new Element('div', { className: 'left_side', style: 'width: '+select_tag_width+'px; height: 145px;' }).insert(new Element('div', { className: 'right_side', style: 'width: '+select_tag_width+'px; height: 145px;' }).insert(new Element('div', { className: 'select_bottom_side', style: 'width: '+select_tag_width+'px; height: 145px;' }).insert(new Element('div', { className: 'bottom_left', style: 'width: '+select_tag_width+'px; height: 145px;' }).insert(new Element('div', { className: 'bottom_right', style: 'width: '+select_tag_width+'px; height: 145px;' }).insert(options_tag_content))))));
		this.options_tag = options_tag;
		this.tag_value = tag_value;
		this.right_side = right_side; 
		this.options_tag_content = options_tag_content;
		this.el_conteiner = el_conteiner.insert(new Element('div',{ className: 'center_content', style: 'width: '+select_tag_width+'px'}).insert(new Element('div', { className: 'left_side', style: 'width: '+select_tag_width+'px'}).insert(right_side.insert(tag_value)))).insert({top: options_tag});
	},
	toElement: function(){
		return this.el_conteiner;
	},
	changeValue: function(event){
		var el = Event.element(event);
		$(el.up().tag_value_id).innerHTML = el.innerHTML;
		if(typeof this.options.onChange=='function')this.options.onChange(el.opt_value);
	},
	mouseClick: function (event){
		var el = Event.element(event);
		if (el.className=='scroll'){
		}else if (el.identify()== this.options_tag_content.identify()){
			this.options_tag_content.scrollTop +=20;
			$(this.options_tag_content.scroll_id).style.top = Math.round((this.options_tag_content.scrollTop/(this.options_tag_content.options_count*20))*81)+'px';
		}else if (el.identify()==this.right_side.identify()){
			if (this.el_conteiner.hasClassName('select_tag_open')){
				this.options_tag_content.scrollTop -=20;
				$(this.options_tag_content.scroll_id).style.top = Math.round((this.options_tag_content.scrollTop/(this.options_tag_content.options_count*20))*81)+'px';
			}else{
				new Effect.SlideDown(this.options_tag, { queue: { position: 'end', scope: 'select_tag', limit: 2 }, duration: 0.3, beforeStart: function(k) { $(k.element.select_tag_id).addClassName('select_tag_open'); } });
			}
		}else if (el.identify()==this.tag_value.identify()){
			if (this.el_conteiner.hasClassName('select_tag_open')){
				new Effect.SlideUp(this.options_tag, { queue: { position: 'end', scope: 'select_tag', limit: 2 }, duration: 0.3, afterFinish: function(k) { $(k.element.select_tag_id).removeClassName('select_tag_open'); } });
			}else{
				new Effect.SlideDown(this.options_tag, { queue: { position: 'end', scope: 'select_tag', limit: 2 }, duration: 0.3, beforeStart: function(k) { $(k.element.select_tag_id).addClassName('select_tag_open'); } });
			}
		}else if (this.el_conteiner.hasClassName('select_tag_open')){
			new Effect.SlideUp(this.options_tag, { queue: { position: 'end', scope: 'select_tag', limit: 2 }, duration: 0.3, afterFinish: function(k) { $(k.element.select_tag_id).removeClassName('select_tag_open'); }});
		}
	},
	hasValue: function(){
		return (this.tag_value.innerHTML!='Выберите ответ') ? true : false;
	}
});
var Checkbox = Class.create({
	initialize: function (items, required_number_of_answers){
		this.required_number_of_answers = required_number_of_answers;
		var el_conteiner = new Element('ul',{ className: 'check_box' });
		items.each(function (answer){
			var p_el = new Element('p').update('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+answer.text);
			p_el.observe('click',this.mouseClick.bindAsEventListener(this));
			el_conteiner.insert({bottom: new Element('li').insert(p_el)});
		}, this);
		this.el_conteiner = el_conteiner;
	},
	mouseClick: function(event){
		var item = Event.element(event);
		item.toggleClassName('selected');
	},
	hasValue: function(){
		var answers_count = false;
		this.el_conteiner.select('p[class=selected]').each(function(){ answers_count++; });
		return this.required_number_of_answers==answers_count ? true : false;
	},
	toElement: function(){ return this.el_conteiner; }
});
var RadioGroup = Class.create({
	initialize: function (items){
		var el_conteiner = new Element('ul',{ className: 'radio' });
		items.each(function (answer){
			var p_el = new Element('p').update('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+answer.text);
			p_el.observe('click',this.mouseClick.bindAsEventListener(this));
			el_conteiner.insert({bottom: new Element('li').insert(p_el)});
		}, this);
		this.el_conteiner = el_conteiner;
	},
	mouseClick: function(event){
		var item = Event.element(event);
		this.el_conteiner.select('p').invoke('removeClassName','selected');
		item.addClassName('selected');
	},
	hasValue: function(){
		var result = false;
		this.el_conteiner.select('p[class=selected]').each(function(el){ result = el.innerHTML; });
		return result;
	},
	toElement: function(){
		return this.el_conteiner;
	}
});
function setSelectAbility(){
	if ($('test_conteiner').select('div[class=select_tag]').size()>0){
		document.onselectstart = function() { return false; };
		document.unselectable = "on";
		document.body.style.MozUserSelect = "none";
		document.body.style.cursor = "default";
	}
}