/* ############### CLASSE COOKIES ############### */

var Cookie = Class.create({

	initialize: function(name) {
		this.name = name;
		var date_exp = new Date();
		date_exp.setTime(date_exp.getTime()+(365*24*3600*1000));
		this.expire = date_exp.toGMTString();							
	},
	  
	set: function(value) {
		var argv	= this.set.arguments;
		var argc	= this.set.arguments.length;
		document.cookie = this.name + "=" + value + "; expires=" + this.expire + "; path=/";
	},
	
	getVal: function(offset) {
		var endstr=document.cookie.indexOf (";", offset);
		if (endstr==-1) {
	      		endstr=document.cookie.length;
	    }
		return unescape(document.cookie.substring(offset, endstr));
	},
	
	get: function() {
		var arg=this.name+"=";
		var alen=arg.length;
		var clen=document.cookie.length;
		var i=0;		
		while (i<clen) {
			var j=i+alen;
			if (document.cookie.substring(i, j)==arg) {
	        	return this.getVal (j);
	        }
	        i=document.cookie.indexOf(" ",i)+1;
	        if (i==0) {
	        	break;
	        }
	    }
		return null;
	}
	    
});

/* ############### CLASSE CATEGORIES ############### */

var Category = Class.create({

	initialize: function() {				
												
		this.refreshCookie = new Cookie('hikaru_refresh');
		this.categoriesCookie = new Cookie('hikaru_categories');

		this.refresh_notification = 
			(this.refreshCookie.get() == null) ? 0 : 1;		
								
		if(this.categoriesCookie.get() != null) {		
			this.categories = $H(this.categoriesCookie.get().evalJSON());				
		} else {
			this.categories = new Hash();
			this.categories.set('jeux_videos',true);
			this.categories.set('doujins'	 ,true);
			this.categories.set('anime'		 ,true);						
			this.categories.set('figurines'	 ,true);			
			this.categories.set('autres'	 ,true);
			this.categories.set('musique'	 ,true);
			this.categoriesCookie.set(this.categories.toJSON());											
		}	
							
	},	
	
	toggle: function(category, activate) {

		if(this.refresh_notification == 0) {
			var msg = "Vous devez rafra\xEEchir la page pour que les modifications soient prises en compte.\nPour cela vous pouvez appuyer sur l'ic\xF4ne bleu dans le menu de droite, ou sur la touche F5 de votre clavier.\nEn appuyant sur \"ok\" vous ne verrez plus ce message."
			if (confirm(msg)) {
				this.refresh_notification = 1;
				this.refreshCookie.set('1');
			}						
		}
				
		this.categories.set(category, activate);	
		this.categoriesCookie.set(this.categories.toJSON());
				
	}	
	
});

/* ############### HTML POTIONS BUILDER ################ */

var Fragment = {
		
	ratingBuilder: function(rating_points, rating_count) {
	
		var rating = Math.round(2*(rating_points/rating_count))/2;
		var dec_string = (Math.floor(rating) == rating) ? '.0' : '';			
		eval('rating = \'' + rating + dec_string + '\';');
									
		var regex  = /(\d).(\d)/;
		regex.exec(rating);
 		var integer    = RegExp.$1;
 		var decimal    = RegExp.$2;	
	
		var max_stars = 5;
		var rating_dom = '';

		for(var i=1;i<=integer;i++) {
			rating_dom += '<div class="rating r' + integer + '_0"></div>';					
		}		
		i--;

		if(parseInt(decimal) == 5) {
			rating_dom += '<div class="rating r' + integer + '_5"></div>';
			i++;
		}		

		for(var j=i+1;j<=max_stars;j++) {
			rating_dom += '<div class="rating r0_0"></div>';
		}

		rating_dom += '<br class="clear_l" />';		
		rating_dom += '<p class="rating_notice">note : ' 
			+ Math.round(100*(rating_points/rating_count))/100 
			+ ' - ' + rating_count + ' votes</p>';

		return rating_dom;
	},
	
	moduleBuilder: function(module_id, color, title, content) {		
		var module_dom = 
			    '<div class="module" id="' + module_id + '">' +
        			'<div class="footer">' +						
        				'<p class="module_title" style="background-color: ' + color + ';">' + title + '</p>' +					
						'<div class="module_content">' + 
							content + 
							'<div class="color_box_container"><div class="color_box" style="background-color: #ffb2e1"></div><div class="color_box" style="background-color: #e1b2ff"></div><div class="color_box" style="background-color: #b2d3ff"></div>'+
							'<div class="color_box" style="background-color: #b2ffe8"></div><div class="color_box" style="background-color: #cdffb2"></div><div class="color_box" style="background-color: #fff5b2"></div>'+
							'<div class="color_box" style="background-color: #ffc8b2"></div>'+
							'<span class="close">fermer</span>' +						
						'</div>' +        							
        			'</div>'+
        		'</div>'; 
        return module_dom;   					
	}
	
}

