
/*

Needs prototype and scripaculous[builder]

*/

var Noa = {};

Noa.HTTP_PATH = null;
Noa.MEDIAS_PATH = null;
Noa.CSS_PATH = null;

Noa.loaded = false;

Noa.oninit = null;

Noa.init = function(){
	Noa.loaded = true;
	
	Position.includeScrollOffsets = true;
	
	var a = Builder.node('a', {href:Noa.HTTP_PATH}, [Noa.getLabel("mainShowSite")]);
	$('rightMenu').appendChild(Builder.node('li', [a]));
	
	if(Noa.oninit) Noa.oninit();
};

document.observe("dom:loaded", Noa.init);
/*********************************************************************************************************/


/*********************************************************************************************************/
Noa.registerModule = function(module, name){
	var a = Builder.node('a', {href:'javascript:void(0);'}, [name]);
	$('mainMenu').appendChild(Builder.node('li', [a]));
	a.observe('click', Noa.loadModule.bindAsEventListener(this, module));
	
};
Noa.loadModule = function(event, module){
	var e = event.element()
	e.blur();
	var li = e.up().adjacent('li');
	for(var i=0; i<li.length; i++){
		li[i].removeClassName('on');
	}
	e.up().addClassName('on');

	$('editor').update();
	new module($('editor'));
	//module.init());
	
	event.stop();
};

/*********************************************************************************************************/

Noa.resizeImage = function(img, width, height){
	var src = img.src;
	
	img.writeAttribute({ width:null, height:null });
	img.hide();
	
	var onLoad = function(){
		img.show();
		
		var w = img.width;
		var h = img.height;
		
		if(img.width > width || img.height > height){
			if(img.width / img.height > width / height){
				h = img.height / img.width * width;
				w = width;
			}
			else{
				w = img.width / img.height * height;
				h = height;
			}
			
		}
		
		img.width = w;
		img.height = h;
		
		
		img.stopObserving('load', onLoad);
	}
	img.observe('load', onLoad);
	if(Prototype.Browser.IE && img.complete) img.src = src;
}

Noa.formatSqlDate = function(date){
	date = date.split('-');
	return(date[2]+'/'+date[1]+'/'+date[0]);
}


/*********************************************************************************************************/


/*********************************************************************************************************/

Noa.lang = "uk_en";
Noa.langData = {};
Noa.getLabel = function(label){
	var out = "";
	if(Noa.langData[Noa.lang] && Noa.langData[Noa.lang][label] != undefined) out = Noa.langData[Noa.lang][label];
	else out = Noa.langData['uk_en'][label];
	
	args = Noa.getLabel.arguments;
	if(args.length > 1){
		var parts = out.split("{$}");
		out = "";
		for(var i=0; i<parts.length; i++){
			out += parts[i];
			if(args[i+1]) out += args[i+1];
		}
	}
	
	return out;
};
Noa.upload = new Object();

Noa.upload.form = null;
Noa.upload.iframe = null;
Noa.upload.result = null;
Noa.upload.callback = null;

Noa.upload.init = function(form, url){
	Noa.upload.reset();
	
	$(document.body).insert({bottom:"<div style=\"display:none;\"><iframe id=\"noaUploadIFrame\" name=\"noaUploadIFrame\"></iframe></div>"});
	Noa.upload.iframe = $('noaUploadIFrame');
	
	Noa.upload.form = form;
	form.writeAttribute('target', 'noaUploadIFrame');
	form.writeAttribute('action', url);
	form.writeAttribute('method', 'post');
	form.writeAttribute('enctype', 'multipart/form-data');
	
	Noa.upload.iframe.observe('load', Noa.upload.iframeLoadedHandler);
};
Noa.upload.reset = function(){
	if(Noa.upload.iframe) Noa.upload.iframe.up().remove();
	Noa.upload.form = null;
	Noa.upload.iframe = null;
	Noa.upload.result = null;
	Noa.upload.callback = null;
}

Noa.upload.submit = function(callback){
	Noa.upload.callback = callback;
	Noa.upload.form.submit();
};

Noa.upload.iframeLoadedHandler = function(){
	Noa.upload.iframe.src = "javascript: window.parent.Noa.upload.result = document.body.innerHTML; void(0); ";
	
	setTimeout(function(){
		if(Noa.upload.result.substring(0, 5) == '<pre>'){
			Noa.upload.result = Noa.upload.result.substring(5, Noa.upload.result.lastIndexOf('</pre>'));
		}
		Noa.upload.callback(String(Noa.upload.result).evalJSON()); Noa.upload.reset();
	}, 250);
};

Noa.popin = new Object();

Noa.popin.container = null;
Noa.popin.content = null;

Noa.popin.init = function(width, height, title){

	//$$('html')[0].setStyle( {overflow:'hidden'} );
	
	var vpw = document.viewport.getWidth();
	var vph = document.viewport.getHeight();
	
	if(width == null) width = vpw * .9;
	if(height == null) height = vph * .8;
	
	
	if(!title) title = Noa.getLabel("popinDefaultTitle");
	$('editor').insert({bottom:'<div id="noa-popin"><div id="noa-popin-back"></div><div id="noa-popin-container"></div></div>'});
	
	Noa.popin.container = $('noa-popin-container');
	Noa.popin.container.setStyle({ width:width+'px', height:height+'px' });
	Noa.popin.container.setStyle({ left:((vpw-width)/2)+'px', top:((vph-height)/2)+'px' });

	Noa.popin.container.appendChild(Builder.node('h2', [title]));
	
	var close = Builder.node('a', {'class': 'closebt'}, ['Close']);
	close.observe('click', Noa.popin.close);
	Noa.popin.container.appendChild(close);
	
	//Noa.popin.container.appendChild(Noa.nodes.button('cross', "Close", 'right', '7px 7px 0 0', { click:Noa.popin.close }));
	Noa.popin.container.appendChild(Builder.node('div', {id:'noa-popin-content'}));
	
	Noa.popin.content = $('noa-popin-content');
	Noa.popin.content.width = width - 12;
	Noa.popin.content.height = height - 52;
	Noa.popin.content.setStyle({ height:(height-40)+'px' });
	
};

