/*
	abstract fancy inputa
*/

function fancyInput()
{	
	this.obj = new Object();
	this.data = new Object();
	this.options = new Array();
	
	this.getObjectData = function() 
	{
		var attributes = new Array('style','className','id','value','name','onclick','onchange','onmouseover','onmousemove','onmouseout','ondblclick','disabled');
		
		for(var i = 0; i < attributes.length; i++){
			if(not(this.data[attributes[i]])){
				if(!not(this.obj[attributes[i]])){					
					this.data[attributes[i]] = this.obj[attributes[i]];
				}
				else {
					this.data[attributes[i]] = null;
				}
			}
		}
		
	}
	
	this.cancelBubble = function(e)
	{
		if(!e){
			if(!not(window.event.cancelBubble))
				window.event.cancelBubble = true;
		}
		else {
			if(e.stopPropagation)
				e.stopPropagation();
		}
	}
	
	this.trigger = function(eventName,e)
	{
		eventName = 'on'+eventName;
		if(this.data[eventName]){
			var ret = this.data[eventName](e);
			if(ret != false){
				return true;
			}
			return false;
		}
		return true;
	}
	
	this.createInput = function(value)
	{
		var input = document.createElement('input');		
		input.type = 'hidden';
		
		if(this.obj && this.obj.name){
			input.name = this.obj.name;
		}
		else {
			input.name = '';
		}
		
		input.value = value;
		
		input.setValue = function(value)
		{
			this.value = value;
		}
		
		input.setName = function(name)
		{
			this.name = name;
		}
		
		input.clear = function()
		{
			this.value = '';
			this.name = '';
		}
		
		return input;
	}
	
	this.createPlainContainer = function(className)
	{
		var cont = document.createElement('div');
		setClass(cont,className);
		
		if(this.data && this.data.className){
			setClass(cont,this.data.className,true);
		}
		
		return cont;
	}
	
	this.createList = function(selected,form)
	{
		if(not(selected)){
			var selected = 0;
		}
		var list = document.createElement('div');
		list.className = 'list';
		list.fancy = this;
		list.container = false;
		
		if(form){
			list.form = form;
		}
		
		list.selected = selected;		
		list.highlight = selected;
		list.mouseover = false;
		
		list.visible = false;
		
		list.hide = function()
		{
			setStyle(this,'display','none');
			if(this.container){
				setStyle(this.container,'display','none');
			}
			
			this.visible = false;
			
			for(var i = 0; i < this.childNodes.length; i++){
				var item = this.childNodes.item(i);
				unsetClass(item,'hover');
			}
			
			removeListener(document,'click');
			if(this.fancy.onListHidden){
				this.fancy.onListHidden();
			}
		}
		
		list.show = function(obj,goFullScreen,noPosition)
		{
			if(not(obj) || obj == false){
				setStyle(this,'top',-1000,'px');
				setStyle(this,'left',-1000,'px');
			}
			else if(!noPosition) {
				var y = getAbsoluteTop(obj) + getRealHeight(obj);
				var x = getAbsoluteLeft(obj);
				setStyle(this,'top',y,'px');
				setStyle(this,'left',x,'px');
			}
			else {
				setStyle(this,'top',0,'px');
				setStyle(this,'left',0,'px');
			}
			
			if(goFullScreen && this.container){
				var ypx;
				if (document.height == undefined)
					ypx = document.body.offsetHeight;
				else
					ypx = document.height
				
				setStyle(this.container,'height',ypx,'px');
			}
			this.visible = true;
			
			setStyle(this,'display','block');
			if(this.container){
				setStyle(this.container,'display','block');
			}
			
			setClass(this.fancy.options[this.selected],'hover',true);
			this.highlight = this.selected;
			
			if(!not(obj) && obj != false){
				document.fancy = this.fancy;
				document.onclick = function(e) { this.fancy.hideLists(); }
				//addListener(window,'blur',function(e) {  this.document.fancy.hideLists(); });
				this.fancy.obj.onkeydown = function(e) { this.fancy.list.onkeydown(e); };
			}
			
			var fullSelectWidth = !not(this.fancy.data.width) ? this.fancy.data.width + (!not(this.fancy.data.buttonWidth) ? this.fancy.data.buttonWidth : 0) : 0;
			
			if(this.getWidth() <= fullSelectWidth){
					setStyle(this,'width',fullSelectWidth,'px');				
			}
			if(this.fancy.onListShown){
				this.fancy.onListShown();
			}
			
		}
		
		list.onkeydown = function(e)
		{			
			if(!e){
				var e = window.event;
			}
			if(!this.visible){
				return false;
			}

			if(not(this.fancy.options[this.highlight])){
				this.highlight = 0;
			}

			if(e.keyCode == 13 || e.keyCode == 35){
				if((this.fancy.options[this.highlight])){
					this.fancy.options[this.highlight].onclick(e);
					this.fancy.obj.changeName();
					return true;
				}
			}
			
			this.fancy.options[this.highlight].onmouseout();
			if(e.keyCode == 38){
				if(this.onhighlight){
					this.onhighlight();
				}
				//do gory
				if(this.highlight > 0){
					this.highlight -= 1;
				}
				else {
					this.highlight = this.fancy.options.length-1;
				}
			}
			if(e.keyCode == 40){
				if(this.onhighlight){
					this.onhighlight();
				}
				//na dol
				if(this.highlight+1 < this.fancy.options.length){
					this.highlight += 1;
				}
				else {
					this.highlight = 0;
				}
			}
			
			if(e.keyCode == 27){
				this.hide();
			}	
			
			this.fancy.options[this.highlight].onmouseover();
			
		}
		
		list.getWidth = function()
		{
			var v = this.visible;
			if(!v){
				this.show();
			}
			var w = getRealWidth(this.fancy.options[0]);
			if(!v){
				this.hide();
			}
			
			return w;
		}
		
		list.update = function(clear) 
		{
			var temp_options = new Array();
			if(not(clear)){
				var clear = true;
			}
			
			if(clear){
				this.clear();
			}

			var id = 0;
			for(var i=0; i<this.fancy.options.length; i++){
				var className = '';
				if(i == 0){
					className += 'first';
				}
				if(i == this.fancy.options.length-1){
					className += ' last';
				}
				
				var option = this.fancy.options[i];
				
				if(option instanceof listOptgroup){
					var optgroup_cont = this.fancy.createPlainContainer('optgroup_container');
					if(typeof option.label != 'undefined'){
						var item = this.parseItem(option.label,id,className);
						
						temp_options[id] = optgroup_cont.appendChild(item);
						id++;
					}
					
					var optgroup = this.fancy.createPlainContainer('optgroup');
					
					for(var j = 0; j < option.items.length; j++){
						var className = '';
						if(i == 0 && j == 0){
							className += 'first';
						}
						if(i == this.fancy.options.length-1 && j == option.items.length-1){
							className += ' last';
						}
						if(j == 0){
							className += ' optgroup_first';
						}
						if(j == option.items.length-1){
							className += ' optgroup_last';
						}
						
						var item = this.parseItem(option.items[j],id,className);
						temp_options[id] = optgroup.appendChild(item);
						
						if(this.fancy.data.itemSplit){
							optgroup.appendChild(document.createTextNode(' '));
						}
						id++;
					}
					
					optgroup_cont.appendChild(optgroup);
					list.appendChild(optgroup_cont);
					if(this.fancy.data.itemSplit){
						list.appendChild(document.createTextNode(' '));
					}
				}
				else{
					var item = this.parseItem(option,id,className);
					
					temp_options[id] = list.appendChild(item);
					if(this.fancy.data.itemSplit){
						list.appendChild(document.createTextNode(' '));
					}
					id++;
				}
			}
			
			this.fancy.options = temp_options;
		}
		
		list.parseItem = function(option,value,className)
		{
			var item = document.createElement('div');
			item.fancy = this.fancy;
			item.value = value; //i
			item.inputValue = option.value;
			item.label = option.label;
			setStyle(item,'position','relative');
			setClass(item,'option');
			
			if(option.selected){
				this.fancy.selected = value;
			}
			
			item.enabled = !option.disabled;
			item.type = option.type;
			

			
			if(!item.enabled && item.type != 'optgroup'){
				setClass(item,'disabled',true)
			}
			
			if(option.className){
				setClass(item,option.className,true);
			}
			
			setClass(item,className,true);
			
			if(navigator.userAgent.indexOf('MSIE') != -1)
				item.onselectstart = new Function('return false;');
    		else 
	        	item.onmousedown = function() { return false; };
			
			item.onmouseover = function() {
				if(!not(this.fancy.options[this.fancy.list.selected])){
					unsetClass(this.fancy.options[this.fancy.list.selected],'hover');
				}
				if(!not(this.fancy.options[this.fancy.list.highlight])){
					unsetClass(this.fancy.options[this.fancy.list.highlight],'hover');
				}
				
				if(this.enabled){
					setClass(this,'hover',true);
					this.fancy.list.highlight = this.value;
				}
			};
			
			item.onmouseout = function() {
				unsetClass(this,'hover');
			};
						
			item.onclick = function(e) {
				window.status = 'click | '+e+' | '+ this.value +' | '+this.enabled;
				this.fancy.cancelBubble(e);
				if(this.enabled){
					this.fancy.select(this.value);
				}
			};
			
			item.innerHTML = option.label;
			
			if(this.fancy.data.itemNoWrap){
				item.innerHTML = item.innerHTML.replace(/ /g,'&nbsp;');
			}
			
			return item;
		}
		
		list.clear = function()
		{			
			this.hide();
			while(this.childNodes.length > 0){
				this.removeChild(this.childNodes[0]);
			}
		}
		
		if(not(list.fancy.data.width) || !list.fancy.data.width){
			setStyle(list,'cssFloat','left');
		}
		
		setStyle(list,'cursor','default');
		if(not(list.fancy.data.list_container) || !list.fancy.data.list_container){
			setStyle(list,'position','absolute');
		}
		
		if(list.fancy.data.list_width){
			if(parseInt(list.fancy.data.list_width) == list.fancy.data.list_width){
				list.fancy.data.list_width+='px';
			}
			setStyle(list,'width',list.fancy.data.list_width);
		}
		
		setStyle(list,'display','none');
		
		if(this.options.length > 0)
			list.update(false);
		
		return list;
	}
	
	this.hideLists = function()
	{
		for(var i = 0; i<document.fancyLists.length; i++){
			if(document.fancyLists[i].visible){
				document.fancyLists[i].hide();
			}
		}
	}
	
	this.getForm = function(obj)
	{
		return getParentElement(obj,'form');
	}
	
	this.getLabel = function()
	{
		var l = false;
		if(l = getParentElement(this.obj,'label')){
			this.data.labelNested = true;
			return l;
		}
		else if(this.data.id){
			var labels = document.getElementsByTagName('label');
			for(var i = 0; i<labels.length; i++){
				var item = labels.item(i);

				if(item.htmlFor == this.data.id){
					this.data.labelNested = false;
					return item;
				}
			}
		}
		
		return false;
	}
	
	listOptgroup = function()
	{
		var className = '';
		var label = new Object();
		var items = new Array();
	}
}