/* ############### MODULES ############### */

var Modules = {

	initialize: function() {
		this.modulesCookie = new Cookie('hikaru_modules');		
		this.restoreModules();	
	},

	restoreModules: function() {
		if(this.modulesCookie.get() != null) {
			var modules_list = this.modulesCookie.get().evalJSON();				
			for(var i=0;i<modules_list.length;i++) {	
				this.addModule(modules_list[i].id, modules_list[i].color, 'nosave', 'synchronous');				
			}	
		} else {
			this.addModule('partenaires');	
		}
	},
	
	addModule: function(module_id, color, save, sync) {			
		var color = color || '#FFBBE9';
		var save = save || 'save';
		var sync = sync || 'asynchronous';
		
		ajax_async = (sync == 'asynchronous') ?
						true:
						false;
			
		/* on verifie que le menu ne se trouve pas deja ds la liste */
		var modules = $$('#module_container .module');
		
		var already_in_menu = false;
		for(var i=0;i<modules.length;i++) {
			if(modules[i].id == module_id) {
				already_in_menu = true;			
			}		
		}
		
		if(already_in_menu == true) {
			alert('module d\xE9j\xE0 dans la liste');
		} else {				
			new Ajax.Request('/hikaru/ajax_jump.php', {
				method: 'get',
				asynchronous: ajax_async,
				parameters: '?module_id=' + module_id,
				onSuccess: function(transport) {
					response = transport.responseText.evalJSON();
					var dom = Fragment.moduleBuilder(module_id, color, response.title, response.content);
					$('module_container').innerHTML = $('module_container').innerHTML + dom;
					Observer.addEvent('.close', 'click', 'closeModule');
					Observer.addEvent('.color_box', 'click', 'colorModule');						
					Observer.createDragDrop();								
					if(save == 'save') {		
						HikaruEvent.toggleMenuModule();	
						Modules.saveConfiguration();
					}					
				}});			 
		}

	},

	saveConfiguration: function() {
		var modules = $$('#module_container .module');	
		var modules_configuration = new Array();		
		var title_elmnt;
		for(var i=0;i<modules.length;i++) {
			modules_configuration[i] = new Object();
			modules_configuration[i].id = modules[i].id;			
			eval('title_elmnt = $$(\'#' + modules[i].id + ' .module_title\')[0]');			
			modules_configuration[i].color = title_elmnt.style.backgroundColor;					
		}
		this.modulesCookie.set(modules_configuration.toJSON());
	}

}

/* ############### EVENTS & DRAGDROP ############### */

