function formular(parentObj,idForm,fields,empty,mandatory,modul)
{
	// create field ids		
	if (!fields){ 
		var amount = parseInt(labels[idForm+'_fields']); if (!amount) amount = 1;
		fields = new Array(amount); 
		for (var i=0;i<amount;i++) fields[i] = idForm+i; 
	} 
	else var amount = fields.length;
	
	// start
	if (!mandatory)	mandatory = labels.mandatory.split(',');
	var form = createContainer(parentObj,idForm,'form');
	if (labels[idForm+'Title']){ createText(form,idForm+'Title','header'); createBreak(form,2); }
	if (labels[idForm+'Subtitle']){ createText(form,idForm+'Subtitle','bold'); createBreak(form); } 
	if (mandatory){ createText(form,'mandatory_txt'); createBreak(form); } 
	if (window.formAmount) formAmount(form,idForm,amount); // admin
	createBreak(form,2);
	
	$.each(fields,function(id,value){   
		
		// break
		if (value == 'break'){ createBreak(form); return; }
		
		// empty fields or filled with values
		if (empty){ id = value; value = false; }		
		var type = labels[id+'_type'];

		// mandatory
		var optional = true;
		if (array_search(id,mandatory)) optional = false;
		if (substring2(labels[id+'_txt'],-1) == '*'){ optional = false; labels[id+'_txt'] = substring2(labels[id+'_txt'],0,-1)}

		if (type == 'textarea'){
			createText(form,id+'_txt','label');
			createTextarea(form,id,'input',value); 
			createBreak(form); 
		}
		else if (type == 'selection'){
			var texts = labels[id+'_fields'].split(',');
			createSelection(form,id,texts,value,optional);
			createBreak(form); 
		} 
		else if (type == 'selectbox'){
			var texts = labels[id+'_fields'].split(',');
			createSelectbox(form,id,texts,value,optional);
			createBreak(form); 
		} 
		else if (type == 'bool'){
			var texts = labels['bool_fields'].split(',');
			createSelection(form,id,texts,value,optional);
			createBreak(form); 
		} 
		else if (type == 'checkboxes'){
			createBreak(form,2);
			var texts = labels[id+'_fields'].split(',');
			createCheckboxes(form,id,texts,value);
		} 
		else if (type == 'checkbox'){
			createBreak(form);
			createCheckbox2(form,id,optional,'',labels[id+'_checked']);
		} 
		else if (type == 'image'){
			createImageUpload(form,id);
		}
		else if (type == 'mail'){
			createTextfield(form,id,'input',value,type,optional);
			if (labels[id+'2']) createTextfield(form,id+'2','input',value,type,'second');
		} 
		else if (type == 'password'){
			value = '';
			createTextfield(form,id,'input',value,type,optional);
			createTextfield(form,id+'2','input',value,type,'second');
		}
		else if (type == 'header'){
			createText(form,id+'_txt','header2');
			createBreak(form);
		} 
		else createTextfield(form,id,'input',value,type,optional);
		
		// admin
		if (window.contextForm){
			if ($('#'+id)[0]) $('#'+id)[0].oncontextmenu = contextForm;
			else if (type == 'checkboxes') for (var i=0; i<texts.length; i++) $('#'+id+i)[0].oncontextmenu = contextForm;
			
		} 		
	});
	createBreak(form);
	if (labels[idForm+'_modul']) modul = labels[idForm+'_modul'];
	if (modul){
		createInput(form,'id','',idForm,'hidden');
		createSubmit(form,idForm+'Submit','submit',Array(idForm,modul));
	} 
	else createSubmit(form,idForm+'Submit','submit');
	if (parentObj) align(form);
	
	return form;
}
function attributes(element,id,className,evtFunction,evtType,evtParam)
{
	if (evtFunction){
		if (isArray(evtFunction)){
			for (var i=0; i<evtType.length; i++){
				if (!evtType[i]) continue;	
				if (evtParam && evtParam[evtFunction[i]]) eventBind(element,evtFunction[i],evtType[i],evtParam[evtFunction[i]]);
				else eventBind(element,evtFunction[i],evtType[i]);
			} 
		} 
		else if (evtType) eventBind(element,evtFunction,evtType,evtParam);
		else eventBind(element,evtFunction,'click',evtParam);
	}
	if (id) element.id = id;
	if (className) element.className = className;
}
function eventBind(element,evtFunction,evtType,evtParam)
{
	if (evtType == 'enter'){
		var enter = true;
		evtType = 'keypress';
	} 

	$(element).bind(evtType, function(event){   
		element = this;
		if (enter && event.keyCode != '13') return;
		//if (isArray(evtFunction)) for (var i=0; i<evtFunction.length; i++) window[evtFunction[i]](element,evtParam); // more functions on the same event	
		window[evtFunction](element,evtParam);		
	});
}
function createBreak(parentObj,number)
{
	if (!number) number = 1;
	
	for (var i=0; i<number; i++) {
		
		var element = document.createElement('BR');
		element.className = 'break';
		if (parentObj) parentObj.appendChild(element);	
	};
}
function createDoubleBreak(parentObj)
{
	createBreak(parentObj);
	createBreak(parentObj);
}
//function createBox(parentObj,id,className,title)
//{
//	createContainer(parentObj,'',className+'Top'); 
//	var cont = createContainer(parentObj,id,className); 
//	createContainer(parentObj,'',className+'Bottom');
//	return cont;
//}
function createBox(parentObj,id,className,title,link)
{
	// already there
	if (id != '') var cont = obj(id); 
	if (cont){ removeChildren(cont); return cont; } 
	
	// to create
	if (title){
		var top = createContainer(parentObj,'',className+'TopTitled');
		if (link) createLink(top,'','link',title,link);
		else createText(top,'','',title);
	} 
	else createContainer(parentObj,'',className+'Top'); 
	var cont = createContainer(parentObj,id,className); 
	createContainer(parentObj,'',className+'Bottom');
	return cont;
}
function createText(parentObj,id,className,value,evtFunction,evtType,evtParam)
{
	var element = document.createElement('SPAN');
	if (value) element.innerHTML = value;
	else if (labels[id]) element.innerHTML = labels[id];
	else element.innerHTML = id;
	if (parentObj) parentObj.appendChild(element);
	attributes(element,id,className,evtFunction,evtType,evtParam);
	if (!value && window.labelChange) element.oncontextmenu = labelChange; // label editing	
	return element;
}
function createLink(parentObj,id,className,value,evtFunction,evtParam)
{
	var element = createText(parentObj,id,className,value,Array(evtFunction,'evtOver','evtOut'),Array('click','mouseover','mouseout'),object(evtFunction,evtParam));
	return element;
}
function createSubmit(parentObj,id,className,evtParam)
{
	if (labels[id]) var label = decodeAscii(labels[id]);
	else var label = decodeAscii(labels[className]);
	var element = createInput(parentObj,id,className,label,'submit','submitForm','click',evtParam);
	align(element);
	return element;
}
function createContainer(parentObj,id,className,hidden,evtFunction,evtType,evtParam)
{
	var element = document.createElement('DIV');
//	if (hidden) element.style.display = 'none';
	element.style.display = 'none';
	if (parentObj) parentObj.appendChild(element);
	if (!hidden) $(element).fadeIn('slow');
	attributes(element,id,className,evtFunction,evtType,evtParam);		
	return element;
}
function createImage(parentObj,id,className,address,evtFunction,evtType,evtParam)
{
	var element = document.createElement('IMG');
	element.src = address;
	//element.alt = address;
	if (parentObj) parentObj.appendChild(element);
	attributes(element,id,className,evtFunction,evtType,evtParam);
	return element;
}
function createImagePopup(parentObj,id,className,address,addressBig,text,evtFunction,evtType,evtParam)
{
	var element = document.createElement('A');
	element.href = addressBig;
	element.rel = className;
	if (text) element.title = text;
	var image = createImage(element,id,className,address,evtFunction,evtType,evtParam);
	parentObj.appendChild(element);
	attributes(element,'','thickbox');
	tb_init(element);
	return image;
}
function createButton(parentObj,id,className,address,evtFunction,evtParam)
{
	createImage(parentObj,id,className,address,Array(evtFunction,'infoTip','infoTipDelete'),Array('click','mouseover','mouseout'),object(evtFunction,evtParam));
}
function createInput(parentObj,id,className,value,type,evtFunction,evtType,evtParam)
{
	if ($.browser.msie) var element = document.createElement('<input name="">'); // IE bug
	else var element = document.createElement('INPUT');
	if (type) element.type = type;
	else element.type = 'text';	
	if (value){
		if (type == 'checkbox' && value == 'x') element.checked = true;
		else element.value = value;
	} 
	if (parentObj) parentObj.appendChild(element);
	attributes(element,id,className,evtFunction,evtType,evtParam);
	return element;
}
function createTextfieldNormal(parentObj,id,className,value,checkType,optional,evtEnter,evtParam)
{
	if (!className) className = 'input';
	if (!checkType) checkType = 'text';
	if (checkType == 'password') type = checkType;
	else type = 'text';
	
	var evtFunction = Array();
	var evtType = Array();
	
	// check input except when read only or false
	if (checkType && checkType != 'read'){
		evtFunction.push('checkElement');
		evtType.push('blur');
	}
	// enter event
	if (evtEnter){
		evtFunction.push(evtEnter);
		evtType.push('enter');
	}	
	// width
	var className2 = className.split('_');
	if (className2.length > 1){
		className = className2[0];
		var width = className2[1];
	}

	var element = createInput(parentObj,id,className,value,type,evtFunction,evtType,object('checkElement',Array(checkType,optional),evtEnter,evtParam));
	if (width) element.style.width = width;
	if (checkType == 'read') element.readOnly = true; // read only		
//	if (optional == 'second') createText(parentObj,id+'_error','error',labels.error.second); // second
//	createText(parentObj,id+'_error','error',labels.error[checkType]); // error
	
	// error
	var error = labels.error[checkType];	
	if (error && (!optional || optional == 'second')) error += ', ';
	if (!optional) error += labels.error['mandatory'];
	else if (optional == 'second') error += labels.error['second'];
	createText(parentObj,id+'_error','error',error);

	return element;
}
function createTextfield(parentObj,id,className,value,checkType,optional,evtEnter,evtParam)
{
	var text = createText(parentObj,id+'_txt','label');	
	if (!optional || optional == 'second') $(text).append('*');
	var element = createTextfieldNormal(parentObj,id,className,value,checkType,optional,evtEnter,evtParam);
	createBreak(parentObj);
	return element;
}
function createTextfieldHelp(parentObj,id,className,value,checkType,optional,evtEnter,evtParam)
{
	createText(parentObj,id+'_txt','label');		
	var element = createTextfieldNormal(parentObj,id,className,value,checkType,optional,evtEnter,evtParam);
	createImage(parentObj,id+'_tip','','img/help.gif',Array('infoTip','infoTipDelete'),Array('mouseover','mouseout'));
	createBreak(parentObj);
	return element;
}
function createTextfieldLabeled(parentObj,id,className,checkType,optional,evtEnter,evtParam)
{
	if (checkType == 'password'){ checkType = 'text'; var password = true; } 
	var element = createTextfieldNormal(parentObj,id,className,labels[id+'_txt'],checkType,optional,evtEnter,evtParam);	
	$(element).bind("focus", function(){ 
		$(this).val('');
		$(this).unbind('focus'); 
		if (password) this.type = 'password';		
	});
}
function createTextfieldBlock(parentObj,id,className,value,checkType,optional,evtEnter,evtParam)
{	
	var cont = createContainer(parentObj,'','textfieldBlock');
	var element = createTextfieldNormal(cont,id,className,value,checkType,optional,evtEnter,evtParam);
	createBreak(cont);
	createText(cont,id+'_txt','label');
	return element;
}
function createTextfieldForm(parentObj,id,className,value,checkType)
{
	createText(parentObj,id+'_txt');	
	var element = createTextfieldNormal(parentObj,id,className,value,checkType,false,'submitField');
	createLink(parentObj,id+'Submit','link','','submitField',id);
	createBreak(parentObj);
	return element;
}
function createTextline(parentObj,id,obj)
{
	createText(parentObj,id+'_txt','label');
	if (obj[id]) createText(parentObj,'','',obj[id]);
	else if (isArray(obj)) createText(parentObj,'','',labels.empty);
	else createText(parentObj,'','',obj);
	createBreak(parentObj);
}
function createTextarea(parentObj,id,className,value,evtFunction,evtType,evtParam)
{
	var element = document.createElement('TEXTAREA');
	if (value) element.innerHTML = value;
	parentObj.appendChild(element);
	attributes(element,id,className,evtFunction,evtType,evtParam);
	return element;
}
function createSelectbox(parentObj,id,values,selected,evtFunction,evtType,evtParam)
{
	if (labels[id+'_txt']) createText(parentObj,id+'_txt','label');
	var element = document.createElement('SELECT');		
	for (var i=0; i<values.length; i++) {
		
		var option = document.createElement('OPTION');
		option.innerHTML = values[i];
		element.appendChild(option);
		if (values[i] == selected) element.options.selectedIndex = i;
	};
	element.name = id;
	
	attributes(element,id,'input',evtFunction,evtType,evtParam);
	parentObj.appendChild(element);
	return element;
}
function createSelection(parentObj,id,values,checked,optional,vertical,evtFunction,evtType,evtParam)
{
	// optional or mandatory
	if (labels[id+'_txt']){
		var text = createText(parentObj,id+'_txt','label');
		if (!optional){
			$(text).append('*');
			evtFunction = 'checkElement';
			evtType = 'click';
			evtParam = Array('selection',optional);
		} 
	} 
		
	if (values.length > 2) vertical = true;
	var cont = createContainer(parentObj,id,'selection',false,evtFunction,evtType,evtParam);	
	cont.name = 'selection';
	for (var i=0; i<values.length; i++) {
		
		var input = createInput(cont,id+i,'checkbox','','radio');
		input.name = id;
		createText(cont,'','',values[i]);
//		if (labels[id+i+'_tip']){  
//			var img = createImage(cont,'listingHelp','','img/help.gif'); 
//			$(img).tooltip(labels[id+i+'_tip']);  
//		}
		if (labels[id+i+'_tip']) createText(cont,id+i+'_tip');
		if (vertical) createBreak(cont);
	};
	if (checked) obj(checked).checked = true; //else obj(id+'0').checked = true;	
	
	createText(parentObj,id+'_error','error',labels['error']['selection']); // error
	
	return cont;
}
function createCheckbox2(parentObj,id,optional,text,value,evtFunction,evtType,evtParam)
{	
	var element = createInput(parentObj,id,'checkbox',value,'checkbox',evtFunction,evtType,evtParam);	
	if (text || labels[id+'_txt']) createText(parentObj,id+'_txt','labelCheckbox',text);
	if (!optional){
		createText(parentObj,id+'_error','error',labels['error']['mandatory']);
		$(element).change(function(){ checkElement(this,Array('checkbox',optional)); });
	}
	createBreak(parentObj);	
	return element;
}
function createCheckbox(parentObj,id,name,text,value,evtFunction,evtType,evtParam)
{	
	var element = createInput(parentObj,id,'checkbox',value,'checkbox',evtFunction,evtType,evtParam);
	if (name) element.name = name;
	if (text || labels[id+'_txt']){
		createText(parentObj,id+'_txt','labelCheckbox',text);
		createBreak(parentObj);		
	}
	return element;
}
function createCheckboxes(parentObj,id,texts,value)
{
	createText(parentObj,id+'_txt','header2'); 
	var cont = createContainer(parentObj,id+'Cont');
	for (var i=0; i<texts.length; i++){
		if (value && array_search(texts[i],value)) createCheckbox(cont,id+i,id,texts[i],'x');
		else createCheckbox(cont,id+i,id,texts[i]);
		if (labels[id+i+'_type'] == 'selection'){ createSelection(cont,id+i+'_cg',labels[id+i+'_fields'].split(','),false,true); createBreak(parentObj); } 
	} 
	createBreak(parentObj,2);
}
function createFormular(parentObj,id)
{
	if ($.browser.msie) var element = document.createElement('<form enctype="multipart/form-data">'); // IE bug
	else var element = document.createElement('FORM');
	element.enctype = 'multipart/form-data';
	element.method = 'post';
	element.action = phpFile+'/?action='+id; // for further action in php
	element.target = id+'_iframe';
	element.id = id;	
	createIFrame(element,id+'_iframe','hidden');
	if (parentObj) parentObj.appendChild(element);
	return element;
}
function createIFrame(parentObj,id,className,source)
{
	if ($.browser.msie) var element = document.createElement('<iframe name="'+id+'" frameborder="0">'); // IE bug
	else var element = document.createElement('IFRAME');
	if (source) element.src = source;
	else element.src = '#';
	element.name = id;
	parentObj.appendChild(element);	
	attributes(element,id,className);
	return element;
}
function createImageUpload(parentObj,id,className,text,evtParam)
{
	createText(parentObj,id+'_txt','label',text);	
	var form = createFormular(parentObj,id);
	var element = createInput(form,id+'_file',className,'','file','submitImageUpload','change',object('form',form,'data',evtParam));
	element.name = id+'_file';
	if (labels[id+'_tip']){ var img = createImage(form,'listingHelp','','img/help.gif'); $(img).tooltip(labels[id+'_tip']); }
	createBreak(parentObj);	
	return element;
}
function createList(parentObj,id,className)
{
	var element = document.createElement('UL');
	parentObj.appendChild(element);
	attributes(element,id,className);
	return element;
}
function createListElement(parentObj,id,className,value)
{
	var element = document.createElement('LI');
	element.innerHTML = value;
	parentObj.appendChild(element);
	attributes(element,id,className);
	return element;
}
function createMenu(parentObj,id,className)
{
	var element = createList(parentObj,id,className);
	return element;
}
function createMenuElement(parentObj,id,evtFunction,evtParam)
{
	var list = createListElement(parentObj);
	var element = createText(list,id,'menuLink','',Array(evtFunction,'evtOver','evtOut'),Array('click','mouseover','mouseout'),object(evtFunction,evtParam));
	return element;
}
function createPopup(parentObj,id,idText,width,height,evtFunction,evtParam)
{
	var popup = createContainer(parentObj,id,'',true);
	createBreak(popup);
	createText(popup,'','',labels[id]);
	
	if (!width) width = 700;
	if (!height) height = 500;
	var element = document.createElement('A');
	element.href = '#TB_inline?width='+width+'&height='+height+'&inlineId='+id;
	if (!idText) idText = id+'_txt';
	element.title = labels[idText];
	element.innerHTML = labels[idText];
	parentObj.appendChild(element);
	attributes(element,idText,'thickbox',evtFunction,'click',evtParam);
	tb_init(element);
	return element;
}
function createSlider(parentObj,data,numberStep,numberAll,name)
{
	var detail = new Object();
	detail.panel = name+'Panel';
	detail.buttons = name+'Control';
	detail.create = name+'Box';
	detail.numberNow = numberStep;
	detail.numberStep = numberStep; // step number
	detail.numberAll = numberAll; // max to show
	detail.type = 'horizontal';
	if (numberAll < numberStep) detail.size = 61*numberAll+1; // width of one panel - smaller cause not enough elements
	else detail.size = 61*numberStep+1; // width of one panel
	detail.data = data;
	
	// panel
	var cont = createContainer(parentObj,'','sliderContainer');
	cont.style.width = detail.size+'px';
	var row = createContainer(cont,name+'Row','sliderRow');
	var panel = createContainer(row,detail.panel,'sliderPanel');
	window[name+'Box'](panel,data,numberStep,0);	
	
	// buttons
	createBreak(cont);
	var buttons = createContainer(cont,detail.buttons,'sliderControl');
	var previous = createLink(buttons,'sliderPrevious','link','','slider',Array(detail,'previous'));
	$(previous).hide();
	var next = createLink(buttons,'sliderNext','link','','slider',Array(detail,'next'));
	if (numberAll < numberStep) $(next).hide();
}
function slider(element,param)
{
	var detail = param[0];
	var panel = obj(detail.panel);
	var control = obj(detail.buttons);
	var direction = param[1];
	var numberCreated = panel.childNodes.length; // already showen
	
	// horizontal or vertical
	if (detail.type == 'horizontal') var position = substring($(panel).css('marginLeft'),0,-2);
	else if (detail.type == 'vertical') var position = substring($(panel).css('marginTop'),0,-2);
	
	// what to do when a button pressed
	if (direction == 'previous'){ 
		if (detail.numberNow <= detail.numberStep) return; // beginning
		detail.numberNow -= detail.numberStep;
		var prefix = '+';
	}
	else if (direction == 'next'){	
		if (detail.numberNow >= detail.numberAll) return; // end
		if (detail.numberNow+detail.numberStep > numberCreated && numberCreated < detail.numberAll){ // if it will be more than created, create the next
			window[detail.create](panel,detail.data,detail.numberStep,detail.numberNow); 	
		} 
		detail.numberNow += detail.numberStep; 
		var prefix = '-';
	} 

	// hide buttons
	var buttons = control.childNodes;
	if (detail.numberNow <= detail.numberStep) $(buttons[0]).hide(); // beginning
	else $(buttons[0]).show();
	if (detail.numberNow >= detail.numberAll) $(buttons[1]).hide(); // end
	else $(buttons[1]).show(); 

	var pixel = eval(position+prefix+detail.size);
	$(control).hide();
	if (detail.text) $('.'+detail.text).css({ overflow:'hidden' }); // bug in stream
	if (detail.type == 'horizontal') $(panel).animate({marginLeft:pixel},1000,false,function(){sliderAfter(detail)});
	else if (detail.type == 'vertical') $(panel).animate({marginTop:pixel},1000,false,function(){sliderAfter(detail)});
	//$(panel).animate({marginLeft:pixel},2000,'easeOutBounce',galleryAfterShift);
}
function sliderAfter(detail)
{
	if (detail.text) $('.'+detail.text).css({ overflow:'auto' }); // bug in stream
	var buttons = obj(detail.buttons);
	$(buttons).show();
}