function fancySelect(obj,dataIn)
{
	this.obj = obj;
	this.selected = 0;
	this.options = new Array();
	this.active = false;
	this.data = new Object();
	if(typeof dataIn == 'object'){
		this.data = dataIn;
	}
	
	this.createContainer = function()
	{
		var cont = this.createPlainContainer('fancySelect');
		
		if(this.data.id){
			cont.id = this.data.id;
		}
		
		if(this.data.disabled){
			setClass(cont,'disabled',true);
		}
		
		cont.fancy = this;
		
		this.label = cont.appendChild(this.createLabel());
		this.button = cont.appendChild(this.createButton());

		this.list = this.createList(this.selected);

		if(!obtainClass(this.obj,'noclear')){
			var clear = document.createElement('br');
			clear.style.clear = 'both';
			cont.appendChild(clear);
		}
		
		return cont;
	}
	
	this.createLabel = function()
	{
		var label = document.createElement('div');
		label.className = 'label';
		
		label.fancy = this;
		
		setStyle(label,'cssFloat','left');
		setStyle(label,'cursor','default');
		if(this.data.height)
			setStyle(label,'height',this.data.height,'px');
		setStyle(label,'overflow','hidden');

		//wylaczam zaznaczanie, kopia from MiLka
		if(navigator.userAgent.indexOf('MSIE') != -1)
			label.onselectstart = new Function('return false;');
        else 
        	label.onmousedown = function() { return false; };
		
		
		if(this.data.width){
			setStyle(label,'width',this.data.width,'px');
		}
		
		label.setLabel = function(text)
		{
			if(navigator.userAgent.indexOf('MSIE') != -1){
				this.innerText = text;
			}
			else {
				this.innerHTML = text;
			}
			this.parentNode.value = text;
		}
		
		label.update = function()
		{
			if(not(this.fancy.data.width)){
				setStyle(this,'width',this.fancy.list.getWidth(),'px');
			}
			this.parentNode.value = this.fancy.options[this.fancy.selected].inputValue;
		}
		
		label.onclick = function(e)
		{
			if(!this.fancy.trigger('click')){
				return false;
			}

			if(!this.fancy.data.disabled)
				this.fancy.openList(e);
		}
		
		label.onmouseover = function(e)
		{
			this.fancy.trigger('mouseover',e);
		}
		
		label.onmousemove = function(e)
		{
			this.fancy.trigger('mousemove',e);
		}
		
		label.ondblclick = function(e)
		{
			this.fancy.trigger('dblclick',e);
		}
		
		return label;
	}
	
	this.createButton = function()
	{
		var button = document.createElement('div');
		button.className = 'button';
		
		setStyle(button,'cssFloat','left');
		setStyle(button,'cursor','default');
		if(this.data.height)
			setStyle(button,'height',this.data.height,'px');
		
		button.fancy = this;
		
		
		button.onclick = function(e)
		{
			if(!this.fancy.trigger('click')){
				return false;
			}
	
			if(!this.fancy.data.disabled)
				this.fancy.openList(e);
		}
		
		button.onmouseover = function(e)
		{
			this.fancy.trigger('mouseover',e);
		}
		
		button.onmousemove = function(e)
		{
			this.fancy.trigger('mousemove',e);
		}
		
		button.ondblclick = function(e)
		{
			this.fancy.trigger('dblclick',e);
		}
		
		return button;
	}
	
	this.openList = function(e,vis)
	{
		this.cancelBubble(e);
		
		if(not(vis)){
			var vis = !this.list.visible;
		}
		
		this.hideLists();
		
		if(vis) {
			this.list.show(this.label,this.data.list_goFullScreen,this.data.list_noPosition);
		}
	}
	
	this.onListShown = function()
	{
		setClass(this.button,'active',true);
		setClass(this.label,'activel',true);
		
		if(!not(this.data.fixParent) && this.data.fixParent){
			setClass(this.container.parentNode,'active',true);
		}
	}
	
	this.onListHidden = function()
	{
		unsetClass(this.button,'active');
		unsetClass(this.label,'activel');
		
		if(!not(this.data.fixParent) && this.data.fixParent){
			unsetClass(this.container.parentNode,'active');
		}
	}
	
	//wyciagam wszystkie mozliwe opcje z selecta
	this.parseOptions = function(node)
	{
		var temp_options = new Array();
		for(var i = 0; i<node.childNodes.length; i++){
			var item = node.childNodes.item(i);
			if(item.nodeName.toUpperCase() == 'OPTION'){
				item.label = item.innerHTML;
				count = temp_options.push(item);
			}
			else if(item.nodeName.toUpperCase() == 'OPTGROUP'){
				count = temp_options.push(this.parseOptgroup(item));
			}
		}
		
		return temp_options;
	}
	
	this.parseOptgroup = function(group)
	{
		var temp_optgroup = new listOptgroup();
		
		if(group.label){
			var item = new Object();
			item.disabled = true;
			item.type = 'optgroup';
			item.label = group.label;
			item.className = 'optgroup_label';
			if(group.className){
				item.className += group.className;
			}
			this.options.push(item);
			
			temp_optgroup.label = item;
		}
		
		setClass(temp_optgroup,'optgroup');
		temp_optgroup.className = 'optgroup';
		if(group.className){
			setClass(temp_optgroup,group.className,true);
		}
		
		temp_optgroup.items = this.parseOptions(group);
		
		return temp_optgroup;
		
	}
	
	this.select = function(id) 
	{
		this.selected = id;
		this.list.selected = id;
		this.label.setLabel(this.options[this.selected].label);
		this.input.setValue(this.options[this.selected].inputValue);
		this.value = this.options[this.selected].inputValue;
		this.data.value = this.value;
		this.list.hide();
		
		this.label.parentNode.value = this.options[this.selected].inputValue;
		this.trigger('change');
	}
	
	this.onload = function() 
	{
		var cont = false;
		//jesli kontener listy ma id
		if(this.data.list_container_id) {
			cont = $(this.data.list_container_id);
		}
		
		if(!cont){
			cont = this.createPlainContainer();
			if(this.data.list_container_id) {
				cont.id = this.data.list_container_id;
			}
		}
		
		setClass(cont,'fancySelect',true);
		if(this.data.list_container_class){
			setClass(cont,this.data.list_container_class,true);
		}
		
		if(this.data.id && !cont.id){
			cont.id = this.data.id;
		}
		
		
		
		this.list = cont.appendChild(this.list);
		this.list.container = cont;
		
		document.body.appendChild(cont);
		document.fancyLists.push(this.list);
		this.label.setLabel(this.options[this.selected].label);
		this.label.update();
	}
	
	this.init = function()
	{	
		document.fancyLists = new Array();
		
		this.getObjectData();
		
		this.options = this.parseOptions(this.obj);
		
		var container = this.createContainer();			
		
		this.input = this.createInput(this.options[this.selected].inputValue);
		
		this.container = obj.parentNode.insertBefore(container,obj);

		this.input = obj.parentNode.insertBefore(this.input,container);
		
		obj.parentNode.removeChild(obj);

		addListener(window,'load',function() { container.fancy.onload(); });
	}	
	this.init();
}
fancySelect.prototype = new fancyInput;