var Observer = {

	initialize: function() {								
				
		var so = new SWFObject("/flash/header.swf", "header", 1004, 213, "9", "#000000");
        so.write("header_container");
		
		var links = $$('#commentsList a');
		for(i=0;i<links.length;i++) {
			links[i].setAttribute("target","_blank");
		}
		
		if($('rating_stars') != null) {
			this.createRating();		
		}
		
		this.createEvents();	
		Modules.initialize();
				
	},

	createDragDrop: function() {
		Sortable.create('module_container',
							{tag:"div",only:"module",constraint:null,handle:"module_title",onUpdate: function() {Modules.saveConfiguration()}});
	},
	
	createEvents: function() {
		this.addEvent('.delicious', 'click', 'delicious');
		this.addEvent('#commentform', 'submit', 'commentForm');			
		this.addEvent('#add_module', 'click', 'toggleMenuModule');	
		this.addEvent('#select_module li', 'click', 'addModule');
		this.addEvent('.r_18 a:not(.delicious)', 'click', 'showR18Notice');			
	},
	
	createRating: function() {
	
	 	var form 		  = $('rating_post');
		var rating_points = parseInt($F(form.post_rating_points));
		var rating_count  = parseInt($F(form.post_rating_count));
		var post_id		  = $F(form.post_id);				
								
		var rating_dom = Fragment.ratingBuilder(rating_points, rating_count);		
		$$('#rating_stars')[0].innerHTML = rating_dom;
		
		this.ratingCookie = new Cookie('hikaru_rating');
		var ratings	= new Array();
		if(this.ratingCookie.get() != null) {
			ratings = this.ratingCookie.get().evalJSON();
		}		
		
		HikaruEvent.ratings = ratings;
		HikaruEvent.ratingCookie = this.ratingCookie;
		HikaruEvent.rating = new Object();
		HikaruEvent.rating.post_id = post_id;	
		HikaruEvent.rating.rating_points = rating_points;
		HikaruEvent.rating.rating_count = rating_count;
				
		if(!in_array(post_id,ratings)) {
			var ratings_div = $$('.rating');
			var newdiv;
			for(var i=0;i<ratings_div.length;i++) {
				j = i+1;
				newdiv	= document.createElement('div');
				newdiv.id = 'rate_' + j;
				newdiv.className = 'rating_add';		
				ratings_div[i].appendChild(newdiv);
				this.addEvent('#rate_' + j, 'mouseover', 'ratingOver');
				this.addEvent('#rate_' + j, 'mouseout', 'ratingOut');
				this.addEvent('#rate_' + j, 'click', 'ratingClick');									
			}
		}
		
	},
	
	addEvent: function(elmnt, event, fct) {
		var argv	= this.addEvent.arguments;
		var argc	= this.addEvent.arguments.length;		
		var addReturnFalse = (argc == 4) ? 	argv[3] : true;				
		var elements = $$(elmnt);
		for(i=0;i<elements.length;i++) {
			if(addReturnFalse != false) { 
				eval('elements[i].on' + event + ' = function() {return false;}');
			}
			Event.observe( 	elements[i], 
							event,
							eval('HikaruEvent.' + fct + '.bindAsEventListener(HikaruEvent)'));		
		}	
	}

};