Noa.popin.close = function(){
	//$$('html')[0].setStyle( {overflow:'' } );
	$('noa-popin').remove();
	Noa.popin.content = null;
};



/*********************************************************************************************************/

Noa.message = function(message, okCallback){
	Noa.popin.init(240, 142, Noa.getLabel("popinMessageTitle"));
	Noa.popin.content.appendChild(Builder.node('p', {className:'message'}, message));
	var form = Builder.node('form', {});
	
	
	form.appendChild(Noa.nodes.button('', Noa.getLabel("popinMessageBtOk"), { click: function(){
		Noa.popin.close();
		if(okCallback) okCallback();
	}}));
	
	if(okCallback){
		form.appendChild(Noa.nodes.button('cancel', Noa.getLabel("popinMessageBtCancel"), { click: Noa.popin.close }));
	}
	Noa.popin.content.appendChild(form);
};

Noa.preview = function(path){
	Noa.popin.init(null, null, Noa.getLabel("popinPreviewTitle"));
	var frame = Builder.node('iframe');
	frame.setStyle({width:(Noa.popin.content.width-2)+'px', height:(Noa.popin.content.height-2)+'px'});
	frame.writeAttribute("src", path);
	Noa.popin.content.appendChild(frame);
}

Noa.imagePopin = function(params, insertFunc, additional){
	
	additional = additional ? additional : "";
	
	if(params){
		var src = unescape(params.src);
		var alt = params.alt;
	}
	
	Noa.popin.init(915, null, Noa.getLabel("mceImagePopinTitle")+" "+additional);
	
	var div = new Element('div', {'class': 'select'});
	
	if(Medias){
		var medias = new Medias(div, Medias.POPIN_MODE);
		medias.onFileOpen = function(file){
			form.imgSrc.value = escape(file.path);
		}
	}
	if(src && src.indexOf(Noa.MEDIAS_PATH) != -1){
		src = src.substring(src.indexOf(Noa.MEDIAS_PATH)+Noa.MEDIAS_PATH.length);
		if(medias) medias.onFoldersLoaded = function(){
			medias.files(null, src.substring(0, src.lastIndexOf('/')));
			medias.onFoldersLoaded = null;
			medias.onFilesLoaded = function(files){
				medias.open(null, src);
				medias.onFilesLoaded = null;
			}
		}
	}
	
	var form = Builder.node('form');
	form.appendChild(Noa.nodes.input('text', 'imgSrc', 'imgSrc', null, src, null, Noa.getLabel("mceImagePopinSrc")));
	form.appendChild(Noa.nodes.input('text', 'imgAlt', 'imgAlt', null, alt, null, Noa.getLabel("mceImagePopinAlt")));
	
	
	var bt = new Element('p');
	bt.appendChild(Noa.nodes.button('', Noa.getLabel("mceImagePopinBtInsert"), { click: insertFunc.bindAsEventListener(this, form) }));
	bt.appendChild(Noa.nodes.button('cancel', Noa.getLabel("mceImagePopinBtCancel"), { click: function(){ Noa.popin.close(); } }));
	form.appendChild(bt);
	
	Noa.popin.content.appendChild(form);
	Noa.popin.content.appendChild(Noa.nodes.separator());
	Noa.popin.content.appendChild(div);
};

Noa.filePopin = function(src, insertFunc, additional){
	
	src = unescape(src);
	
	additional = additional ? additional : "";
	
	Noa.popin.init(915, null, Noa.getLabel("mceFilePopinTitle")+" "+additional);
	
	var div = new Element('div', {'class': 'select'});
	
	if(Medias){
		var medias = new Medias(div, Medias.POPIN_MODE);
		medias.onFileOpen = function(file){
			form.src.value = escape(file.path);
		}
	}
	if(src && src.indexOf(Noa.MEDIAS_PATH) != -1){
		src = src.substring(src.indexOf(Noa.MEDIAS_PATH)+Noa.MEDIAS_PATH.length);
		if(medias) medias.onFoldersLoaded = function(){
			medias.files(null, src.substring(0, src.lastIndexOf('/')));
			medias.onFoldersLoaded = null;
			medias.onFilesLoaded = function(files){
				medias.open(null, src);
				medias.onFilesLoaded = null;
			}
		}
	}
	
	var form = Builder.node('form');
	form.appendChild(Noa.nodes.input('text', 'src', null, null, src, null, Noa.getLabel("mceImagePopinSrc")));
	
	
	var bt = new Element('p');
	bt.appendChild(Noa.nodes.button('', Noa.getLabel("mceImagePopinBtInsert"), { click: insertFunc.bindAsEventListener(this, form) }));
	bt.appendChild(Noa.nodes.button('cancel', Noa.getLabel("mceImagePopinBtCancel"), { click: function(){ Noa.popin.close(); } }));
	form.appendChild(bt);
	
	Noa.popin.content.appendChild(form);
	Noa.popin.content.appendChild(Noa.nodes.separator());
	Noa.popin.content.appendChild(div);
};

Noa.mce = {};

Noa.mce.init = function(){
	tinyMCE.init({
		setup : Noa.mce.setup,
				
		mode : "textareas",
		editor_deselector : "mceNoEditor",
		//mode : "none",
		theme : "advanced",

		theme_advanced_toolbar_location : "top",
		theme_advanced_toolbar_align : "left",
		theme_advanced_buttons2 : "",
		theme_advanced_buttons3 : "",
		theme_advanced_styles : "Left=left;Right=right",
		
		theme_advanced_resizing : true,
		
		relative_urls : false,
		remove_script_host : false,
		document_base_url : Noa.HTTP_PATH,
		content_css: Noa.CSS_PATH+","+Noa.HTTP_PATH+"admin/css/TinyMCE.css"
	});
};



