var Newsletter = Class.create({
	
	/**
	 * 
	 */
	initialize: function(inNode, mode) {
		
		//reset events
		this.onListLoaded = null;
		this.onEdit = null;
		this.onEditLoaded = null;
		
		this.mode = 0;
		
		this.templateList = null;
		this.letterList = null;
		this.defaultExp = null;
		
		this.listNode = null;
		this.editorNode = null;
		this.editorConfigNode = null;
		this.editorContentNode = null;
	
		if(mode != null) this.mode = mode;
		else this.mode = 0;
		
		if(this.mode == 0){
			var btltr = Noa.nodes.button('mail', Noa.getLabel("newslBtLtr"), { 'click': this.list.bindAsEventListener(this) });
			var btadd = Noa.nodes.button('addmail', Noa.getLabel("newslBtAdd"), { 'click': this.edit.bindAsEventListener(this) });
			var btaddr = Noa.nodes.button('report', Noa.getLabel("newslBtaddr"), { 'click': this.addrList.bindAsEventListener(this) });
		
			inNode.appendChild(Builder.node('p', { 'class':'submenu' }, [btltr, btadd, btaddr]));
		}
		
		
		this.listNode = Builder.node('div', {'class':'bloc list NewsletterList'});
		inNode.appendChild(this.listNode);
		
		this.editorNode = Builder.node('div', {'class':'bloc last'});
		inNode.appendChild(this.editorNode);
		
		if(this.mode == 0){
			Noa.ajaxCall('Newsletter', 'getTemplates', null, function(data){
				this.templateList = data.templateList;
				this.defaultExp = data.defaultExp;
				this.list();
			}.bind(this));
		}
		else{
			this.addrList();
		}
	},
	/**
	 * 
	 */
	list: function(){
		this.listNode.update();
		if(this.editorNode) this.editorNode.update();
		
		Noa.ajaxCall('Newsletter', 'getLetters', null, function(data){
			
			this.letterList = data.letters;
			
			var ul = Builder.node('ul');
			this.letterList.each(function(page){
				var a = Builder.node('a', { href:'javascript:void(0);'}, [Noa.formatSqlDate(page.date)+' - '+page.subject]);
				if(page.sent) a.addClassName("alt");
				a.observe('click', this.edit.bindAsEventListener(this, page.id));
				page._link = a;
				
				var li = Builder.node('li');
				li.appendChild(a);
				li._page = page;
				
				ul.appendChild(li);
			}.bind(this));
			
			this.listNode.update(ul);
			
			if(this.onListLoaded) this.onListLoaded();
		}.bind(this));
	},
	/**
	 * 
	 * @param {Object} event
	 */
	edit: function(event, id){
		
		var makeForm = function(ltr){
			
			var config = $(Builder.node('div', {'class':'configCol'}));
			this.editorConfigNode = config;
			var content = $(Builder.node('div', {'class':'contentCol'}));
			this.editorContentNode = content;
			var form = $(Builder.node('form', null, [config, content]));
			
			config.appendChild(Noa.nodes.input('text', 'subject', null, null, ltr ? ltr.subject : null, null, Noa.getLabel("newslFormSubject")));
			config.appendChild(Noa.nodes.input('text', 'exp', null, null, ltr ? ltr.exp : this.defaultExp, null, Noa.getLabel("newslFormExp")));

			elms = [];
			this.templateList.each(function(template){
				var elm = { label:template.label, value:template.name };
				if(ltr && ltr.template == template.name) elm.selected = true;
				elms.push(elm);
			});
			config.appendChild(Noa.nodes.select('template', 'template', null, elms, { change:this.content.bindAsEventListener(this, ltr, form) }, Noa.getLabel("newslFormTemplate")));

			config.appendChild(Noa.nodes.separator());
			
			var bt = new Element('p');
			bt.appendChild(Noa.nodes.button('save', Noa.getLabel("newslBtSave"), { click: this.save.bindAsEventListener(this, ltr, form) }));
			if(ltr) bt.appendChild(Noa.nodes.button('previewmail', Noa.getLabel("newslBtPreview"), { click: this.preview.bindAsEventListener(this, ltr, form) }));
			if(ltr) bt.appendChild(Noa.nodes.button('delete', Noa.getLabel("newslBtDel"), { click: this.del.bindAsEventListener(this, ltr) }));
			if(ltr) bt.appendChild(Noa.nodes.button('sendmail', Noa.getLabel("newslBtSend"), { click: this.send.bindAsEventListener(this, ltr, form) }));
			config.appendChild(bt);
			
			this.editorNode.update(form);
			
			this.content(null, ltr, form);
		};

		this.editorNode.update();
		
		var decs = this.listNode.descendants();
		decs.each(function(elm){
			if(elm.match('a')) elm.removeClassName('on');
		});
		
		if (id) {
			var ltr = this.getLtrFromId(id);
			if (ltr) {
				ltr._link.blur();
				ltr._link.addClassName('on');
			}
			
			if (this.onEdit) {
				this.onEdit(id);
			}
			
			Noa.ajaxCall('Newsletter', 'getLetter', {
				id: id
			}, function(data){
				if (this.onEditLoaded) 
					this.onEditLoaded(data.letter);
				makeForm.bind(this)(data.letter);
			}.bind(this));
		}
		else {
			this.list();
			makeForm.bind(this)(null);
		}
	},
	/**
	 * 
	 * @param {Object} event
	 * @param {Object} ltr
	 */
	content: function(event, ltr, f){
		this.editorContentNode.update();
		var name = f['template'].value;
		
		this.templateList.each(function(temp){
			if(temp.name == name) template = temp;
		});
			
		this.editorContentNode.appendChild(Noa.nodes.collapaseButton(this.editorContentNode));
		
		
		template.contents.each(function(content){
			Noa.nodes.makeNodesFromContent(content, 'content', ltr ? ltr.content : null, this.editorContentNode);
		}.bind(this));
		
		Noa.mce.init();
	},
	/**
	 * 
	 * @param {Object} event
	 * @param {Object} ltr
	 * @param {Object} f
	 */
	save: function(event, ltr, f){
		tinyMCE.triggerSave();
		
		var params = f.serialize(true);
		if(ltr) params.id = ltr.id;
		
		Noa.ajaxCall('Newsletter', 'save', params, function(data){
			if(data.result){
				this.list();
				this.onListLoaded = function(){
					this.onListLoaded = null;
					this.edit(null, data.result.newLetterId);
				};
			}
			else{// gestion des erreurs
			}
		}.bind(this) );
	},
	/**
	 * 
	 * @param {Object} event
	 * @param {Object} ltr
	 */
	del: function(event, ltr){
		Noa.message(Noa.getLabel("newslMessageDel", ltr.subject), function(){
			Noa.ajaxCall('Newsletter', 'delete', { id:ltr.id }, function(data){
				if(data.result){
					this.list();
				}
				else{// gestion des erreurs
				}
			}.bind(this) );
		}.bind(this) );
	},
	/**
	 * 
	 * @param {Object} event
	 * @param {Object} ltr
	 * @param {Object} f
	 */
	send: function(event, ltr, f){
		this.save(event, ltr, f);
		this.onEditLoaded = function(){
			this.onEditLoaded = null;
			
			this.selectAddr(ltr);
		}
	},
	
	selectAddr: function(ltr){
		Noa.popin.init(600, 400, Noa.getLabel("newslPopSelectA"));
		var div = new Element('div', {'class': 'select'});
		var newsletter = new Newsletter(div, 1);
		Noa.popin.content.appendChild(div);
		
		newsletter.onSend = function(ul){
			var params = {id:ltr.id};
			if(ul){
				var list = "";
				var li = ul.childElements();
				for(var i=0; i<li.length; i++){
					if(li[i].down('input').checked){
						list += li[i]._address.id + ",";
					}
				}
				if(list == "") return;
				params.list = list;
			}
			Noa.ajaxCall('Newsletter', 'send', params, function(data){
				if(data.result){
					this.list();
					this.onListLoaded = function(){
						this.onListLoaded = null;
						Noa.popin.close();
						this.editorNode.update("<p>"+Noa.getLabel("newslMessageSent")+"</p>");
					};
				}
				else{// gestion des erreurs
				}
			}.bind(this) );
		}.bind(this);
	},
	/**
	 * 
	 * @param {Object} event
	 * @param {Object} ltr
	 */
	preview: function(event, ltr, f){
		this.save(event, ltr, f);
		this.onEditLoaded = function(){
			this.onEditLoaded = null;
			Noa.preview(Noa.HTTP_PATH + "newsletter?id=" + ltr.id);
		}
	},
	/**
	 * 
	 * @param {Object} event
	 */
	addrList: function(event){
		Noa.ajaxCall('Newsletter', 'getAddresses', null, function(data){
			
			var ul = Builder.node('ul', {className:'addresses'});
			data.addresses.each(function(address){
				var c = Noa.nodes.input('checkbox');
				var a = Builder.node('a', { href:'javascript:void(0);', className:'check'}, [address.address]);
				if(address.conf) a.addClassName("alt");
				a.observe('click', function(){
					this.blur();
					this.previous().checked = !this.previous().checked;
				});
				
				var li = Builder.node('li');
				li.appendChild(c);
				li.appendChild(a);
				li._address = address;
				
				ul.appendChild(li);
			}.bind(this));
		
			this.listNode.update(ul);
			
			var form = $(Builder.node('form'));
			var bt = new Element('p');
			
			if(this.mode == 0){
				bt.appendChild(Noa.nodes.button('delete', Noa.getLabel("newslBtDelAddresses"), { click: this.delAddr.bindAsEventListener(this, ul) }));
			}
			else{
				bt.appendChild(Noa.nodes.button('sendmail', Noa.getLabel("newslBtSendSelected"), { click: function(){ if(this.onSend) this.onSend(ul) }.bind(this) }));
				bt.appendChild(Noa.nodes.button('sendmail', Noa.getLabel("newslBtSendAll"), { click: function(){ if(this.onSend) this.onSend() }.bind(this) }));
			}
			form.appendChild(bt);
			form.appendChild(Noa.nodes.separator());
			
			if(this.mode == 0){
				var newAddr = Noa.nodes.textarea("newAddr", null, null, null, null, Noa.getLabel("newslFormNewAddr"))
				form.appendChild(newAddr);
				bt = new Element('p');
				bt.appendChild(Noa.nodes.button('addvcard', Noa.getLabel("newslBtAddAddr"), { click: this.addAddr.bindAsEventListener(this, newAddr._node) }));
				form.appendChild(bt);
			}
			
			this.editorNode.update(form);
			
		}.bind(this));
	},
	/**
	 * 
	 * @param {Object} event
	 */
	addAddr: function(event, field){
		if (field.value != "") {
			Noa.ajaxCall('Newsletter', 'addAddr', { list: field.value }, function(data){
				if (data.result) {
					this.addrList();
				}
				else {// gestion des erreurs
				}
			}.bind(this));
		}
	},
	/**
	 * 
	 * @param {Object} event
	 */
	delAddr: function(event, ul){
		var toDel = "";
		var li = ul.childElements();
		for(var i=0; i<li.length; i++){
			if(li[i].down('input').checked){
				toDel += li[i]._address.id + ",";
			}
		}
		if(toDel.length > 0){
			Noa.message(Noa.getLabel("newslMessageDelAddr"), function(){
				Noa.ajaxCall('Newsletter', 'delAddr', { list:toDel }, function(data){
					if(data.result){
						this.addrList();
					}
					else{// gestion des erreurs
					}
				}.bind(this) );
			}.bind(this) );
		}
	},
	
	
	
	getLtrFromId: function(id){
		for(var i=0; i<this.letterList.length; i++){
			if (this.letterList[i].id == id) return this.letterList[i];
		}
		return null;
	}
});