function fancySelectInitAll(data)
{	
	var selecty = document.getElementsByTagName('select');
	
	if(typeof data != 'object'){
		var data = new Object();
	}
	
	while(!not(selecty[0])){
		var fs = new fancySelect(selecty[0],data.clone());	
	}
	return true;
}

//jak jest wiele elementow do pokazania to parametr moze byc tablica obiektow, jak jeden wystarczy pojedynczy obiekt z element i className
function showFixElements(elements)
{	
	//javascriptowy namespace
	this.showElement = function(element)
	{
		var objcts = document.getElementsByTagName(element.element);
			
		for(var j = 0; j < objcts.length; j++)
		{
			if(obtainClass(objcts[j],element.className)){
				setStyle(objcts[j],'display','block');
			}
		}
	}

	if(typeof elements.length != 'undefined'){
		for(var i = 0; i < elements.length; i++){
			this.showElement(elements[i]);
		}
	}
	else {
		this.showElement(elements);
	}
}


/**
 * Zamienia text input na textinput z podpowiedziami wysyłanymi za pomocą ajaxa
 * 
 * @param {Object} obj textinput
 * @param {Object} url url zapytania ajax
 * @param {Object} min_length minimalna długość, do której zapytanie nie będzie wykonywane (domyślnie 3)
 */