Noa.mce.setup = function(ed){
	
	var options = $(ed.id).readAttribute("options");
	var mini = (options != null && options == "min");
	
	ed.addCommand('noaMceSource', function(){ Noa.mce.sourceEdit(ed) });
	ed.addButton('code', { title : 'Show source code', cmd:'noaMceSource' });
	
	if(!mini) ed.settings.theme_advanced_statusbar_location = "bottom";
	
	if(mini){
		ed.settings.force_br_newlines = true;
		ed.settings.forced_root_block = '';
	}
	else{
		ed.settings.force_br_newlines = false;
		ed.settings.forced_root_block = 'p';
	}
	
	var stylesstr = "";
	var styles = $(ed.id).readAttribute("styles");
	if(styles && styles != "undefined"){
		styles = styles.split(";");
		for(var i=0; i < styles.length; i++){
			stylesstr += styles[i]+"="+styles[i];
			if(i < styles.length - 1) stylesstr += ";";
		}
	}
	ed.settings.theme_advanced_styles = stylesstr;
	//ed.settings.theme_advanced_styles = null;
	
	ed.settings.theme_advanced_buttons1 = "code";
	if(!mini) ed.settings.theme_advanced_buttons1 += ",|,formatselect,";
	if(stylesstr != "" && !mini) ed.settings.theme_advanced_buttons1 += "styleselect,";
	if(!mini) ed.settings.theme_advanced_buttons1 += "|";
	
	
	ed.settings.theme_advanced_blockformats = "p";
	
	
	var allowed = $(ed.id).readAttribute("allowed");
	if(allowed){
		allowed = allowed.split(";");
		
		for(var i=0; i < allowed.length; i++){
			
			var tag = allowed[i].indexOf('[') > -1 ? allowed[i].substring(0, allowed[i].indexOf('[')) : allowed[i];
			
			
			
			switch(tag){
				case 'h1':
				case 'h2':
				case 'h3':
				case 'h4':
				case 'h5':
				case 'h6':
				case 'div':
					ed.settings.theme_advanced_blockformats += ","+tag;
				break;
				
				case 'b':
					ed.settings.theme_advanced_buttons1 += ",bold";
				break;
				
				case 'i':
					ed.settings.theme_advanced_buttons1 += ",italic";
				break;
				
				case 'img':
					ed.addCommand('noaMceImage', function(){ Noa.mce.openImagePopin(ed) });
					ed.addButton('image', { title : 'Insert image', cmd:'noaMceImage' });
					ed.settings.theme_advanced_buttons1 += ",image";
				break;
				
				case 'a':
					ed.addCommand('noaMceLink', function(){ Noa.mce.openLinkPopin(ed) });
					ed.addButton('link', { title : 'Insert link', cmd:'noaMceLink' });
					ed.settings.theme_advanced_buttons1 += ",link,unlink";
				break;
				
				case 'ul':
					ed.settings.theme_advanced_buttons1 += ",bullist";
				break;
			}
		}
	}
	
	//ed.allowed = allowed;
	
	//ed.onNodeChange.add(Noa.mce.updateStyleList);
};
/*********************************************************************************************************/
/*Noa.mce.updateStyleList = function(ed, cm, e){
	var stylesel = cm.get("styleselect");
	stylesel.items = [];
	
	var allowed = ed.allowed;
	
	if(allowed){
		
		for(var i=0; i < allowed.length; i++){
			if(allowed[i].indexOf('[') > -1){
				var tag = allowed[i].substring(0, allowed[i].indexOf('['));
				var styles = allowed[i].substring(allowed[i].indexOf('[')+1, allowed[i].indexOf(']')).split(",");
				
				if(e.nodeName.toLowerCase() == tag){
					console.log(styles);
					for(var j=0; j<styles.length; j++){
						stylesel.add(styles[j], styles[j]);
					}
					break;
				}
				//console.log(e.nodeName, tag, styles);
			}
		}
	}
	
	
	//stylesel.setActive(stylesel.getLength() > 0);

}*/
/*********************************************************************************************************/
Noa.mce.openImagePopin = function(ed){
	
	if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) return;
	
	
	
	var dom = ed.dom, node = ed.selection.getNode(), src = '', alt = '';
	if(node.nodeName == "IMG"){
		src = dom.getAttrib(node, 'src');
		alt = dom.getAttrib(node, 'alt');
	}
	
	Noa.imagePopin({src:src, alt:alt}, Noa.mce.imageInsert.bind(this, ed));
	
};

