var Commentaires = new Class({
	Implements: [Options, Events],
	
	options: {
		container : null
	},
	
	initialize: function(options){
		this.setOptions(options);
		this.container = $(this.options.container);
		this.containerFormulaire = $(this.options.containerFormulaire);
		this.initEtoilesMonCinoche();
		
		this.reqHistory = HistoryManager.register(
			'page-index',
			[0], // invalid default
			function(values) {
				this.changePage(values[0], values[1], values.length < 2);
			}.bind(this),
			function(values) {
				return 'page-index(' + values[0] + '-' + values[1] + ')';
			}.bind(this),
			/page-index\((\d+)\-(\d+)\)/ // the regexp to match "page-index(0)"
		);
		
		HistoryManager.register(
			'scroll',
			[], // invalid default
			function(values) {
				if( values.length > 0 ){
					new Fx.Scroll(window).toElement( $(values[0]) );
				}
			}.bind(this),
			function(values) {
				return 'scroll-' + values[0];
			}.bind(this),
			/scroll-([^;]+)/ // the regexp to match "page-index(0)"
		);
		
		HistoryManager.start();
					
		this.toolTips = new CinocheToolTips(null, {
			className: 'toolTipCinoche',
			text: 'rel'	});				
		
	},
	
	getCommentaires : function(commentaireID, page, sorting){
		/*ajaxLoader = new Element('img', {
			'class' : 'ajaxLoader', 
			'src' : '/assets/images/base/ajaxLoader.gif'
		}).inject(this.container);
		*/
		if(!sorting){
			sorting = 0;
		}
		
		var selfCommentaires = this;
		
		var jsonRequest = new Request.JSON({
			url: "/ajax/ajax.Commentaires.php", 
			data: { xhr : 'getCommentaires' , 'data' : actions, 'page' : page, 'sorting' : sorting},
			onSuccess: function(data){
				this.container.set('html',base64_decode(data.commentaires));
				
				if($('abus')){
					this.abusWindow = new StickyWin({
						content: $('abus').get('html'),
						closeClassName : 'closePanel',
						allowMultiple : false,
						showNow: false
					});
					
					this.abusShowed = false;
				}
				
				if($('ajoutCommentaire')){
					this.containerFormulaire.set('html',base64_decode(data.formulaire));
					this.initForm(this.containerFormulaire);
					this.containerFormulaire.getElement('form').removeEvents('submit');
					this.containerFormulaire.getElement('form').addEvent('submit', function(e){
						e.stop();
						this.envoyerCommentaire(this.containerFormulaire);						
					}.bind(this));
					
					
				}	
				
				if(username == ""){
					var message = 'Vous devez être connecté pour utiliser ces fonctions!';
					
					$$('.abus').set('rel', message);
					$$('.vote').set('rel', message);
					$$('.repondre').set('rel', message);
					$$('#mon-cinoche .encadre').set('rel', message);
					$$('.redigerBillet').set('rel', message);
					$$('.premier').set('rel', message);
					$$('.fauxTextBox').set('rel', message);
					
					this.toolTips.attach($$('.abus'));
					this.toolTips.attach($$('.fauxTextBox'));
					this.toolTips.attach($$('.premier'));
					this.toolTips.attach($$('.vote'));
					this.toolTips.attach($$('.repondre'));			
					this.toolTips.attach($$('#mon-cinoche .encadre'));		
					this.toolTips.attach($$('.redigerBillet'));
				}
				$$('.premier a').addEvent('click', function(e){
					e.stop();
					if (username != '') {
						new Fx.Scroll(window).toElement($('ajoutCommentaire').getElement('.frmCommentaire'));
					}
				});
				// fade les éléments étant déja répondu par l'utilisateur
				this.container.getElements('.fade').each(function(el){
					el.fade(0.5);
				});
				
				// Select box permettant de trier
				$$('.lstSortBy').each( function( lstSortBy ){
					new c2Select(lstSortBy, {
						onChange: function(value){
							selfCommentaires.changePage(1, value);
						}
					});
				});
				if($$('ul.wantToSee').length > 0){
                    $$('#listeCommentaires').hide();
                }
				$$('.redigerBillet a').addEvent('click', function(e){
					e.stop();
					if (username != '') {
						new Fx.Scroll(window).toElement($('ajoutCommentaire').getElement('.frmCommentaire'));
					}
				});
				
				// Pager
				if(!page){
					page = 1;
				}			
				
				new SimplePager({
					onChange: function( pageID ){
						selfCommentaires.changePage( pageID, sorting );
					}
				});
				
				$$('.masquer').hide();
				if($('commentaire_' + commentaireID)){
					new Fx.Scroll(window).toElement($('commentaire_' + commentaireID));
				}
			}.bind(this)
		}).send();
	},
	
	getReponses : function(container, parentID, reponseID){
		/*ajaxLoader = new Element('img', {
			'class' : 'ajaxLoader', 
			'src' : 'assets/images/base/ajaxLoader.gif'
		}).inject($(container),'before');*/
		
		new Fx.Reveal($(container), {duration: 500, mode: 'horizontal'});

		if($(container).getFirst() && !reponseID){
			new Fx.Scroll(window).toElement($(container).getParent());
			$(container).dissolve();
			(function(){
				$(container).empty();
			}).delay(500);
			//ajaxLoader.destroy();
			$(container).getParent().getElement('.afficher').show().fade(1);
			$(container).getParent().getElement('.masquer').fade(0).hide();
		}else{
			
			var jsonRequest = new Request.JSON({
				url: "/ajax/ajax.Commentaires.php", 
				data: { xhr : 'getReponses' , 'parent' : parentID},
				onSuccess: function(data){
					// fade les éléments étant déja répondu par l'utilisateur
					$(container).hide();
					$(container).set('html',base64_decode(data.commentaires));
					$(container).reveal();
					$(container).getElements('.fade').each(function(el){
						el.fade(0.5);
					})
					
					$(container).getParent().getElement('.afficher').fade(0).hide();
					
					$(container).getParent().getElement('.masquer').show().fade(1);
					
					if(reponseID){
						new Fx.Scroll(window).toElement($('commentaire_'+reponseID));
					}
					//ajaxLoader.destroy();
				}.bind(this)
			}).send();
		}
	},
	
	repondre : function(container,parentID){
		if(username != ''){
			if($(container).getElement('.frmReponse')){
				$(container).fade(0);
				(function(){ $(container).empty(); }).delay(500);
			}else{
				$(container).fade(0);
						var btnEnvoyerReponse = $(container).getElement('#btnEnvoyerReponse');
				var jsonRequest = new Request.JSON({
					url: "/ajax/ajax.Commentaires.php", 
					data: { xhr : 'getFormReponse' , 'parentID' : base64_encode(parentID)},
					onSuccess: function(data){
						$(container).set('html',base64_decode(data.formulaire)).fade(1);
						formulaireReponse = $(container).getElement('.frmReponse');
						
						mooeditable = formulaireReponse.getElement('.txtReponse').mooEditable({
							actions: ''
						});
						
						formulaireReponse.store('mooeditable', mooeditable);
						
						var self = this;
						formulaireReponse.addEvent('submit', function(e){
							e.stop();
							self.saveReponse(this);						
						});
						
						new Fx.Scroll(window).toElement($(container).getParent().getParent());
					}.bind(this)
				}).send();
			}
		}
	},
	
	vote : function(container, idCommentaire, vote, reponse){
		if(username != ''){
			$(container).fade(0);
			var data = JSON.encode({
				'username'				: 	username, 
				'idCommentaire'			: 	idCommentaire, 
				'vote' 					: 	vote,
				'reponse'				:	reponse});
			var jsonRequest = new Request.JSON({
				url: "/ajax/ajax.Commentaires.php", 
				data: { xhr : 'vote' , 'data' : base64_encode(data)},
				onSuccess: function(data){
					$(container).set('html',base64_decode(data.voteContent)).fade(1);
					$(container).getElements('.fade').each(function(el){
						el.fade(0.5);
					})
				}
			}).send();
		}
	},

	signalerAbus : function(container, idCommentaire){
		if(username != ''){
			
			//abusWindow = $('abus').clone();
			if(this.abusShowed){
				$(this.abusWindow).getElement('form').removeEvent('submit');
				
			}else{
				this.abusShowed = true;
				
			}
		
			this.abusWindow.show();	
	
			//$(container).adopt(abusWindow);
			$(this.abusWindow).getElement('form').reset();
			$(this.abusWindow).getElement('.commentaireID').set('value',idCommentaire);
			
			$(this.abusWindow).getElement('form').addEvent('submit', function(){	
				this.envoyerAbus($(this.abusWindow));
			}.bind(this));

		}
	},

	envoyerAbus : function(formulaire){
		var data = JSON.encode({
			'username'				: 	username, 
			'idCommentaire'			: 	formulaire.getElement('.commentaireID').get('value'), 
			'abus' 					: 	formulaire.getElement('.abusTypes').get('value'),
			'url'					: 	document.URL + '#' + formulaire.getElement('.commentaireID').get('value')
		});
		
		var container = '#abus_' + formulaire.getElement('.commentaireID').get('value');
		
		this.abusWindow.hide();
		
		var jsonRequest = new Request.JSON({
			url: "/ajax/ajax.Commentaires.php", 
			data: { xhr : 'signalerAbus' , 'data' : base64_encode(data)},
			onSuccess: function(data){
				
				
				$$(container).fade(0.5);
				$$(container).set('text',$$(container).getElement('a').get('text'));
				$$(container).getElement('a').destroy();
				
			}.bind(this)
		}).send();
		
	},

	initForm : function(formulaire){
		var mooeditable = formulaire.getElement('.txtCommentaire').mooEditable({
			actions: '',
			paragraphise : false,
            xhtml : false
		});
		
		formulaire.store('mooeditable', mooeditable);
		
		//Si c'Est dans la partie blog il y a la div choixSujet
		if(blog){
			this.makeAutocompleter(formulaire);
			
			formulaire.getElement('.typeSujet').addEvent('change',function(formulaire){
				formulaire.getElement('.idSujet').set('value','');
				this.destroyAutocompleter(formulaire);	
				this.makeAutocompleter(formulaire);
			}.bind(this,formulaire));
		}
		
		formulaire.getElements('.typeCommentaire').each(function(el){
			el.addEvent('click',function(){
				//Si c'est un commentaire enlever les étoiles
				//formulaire.getElement('.inputModuleStars').set('value','');
				if(this.get('value') == 1){
					formulaire.getElement('.cote').hide();
					//formulaire.getElement('.idMessage').set('value', '');
				}else{
					formulaire.getElement('.cote').show();
					
					formulaire.getElements('.cote #etoilesCote a').each(function(el){
						
						el.addEvent('click', function(e){
							e.stop();
							container = this.getParent().getParent();
							
							for(i=1;i<=10;i++){
								container.removeClass('star'+i);
							}
							newClass= parseInt(el.get('title')*2);
							container.addClass('star'+newClass);
							
							if(container.getElement('.inputModuleStars')){
								container.getElement('.inputModuleStars').set('value',this.get('title'));
							}
						})
					}) 
					
					/*var jsonRequest = new Request.JSON({
						url: "/ajax/ajax.CoteFilm.php", 
						data: { xhr : 'get' , 
								username : username64,
								film : filmId,
								readonly: false},
						onSuccess: function(data){
							if(data){
								formulaire.getElement('.cote #etoilesCote').set('html', data.star);	
								formulaire.getElements('.cote #etoilesCote a').each(function(el){
									
									el.addEvent('click', function(e){
										e.stop();
										container = this.getParent().getParent();
										widthTotal = container.getStyle('width').toString();
										widthTotal = widthTotal.replace('px','');
										
										container.getElement('.current-rating').setStyle('width',(this.get('title')/5)*widthTotal+'px');
										if(container.getElement('.inputModuleStars')){
											container.getElement('.inputModuleStars').set('value',this.get('title'));
										}
									})
								})
								
								if(data.messageId){
									formulaire.getElement('.idMessage').set('value', data.messageId);
								}
							}
						}.bind(this)
					}).send();*/
				}
			});
		});
		if (formulaire.getElement('.typeCommentaire:checked')) {
			formulaire.getElement('.typeCommentaire:checked').fireEvent('click');
		}else{
			//formulaire.getElement('.cote').hide();
		}
	},

	resetForm : function(formulaire){
		//Fonctions permettant de resetter le formulaire de commentaires
		
		mooeditable = formulaire.retrieve('mooeditable');
		mooeditable.detach();
		//SI c'est dans la partie blog ou non
		if(blog){
			formulaire.getElement('.idSujet').set('value','');
		}
		formulaire.getElement('.current-rating').setStyle('width','0px');
		formulaire.reset();
		formulaire.fireEvent('change');
		mooeditable.attach();
	},

	makeAutocompleter : function(formulaire){
		inputAutocompleter = new Element('input');
		formulaire.getElement('.autoCompleter').adopt(inputAutocompleter);
		autoCompleter = new Autocompleter.Request.JSON(inputAutocompleter, '/ajax/ajax.Commentaires.php', {
	        'postVar': 'search',
	        'postData' : {'xhr' : 'autocompleter', 'data' : formulaire.getElement('.typeSujet').get('value')},
	        'autoSubmit': true,
	        'width': '390px',
	        'minLength' : 3,
	        "onSelection": function(element,selection,token){
	        	var num_id = null;
	        	num_id = selection.get("id");
	        	num_id = num_id.replace("id_","");
	        	formulaire.getElement('.idSujet').set('value', num_id);
	        },
	        "injectChoice": function(token) {
				var choice = new Element("li",{"id": "id_"+token.id});
				
				new Element("span", {"html": this.markQueryValue(token.texte)}).inject(choice);
	        	choice.inputValue = token.texte;

				this.addChoiceEvents(choice).inject(this.choices);
	        }
	    });
	},
	
	saveReponse : function(formulaire){
		if(formulaire){
			mooeditable = formulaire.retrieve('mooeditable');
			parentID = formulaire.getElement('.parentID').get('value');
			mooeditable.saveContent();
			
                        var btnEnvoyerReponse = $('commentaire_'+parentID).getElement('#btnEnvoyerReponse');
                        btnEnvoyerReponse.setStyle('display','none');

                        titre = formulaire.getElement('.titre').get('value');
			message = mooeditable.getContent();
			
			error = false;
			
			inputTitre = null;
			inputMessage = null;
			
			if(!titre){
				error = true;
				messageErreur = 'Vous devez écrire un titre';
				inputTitre =  formulaire.getElement('.titre');
				
				this.addError(inputTitre, messageErreur, 'top');
			}else{
				if(inputTitre != null){
					this.removeError(inputTitre)
				}
			}
			
			if(!message){
				error = true;
				messageErreur = 'Vous devez écrire un message';
				
				inputMessage =  formulaire.getElement('.mooeditable-ui-toolbar');
				this.addError(inputMessage, messageErreur, 'before');
			}else{
				if(inputMessage != null){
					this.removeError(inputMessage)
				}
			}
			
			if(!error){
                                 var btnEnvoyerReponse = $('commentaire_'+parentID).getElement('#btnEnvoyerReponse');
                                 btnEnvoyerReponse.setStyle('display','none');
				var data = JSON.encode({
						'titre'				: 	titre, 
						'message'			: 	message, 
						'username' 			: 	username,
						'parentID'			: 	formulaire.getElement('.parentID').get('value')});
				var jsonRequest = new Request.JSON({
					url: "/ajax/ajax.Commentaires.php", 
					data: { xhr : 'ajoutReponse' , 'data' : base64_encode(data)},
					onSuccess: function(data){
						//refreshNbComments
						if(data.idReponse != false){
							formulaire.getParent().fade(0).empty();
                                                        btnEnvoyerReponse.setStyle('display','block');
							$('commentaire_'+parentID).getElements('.countReponses').each(function(el){
								el.set('html', data.nbReponses);
							});
							this.getReponses('reponses_'+parentID, parentID, data.idReponse);
							
							
						}
					}.bind(this)
				}).send();
			}
                        else{
                           btnEnvoyerReponse.setStyle('display','block');
                        }
		}
	},
	
	supprimer : function(container, messageID){
		if(messageID){
			var jsonRequest = new Request.JSON({
				url: "/ajax/ajax.Commentaires.php", 
				data: { xhr : 'supprimerMessage' , 'messageID' : base64_encode(messageID)},
				onSuccess: function(data){
					if(data == true){
						this.changePage(this.no_page, this.sorting,false, true); 
					}
					
					this.setEtoilesMonCinoche();
				}.bind(this)
			}).send();
		}
	},
	
	destroyAutocompleter : function(formulaire){
		autoCompleter.destroy();
		formulaire.getElement('.autoCompleter').empty();
	},
	
	changePage: function(no_page, sorting, noAnchor, noCheck){
		if( this.no_page == no_page && this.sorting == sorting && !noCheck ){
			return;
		}
		
		this.container.empty();
		
		this.no_page = no_page;
		this.sorting = sorting;
		
		this.getCommentaires(null, no_page, sorting);
		
		if( ! noAnchor ){
			this.reqHistory.setValue(0, no_page);
			this.reqHistory.setValue(1, sorting);
		}
	},
	
	addError: function(el, text, where){		
		var parent = el.getParent();
		
		if(!parent.getElement('.error')){
			error = new Element('div',
					{'html':text, 
					 'class': "error"}).inject(parent,where);
			
		}			
	},

	removeError: function(el){
		var parent = el.getParent();
		parent.getElement('.error').destroy();

	},
	
	envoyerCommentaire: function(formulaire){
                $('btnEnvoyerCommentaire').setStyle('display','none');
		mooeditable = formulaire.retrieve('mooeditable');
		
		parentID = formulaire.retrieve('parentID');
		
		mooeditable.saveContent();
		
		titre = formulaire.getElement('.titre').get('value');
		message = mooeditable.getContent();
		typeCommentaire = formulaire.getElement('.typeCommentaire:checked');
		
		error = false;

		inputTitre = null;
		inputMessage = null;
		inputTypeCommentaire = null;
                inputStars = null;
		
		if(!titre){
			error = true;
			messageErreur = 'Vous devez écrire un titre';
			inputTitre =  formulaire.getElement('.titre');
			
			this.addError(inputTitre, messageErreur, 'top');
		}else{
			if(inputTitre != null){
				this.removeError(inputTitre)
			}
		}
		
		if(!message){
			error = true;
			messageErreur = 'Vous devez écrire un message';
			
			inputMessage =  formulaire.getElement('.mooeditable-ui-toolbar');
			this.addError(inputMessage, messageErreur, 'before');
		}else{
			if(inputMessage != null){
				this.removeError(inputMessage)
			}
		}
		
		if(!typeCommentaire){
			error = true;
			messageErreur = 'Vous devez choisir un type de message';
			
			inputTypeCommentaire =  formulaire.getElements('.radioButtons');
			this.addError(inputTypeCommentaire[0], messageErreur, 'top');
		}else{
			typeCommentaire = formulaire.getElement('.typeCommentaire:checked').get('value');
			if(inputTypeCommentaire != null){			
				this.removeError(inputTypeCommentaire[0]);
			}
		}
		
                var etoiles = null;
                if(typeCommentaire == 2 && formulaire.getElement('.inputModuleStars') != null){
                        etoiles = formulaire.getElement('.inputModuleStars').get('value');
                        if (parseFloat(etoiles) < 0.5){
                            //alert("erreur cote");
                            //alert(etoiles);
                            inputStars =  formulaire.getElement('.star-ratingSet');
                            error = true;
                            messageErreur = 'Vous devez coter ce film';
                            this.addError(inputStars, messageErreur, 'bottom');
                        }else{
                            if(inputStars != null){
                                this.removeError(inputStars);
                            }
                            //alert("pas erreur cote");
                        }
                }

		if(!error){
			var lesEtoiles = null;
			if(formulaire.getElement('.inputModuleStars') != null){
				lesEtoiles = formulaire.getElement('.inputModuleStars').get('value');
			}
			var data = JSON.encode({
					'messageId'			: 	formulaire.getElement('.idMessage').get('value'),
					'titre'				: 	titre, 
					'message'			: 	message, 
					'username' 			: 	username,
					'idAssociation'		:	formulaire.getElement('.typeSujet').get('value'),
					'idRid'				:	formulaire.getElement('.idSujet').get('value'),
					'typeCommentaire'	:	typeCommentaire,
					'cote'				:	lesEtoiles,
					'parentID'			: 	parentID});
			var jsonRequest = new Request.JSON({
				url: "/ajax/ajax.Commentaires.php", 
				data: { xhr : 'ajoutCommentaires' , 'data' : base64_encode(data)},
				onSuccess: function(data){
					this.getCommentaires(data.commentID);
					$('btnEnvoyerCommentaire').setStyle('display','block');
					//Recharger les étoiles si changements
					var jsonRequest = new Request.JSON({
						url: "/ajax/ajax.CoteFilm.php", 
						data: { xhr : 'get' , 
								username : username,
								film : filmId,
								readonly: true},
						onSuccess: function(data){
							if(data){
								$$('#mon-cinoche .encadre').set('html', data);	
							}
						}.bind(this)
					}).send();
					//objCommentaires.resetForm(this);						
				}.bind(this)
			}).send();
		}else{
                    $('btnEnvoyerCommentaire').setStyle('display','block');
                }
		
		return false;
	},
	
	initEtoilesMonCinoche: function(){
		$$('#mon-cinoche .encadre .star-ratingSet a').addEvent('click', function(e){
			var valeurCote = this.get('title')
			var jsonRequest = new Request.JSON({
				url: "/ajax/ajax.CoteFilm.php", 
				data: { xhr : 'set' , 
						cote : valeurCote,
						username : username,
						film : filmId},
				onSuccess: function(data){
					//$$('#mon-cinoche .encadre .star-ratingSet').fade(1);
					if(data){
                                            $$('#mon-cinoche .encadre').set('html', data.monCinoche);
                                            $('etoilesCote').set('html', data.commentaire);
                                            $('ajoutCommentaire').getElement('.idMessage').set('value', data.messageId);
                                            new Element('input', {'class': 'inputModuleStars', 'name' : 'inputModuleStars', 'type' : 'hidden', 'value' : this.get('title')}).inject($('etoilesCote'));
					}
				}.bind(this)
			}).send();
		
			e.stop();
		});
	},
	
	setEtoilesMonCinoche: function(){
		var jsonRequest = new Request.JSON({
			url: "/ajax/ajax.CoteFilm.php", 
			data: { xhr : 'get' , 
					username : username,
					film : filmId,
					readonly: true},
			onSuccess: function(data){
				if(data){
					$$('#mon-cinoche .encadre').set('html', data);	
					if( username ){
						this.initEtoilesMonCinoche();
					}
				}
			}.bind(this)
		}).send();
	}
})