var HikaruEvent = {
	
	delicious: function (event) {
		var elmnt = Event.element(event);
		var url = elmnt.href;
		window.open(url, '', 'toolbar=1,status=1,scrollbars=1,width=726,height=436,top=15,left=15');
	},
				
	commentForm: function(event) {

		var form    = Event.element(event);		
		var error_p = $$('#comment_error_msg')[0];		
		
		/*doesn't work directly with inner HTML on IE :(*/
		error_p.innerHTML = '';
		div 		= document.createElement('div');
		div.className   = 'ajax_loader';
		error_p.appendChild(div);
						
		var error   = '';	
						
		var email   = form.email;
		email.className = '';
		
		var comment = form.comment;
		comment.className = '';
		
		var author  = form.author;
		author.className = '';
		
		var form_ok = true;
		var verif;
	
		for (var i=0; i<form.sex.length;i++) {
			if (form.sex[i].checked) {
				var sex = form.sex[i].value;
			}
		} 
							 
		verif = /^.{1,25}$/;						
		if(verif.exec($F(author)) == null) {		
			form_ok = false;	
			error   += "auteur incorrect.<br />\n";
			author.className = 'error_border';		
		}
		
		verif = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9-]{2,}(\.[a-zA-Z]{2,4})+$/;
		if(verif.exec($F(email)) == null) {		
			form_ok = false;	
			error   += "email incorrect.<br />\n";			
			email.className = 'error_border';		
		}

		verif = /^.+$/m;						
		if(verif.exec($F(comment)) == null) {		
			form_ok = false;	
			error   += "commentaire incorrect.<br />\n";			
			comment.className = 'error_border';		
		}

		if(form_ok == false) {
			error_p.innerHTML = error;		
		} else {
			
			var sui = new Cookie('sessionuniqid');
			md5 = sui.get();			
				
			new Ajax.Request('/wp-comments-post.php', {
				method: 'post',
				parameters: '?author=' + encodeURIComponent($F(author)) + '&email=' + $F(email) + '&comment=' + encodeURIComponent($F(comment)) + '&sex=' + sex + '&comment_post_ID=' + $F(form.comment_post_ID) + '&md5=' + md5,
				onSuccess: function(transport) {			    	

			    	var response = transport.responseText.evalJSON();			    	
			    	if(response.status == 'inserted') {						
						$$('#commentsList')[0].innerHTML = response.comments;												
						error_p.innerHTML = '';
						span = document.createElement('span');
						span.innerHTML = 'message ajout&eacute; avec succ&egrave;s.';
						span.onclick = function () {Element.remove(span)};			
						error_p.appendChild(span);									    				    				    				    	
			    	} else if (response.status == 'duplicate') {
			    		error_p.innerHTML = 'le message n\'a pas &eacute;t&eacute; post&eacute; car vous avez d&eacute;j&agrave; post&eacute; le m&ecirc;me.';			    				    	
			    	} else if (response.status == 'flood') {
			    		error_p.innerHTML = 'trop de commentaires tue les commentaires !!';
			    	} else if (response.status == 'nocookie') {			    	
			    		error_p.innerHTML = 'vous devez activer les cookies !!';			    				    					    			    
			    	} else  {			    	
			    		error_p.innerHTML = '/!\\ Unknown error /!\\';
			    	}
				}
			});		
		
		}
	
	},
		
	ratingOver: function(event) {
		window.clearTimeout(this.timeout);
		var elmnt = Event.element(event);
		regex = /rate_(\d)/;
		regex.exec(elmnt.id);
	 	rating = RegExp.$1;	
		divs = $$('.rating_add');
		for(i=0;i<divs.length;i++) {
			divs[i].className = (i+1 <= rating) ?
				'rating_add r' + rating + '_0':
			    'rating_add r0_0';
		}		
	},
	
	ratingOut: function(event) {
		window.clearTimeout(this.timeout);	
		var elmnt = Event.element(event);
		divs = $$('.rating_add');
		/*avoid clignotment ^_^*/
		this.timeout = setTimeout(function() {
			for(i=0;i<divs.length;i++) {
				divs[i].className = 'rating_add';
			}	
   		}, 10);

	},	
			
	ratingClick: function(event) {
		window.clearTimeout(this.timeout);	
		var elmnt   = Event.element(event);
		var regex   = /rate_(\d)/;
		regex.exec(elmnt.id);
	 	var rating  = RegExp.$1;	
	 		 	
		var old_rating_points = this.rating.rating_points;
		var old_rating_count  = this.rating.rating_count;
		var post_id           = this.rating.post_id;
		 	
		$('rating_stars').innerHTML = '';
		div = document.createElement('div');
		div.className = 'ajax_loader';
		$('rating_stars').appendChild(div);	 	
	 	 
		new Ajax.Request('/ajax/rate/' + post_id, {
			method: 'post',
			parameters: '?rating=' + rating, 
			onSuccess: function(transport) {
						    	
		    	var response = transport.responseText.evalJSON();
		    	HikaruEvent.ratings[HikaruEvent.ratings.length] = post_id;
		    	HikaruEvent.ratingCookie.set(HikaruEvent.ratings.toJSON());
		    					    				    
		    	if(response.status == 'inserted') {	
		    		alert('vote pris en compte, si vous rafra\xEEchissez la page, celui ci peut prends jusqu\'\xE0 10mins avant d\'\xEAtre affich\xE9');
					var rating_dom = Fragment.ratingBuilder(old_rating_points + parseInt(rating), old_rating_count + 1);		
					$$('#rating_stars')[0].innerHTML = rating_dom;		    			    	
		    	
		    	} else {
		    		alert('d\xE9j\xE0 vot\xE9 ?');
					var rating_dom = Fragment.ratingBuilder(old_rating_points, old_rating_count);		
					$$('#rating_stars')[0].innerHTML = rating_dom;					    				    				    			    
				}
				
			}
		});					 		 		 		 		 

	 	 	
		divs = $$('.rating_add');
		for(i=0;i<divs.length;i++) {
			Element.remove(divs[i]);
		}		
	},	
		
	toggleMenuModule: function(event) {
		var menu = $('select_module');
		Element.toggle(menu);	
	},	
		
	addModule: function(event) {
		var elmnt   = Event.element(event);
		var regex   = /add_(.*)/;
		regex.exec(elmnt.id);
	 	var module_id  = RegExp.$1;
		Modules.addModule(module_id);
	},	
		
	closeModule: function(event) {
		var elmnt   = Event.element(event);
		Element.remove(elmnt.parentNode.parentNode.parentNode.parentNode);
		Modules.saveConfiguration();
	},			
		
	colorModule: function(event) {
		var elmnt   = Event.element(event);
		elmnt.parentNode.parentNode.parentNode.childNodes[0].style.backgroundColor = elmnt.style.backgroundColor;
		Modules.saveConfiguration();
	},	
		
	showR18Notice: function(event) {
		var elmnt = Event.element(event);		
		var href  = (elmnt.tagName == 'IMG') ?
			elmnt.parentNode.href :
			elmnt.href;
		var msg   = 'vous devez avoir 18 ans pour lire ce billet !!! Si vous ne les avez pas cliquez sur "ANNULER", la page suivante est prot\xE9g\xE9e par un tag ICRA !';
		if(confirm(msg)) {
			window.location = href;
		}
	},
		
	nothing: function(event){}
	
};