Noa.mce.imageInsert = function(ed, event, form){
	var f = form;
	
	var params = {};
	if(f.imgSrc.value.indexOf("http://") == -1)
		params.src = Noa.MEDIAS_PATH + f.imgSrc.value;
	else
		params.src = f.imgSrc.value;
	
	params.alt = f.imgAlt.value;
	
	if (f.imgSrc.value === '') { // le champ src est vide
		if (ed.selection.getNode().nodeName == 'IMG') { // si une image �tait s�lectionn�e, on la supprime
			ed.dom.remove(ed.selection.getNode());
			ed.execCommand('mceRepaint');
		}
	}
	else{ // le champ src contient un valeur
		// Fixes crash in Safari
		if (tinymce.isWebKit)
			ed.getWin().focus();
		
		var node = ed.selection.getNode();
		if (node && node.nodeName == 'IMG') { // si une image �tait s�lectionn�e, on met � jour ses propri�t� (dont src)
			ed.dom.setAttribs(node, params);
		}
		else{ // sinon on insert une nouvelle image
			ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1});
			ed.dom.setAttribs('__mce_tmp', params);
			ed.dom.setAttrib('__mce_tmp', 'id', '');
			ed.undoManager.add();
		}
		ed.execCommand('mceRepaint');
	}
	
	Noa.popin.close();
};
/*********************************************************************************************************/
Noa.mce.openLinkPopin = function(ed){
	if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) return;
	
	Noa.popin.init(null, null, Noa.getLabel("mceLinkPopinTitle"));
	
	var div = new Element('div', {'class': 'select'});
	
	if(Pages){
		var pages = new Pages(div, Pages.POPIN_MODE);
		pages.onPageOpen = function(page){
			form.linkUrl.value = page.fullpath;
		};
	}
	
	var dom = ed.dom, node = null, href = '', target = '';
	
	if (node = ed.dom.getParent(ed.selection.getNode(), 'A')){
	//if(node.nodeName == "A"){
		
		href = dom.getAttrib(node, 'href');
		//if(href.indexOf(Noa.HTTP_PATH) != -1){
		if(href.indexOf("http://") != -1 && href.indexOf("mailto:") != -1){
			href = href.substring(href.indexOf(Noa.HTTP_PATH)+Noa.HTTP_PATH.length);
			
			if(pages) pages.onPagesLoaded = function(){
				pages.onPagesLoaded = null;
				
				pages.edit(null, null, href);
			}
		}
		
		target = dom.getAttrib(node, 'target');
	}
	
	var form = Builder.node('form');
	form.appendChild(Noa.nodes.input('text', 'linkUrl', 'linkUrl', null, href, null, Noa.getLabel("mceLinkPopinUrl")));
	form.appendChild(Noa.nodes.input('text', 'linkTarget', 'linkTarget', null, target, null, Noa.getLabel("mceLinkPopinTarget")));
	
	var bt = new Element('p');
	bt.appendChild(Noa.nodes.button('', Noa.getLabel("mceLinkPopinBtInsert"), { click: Noa.mce.linkInsert.bindAsEventListener(this, ed, form) }));
	bt.appendChild(Noa.nodes.button('cancel', Noa.getLabel("mceLinkPopinBtCancel"), { click: function(){ Noa.popin.close(); } }));
	form.appendChild(bt);
	
	Noa.popin.content.appendChild(form);
	Noa.popin.content.appendChild(Noa.nodes.separator());
	Noa.popin.content.appendChild(div);
};
Noa.mce.linkInsert = function(event, ed, form){
	var f = form;
	
	var params = {};
	if(f.linkUrl.value.indexOf("http://") == -1 && f.linkUrl.value.indexOf("mailto:") == -1)
		params.href = Noa.HTTP_PATH + f.linkUrl.value;
	else
		params.href = f.linkUrl.value;
	
	params.target = f.linkTarget.value;

	e = ed.dom.getParent(ed.selection.getNode(), 'A');

	// Remove element if there is no href
	if (!f.linkUrl.value) {
		if (e) {
			b = ed.selection.getBookmark();
			ed.dom.remove(e, 1);
			ed.selection.moveToBookmark(b);
		}
	}
	// Create new anchor elements
	if (e == null) {
		ed.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1});

		tinymce.each(ed.dom.select("a"), function(n) {
			if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') {
				e = n;

				ed.dom.setAttribs(e, params);
			}
		});
	} else {
		ed.dom.setAttribs(e, params);
	}
	
	Noa.popin.close();
};
/*********************************************************************************************************/
Noa.mce.sourceEdit = function(ed){

	Noa.popin.init(null, null, Noa.getLabel("mceSourcePopinTitle"));
	
	var form = Builder.node('form');
	var ta = Noa.nodes.textarea('source', 'source', 'source', ed.getContent(), null);
	ta.setStyle( {height: (document.viewport.getHeight() * .8 - 90) + 'px' } );
	form.appendChild(ta);
	
	var bt = new Element('p');
	bt.appendChild(Noa.nodes.button('', Noa.getLabel("mceSourcePopinBtUpdate"), { click: Noa.mce.sourceUpdate.bindAsEventListener(this, ed, form) }));
	bt.appendChild(Noa.nodes.button('cancel', Noa.getLabel("mceSourcePopinBtCancel"), { click: function(){ Noa.popin.close(); } }));
	form.appendChild(bt);
	
	Noa.popin.content.appendChild(form);
};
Noa.mce.sourceUpdate = function(event, ed, form){
	ed.setContent(form.source.value);
	
	Noa.popin.close();
};

Noa.nodes = {};

Noa.nodes.makeNodesFromContent = function(content, varName, data, inNode, noMce, title){
	switch(content.type){
		case 'div':
		case 'smalldiv':
		case 'largediv':
		case 'mindiv':
			var ta = Noa.nodes.textarea(varName+'['+content.name+']', null, null, data ? data[content.name] : null, null, content.label);
			ta._node.writeAttribute({'allowed': content.allowed});
			ta._node.writeAttribute({'styles': content.styles});
			inNode.appendChild(ta);
			
			if(content.type == 'smalldiv') ta._node.addClassName('small');
			if(content.type == 'largediv') ta._node.addClassName('large');
			if(content.type == 'mindiv') {
				ta._node.writeAttribute({
					'allowed': 'b;i',
					'options': 'min'
				});
				ta._node.addClassName('ssmall');
			}
			ta._node.identify();
			if(noMce) ta._node.addClassName('mceNoEditor');
		break;
		
		case 'h2':
		case 'h3':
		case 'txt':
			var txt = Noa.nodes.input('text', varName+'['+content.name+']', null, null, data ? data[content.name] : null, null, content.label);
			inNode.appendChild(txt);
			if(title && title.field == content.name){
				title.node.update(txt._node.value);
				txt._node.observe('keyup', function(){
					title.node.update(this.value);
				});
			}
		break;
		
		case 'img':
			thumb = (content.thumbs && content.thumbs == "true");
			var img = Noa.nodes.imgselect(varName+'['+content.name+']', null, data ? data[content.name] : null, null, content.label, thumb);
			inNode.appendChild(img);
		break;
		
		case 'imglist':
			thumb = (content.thumbs && content.thumbs == "true");
			var img = Noa.nodes.imglist(varName+'['+content.name+']', null, data ? data[content.name] : null, null, content.label, thumb);
			inNode.appendChild(img);
		break;
		

		case 'file':
			var file = Noa.nodes.fileselect(varName+'['+content.name+']', null, data ? data[content.name] : null, null, content.label);
			inNode.appendChild(file);
		break;

		
		case 'list':
			inNode.appendChild(Noa.nodes.list(varName+'['+content.name+']', null, content.elements, data ? data[content.name] : null, null, content.label, content.title));
		break;
		
		
		case 'misc':
			var m = content.misc.evalScripts()[0];
			var n = m(varName, content, data);
			if(Object.isArray(n)){
				for(var i=0; i<n.length; i++){
					if(Object.isElement(n[i])) inNode.appendChild(n[i]);
				}
			}
			else if(Object.isElement(n)){
				inNode.appendChild(n);
			}
		break;
	}
}