var fancyTimeout = null;
function fancyTextInput(obj, url, data, min_length)
{
	this.obj = obj;
	this.url = url;
	this.data = new Object();
	if(typeof data == 'object'){
		this.data = data;
	}
		
	if(not(min_length)) 
		var min_length=3;

	this.min_length=min_length;
	this.last_search = '';
	this.timeout = false;
	this.request_timeout = 1000; //opóźnienie
	
	
	this.do_request = function()
	{
		advAJAX.get({
				url: this.url,
				query: this.last_search,
				onSuccess : function(obj) {
					var response = eval('(' + obj.responseText + ')'); 
					if(response.query==this.fancy.last_search){
						this.fancy.updateList(response);
					} 
				},
    			onError : function(obj) {  }
			})
	}
	
	this.onblur = function(e)
	{
		clearTimeout(this.timeout);
		if(navigator.userAgent.indexOf('MSIE') == -1){
			if(this.list.visible){
				this.list.hide();
			}
		}
	}
	
	this.onkeyup = function(e)
	{
		if(!e){
			var e = window.event;
		}
		
		var currentValue = '';
		
		if(e.originalTarget){
			currentValue = e.originalTarget.value;
		}
		else if (e.srcElement) {
			currentValue = e.srcElement.value;
		}
		
		
		this.input.value = currentValue;
		if(currentValue == this.last_search){
			return true;
		}
		
		this.last_search = currentValue;
		if(this.timeout)
			clearTimeout(this.timeout); 
		
		window.fancy = this;
		
		if(this.last_search.length >= this.min_length){
			this.timeout = setTimeout("this.fancy.do_request()", this.request_timeout);
		}
		else {
			if(this.list.visible){
				this.list.hide();
			}
		}
	}
	
	this.onload = function() 
	{
		var cont = this.createPlainContainer('fancyTextInput');
		this.list = cont.appendChild(this.list);
		document.body.appendChild(cont);
		document.fancyLists.push(this.list);
	}
	
	this.updateList = function(options)
	{
		this.options = new Array();

		if(options.data.length == 0){
			this.list.clear();
			this.list.hide();
			return false;
		}
		
		for(var i = 0; i<options.data.length; i++){
			this.options.push({'label':options.data[i],'value':i});
		}
		
		this.list.update();
		this.list.show(this.obj);
	}
	
	this.select = function(id)
	{
		this.last_search = this.options[id].label;
		this.obj.value = this.options[id].label;
		this.input.value = this.options[id].label;
		this.list.hide();
		fancyTimeout = setTimeout("this.fancy.onclosed()", 5);
	}
	
	this.onclosed = function()
	{
		this.form.onsubmit = null; 
		this.obj.focus(); 
		this.obj.changeName()
	}
	
	this.setup = function()
	{
		if(!this.data.width){
			this.data.width = getRealWidth(this.obj);
		}
	}
	
	this.init = function()
	{
		this.getObjectData();
		document.fancyLists = new Array();
		this.obj.fancy = this;
		
		this.setup();
		
		this.obj.onkeyup = function(e){ this.fancy.onkeyup(e); }
		this.obj.onblur = function(e){ this.fancy.onblur(e); }
		
		this.form = this.getForm(this.obj);
		
		this.list = this.createList();
		this.list.onhighlight = function() { this.fancy.form.onsubmit = function() { return false; }; } 
		
		this.input = this.createInput(this.obj.value);
		this.input = this.obj.parentNode.insertBefore(this.input,this.obj);
		
		this.obj.changeName = function()
		{
			var d = new Date();
			this.name = "__r"+d.getTime()+Math.ceil(Math.random()*10000);
		}
		this.obj.changeName();
		
		addListener(window,'load',function() { obj.fancy.onload(); });
		
		this.last_search = this.obj.value;
	}
	this.init();
}
fancyTextInput.prototype = new fancyInput;