var Player = {		
	code: new Object(),
	add: function(from, id, container) {
		/*alert("from : " + from + "\n id : " + id + "\n container : " + container);*/			
		if(from == 'dailymotion') {
			eval('Player.code.c' + container + ' = \'<div class="flash"><object width="520" height="446"><param name="movie" value="http://www.dailymotion.com/swf/' + id +  '&colors=background:FFCFEB;foreground:F7407C;special:F7407C;&related=0"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.dailymotion.com/swf/' + id +  '&colors=background:FFCFEB;foreground:F7407C;special:F7407C;&related=0" type="application/x-shockwave-flash" width="520" height="446" allowFullScreen="true" allowScriptAccess="always"></embed></object></div>\'');		
		} else if (from == 'youtube') {	
			eval('Player.code.c' + container + ' = \'<div class="flash"><object width="480" height="360"><param name="movie" value="http://www.youtube.com/v/' + id +  '&hl=fr&rel=0&color1=0xcc2550&color2=0xe87a9f&ap=%2526fmt%3D18"></param><embed src="http://www.youtube.com/v/' + id +  '&hl=fr&rel=0&color1=0xcc2550&color2=0xe87a9f&ap=%2526fmt%3D18" type="application/x-shockwave-flash" width="480" height="360"></embed></object></div>\'');		
		} else if (from == 'mp3') {			
			var url =	
				(id.indexOf('http://') == -1) ?
					'/medias/mp3/' + id:
					id;					 
			eval('Player.code.c' + container + ' = \'<div class="mp3_player_container"><object width="300" height="20"><param name="movie" value="/flash/mediaplayer.swf"></param><embed src="/flash/mediaplayer.swf" type="application/x-shockwave-flash" width="300" height="20" flashvars="file=' + url +  '"></embed></object></div>\'');									
		}
		eval('document.observe(\'dom:loaded\',function() {$$(\'#\' + container)[0].innerHTML = Player.code.c' + container + '})');
	}
}

/* ############### LE RESTE ############### */

document.observe('dom:loaded', function () {Observer.initialize();});
function flash_toggle(category, activate){categoryObject.toggle(category, activate);}
function flash_getDefaultConfiguration() {getFlashMovie("header").defaultCategories(categoryObject.categories.toJSON());}
function getFlashMovie(movieName) {
	var isIE = navigator.appName.indexOf("Microsoft") != -1;
	return (isIE) ? window[movieName] : document[movieName];
}
var categoryObject = new Category();
function in_array(needle, haystack, strict) {
    var found = false, key, strict = !!strict; 
    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    } 
    return found;
}