Noa.nodes.input = function(type, name, id, className, value, events, label){
	var input = $(Builder.node('input', {type:type} ));
	if(name) input.writeAttribute({ name:name });
	if(id) input.writeAttribute({ id:id });
	if(className) input.addClassName(className);
	if(type == "checkbox") input.addClassName("checkbox");
	if(type == "radio") input.addClassName("radio");
	if(value){
		if(type == "checkbox" || type == "radio"){
			if(value == "1") input.checked = true;
		}
		else input.writeAttribute( {value:value} );
	}
	Noa.nodes.addEvents(input, events);
	
	return Noa.nodes.addLabel(input, label);
};



Noa.nodes.textarea = function(name, id, className, value, events, label){
	var ta = $(Builder.node('textarea'));
	if(name) ta.writeAttribute({ name:name });
	if(id) ta.writeAttribute({ id:id });
	if(className) ta.addClassName(className);
	if(value) ta.value = value;
	Noa.nodes.addEvents(ta, events);
	
	return Noa.nodes.addLabel(ta, label);
};



Noa.nodes.select = function(name, id, className, elements, events, label){
	var sel = $(Builder.node('select'));
	if(name) sel.writeAttribute({ name:name });
	if(id) sel.writeAttribute({ id:id });
	if(className) sel.addClassName(className);
	if(elements){
		var sIndex = 0;
		for(var i=0; i<elements.length; i++){
			var opt = $(Builder.node('option', {value:elements[i].value}, [elements[i].label]));
			if(elements[i].disabled) opt.writeAttribute({ disabled:'disabled' });
			if(elements[i].selected) sIndex = i;
			if(elements[i].className) opt.addClassName(elements[i].className);
			sel.appendChild(opt);
		}
		sel.selectedIndex = sIndex;
	}
	Noa.nodes.addEvents(sel, events);
	
	return Noa.nodes.addLabel(sel, label);
};

Noa.nodes.radios = function(name, id, className, elements, events, label, check){
	var ra = $(Builder.node('div'));
	ra.addClassName('radios');
	if(id) ra.writeAttribute({ id:id });
	if(className) ra.addClassName(className);
	if(elements){
		for(var i=0; i<elements.length; i++){
			var radio = $(Builder.node('input', {type:check?"checkbox":"radio", name:name+(check?"[]":""), value:elements[i].value, id:name+"f"+i}));
			Noa.nodes.addEvents(radio, events);
			if(elements[i].disabled) radio.writeAttribute({ disabled:'disabled' });
			if(elements[i].checked) radio.writeAttribute({ checked:'checked' });
			var lab = $(Builder.node('label', {'for':name+"f"+i}, [elements[i].label]));
			if(elements[i].disabled) lab.addClassName('disabled');
			ra.appendChild(radio);
			ra.appendChild(lab);
		}
	}
	
	return Noa.nodes.addLabel(ra, label);
}

Noa.nodes.checkboxes = function(name, id, className, elements, events, label){
	return Noa.nodes.radios(name, id, className, elements, events, label, true);
}


Noa.nodes.hidden = function(name, id, value){
	var n = new Element('input', { type:'hidden', name:name });
	if(id != null) n.writeAttribute({ id:id });
	if(value != null) n.writeAttribute({ value:value });
	return n;
};

Noa.nodes.button = function(type, label, events, inp){
	var bt = Noa.nodes.input('button', null, null, 'button '+type, label, events, null);
	bt.observe('click', function(){ this.blur(); });
	if(!label || label == "") bt.addClassName('nolabel');
	
	if(inp == true) return Builder.node('p', null, [bt]);
	else return bt;
};

Noa.nodes.collapaseButton = function(div){
	
	var collapseFunc = function(){
		if(this.hasClassName('collapse')){
			this.removeClassName('collapse');
			this.addClassName('expand');
			this.value = Noa.getLabel("nodesExpandAll");
			
			var ps = div.childElements();
			for(var i = 0; i< ps.length; i++){
				if(ps[i].nodeName == "P" && ps[i] != this.ancestors()[0]){
					ps[i].addClassName("folded");
				}
			}
		}
		else{
			this.addClassName('collapse');
			this.removeClassName('expand');
			this.value = Noa.getLabel("nodesCollapseAll");
			
			var ps = div.childElements();
			for(var i = 0; i< ps.length; i++){
				if(ps[i].nodeName == "P" && ps[i] != this.ancestors()[0]){
					ps[i].removeClassName("folded");
				}
			}
		}
	};
	
	var bt = Noa.nodes.button('collapse', Noa.getLabel("nodesCollapseAll"), { click: collapseFunc }, true);
	bt.appendChild(Noa.nodes.clear());
	
	return bt;
};

Noa.nodes.separator = function(){
	return new Element('div', {'class':'sep'});
};
Noa.nodes.clear = function (){
	return new Element('div', {'class':'clear'});
};

/*********************************************************************/
/*********************************************************************/
/*********************************************************************/
/*********************************************************************/