/**
 * Zamienia zwyklego checkboxa na obrazkowego
 * 
 * @param {Object} obj chkbox
 */
function fancyChkbox(obj,data)
{
	this.obj = obj;
	
	this.data = new Object();
	if(typeof data == 'object'){
		this.data = data;
	}
		
	this.createContainer = function(className)
	{
		var cont = this.createPlainContainer(className);
		
		if(this.data.id){
			cont.id = this.data.id;
		}
		
		this.checkbox = this.createCheckbox()		
		
		this.checkbox = cont.appendChild(this.checkbox);
		
		if(this.label)
			this.label = cont.appendChild(this.label);
		
		if(!obtainClass(this.obj,'noclear') && (not(this.data.noFloat) && !this.data.noFloat)){
			var clear = document.createElement('br');
			clear.style.clear = 'both';
			cont.appendChild(clear);
		}

		return cont;
	}
	
	this.createCheckbox = function()
	{
		var checkbox = document.createElement('div');
		
		checkbox.fancy = this;		
		
		checkbox.check = function(checked)
		{
			this.fancy.trigger('click');
			if(not(checked)){
				this.fancy.checked = !this.fancy.checked;				
			}
			else {
				this.fancy.checked = checked;
			}
			
			this.fancy.trigger('checked');
			
			if(this.fancy.checked)
				setClass(this.fancy.container,'checked',true);
			else
				unsetClass(this.fancy.container,'checked');
		
			this.fancy.update();
			
			this.fancy.trigger('change');
		}
		
		checkbox.onclick = function() {
			this.check();
		}
		
		setClass(checkbox,'input');
		
		if(not(this.data.noFloat) || !this.data.noFloat){
			setStyle(checkbox,'cssFloat','left');
		}
		
		return checkbox;
	}
	
	this.update = function()
	{
		this.input.value = this.data.value;
		if(this.checked){
			this.input.name = this.data.name;
			setClass(this.container,'checked',true);
		}
		else {
			this.input.name = '';
			unsetClass(this.container,'checked');
		}
	}
	
	this.createLabel = function(label)
	{
		var temp = document.createElement('div');
		
		temp.fancy = this;
		
		setClass(temp,'label');
		
		if(not(this.data.noFloat) || !this.data.noFloat){
			setStyle(temp,'cssFloat','left');
		}
		
		temp.innerHTML = label.innerHTML;
		
		temp.onclick = function() {
			this.fancy.check();
		}
		
		return temp;
	}
	
	this.check = function(checked)
	{
		this.checkbox.check(checked);
	}
	
	this.init = function()
	{
		this.getObjectData();
		
		var label = this.getLabel();
		
		if(label){
			this.label = this.createLabel(label);
		}
		
		if(not(this.obj.checked) || this.obj.checked == ''){
			this.checked = false;
		}
		else {
			this.checked = true;
		}
		
		this.container = this.createContainer('fancyChkbox');
		
		this.input = this.createInput(this.data.value);
		this.input = this.obj.parentNode.insertBefore(this.input,this.obj);
		this.update();
		
		this.container = this.obj.parentNode.insertBefore(this.container,this.obj);
		this.obj.parentNode.removeChild(this.obj);
		if(label)
			label.parentNode.removeChild(label);
	}
	
	this.init();
}
fancyChkbox.prototype = new fancyInput;