Newsletter.lang = {uk_en:{
	newsletterTitle:			"Newsletter",
	
	newslBtLtr:					"Manage newsletters",
	newslBtAdd:					"Create a newsletter",
	newslBtAddAddr:				"Add",
	newslBtaddr:				"Manage addresses",
	
	newslFormSubject:			"Subject",
	newslFormExp:				"Expeditor",
	newslFormTemplate:			"Template",
	newslFormNewAddr:			"Add addresses",
	newslBtSave:				"Save",
	newslBtDel:					"Delete",
	newslBtSend:				"Send",
	newslBtSendSelected:		"Send to selected",
	newslBtSendAll:				"Send to all",
	newslBtPreview:				"Preview",
	newslBtDelAddresses: 		"Delete selected",
	
	newslPopSelectA:			"Select addresses",
	
	newslMessageDel:			"Delete the newsletter \"{$}\" ?",
	newslMessageDelAddr: 		"Delete the selected addresses ?",
	newslMessageSent: 			"Newsletter sent."
}};
Object.extend(Noa.langData.uk_en, Newsletter.lang.uk_en);


Newsletter.lang = {fr_fr:{
	newsletterTitle:			"Newsletter",
	
	newslBtLtr:					"Gérer les newsletters",
	newslBtAdd:					"Créer une newsletter",
	newslBtAddAddr:				"Ajouter",
	newslBtaddr:				"Gérer les adresses",
	
	newslFormSubject:			"Sujet",
	newslFormExp:				"Expéditeur",
	newslFormTemplate:			"Gabarit",
	newslFormNewAddr:			"Ajouter des adresses",
	newslBtSave:				"Enregistrer",
	newslBtDel:					"Supprimer",
	newslBtSend:				"Envoyer",
	newslBtSendSelected:		"Envoyer à la sélection",
	newslBtSendAll:				"Envoyer à toutes les adresses",
	newslBtPreview:				"Aperçu",
	newslBtDelAddresses: 		"Supprimer la sélection",
	
	newslPopSelectA:			"Sélectionner les destinataires",
	
	newslMessageDel:			"Supprimer la newsletter \"{$}\" ?",
	newslMessageDelAddr: 		"Supprimer les adresses sélectionnées ?",
	newslMessageSent: 			"Newsletter envoyée."
}};
Object.extend(Noa.langData.fr_fr, Newsletter.lang.fr_fr);