Noa.nodes.inputlist = function(name, id, className, elements, events, label){
	var ra = $(Builder.node('div'));
	ra.addClassName('inputlist');
	if(id) ra.writeAttribute({ id:id });
	if(className) ra.addClassName(className);
	
	var n = 0;
	
	ra = Noa.nodes.addLabel(ra, label);
	
	ra.add = function(elm){
		var radio = $(Builder.node('input', {type:"text", name:name+"["+n+"]"}));
		n++;
		if(elm && elm.value) radio.writeAttribute({value:elm.value});
		Noa.nodes.addEvents(radio, events);
		if(elm && elm.disabled) radio.writeAttribute({ disabled:'disabled' });
		
		var del = $(Builder.node('img', { src: 'img/picto/bin_empty.png' }));
		var lab = $(Builder.node('label', [del]));
		del.observe("click", function(r, l){
			r.remove();
			l.remove();
		}.bind(this, radio, lab));
		if (elm && elm.label) {
			lab.insert(elm.label);
			if (elm.disabled) lab.addClassName('disabled');
		}
		
		this._node.appendChild(radio);
		this._node.appendChild(lab);
	}
	
	if(elements){
		for(var i=0; i<elements.length; i++){
			ra.add(elements[i]);
		}
	}
	
	return ra;
}
/*********************************************************************/
/*********************************************************************/
/*********************************************************************/
/*********************************************************************/
Noa.nodes.simplelist = function(name, id, className, elements, events, label){
	var ul = $(Builder.node('ul'));
	ul.addClassName('simplelist');
	if(id) ul.writeAttribute({ id:id });
	if(className) ul.addClassName(className);
	var n = 0;
	
	ul = Noa.nodes.addLabel(ul, label);

	ul.add = function(elm){
		var li = $(Builder.node('li'));
		var hid = $(Builder.node('input', {type:"hidden", name:name+"["+n+"]"}));
		li.insert(hid);
		n++;
		if(elm && elm.value) hid.writeAttribute({value:elm.value});
		Noa.nodes.addEvents(li, events);
		
		var del = $(Builder.node('img', { src: 'img/picto/bin_empty.png' }));
		li.insert(del);
		del.observe("click", function(l){
			l.remove();
		}.bind(this, li));
		if (elm && elm.label) {
			li.insert(elm.label);
		}
		
		this._node.appendChild(li);
	}
	
	if(elements){
		for(var i=0; i<elements.length; i++){
			ul.add(elements[i]);
		}
	}
	
	return ul;
}

/*********************************************************************/
/*********************************************************************/
/*********************************************************************/
/*********************************************************************/

Noa.nodes.list = function(name, id, elements, value, events, label, titleField){
	
	var nbi = 0;
	
	//init
	var bt = Noa.nodes.button('add', Noa.getLabel("nodesListAdd"), { click:function(){
		addItem();
		checkUpDown();
	} });
	
	var p = Noa.nodes.addLabel(bt, label);
	p.appendChild(Noa.nodes.clear());

	var ul = new Element('ul', {'class':'elmList'});
	p.appendChild(ul);
	
	if(value != undefined){
		for(var i=0; i<value.length; i++){
			addItem(value[i]);
		}
		checkUpDown();
	};
	
	//add item
	function addItem(data){
		var li = new Element('li');
		
		var title = new Element('h4');
		li.appendChild(title);
		

		var tools = new Element('div', {'class':'tools'});
		var up = new Element('img', {src:'img/picto/arrow_up.png', 'class':'upbt'});
		up.observe('click', function(){ upItem(li); } );
		tools.appendChild(up);
		
		var down = new Element('img', {src:'img/picto/arrow_down.png', 'class':'downbt'});
		down.observe('click', function(){ downItem(li); } );
		tools.appendChild(down);
		
		var fold = new Element('img', {src:'img/picto/application_get.png'});
		fold.observe('click', function(){ foldItem(li, fold); } );
		tools.appendChild(fold);
		
		var del = new Element('img', {src:'img/picto/bin_empty.png'});
		del.observe('click', function(){ removeItem(li); } );
		tools.appendChild(del);
		li.appendChild(tools);
		
		
		for(var i=0; i<elements.length; i++){
			Noa.nodes.makeNodesFromContent(elements[i], name+'['+nbi+']', data, li, true, {node:title, field:titleField});
			
			
			/*switch(elements[i].type){
				case 'h2':
				case 'h3':
				case 'txt':
					var txt = Noa.nodes.input('text', name+'['+nbi+']['+elements[i].name+']', null, null, (data && data[elements[i].name] ? data[elements[i].name] : null), null, Noa.getLabel("pagesFormContent")+elements[i].label);
					li.appendChild(txt);
					
					
				break;
				
				case 'div':
				case 'smalldiv':
				case 'largediv':
				case 'mindiv':
					var ta = Noa.nodes.textarea(name+'['+nbi+']['+elements[i].name+']', null, null, (data && data[elements[i].name] ? data[elements[i].name] : null), null, Noa.getLabel("pagesFormContent")+elements[i].label);
					ta._node.writeAttribute({'allowed': elements[i].allowed});
					ta._node.writeAttribute({'styles': elements[i].styles});
					li.appendChild(ta);
					if (content.type == 'mindiv') {
						ta._node.writeAttribute({
							'allowed': 'b;i',
							'options': 'min'
						});
						ta._node.addClassName('ssmall');
					}
					else ta._node.addClassName('small');
					ta._node.addClassName('mceNoEditor');
					ta._node.identify();
					
				break;
				
				case 'img':
					thumb = (elements[i].thumbs && elements[i].thumbs == "true");
					var img = Noa.nodes.imgselect(name+'['+nbi+']['+elements[i].name+']', null, (data && data[elements[i].name] ? data[elements[i].name] : null), null, Noa.getLabel("pagesFormContent")+elements[i].label, thumb);
					li.appendChild(img);
				break;
				
				case 'imglist':
					thumb = (elements[i].thumbs && elements[i].thumbs == "true");
					var img = Noa.nodes.imglist(name+'['+nbi+']['+elements[i].name+']', null, (data && data[elements[i].name] ? data[elements[i].name] : null), null, Noa.getLabel("pagesFormContent")+elements[i].label, thumb);
					li.appendChild(img);
				break;
				
				case 'file':
					var file = Noa.nodes.fileselect(name+'['+nbi+']['+elements[i].name+']', null, (data && data[elements[i].name] ? data[elements[i].name] : null), null, Noa.getLabel("pagesFormContent")+elements[i].label);
					li.appendChild(file);
				break;
			}*/
		}
		ul.appendChild(li);
		
		if(data) foldItem(li, fold);
		else addEditor(li);
		
		nbi ++;
	};
	
	//remove item
	function removeItem(li){
		li.remove();
		checkUpDown();
	};
	
	//fold item
	function foldItem(li, icon){
		if(li.hasClassName('folded')){
			li.removeClassName('folded');
			icon.src = 'img/picto/application_get.png';
			addEditor(li);
		}
		else{
			li.addClassName('folded');
			icon.src = 'img/picto/application_put.png';
			removeEditor(li);
		}
	};
	
	// move item up
	function upItem(li){
		downItem(li, true);
	};
	
	// move item down
	function downItem(li, up){
		up = up == undefined ? false : true;
		
		if(up) var n = li.previousSiblings();
		else var n = li.nextSiblings();
		if(n.length > 0){

			removeEditor(li);
			
			if(up) n[0].insert({before:li});
			else n[0].insert({after:li});
			
			if(!li.hasClassName('folded')) addEditor(li);
			
		}

		checkUpDown();
	};
	
	//remove editors control
	function removeEditor(li){
		var eds = li.getElementsBySelector('textarea');
		for(var i=0; i<eds.length; i++){
			if(tinyMCE)
				tinyMCE.execCommand("mceRemoveControl", false, eds[i].readAttribute('id'));
		}
	}
	//add editors control
	function addEditor(li){
		var eds = li.getElementsBySelector('textarea');
		for(i=0; i<eds.length; i++){
			if(tinyMCE)
				tinyMCE.execCommand("mceAddControl", false, eds[i].readAttribute('id'));
		}
	}
	
	// check visibility of the up and down tool buttons
	function checkUpDown(){
		var lis = ul.childElements();
		for(var i=0; i<lis.length; i++){
			var t = lis[i].down('div.tools');
			t.down('img.upbt').show();
			t.down('img.downbt').show();
			if(i == 0){
				t.down('img.upbt').hide();
			}
			if(i == lis.length-1){
				t.down('img.downbt').hide();
			}
		}
	}
	
	
	
	return p;
};