function fancyChkboxInitAll(data)
{
	if(!data){
		var data = new Object();
	}
	var elements = document.getElementsByTagName('input');
	for(var i = 0; i < elements.length; i++){
		if(elements[i].type == 'checkbox'){
			new fancyChkbox(elements[i],data.clone());
		}
	}
}

/**
 * Zaznacza lub oznacza wszystkie chboxy
 * @param {Object} name nazwa chboxów do zaznaczenia
 */
function selectAllChkBox(name){
	var divs = document.getElementsByTagName('div');
	var to_select_divs = new Array();
	var zaznaczonych = 0;
	var odznaczonych = 0;
	
	for(var i=0; i<divs.length; i++)
		if(obtainClass(divs[i],'input') && divs[i].fancy.obj.name==name){
			to_select_divs.push(divs[i]);
			if(divs[i].fancy.checked) zaznaczonych++
			else odznaczonych++
			ggg = divs[i];
		}
	for(var i=0;i<to_select_divs.length;i++){
		to_select_divs[i].check(zaznaczonych<odznaczonych);
	}
}

function fancyRadioGroup(obj,data)
{
	this.obj = obj;
	this.selected = null;
	
	this.radios = new Array();
	
	
	this.data = new Object();
	if(typeof data == 'object'){
		this.data = data;
	}
	
	this.getRadios = function()
	{
		var elements = document.getElementsByTagName('input');
		var c = 0;
		for(var i = 0; i < elements.length; i++){
			if(elements[i].type == 'radio' && elements[i].name == this.data.name){
				this.radios.push(elements[i]);
				c++;
			}
		}
		return c;
	}
	
	fancyRadioGroup.fancyRadio = function(obj,data)
	{
		this.obj = obj;
		this.label = false;
		this.data = new Object();
		if(data){
			this.data = data;
		}
		this.checked = false;
		
		this.createButton = function()
		{
			var button = document.createElement('div');
			
			button.radio = this;
			
			button.onclick = function(e)
			{
				if(this.radio.onclick){
					this.radio.onclick(e);
				}
			}
			
			setClass(button,'input');
			setStyle(button,'cssFloat','left');
			
			return button;
		}
		
		this.createLabel = function(label)
		{
			var temp = document.createElement('div');
			
			temp.radio = this;
			
			setClass(temp,'label');
			
			setStyle(temp,'cssFloat','left');
			
			temp.innerHTML = label.innerHTML.replace(/(<([^>]+)>)/ig,"");
			
			temp.onclick = function(e) {
				if(this.radio.onclick){
					this.radio.onclick(e);
				}
			}
			
			return temp;
		}
		
		this.createContainer = function(className)
		{
			var cont = this.createPlainContainer(className);
			
			if(this.data.id){
				cont.id = this.data.id;
			}
			
			this.button = this.createButton()		
			
			this.button = cont.appendChild(this.button);
			if(this.label)
				this.label = cont.appendChild(this.label);
			
			if(!obtainClass(this.obj,'noclear')){		
				var clear = document.createElement('br');
				clear.style.clear = 'both';
				cont.appendChild(clear);
			}
		
			return cont;
		}
		
		this.onclick = function(e)
		{
			if(this.fancy.selected != this){
				this.fancy.select(this);				
				this.fancy.update();
			}
		}
		
		this.getHTMLObject = function()
		{
			return this.HTMLObject;
		}
		
		this.check = function(checked)
		{
			if(not(checked) == 'undefined'){
				var checked = !this.checked;
			}
			
			if(checked){
				setClass(this.container,'active',true);
			}
			else {
				unsetClass(this.container,'active');
			}
		}
		
		this.init = function()
		{
			this.getObjectData();
			
			if(this.obj.checked){
				this.checked = true;
			}
			
			var label = this.getLabel();
			
			if(label){
				this.label = this.createLabel(label);
			}
			
			var container = this.createContainer('fancyRadio');
			
			if(label){
				this.container = label.parentNode.insertBefore(container,label);
				label.parentNode.removeChild(label);
			}
			else{
				this.container = this.obj.parentNode.insertBefore(container,this.obj);
			}
			
			this.obj.parentNode.removeChild(this.obj);
		}
		
		this.init();
	}
	fancyRadioGroup.fancyRadio.prototype = new fancyInput;
	
	this.createRadios = function()
	{
		for(var i = 0; i < this.radios.length; i++){
			this.radios[i] = new fancyRadioGroup.fancyRadio(this.radios[i]);
			this.radios[i].fancy = this;
		}
	}
	
	this.parseRadios = function()
	{
		for(var i = 0; i < this.radios.length; i++){
			if(this.radios[i].obj.checked){
				this.selected = this.radios[i];
				this.selected.checked = true;
				this.selected.check(true);
			}
		}
	}	
	
	this.select = function(element)
	{
		if(this.selected == element){
			return true;
		}
		
		if(this.selected){
			this.selected.check(false);
		}
		
		this.selected = element;
		this.selected.check(true);
	}
	
	this.update = function()
	{
		this.input.clear();
		if(this.selected){			
			this.input.setValue(this.selected.obj.value);
			this.input.setName(this.selected.obj.name);
		}
		
	}
	
	this.init = function()
	{
		this.getObjectData();

		if(!this.getRadios()){
			return false;
		}
		
		this.input = this.createInput(this.data.value);
		
		this.createRadios();
		
		this.input = this.radios[0].container.parentNode.insertBefore(this.input,this.radios[0].container);
		
		this.parseRadios();
		
		this.update();
	}
	
	this.init();
}
fancyRadioGroup.prototype = new fancyInput;

function fancyRadioInitAll(data)
{
	if(!data){
		var data = new Object();
	}
	
	var loop = false;
	
	do { 
		loop = false;
		var elements = document.getElementsByTagName('input');
		for(var i = 0; i < elements.length; i++){
			if(elements[i].type == 'radio'){
				loop = true;
				new fancyRadioGroup(elements[i],data.clone());
				break;
			}
		}
	}while(loop);
}