CMSError = new Class
({
	initialize : function(form) 
	{
		this.form = form;
		
		this.errors = new Array();
		
		this.form.getElements('label').removeClass('label_error');
	},
	
	addError : function(field, error)
	{
		var _field = $(field);
		
		if(_field && this.errors.length == 0)
		{
			_field.focus();
		}
		
		if(this.form.getElement('label[for='+field+']'))
			this.form.getElement('label[for='+field+']').addClass('label_error');
			
		this.errors.include(error);
	},
	
	hasErrors : function()
	{
		return this.errors.length > 0 ? true : false;
	},
	
	isValidEmail : function(email)
	{
		var pattern = /^(([^<>()[\]\.,;:\s@"']+(\.[^<>()[\]\.,;:\s@"']+)*)|("[^"']+"))@((\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\])|(([a-zA-Z\d\-]+\.)+[a-zA-Z]{2,}))$/;
		
		return email.test(pattern);
	},
	
	printErrors : function(e)
	{
		if(this.hasErrors())
		{
			if(e)
				e.stop();
				
			if($('errors'))
				$('errors').dispose();
				
			if($('messages'))
				$('messages').dispose();
			
			if($('applicationMessage'))
			{
				var ull = new Element('ul', {'id' : 'errors'});

				this.errors.each(function(error, index)
				{
					ull.adopt(new Element('li', {'html' : error}));
				});
				
				$('applicationMessage').empty();
				$('applicationMessage').adopt(ull);
			}
			else
			{
				var test = '';

				this.errors.each(function(error, index)
				{
					test += error + "\n";
				});
				
				alert(test);
			}
		}
	}
});

var popUpOpen = false;

CMSPopUp = new Class
({
	Implements: [Options, Events],
	
	options: 
	{
		popUpElement : null,	// Objet repr?sentant le popup
		popUpTitle	 : null,	// Titre du popup
		
		popUpWidth : 600,		// Taille du popup
		popUpTop : 150,			// Position par rapport au dessus de la fen?tre
		
		textSelector : false
	},
	
	initialize : function(e, url, options) 
	{
		if(e != null)
			e.stop();
			
		this.url = url;
		
		this.setOptions(options);
			
		new Request.HTML(
		{
			url: this.url, 
			onSuccess: function(r1, r2, r3, r4)
			{
				if(this.options.textSelector)
				{
					var element = new Element('div', {'html' : r3}).getElement(this.options.textSelector);
					
					if(element)
						var content = element.get('html');
					else
						var content = '';
				}
				else
				{
					var content = r3;
				}
			
				var div = new Element('div', {'html' : content});
				
				$('popUpContent').set('html', div.get('html'));
				
				if($('cancelPopup'))
				{
					$('cancelPopup').addEvent('click', function(e)
					{
						e.stop();
						
						popUpOpen.hide();
					});
				}
			}.bind(this)
		}).post({'ajax' : '1'});
		
		
		if(popUpOpen)
			popUpOpen.hide();
		
	
		this.options.popUpElement = new Element('table', {'class' : 'popup'}).adopt(
			new Element('tbody').adopt(
				new Element('tr', {'class' : 'top'}).adopt(
					new Element('td', {'class' : 'left'}),
					new Element('td', {'class' : 'center'}).setStyle('width', this.options.popUpWidth+'px'),
					new Element('td', {'class' : 'right'})
				),
				new Element('tr', {'class' : 'middle'}).adopt(
					new Element('td', {'class' : 'left'}),
					new Element('td', {'class' : 'center', 'id' : 'popUpContent'}).setStyle('width', this.options.popUpWidth+'px'),
					new Element('td', {'class' : 'right'})
				),
				new Element('tr', {'class' : 'bottom'}).adopt(
					new Element('td', {'class' : 'left'}),
					new Element('td', {'class' : 'center'}).setStyle('width', this.options.popUpWidth+'px'),
					new Element('td', {'class' : 'right'})
				)
			)
		);
		
		this.options.popUpElement.setStyles(
		{
			'left'		: (document.getSize().x - this.options.popUpWidth) / 2,
			'top'		: (this.options.popUpTop + window.getScroll().y)+'px',
			'display'	: 'block'
		});
		
		this.insert();
	},
	
	insert : function()
	{
		this.overlay = new Element('div', { 'id':'popUpOverlay','styles':{ 'opacity':0,'visibility':'visible','height':0,'overflow':'hidden' }}).inject($(document.body));
		
		this.overlay.setStyles({ 'top': -$(window).getScroll().y,'height':$(window).getScrollSize().y+$(window).getScroll().y });
		
		this.overlay.fade(0.3);
		
		$(document.body).adopt(this.options.popUpElement);
		
		if(this.cancelButton) this.cancelButton.focus();
		if(this.closeButton) this.closeButton.focus();
		if(this.submitButton) this.submitButton.focus();
			
		popUpOpen = this;
		
		this.overlay.addEvent('click', function(e)
		{
			popUpOpen.hide();
		});
	},
	
	hide : function(e)
	{
		if(e != null)
			e = new Event(e).stop();
			
		this.options.popUpElement.dispose(); 
		
		this.overlay.dispose();
		
		popUpOpen = false;
	}
});

CMSAgenda = new Class
({
	initialize : function(options) 
	{
		this.id 			= options.id;
		this.navYear 		= options.navYear;
		this.navMonth 		= options.navMonth;
		this.navEventsAjax 	= options.navEventsAjax;
		
		window.addEvent('domready', function(e)
		{
			this.loadEvents(this);
		}.bind(this));
	},
	
	loadEvents : function(agenda)
	{
		if($(agenda.id))
		{
			// Année précédente
			if($(agenda.id).getElement('span.navYearPrev a'))
				$(agenda.id).getElement('span.navYearPrev a').addEvent('click', function(e)  { agenda.getCalendar(e, this.href); });
			
			// Année suivante
			if($(agenda.id).getElement('span.navYearNext a'))
				$(agenda.id).getElement('span.navYearNext a').addEvent('click', function(e)  { agenda.getCalendar(e, this.href); });
			
			// Mois précédent
			if($(agenda.id).getElement('span.navMonthPrev a'))
				$(agenda.id).getElement('span.navMonthPrev a').addEvent('click', function(e) { agenda.getCalendar(e, this.href); });
			
			// Mois suivant
			if($(agenda.id).getElement('span.navMonthNext a'))
				$(agenda.id).getElement('span.navMonthNext a').addEvent('click', function(e) { agenda.getCalendar(e, this.href); });
				
			// Quand on clique sur un jour
			if(this.navEventsAjax)
			{
				$(agenda.id).getElements('td.day a').addEvent('click', function(e)
				{
					e.stop();
					
					new CMSPopUp(e, this.get('href'), 
					{ 
						popUpWidth : 800,
						textSelector : '.events_list'
					});
				});
			}
		}
	},
	
	getCalendar : function(e, href)
	{
		e.stop();
		
		new Request.JSON(
		{
			url : href,
			onComplete : function(json, r)
			{
				$(this.id).set('html', r);
				
				this.loadEvents(this);
			}.bind(this)
		}).post({'ajaxCalendar' : '1', 'navYear' : this.navYear, 'navMonth' : this.navMonth});
	}
});

CMSRegisterBox = new Class
({
	initialize : function(uniqid, labels_in_inputs)
	{
		window.addEvent('domready', function(e)
		{
			if($(uniqid))
			{
				$(uniqid).getElement('form').addEvent('submit', function(e)
				{
					var err = new CMSError(this);
						
					var formEmail 	= $('newsletter_field_email'+uniqid);
					var formCaptcha	= $('newsletter_field_captcha'+uniqid);
						
					var regexp = /^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/;
					
					if(formEmail && !regexp.test(formEmail.get('value')))
						err.addError('newsletter_field_email'+uniqid, error_email_invalide);
					
					if(formCaptcha && formCaptcha.get('value').clean() == '')
						err.addError('newsletter_field_captcha'+uniqid, error_captcha_vide);
						
					err.printErrors(e)
				});
				
				if(labels_in_inputs)
				{
					$(uniqid).getElement('form').getElements('input[type=text]').addClass('blur');
					
					$(uniqid).getElement('form').getElements('input[type=text]').addEvent('focus', function(e)
					{
						if(this.hasClass('blur'))
						{
							this.store('value', this.get('value'));
							this.set('value', '');
							this.removeClass('blur');
						}
					});
					
					$(uniqid).getElement('form').getElements('input[type=text]').addEvent('blur', function(e)
					{
						if(this.get('value') == '')
						{
							this.set('value', this.retrieve('value'));
							this.addClass('blur');
						}
					});
				}
			}
		});
	}
});

CMSUnregisterBox = new Class
({
	initialize : function(uniqid)
	{
		window.addEvent('domready', function(e)
		{
			if($(uniqid))
			{
				$(uniqid).getElement('form').addEvent('submit', function(e)
				{
					var err = new CMSError(this);
						
					var formEmail 	= $('newsletter_field_email'+uniqid);
						
					var regexp = /^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/;
					
					if(formEmail && !regexp.test(formEmail.get('value')))
						err.addError('newsletter_field_email'+uniqid, error_email_invalide);
						
					err.printErrors(e)
				});
			}
		});
	}
});

CMSFormulaire = new Class
({
	initialize : function(uniqid, fields)
	{
		// Quand on soumet le formulaire, on teste les champs
		$(uniqid).getElement('form').addEvent('submit', function(e)
		{
			var err = new CMSError($(uniqid).getElement('form'));
			
			// Nombre de champs
			var nb_fields 	= fields.length;
			
			// On parcourt les champs du formulaire
			for(var i = 0; i < nb_fields; i++)
			{
				if(fields[i].type == 'radio') // Champ de type radios
				{
					var radioChecked = false;
					
					$$('input[name='+fields[i].nom+']').each(function(item, index)
					{
						if(item.checked)
							radioChecked = true;
					});
					
					if(fields[i].obligatoire == 1 && !radioChecked)
						err.addError('field_'+fields[i].nom, fields[i].erreur);
				}
				if(fields[i].type == 'file') // Champ de type files
				{
					var fileSet	= $('field_'+fields[i].nom).get('value').clean();
					
					if(fields[i].obligatoire == 1 && fileSet == '')
						err.addError('field_'+fields[i].nom, fields[i].erreur);
				}
				else // Autres champs
				{
					if(fields[i].obligatoire == 1) // Chamb obligatoire
					{
						if(fields[i].pattern != null) // Si il y a un pattern
						{
							this.testPatternField(fields[i], err);
						}
					}
					
					else // Champ facultatif
					{
						if($('field_'+fields[i].nom).get('value').clean() != '') // Si il y a une valeur
						{
							if(fields[i].pattern != null) // Si il y a un pattern
							{
								this.testPatternField(fields[i], err);
							}
						}
					}
				}
			}
			
			err.printErrors(e)
		}.bind(this));
		
		// Construction des aides
		$$('img.helpImg').addEvent('mouseenter', function(e)
		{
			this.store('title', this.get('title'));

			this.set('title', '');
			
			var helper = new Element('div', 
			{
				'class'	: 'formTips',
				'html' 	: this.retrieve('title'),
				'style'	: 'position:absolute;background:#000000;color:white;padding:5px;width:170px;margin: -17px 0 0 -185px;'
			});
			
			helper.fade(0.9);
			
			helper.inject(this, 'after');
		});
		
		$$('img.helpImg').addEvent('mouseleave', function(e)
		{
			this.set('title', this.retrieve('title'));
			this.getNext().dispose();
		});
		
		// Bind de click aide
		if($(uniqid).getElement('form').getElement('a.refresh_captcha'))
		{
			$(uniqid).getElement('form').getElement('a.refresh_captcha').addEvent('click', function()
			{
				$(uniqid).getElement('form').getElement('img.img_captcha').set('src', '/captcha.html?t'+$time());
			});
		}
	},
	
	testPatternField : function(field, err)
	{
		field.pattern = unescape(field.pattern);
		
		if(field.pattern_option == '')
			var re = new RegExp(field.pattern);
		else
			var re = new RegExp(field.pattern, field.pattern_option);
	
		if(!re.exec($('field_'+field.nom).get('value')) || $('field_'+field.nom).get('value') == '') // Valeur incorrecte
			err.addError('field_'+field.nom, field.erreur);
	}
});