/*********************************************************************/
/*********************************************************************/
/*********************************************************************/
/*********************************************************************/


Noa.nodes.fileselect = function(name, id, value, events, label){
	
	function selectFile(){
		Noa.filePopin(value, function(event, form){
			var f = form;

			if(f.src.value != "" && f.src.value.indexOf("http://") == -1)
				value = Noa.MEDIAS_PATH + f.src.value;
			else
				value = f.src.value;
			
			
			hid.value = value;
			fpath.update(value.replace(Noa.MEDIAS_PATH, ""));
			fname.update(value.substr(value.lastIndexOf('/')+1));
			
			Noa.popin.close();
		});
	}
	
	
	
	label = label != null ? label : "";
	
	var hid = Noa.nodes.hidden(name, null, value != null ? value : null);
	var p = Noa.nodes.addLabel(hid, label);
	
	p.appendChild(Noa.nodes.button("selectfile", Noa.getLabel("nodesFileChange"), { click: function(){ selectFile(); } }));
	p.appendChild(Noa.nodes.clear());
	
	var fname = new Element('h3')
	p.appendChild(fname);
	var fpath = new Element('small')
	p.appendChild(fpath);
	
	if(value != null){
		fpath.update(value.replace(Noa.MEDIAS_PATH, ""));
		fname.update(value.substr(value.lastIndexOf('/')+1));
	}
	
	return p;
};


/*********************************************************************/
/*********************************************************************/
/*********************************************************************/
/*********************************************************************/

Noa.nodes.imgselect = function(name, id, value, events, label, thumb){
	
	label = label != null ? label : "";
	
	var params = {};
	
	
	var selectThumb = function(){
		if(params.thumb == undefined) params.thumb = {};
		
		Noa.imagePopin(params.thumb, function(event, form){
			var f = form;
			
			if(f.imgSrc.value != "" && f.imgSrc.value.indexOf("http://") == -1)
				params.thumb.src = Noa.MEDIAS_PATH + f.imgSrc.value;
			else
				params.thumb.src = f.imgSrc.value;
			
			params.thumb.alt = f.imgAlt.value;
			
			Noa.nodes.objectToHiddens(params, name, div);
			
			Noa.popin.close();
			
		}, thumb ? Noa.getLabel("nodesImageListThumb") : '');
	};
	
	var selectImg = function(){
		if(params.img == undefined) params.img = {};
		
		Noa.imagePopin(params.img, function(event, form){
			var f = form;

			if(f.imgSrc.value != "" && f.imgSrc.value.indexOf("http://") == -1)
				params.img.src = Noa.MEDIAS_PATH + f.imgSrc.value;
			else
				params.img.src = f.imgSrc.value;
			
			params.img.alt = f.imgAlt.value;
			
			Noa.nodes.objectToHiddens(params, name, div);
			
			img.writeAttribute({ src:params.img.src });
			Noa.resizeImage(img, 450, 200);
			Noa.popin.close();
			
			if(thumb == true) selectThumb();
			
		}, thumb ? Noa.getLabel("nodesImageListImg") : '');
	};
	
	var div = new Element('div');
	
	if(value){
		params = value;
		Noa.nodes.objectToHiddens(params, name, div);
	}
	
	var img = $(Builder.node('img'));
	if(params.img && params.img.src != ''){
		img.writeAttribute({ src:params.img.src });
		Noa.resizeImage(img, 450, 200);
	}

	
	var p = Noa.nodes.addLabel(div, label);
	p.appendChild(Noa.nodes.button('selectimage', Noa.getLabel("nodesImageChange"), { click: function(){ selectImg(); } }));
	p.appendChild(Noa.nodes.clear());
	p.appendChild(img);
	
	return p;
};

/*********************************************************************/
/*********************************************************************/
/*********************************************************************/
/*********************************************************************/

