/**
 * Main javascripts tools
 */
var core = {
	defaultContainer : "body",
	/**
	 * Javascript redirection
	 * @param string url
	 */
	goTo: function(url){
		window.location.href=url;
	},
	/**
	 * Multi replace with regexp
	 * @param str string to modify
	 * @param from array of regexp
	 * @param to array of replacement
	 * @returns
	 */
	replaceArray: function(str,from,to){
		if(typeof(str)!="string"||(typeof(from)!="string"&&typeof(to)!="string"&&from.length!=to.length))
			return false;
		for(var i=0;i<from.length;i++)
			str=str.replace(new RegExp(from[i],"g"),to[i]);
		return str;
	},
	/**
	 * Open a pop up
	 * @param object popup
	 * @param function onready
	 * @return object
	 */
	popUp: function(url,onready,onunload,height,width,scroll) {
		var config = (height?'height='+height:'')+(width?', ':'');
		config += (width?'width='+width:'');
		config += (width||height?', toolbar=no, menubar=no, scrollbars='+(scroll?'yes':'no')+', resizable=yes, location=no, directories=no, status=no':'');
		var popup = window.open(url,'',config);
		if (onready||onunload) setTimeout(poll, 10);
		function poll() {
			if (jQuery("body *", popup.document).length == 0) setTimeout(poll, 10);
			else {
				if(onready)
					onready(popup);
				if(onunload){
					core.onunload=onunload;
				}
			}
		};
		return popup;
	},
	/**
	 * Launch a modal pop up
	 * @param target modal popup actioner
	 * @param url to load
	 * @param title
	 * @returns void
	 */
	modalPopUp: function(target,url,title){
		$(target).bind('click',function(){
			var n=$('div[id^="modal"]').length;
			$('#content').before('<div id="modal'+n+'"><div class="preloader"></div></div>');
			$('#modal'+n).load(url,function(){
				core.initUI("#modal"+n);
				$("#modal"+n).find('a.uiicon-cancel').removeAttr('href').click(function(){$("#modal"+n).dialog('close');$(target).trigger('dataCanceled');return false;});
				$("#modal"+n).find('a:not([href$=".pop"])').click(function(){return false;});
				$(this).dialog({
					width:650,
					height:'auto',
					modal:true,
					draggable:false,
					resizable:false,
					title:title,
					close : function(){
						$(this).remove();
					}
				});
				if($(this).dialog("widget").height() > $('#content').height()-10){
					$(this).dialog( "option", "height", $('#content').height()-10 );
				}
				$("#modal"+n+" form[action]").submit(function(e){
					if($('#error').is(':hidden')){
						$("#modal"+n).prepend('<div class="preloader" style="position:absolute;"></div>');
						$.post($(this).attr('action').replace(/\.html/g,'.pop'),$(this).formToJQueryAjax(),function(data){
							if(data){
								$(target).trigger('dataSaved');
								core.indicator("Enregistrement effectu&eacute;");
							}else{
								core.error("Erreur lors de l'enregistrement");
							}
							$("#modal"+n).dialog("close");
						});
					}
					return false;
				});
				//console.log($("#modal"+n+" form[action]").data('events'));
			});
			return false;
		});
	},
	/**
	 * Embed a flash uploader
	 * @param idtarget into embedding
	 * @param folder target folder of uploading
	 * @param onloadstart
	 * @param onloadcomplete
	 * @return void
	 */
	embedUploader: function(idtarget,folder,persistant){
		$("#"+idtarget).after("<div class='flashUploader'><span id='up_"+idtarget+"'>Vous avez besoin de <a href='http://www.adobe.com/go/getflashplayer'>Flash Player</a> pour envoyer des fichiers.</span></div>")
		.before('<span id="menu_'+idtarget+'"><button type="button" class="uiicon-document viewtext">Voir : '+$('#'+idtarget).val()+'</button><button type="button" class="uiicon-delete viewtext">Supprimer</button></span>');
		$("#menu_"+idtarget+" button").isButton().parent().buttonset();
		var flashparams = {
			menu:false,
			wmode:"transparent",
			width:250,
			height:28
		};
		var flashvars = {
			dir:folder,
			php:"/upload/upload.php",
			id:idtarget,
			loadStart:"core.uploadStart",
			loadComplete:"core.uploadComplete",
			theme:"/lib/flash/themeUploader.xml"
		};
		var flag = new Date();
		swfobject.embedSWF(
			"lib/flash/SimpleFlashUploader.swf?"+flag.getMilliseconds(),
			"up_"+idtarget,
			flashparams.width,
			flashparams.height,
			"9.0.0",
			"expressInstall.swf",
			flashvars,
			flashparams,
			false,
			function(){
				if($("#"+idtarget).val()!=""){
					$("#up_"+idtarget).parent().hide();
				}else{
					$("#menu_"+idtarget+" button").button('disable');
					$("#menu_"+idtarget).hide();
				}
				$('#'+idtarget).trigger('flashReady');
			}
		);
		$("#menu_"+idtarget+" .uiicon-document").click(function(){
			core.popUp('/upload/'+folder+$("#"+idtarget).val(),false,false,900,600,true);
		});
		if(!persistant){
			$("#menu_"+idtarget+" .uiicon-delete").click(function(){
				$("#"+idtarget).val('');
				$("#up_"+idtarget).parent().show();
				$("#menu_"+idtarget).hide();
			});
		}else{
			$("#menu_"+idtarget+" .uiicon-delete").click(function(){
				$("#"+idtarget).parent().remove();
			});
		}
	},
	uploadStart: function(idtarget){
		$("#menu_"+idtarget+" button").button('disable');
		$("#"+idtarget).trigger('uploadStart');
	},
	uploadComplete: function(value,idtarget){
		if(value!="0"){
			$("#"+idtarget).val(value);
			$("#menu_"+idtarget+" button.uiicon-document").button( "option", "label", 'Voir : '+value);
			$("#menu_"+idtarget).show();
			$("#up_"+idtarget).parent().hide();
			$("#menu_"+idtarget+" button").button('enable');
			$("#"+idtarget).trigger('uploadComplete');
		}
	},
	/**
	 * Clean a string to be SEO friendly
	 * @param string string
	 * @return string
	 */
	stringToUrl: function(string){
		var url = string
		.toLowerCase()
		.replace(/^\s+|\s+$/g,"")
		.replace(/[\s]+/g,"-")
		.replace(/[^a-z0-9\+_-]+/g,"")
		.substring(0,40)
		.replace(/[_]+/g,"_")
		.replace(/^_+|_+$/g,""); 
		return url;
	},
	showUp : function(selector,message,nextTo){
		nextTo = nextTo==undefined?core.defaultContainer:nextTo;
		var pos = {
			my: nextTo==core.defaultContainer?'top':'center center',
			at: nextTo==core.defaultContainer?'top':'center center',
			of: nextTo,
			offset: "0 "+(nextTo==core.defaultContainer?"0":$(core.defaultContainer).scrollTop())
		};
		$(selector+' span.content').html(message);
		$(selector).position(pos);
		
		if(nextTo==core.defaultContainer)
			$(selector).css('top','0px');
			
		$(selector).show();
		$(selector).one('click',function(){clearTimeout(core.timeInd);$(selector).fadeOut();});
		if(core.timeInd!=undefined) clearTimeout(core.timeInd);
		core.timeInd=setTimeout("$('"+selector+"').fadeOut()",5000);
	},
	/**
	 * Show a message
	 * @param string message
	 */
	indicator:function(message,nextTo){
		core.showUp('#indicator', message, nextTo);
	},
	/**
	 * Show an error
	 * @param string message
	 */
	error:function(message,nextTo){
		core.showUp('#error', message, nextTo);
	},
	/**
	 * 
	 * @param param
	 * @param value
	 * @param oncomplete
	 * @returns
	 */
	setParam:function(param,value,oncomplete){
		if(!param||param==undefined) return false;
		value = value==undefined?true:value;
		$.post("/admin/update-param.xhtml",{"param":param,"value":value},typeof(oncomplete)=="function"?oncomplete:null);
		return true;
	},
	/**
	 * Different initialisation scripts
	 * @param selector
	 * @returns
	 */
	initNumericInput: function(selector){
		$(selector).find('input[numeric],input.numeric').filter(':not(.noUI)').isNumericInput();
	},
	initAutocomplete:function(selector){
		var target = 'input.autocomplete:not(.noUI)';
		if(selector)
			$(selector).find(target).isAutocomplete();
		else
			$(target).isAutocomplete();
	},
	initButtons:function(selector){
		var target = '[class*="uiicon-"],.toggler,:button,:submit,.button,.submit';
		if(selector)
			$(selector).find(target).not('.ui-button,.noUI').isButton();
		else
			$(target).not('.ui-button,.noUI:parent.buttonset').isButton();
	},
	initDatepicker:function(selector){
		var target = 'input.datepicker:not(.noUI)';
		if(selector)
			$(selector).find(target).isDatepicker();
		else
			$(target).isDatepicker();
	},
	initUI: function(target){
		target=target=="undefined"||!target?"body":target;
		$(target).find('.noUI').filter('p,div,span,table,th,tr,td,ul,li').find('input,textarea,button').addClass("noUI");
		//Ajoute une classe avec le nom du type de l'input pour ie < 8
		if($.browser.msie && $.browser.version<8){
			$(target).find('input[type=text],input[type=password],input[type=button],input[type=submit],input[type=radio],input[type=checkbox]').each(function(){
				$(this).addClass($(this).attr('type'));
			});
		}
		
		//Input text
		$(target).find('input![maxlength^="-"][maxlength!=524288][maxlength!=2147483647]').each(function(){
			$(this).limitChars($(this).attr('maxlength'));
		});
		
		//Input with numeric values only
		core.initNumericInput(target);
		
		//Lists
		$(target).find('.list:not(.noUI)').initRollOver();
		
		//Datepicker
		core.initDatepicker(target);
		
		//Buttons
		core.initButtons(target);
		$(target).find('.tag,.buttonset').not("noUI").buttonset();
		
		//Select menus
		//$(target).find('select').selectmenu({style:'popup'});
		
		//Autocompletion input
		$.ui.autocomplete.prototype._renderItem = function (ul, item) {
			if(item.id!=0)
				item.label = item.label.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $.ui.autocomplete.escapeRegex(this.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
			else
				item.label="<em>"+item.label+"</em>";
			return $("<li></li>")
				.data("item.autocomplete", item)
				.append("<a>" + item.label + "</a>")
				.appendTo(ul);
		};
		core.initAutocomplete(target);
		
		//Modal popup
		$(target).find('a[href$=".pop"]').each(function(){
			core.modalPopUp(this,$(this).attr('href'),$(this).attr('title'));
		});
		core.initK();
	},
	enableUI:function(target){
		$(target).find('.noUI').removeClass("noUI");
		core.initUI(target);
	},
	/**
	 * Used to debug javascripts objects
	 * @param args to log
	 * @returns void
	 */
	log:function(){
		var temp = "";
		for (var i=0; i<arguments.length; i++){
			var v = arguments[i];
			if(console!="undefined"&&console){ 
				console.log("%o",v);
			}else if(typeof(v)=="object"){
				temp += "{" + "\n";
				for (x in v)
					temp += "\t" + x + " : " + v[x] + "\n";
				temp += "}" + "\n";
			}else
				temp += "(" + typeof(v) + ") " + v + "\n";
		}
		if(temp!="") alert(temp);
		return;
	},
	/**
	 * Trim a string
	 * @param value String
	 * @return String|Boolean
	 */
	trim : function(value){
		if(typeof(value)=="string"){
			var space_reg = /(^\s*)|(\s*$)/g;
			return value.replace(space_reg,"");
		}
		return false;
	},
	/**
	 * Check if val is empty
	 * @param val
	 * @returns Boolean
	 */
	isEmpty : function(val){
		var t = typeof(val);
		var r = false;
		switch(t){
			case "string" :
				val = core.trim(val);
				if(val==""||val=="0") r = true;
			break;
			case "number" :
				if(val==0) r = true;
			break;
			case "boolean" :
				if(!val) r = true;
			break;
			case "object":
				r = true;
				for(var prop in val) {
					if(val.hasOwnProperty(prop))
						r = false;
				}
			break;
			case "undefined" :
				r = true;
		}
		return r;
	},
	/**
	 * Check if a string is an email
	 * @param val String
	 * @returns Boolean
	 */
	checkMail : function(val){
		if(typeof(val)!="string") return false;
		var reg = /^[a-z0-9._-]+@[a-z0-9.-]{2,}[.][a-z]{2,3}$/;
		return (reg.exec(val)!=null);
	},
	initK : function(){
		k = new K();
		k.code = function(){
			$('object,img').each(function(){
				$(this).replaceWith('<div style="display:inline-block;width:'+$(this).width()+'px;height:'+$(this).height()+'px;background-color:black">&nbsp;</div>');
			});
			$('#indicator').css('font-size','larger');
			core.timer=setInterval(function(){
				var c = $('body *:not(.blacked)').length;
				if(c){
					//rand = Math.floor(Math.random()*c);
					$('body *:not(.blacked):first')/*.eq(rand)*/.css({'color':'black','background':'black','border-color':'black'}).addClass("blacked");
				}else{
					clearInterval(core.timer);
				}
			}, 10);
		};
		k.load();
	},
	idVideo : function(u){
	var YT=(function(){
		return {
		getId:function(u){
		//var a=u.match(/(\/vi\/|v=)([^&amp;]+)/);
		//return (a[a.length-1]);
		var youtube_id = u.replace(/^[^v]+v.(.{11}).*/,"$1");
		return youtube_id;
		}
		};
		})();
		return YT.getId(u);
	},
	
	flash2 : function(nom, width, height, flashvar)
	{
		var NomF= nom;
		var WidthF = width;
		var HeightF = height;
		var FlashVarF = flashvar;
		document.write('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="'+ WidthF +'" height="'+ HeightF +'" id="'+ NomF +'">\n');
		document.write('<param name="movie" value="'+ NomF +'.swf" />\n');
		document.write('<param name="quality" value=high />\n');
		document.write('<param name="width" value="'+ WidthF +'" />\n');
		document.write('<param name="height" value="'+ HeightF +'" />\n');
		document.write('<param name="wmode" value="transparent" />\n');
		document.write('<param name="FlashVars" value="'+ FlashVarF +'" />\n');
		document.write('<embed src="'+ NomF +'.swf?'+ FlashVarF +'" FlashVars="'+ FlashVarF +'" quality="high" width="'+ WidthF +'" height="'+ HeightF +'" name="'+ NomF +'" wmode="transparent" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" ></embed>\n');
		document.write('</object>\n');
	} 
};