Noa.nodes.imglist = function(name, id, value, events, label, thumb){
	var params = [];
	label = label != null ? label : "";
	
	/*var hid = $(Builder.node('input', {type:"hidden"}));
	if(name) hid.writeAttribute({ name:name });
	if(id) hid.writeAttribute({ id:id });*/

	var div = new Element('div');
	
	var ul = new Element('ul');
	ul.addClassName('imglist');
	ul.identify();
	
	
	
	var updateParams = function(){
		params = [];
		var lis = ul.childElements();
		for(var i=0; i<lis.length; i++){
			params.push(lis[i]._obj);
		}
		//hid.value = Object.toJSON(params);
		Noa.nodes.objectToHiddens(params, name, div);
	};
	
	var initSortable = function(){
		//Sortable.destroy (ul);
		Sortable.create(ul, {overlap:'horizontal', constraint:'horizontal', scroll:'editor', onChange:updateParams } );
	};
	
	
	var selectThumb = function(im){
		
		Noa.imagePopin(im.thumb, function(event, form){
			var f = form;
			
			if(f.imgSrc.value != "" && f.imgSrc.value.indexOf("http://") == -1)
				im.thumb.src = Noa.MEDIAS_PATH + f.imgSrc.value;
			else
				im.thumb.src = f.imgSrc.value;
			
			im.thumb.alt = f.imgAlt.value;
			
			Noa.popin.close();

			//removeImage(im);
			addImageToUl(im);

			initSortable();
			updateParams();
			
		}, Noa.getLabel("nodesImageListThumb"));
	};
	var selectImg = function(edit){
		var im = {img:{}, thumb:{}};
		
		if(edit != null){
			im = edit;
		}
		
		Noa.imagePopin(im.img, function(event, form){
			var f = form;

			if(f.imgSrc.value != "" && f.imgSrc.value.indexOf("http://") == -1)
				im.img.src = Noa.MEDIAS_PATH + f.imgSrc.value;
			else
				im.img.src = f.imgSrc.value;
			
			im.img.alt = f.imgAlt.value;
			
			Noa.popin.close();
			
			if(thumb == true) selectThumb(im);
			else{
				addImageToUl(im);

				initSortable();
				updateParams();
			}
			
		}, Noa.getLabel("nodesImageListImg"));
	};
	
	var removeImage = function(obj){
		/*for(var i=0; i<params.length; i++){
			if(params[i] == obj) params.splice(i, 1);
		}*/
		if(obj._li) obj._li.remove();
		//hid.value = Object.toJSON(params);
		

		updateParams();
	};
	/*
	var showBigImage = function(obj){
		Noa.popin.init(800, 500, Noa.getLabel("nodesImageListBigImage")+" ("+obj.img.alt+")");
		var img = new Element('img', { src:obj.img.src });
		Noa.popin.content.setStyle({ textAlign:'center' });
		Noa.resizeImage(img, 780, 470);
		Noa.popin.content.appendChild(img);
	};
	*/
	var addImageToUl = function(obj){
		if(!obj._li){
			var li = Builder.node('li', null);
			obj._li = li;
			li._obj = obj;
			
			var tools = new Element('div', {'class':'tools'});
			var edit = new Element('img', {src:'img/picto/picture_edit.png'});
			edit.observe('click', function(){ selectImg(obj); } );
			tools.appendChild(edit);
			var del = new Element('img', {src:'img/picto/bin_empty.png'});
			del.observe('click', function(){ removeImage(obj); } );
			tools.appendChild(del);

			var imgcontainer = new Element('p');
			var src = "";
			if(obj.thumb != undefined && obj.thumb.src != undefined) src = obj.thumb.src;
			else src = obj.img.src
			var img = new Element('img', { src:src });
			//img.observe('click', function(){ showBigImage(obj); });
			Noa.resizeImage(img, 105, 75);
			imgcontainer.appendChild(img);

			li.appendChild(imgcontainer);
			li.appendChild(tools);
			
			ul.appendChild(li);
		}
		else{
			obj._li.down('img').writeAttribute({ src:obj.thumb != undefined ? obj.thumb.src : obj.img.src });
		}
	};
	
	if(value){
		//hid.value = value;
		//params = value.evalJSON();
		
		params = value;
		Noa.nodes.objectToHiddens(params, name, div);
		
		for(var i=0; i<params.length; i++){
			addImageToUl(params[i]);
		}
		
		initSortable();
	}
	
	
	var p = Noa.nodes.addLabel(div, label);

	p.appendChild(Noa.nodes.button('addimage', Noa.getLabel("nodesImageListAdd"), { click: function(){ selectImg(); } }));
	p.appendChild(Noa.nodes.clear());
	
	p.appendChild(ul);
	p.appendChild(Noa.nodes.clear());
	
	return p;
};


/*********************************************************************/


Noa.nodes.addEvents = function(node, events){
	if(node != null && events != null){
		for(var prop in events){
			node.observe(prop, events[prop]);
		}
	}
};
Noa.nodes.addLabel = function(node, label){
	var out = null;
	if(node != null && label != null){
		var lab = $(Builder.node('label', [label]));
		var id = node.readAttribute('id');
		if(id) lab.writeAttribute({ 'for':id });
		out = $(Builder.node('p', [lab, node]));
		lab._p = out;

		lab.observe('click', function(event){
			if(lab._p.ancestors()[0].hasClassName('contentCol')){
				if(this._p.hasClassName("folded")) this._p.removeClassName("folded");
				else this._p.addClassName("folded");
			}
		});
	}
	else{
		out = node;
	}
	out._node = node;
	return out;
};

Noa.nodes.objectToHiddens = function(params, base, elm){
	var hid = elm.childElements();
	if(hid != undefined) for(var i=0; i<hid.length; i++){
		hid[i].remove();
	}
	
	var recu = function(param, name){
		if(Object.isElement(param)) return;
		
		if(Object.isArray(param)){
			for(i=0; i<param.length; i++){
				recu(param[i], name+'['+i+']');
			}
		}
		else{
			for(var prop in param){
				if(Object.isString(param[prop])){
					elm.appendChild(Noa.nodes.hidden(name+'['+prop+']', null, param[prop]));
				}
				else recu(param[prop], name+'['+prop+']');
			}
		}
	}
	recu(params, base);
}

Noa.ajaxCall = function(module, method, params, callback){
	if(!document.body.hasClassName("wait")) document.body.addClassName("wait");
	new Ajax.Request('ajax.php?' + module + '=' + method, { method: 'post', parameters: params, onSuccess:function(data){
		document.body.removeClassName("wait");
		callback(data.responseText.evalJSON());
	} });
}