/**
 * Fonction génériques pour tout le site
 */
Event.observe( document, 'dom:loaded', initJavascript );
//Event.observe( document, 'unload', unloadCache );
//Event.observe( document, 'mousemove',function(event){Event.stop(event)}.bindAsEventListener(window));
//Event.observe( window, 'resize', resize);
 
var divLoader = "<center><img src='/images/ajax.gif' style='margin:2px auto;'/></center>";
var bt = null;
var agenda = null;

var ec = new EventController();

function initJavascript(){
	window.eval();
	
	//on observe l'événement multi postpone
	ec.add("multipostpone",multipostpone);
	if($('leftmenu')) reloadAllIndicators();
}

function unloadCache(){
	Event.unloadCache();
}

function resize(){
	if($(tt_aElt[0])){
		x = (document.viewport.getWidth() - tt_aElt[0].getWidth()) / 2;
		y = (document.viewport.getHeight() - tt_aElt[0].getHeight()) / 2;
		$(tt_aElt[0]).setStyle({top: y+'px', left: x+'px'});
		$(tt_aElt[0]).show();
	}
}

/**
 * affiche la fenetre de login
 */
function showLogin()
{
  if ($('logincontener') && $('logincontener').style.display == 'none' )
  {
    Effect.Appear('logincontener', {duration: 0.5});
  }
}

/**
 * Permet de soumettre le formulaire dont le nom est passé en paramètre
 */
function submitForm(form,url,type){
	if(!Prototype.Browser.IE){
	   $(form).onsubmit();
	}else{
		new Ajax.Request(url, {
			asynchronous:true, 
			evalScripts:true, 
			parameters:$(form).serialize(this),
			onComplete:function(request, json){
					if(type=='r'){
						output = eval(request.responseText);
						read(output.read,null);
					}else if(type=='b'){
						bookmark(eval(request.responseText).bookmark,null);
						showUpdMessage(eval(request.responseText).update,null);
					}
				}, 
				onCreate:function(request, json){
					if($('upd_msg')) $('upd_msg').update(divLoader);
				}				
			}); 
		return false;
	}
	return false;
}

/**
 * cache la fenetre de login
 */
function hideLogin()
{
  if ($('logincontener') && $('logincontener').style.display != 'none' )
  {
    Effect.Fade('logincontener', {duration: 0.5});
  }
}

/**
 * fonction de validation d'un email
 * @param {Object} email: email a valider
 */
function validMail(email)
{
  email = email + "";
  var reg = /^([_a-z0-9-]+(\.[_a-z0-9-]+)*)@([_a-z0-9-]+(\.[_a-z0-9-]+)*)\.([a-z]{2,6})$/i;
  return reg.test(email);
}

/**
 * verifie que tous les champs obligatoires (qui ont une class css appel�e "mandatory") sont remplis avant de submiter le form
 * verifie egalement que les champs dont le nom contient "email" sont au bon format
 */
function checkForm(form_id,event)
{
  if($(form_id))
  {
    elts = $$('input.mandatory');
    txt = '';
    txtemail = '';
    for (i=0; i<elts.length; i++)
    {
      if (elts[i].value.blank())
      {
        txt += '- '+elts[i].name + '\n';
        elts[i].addClassName('red');
      }
      if (elts[i].name.indexOf('email') > -1)//le nom du champ contient email, on peut supposer que c'est un email et faire les verifs
      {
        if (!(elts[i].value.blank()) && !validMail(elts[i].value))
        {
        	elts[i].addClassName('red');
          txtemail = messageRessources["The email format is not valid !"]+"\n";
        }
      }
    }
    txt = (txt.length > 0) ? messageRessources["You must fill the following fields"]+":\n"+txt : '';
    txt = (txtemail.length > 0) ? txt+'\n'+txtemail : txt;
    if(txt.length > 0)
    {
      alert(txt);
      if(event){
      	Event.stop(event);
      }
      setTimeout(function(){
      	$$("input[type=submit]").each(function(element){ element.disabled=false;})
      	$$('input.mandatory').each(function(elt){
      		if(elt.hasClassName('red'))
      		{
      			elt.removeClassName('red');
      		}
      	});
      },3000);
      return false;
    }
    $(form_id).submit();
  }
}
/**
 * Permet d'annuler une redirection automatique
 * Il faut cependant toujours utiliser la variable redirectionTimeout
 */
function cancelRedirection(){
		clearTimeout(redirectionTimeout);
}
/**
 * dans le resum� de la commande, copie l'adresse de la company dans la billing adresse
 */
function copyAdr()
{
  if($('chkcopyAdr'))
  {
    chkbx = $('chkcopyAdr');
    if(chkbx.checked)
    {
      $('bcp_name').value = $F('cpn_name');
      $('bcp_address').value = $F('cpn_address');
      $('bcp_postcode').value = $F('cpn_postcode');
      $('bcp_city').value = $F('cpn_city');
      $('bcp_cty_id').value = $F('cty_id');
      $('bcp_sta_id').value = $F('sta_id');
      $('bcp_tel').value = $F('cpn_tel');
      $('bcp_num_intra').value = $F('cpn_num_intra');
    }
  }
}

function helpAutocomplete()
{
  //verifier si le focus n'est pas sur la suggest de l'autocomplete
  if($('company_auto_complete'))
  {
    new Ajax.Updater('company_detail', '/company/verifExist', 
      {parameters: {  company: $F('company')},
      asynchronous:true,
      evalScripts:true,
      onComplete:function(request, json){Element.hide('ajax_anim')},
      onCreate:function(request, json){Element.show('ajax_anim')}});
  }
}


/**
 * appel� sur le onKeyPress d'un input, limite la saisie des donn�es a des chiffres et des points et le backspace [\b]
 */
function limitDecimal(e)
{
  if(document.all) e=window.event; // for IE
  curChar = (e.which > 0) ? String.fromCharCode(e.which) : String.fromCharCode(e.keyCode);
  if (!curChar.match(/\d|\.|[\b]/))
  {
    return false;
  }
}

/**
 * cache une div 
 * @param {Object} id
 */
function hideDiv(id)
{
  if($(id))
  {
    $(id).hide();
  }
}

/**
 * affiche une div
 * @param {Object} id
 */
function showDiv(id)
{
  if($(id))
  {
    $(id).show();
  }
}


/**
 * cache une div avec EFFET DE FONDU
 * @param {Object} id
 */
function hideDivEffect(id)
{
  if($(id))
  {
    Effect.Fade(id, {duration: 0.5});
  }
}

/**
 * affiche une div avec EFFET DE FONDU
 * @param {Object} id
 */
function showDivEffect(id)
{
  if($(id))
  {
    Effect.Appear(id, {duration: 0.5});
  }
}

/**
 * cache une div avec EFFET DE FONDU
 * @param {Object} id
 */
function hideDivBlind(id)
{
  if($(id))
  {
    Effect.BlindUp(id, {duration: 0.5});
  }
}

/**
 * affiche une div avec EFFET DE FONDU
 * @param {Object} id
 */
function showDivBlind(id)
{
  if($(id))
  {
    Effect.BlindDown(id, {duration: 0.5});
  }
}

/**
 * appel en ajax la fonction qui va effacer un document
 * @param {Object} id
 */
function delDoc(id)
{
  if(confirm(messageRessources["Do you really want to delete this file ?"]))
  {
    new Ajax.Updater('doc_list',myurl+id, {asynchronous:true, evalScripts:false});
  }
}



/**
 * switch l'affichage d'une div pass� en param, entre block et none
 * @param {Object} id
 */
function swapDisplay(id)
{
  var div = $(id);
  div.style.display = (div.style.display == "block") ? "none" : "block";
}

/**
 * Fonctions d'Adobe pour le rollover
 * @param {Object} arg
 */
function newImage(arg) {
  if (document.images) {
    rslt = new Image();
    rslt.src = arg;
    return rslt;
  }
}

function changeImages() {
  if (document.images && (preloadFlag == true)) {
    for (var i=0; i<changeImages.arguments.length; i+=2) {
      document[changeImages.arguments[i]].src = changeImages.arguments[i+1];
    }
  }
}

var preloadFlag = false;
function preloadImages() {
  if (document.images) {
    btn_lyon_over = newImage("btn_lyon-over.gif");
    btn_sanfrancisco_over = newImage("btn_sanfrancisco-over.gif");
    preloadFlag = true;
  }
}

/**
 * limit le nombre de caracteres saisis dans un champ 'obj' a une taille de 'limit'
 * @param {Object} obj : l'objet dont on doit limiter la value (ce n'est pas l'id de l'objet)
 * @param {Object} limit : limite, en nb caracteres
 * @param {Object} tooltip : eventuellement, ID d'un tag ou on indique le nb caracteres tap�s (idealement, un SPAN)
 */
function limitChar(obj,limit,tooltip)
{
  if(obj && obj.id && $(obj.id))
  {
  	content = "";
  	if($F(obj.id))
  	{
	    content = $F(obj.id);
	    content = content.substring(0,limit);
	    $(obj.id).value = content;
  	}  
    if($(tooltip))
    {
      $(tooltip).innerHTML = limit - content.length;
    }
  }
}

/**
 * positionne la popup aux coordonnees de la mouse
 * @param {Object} event
 */
function mousepos(evt,obj)
{
//  evt = (!evt && window.event)?window.event:evt;
//  if (evt.pageX){
//    mousex = evt.pageX;
//    mousey = evt.pageY;
//  }
//  else if (evt.clientX){
//   mousex = evt.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
//   mousey = evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
//  }
  if(obj!=null){
  	obj.setStyle({left : Event.pointerX(evt)+10+"px" });
  	obj.setStyle({top : Event.pointerY(evt)+"px" });
  }else if($('popup')){
  	$('popup').setStyle({left : Event.pointerX(evt)+10+"px" });
  	$('popup').setStyle({top : Event.pointerY(evt)+"px" });
  }
}

/**
 * renvoi la position absolue d'un objet (par rapport a la div principale du site)
 * @param {Object} obj
 */
function coordElement(obj)
{
	objOff = obj.positionedOffset();
	objDim = obj.getDimensions();
//	siteOff = $("site").positionedOffset();
  var x = objOff[0];
  var y = objOff[1] /*- siteOff[1]*/;
  var w = objDim.width;
  var h = objDim.height; //à cause des bordures
  return {x:x,y:y,w:w,h:h};
}

/**
 * Affiche/cache les legendes sur les differentes pages, avec un effet de sliding
 */
function swapLegend()
{
  var target = ($('contentLegend'))? $('contentLegend') : null;
  var ico = ($('iconlegend'))? $('iconlegend') : null;
  if(target && ico)
  {
    if(target.style.display == 'none')
    {
      //target.style.display = 'block';
      new Effect.SlideDown('contentLegend',
        { duration: 0.5});
      ico.src = '/images/icone_moins.png';
    }else{
      //target.style.display = 'none';
      new Effect.SlideUp('contentLegend',
        { duration: 0.5});
      ico.src = '/images/icone_plus.png';
    }
    
    //addendum juste pour le calendar: on vire les filtres si il y en a
    if ($('free_grp')) 
    {
      $('free_grp').selectedIndex = 0;
      getFreeSlot();
    }
  }
}


/**
 * Permet d'afficher des liens situés dans une span en mouseover
 */
function toggleLink(elem,className){
	$(elem+"_span").toggle();
	//$(elem).toggleClassName(className);
}

/**
 * Permet d'afficher un effet de highlighting sur un element
 */

function hlAndRemove(elem){
	new Effect.Highlight(elem,{startcolor:'#DDFFE6',endcolor:'#7FFF8E',restorecolor:'#ffffff', queue: 'front'});
}

/**
 * show popup for the management of meeting request / messages
 */	
function link_to(cpn_id)
{
	var title = "<b>"+messageRessources["Team(s) of the Company"]+": </b>";
	Modalbox.show(url_popmeeting,{ width:780, title: title, params: {cpn_id: cpn_id},overlayClose : false,overlayOpacity:.50, method: 'post'});	
}

var ajax_load_img = "<img src='/images/ajax.gif' style='width:10px;'/>";
/**
 * Fonction permettant le reload du nombre de meetings en attente de réponse
 * Elle peut être appelée de toutes les pages du site
 */
var allready_lance1 = 0;
function waitingAnswerMeetings(){
	if(allready_lance1==0 && typeof(URL_MENU_INDICATOR) != "undefined"){
		allready_lance2 = 1;
		if($('waitingAnswerMeetings1')) $('waitingAnswerMeetings1').update(ajax_load_img);
		if($('waitingAnswerMeetings2')) $('waitingAnswerMeetings2').update(ajax_load_img);
		new Ajax.Request(URL_MENU_INDICATOR,{
			parameters: { type: 1 },
			onComplete: function(transport){
				if($('waitingAnswerMeetings1')) $('waitingAnswerMeetings1').update(transport.responseText);
				if($('waitingAnswerMeetings2')) $('waitingAnswerMeetings2').update(transport.responseText);
				allready_lance2 = 0;
			}
			});
	}
}

/**
 * Fonction permettant le reload du nombre de messages non lus
 * Elle peut être appelée de toutes les pages du site
 */
var allready_lance2 = 0;
function waitingUnreadMessages(){
	if (false) 
  {
    if (allready_lance2 == 0 && typeof(URL_MENU_INDICATOR) != "undefined") 
    {
      allready_lance2 = 1;
      if ($('waitingUnreadMessages')) 
        $('waitingUnreadMessages').update(ajax_load_img);
      new Ajax.Request(URL_MENU_INDICATOR, {
        parameters: {
          type: 2
        },
        onComplete: function(transport){
          if ($('waitingUnreadMessages')) 
            $('waitingUnreadMessages').update(transport.responseText);
          allready_lance2 = 0;
        }
      });
    }
  }
}

/**
 * Fonction permettant le reload du nombre d'alertes non lues
 * Elle peut être appelée de toutes les pages du site
 */
var allready_lance3 = 0;
function waitingUnreadAlerts(){
	if(allready_lance3==0){
		allready_lance3 = 1;
		if($('waitingUnreadAlerts')) $('waitingUnreadAlerts').update(ajax_load_img);
		new Ajax.Request(URL_MENU_INDICATOR,{
			parameters: { type: 3 },
			onComplete: function(transport){
				if($('waitingUnreadAlerts')) $('waitingUnreadAlerts').update(transport.responseText);
				allready_lance3 = 0;
			}
			});
		}
}

/**
 * Fonction permettant le reload des alertes précédentes
 * Elle peut être appelée de toutes les pages du site
 */
function reloadAllIndicators(){
//	waitingUnreadMessages();
//	waitingUnreadAlerts();
	waitingAnswerMeetings();
}

/**
 * ferme la popup et reinitialise son contenu TODO: plus utilisée ?
 */
function closePopup()
{
  $('content').innerHTML = "";
  $('popup').style.display = "none";
}


/**
* Fonction permettant de connaitre la position d'un objet
* par rapport au bord gauche de la page.
* Cet objet peut etre a l'interieur d'un autre objet.
*/
function getLeft(MyObject)
{
  if (MyObject.offsetParent)
    return (MyObject.offsetLeft + getLeft(MyObject.offsetParent));
  else
    return (MyObject.offsetLeft);
}

/**
* Fonction permettant de connaitre la position d'un objet
* par rapport au bord haut de la page.
* Cet objet peut etre a l'interieur d'un autre objet.
*/
function getTop(MyObject)
{
  if (MyObject.offsetParent)
    return (MyObject.offsetTop + getTop(MyObject.offsetParent));
  else
    return (MyObject.offsetTop);
}

/**
 * Permet d'afficher la popup meeting request
 */ 
 
 function showMeetingPopup(masId)
 {
 		// on va récupérer au moins le int_id et/ou le grp_id
 		var title = "<b>"+messageRessources["Meeting request"]+": </b>";
 		Modalbox.show(SHOW_MAS_POPUP,{ width:780, title: title, params: {mas_id: masId},overlayClose : false,overlayOpacity:.50, method: 'post'});		
 }

  /**
   * Affiche une popup qui permet de s'inscrire a un sous event (soirée, visite entreprise, GC Invest...)
   * @param {Object} sev_id
   * @param {Object} usr_id
   */
  function showRegisterSubEventPopup(sev_id, usr_id, gus_id)
  {
    var title = "";
    title = "<b>"+messageRessources["Register to..."]+"</b>";
    Modalbox.show(SHOW_SUBEVENT_POPUP,{ width:420, title: title, params: {sev_id: sev_id, usr_id: usr_id, gus_id: gus_id},overlayClose : false,overlayOpacity:.50, method: 'post'});  
  }


/**
 * Permet d'afficher la popup request a meeting
 */ 
 
 function showAskMeetingPopup(grp_id,int_id,only_message)
 {
 	  var title = "";
 		// on va récupérer au moins le int_id et/ou le grp_id
 		if($('grp_id') && !grp_id)	grp_id = $F('grp_id') ? $F('grp_id') : 0;
 		if($('int_id') && !int_id)	int_id = $F('int_id') ? $F('int_id') : 0;
 		if(!only_message)
 		{
 			title = "<b>"+messageRessources["Send a meeting request"]+": </b>";
 		}else{
 			title = "<b>"+messageRessources["Send a message"]+": </b>";
 		} 		
 		Modalbox.show(SHOW_ASK_MEETING_POPUP,{ width:420, title: title, params: {grp_id: grp_id, int_id: int_id,only_message: only_message},overlayClose : false,overlayOpacity:.50, method: 'post'}); 		
 }
 
 
 /**
  * Affiche la popup d'édition des infos du Directory
  */
  function showEditDirectoryPopup(url)
  {
  	Modalbox.show("<div id='popup'><center><img src='/images/ajax.gif' ></center></div>", {
  		 title: "<b>"+messageRessources["Edit company for directory"]+"</b>", width:780, height:400, overlayClose : false, overlayOpacity:.50, 
  		 afterLoad: function(){
  		 		new Ajax.Updater("popup",url, {asynchronous:true, evalScripts:true, method:'get', onSuccess: function(){ Modalbox.resizeToContent();} });
  		 }});
  }
 
/**
 * Permet d'afficher la popup request a meeting
 */ 
 
 function showTrialPopup(int_id,contacts)
 {
 	  var title = "";
 	  //on va sérializer la liste des contacts à inviter;
 	  var params = "int_id="+int_id+"&nb="+contacts.length+"&";
 	  var glue="";
 	  for(var c in contacts)
 	  {
 	  	 if(!isNaN(c))
 	  	 {
 	  	 		// 0 : type usr ou net, 1: user_network_id, 2: usr_id ou net_id
 	  	 		params +=glue+c+"="+contacts[c];
 	  	 		glue="&";
 	  	 }
 	  }
 		// on va récupérer au moins le int_id et/ou le grp_id
 		title = "<b>"+messageRessources["I want to meet them"]+"</b>";
 		Modalbox.show(SHOW_TRIAL_POPUP,{ width:420, title: title, params: params,overlayClose : false,overlayOpacity:.50, method: 'post'});  		
 }
 
 
function swapDefaultEmail(sens)
{
  valbox = $F('msg_receiver');
  //alert('ok1');
  if (sens && (valbox == messageRessources['Enter email address here']))
  {
    $('msg_receiver').value = '';
    $('msg_receiver').style.color = '#000';
  }
  if (!sens && (valbox == ''))
  {
    $('msg_receiver').value = messageRessources['Enter email address here'];
    $('msg_receiver').style.color = '#888';
  }
  //alert('ok2');
}
 
 /** 
 * permet d'afficher des messages d'update sans popup déjà ouverte 
 */
function showUpdate(jsonTxt)
{
	var json = eval(jsonTxt); 
	Modalbox.show("<div id='popup' style='margin:10px'><div id='upd_msg'><img src='/images/ajax.gif' /></div></div>",{ title: messageRessources["Update"], width:420, overlayClose : false,overlayOpacity:.50	,
  	afterLoad: 	function() { showUpdMessage(json.update,new Array());}
	});
}

 /**
 * Permet d'afficher un message de confirmation
 */ 
 function showUpdMessage(message,afterFinishFunction){
 		if(message && message.valid && $('upd_msg')){ 
        $('upd_msg').update(message.txt);
				if($('upd_msg').hasClassName('red')){
					$('upd_msg').removeClassName('red');
     }
     else 
       if ($('upd_msg').hasClassName('green')) {
					$('upd_msg').removeClassName('green');
 				}
		    $('upd_msg').addClassName(message.classe);
     if ($("MB_window")) 
       Modalbox.resizeToContent();
    	 	new Effect.Fade($('upd_msg'), {
    	 		delay: 3.0, 
    	 		duration: 0.5,
    	 		afterFinish: function() {
         if (afterFinishFunction != null && message.classe == 'green' && message.referer != 'calendar') {
           if ($("MB_window")) 
             Modalbox.hide();
           for (var i = 0; i < afterFinishFunction.length; i++) {
	    	 				func=window.eval(afterFinishFunction[i]);
             if (func) 
               func;
           }
	    	 			}
         else {
           if ($("MB_window")) 
             Modalbox.hide();
	    	 		}
         if ($('validate_form')) 
           $('validate_form').disabled = false;
    				reloadAllIndicators();
       }
     });
   }
   else {
     if ($("MB_window")) 
       Modalbox.hide();
     if (afterFinishFunction != null) {
       for (var i = 0; i < afterFinishFunction.length; i++) {
	 				func=window.eval(afterFinishFunction[i]);
         if (func) 
           func;
       }
	 			}
     if ($('validate_form')) 
       $('validate_form').disabled = false;
		}
 }
 
 
 var list_item_action_selected = new Array();
 
 /**
  * Met à jour la liste des items selectionnés pour le multiselect
  */
 function toggleMultiSelect(elem)
 {
 	 list_item_action_selected = new Array();
 	 $$('#'+elem.identify()).each( function(c){
	 	 	if(c.checked)
	 	 	{
	 	 		list_item_action_selected.push(c.value);
	 	 	}
 	 });
 	 hlAndRemove("action_selected");
 	 $("action_selected").update(list_item_action_selected.length+" selected item(s)");
 }
 
 /**
 * cache le conteneur status
 * @param {Object} mas_id
 */
function hidePartials(type)
{
	list_item_action_selected.each( function(value){
		var table_upd = 'table_'+value;
		var parent = $(table_upd).ancestors()[0];
		$(parent).remove();
	});
	bt.loadDataCount();
}

 /**
 * permet de mettre a jour plusieurs demandes de meeting, en ajax
 * @param {Object} action_id : action demande => 1 accept, 2 decline, 3 cancel, 4 archive, 5 restore
 * @param {Object} mas_id : id de la demande
 */
function doActionMultiple(action_id,afterSuccessFunction,div)
{
	if(list_item_action_selected.length ==0){
		alert(messageRessources["Please select at least one item"]);
	}else{
		var list_mas_str = list_item_action_selected.join(",");
		list_item_action_selected = new Array();
		$("action_selected").update(list_item_action_selected.length+" "+messageRessources["selected item(s)"]);
		$$("#multi_select").each( function(c){
		 	 	if(c.checked){
		 	 			c.checked = false;
		 	 	}
		});
	 	doAction(action_id,list_mas_str,afterSuccessFunction,div);
	}
}

/**
 * permet de mettre a jour une demande de meeting, en ajax
 * @param {Object} action_id : action demande => 1 accept, 2 decline, 3 cancel, 4 archive, 5 restore
 * @param {Object} mas_id : id de la demande
 */
function doAction(action_id, mas_id,afterSuccessFunction,div)
{
  var txt_error = "";
  var booth_content = "";
  var slot_content = "";
  
	var msg = "<div class='margin20'>"
	+ "<form name='popup_form'  id='popup_form'>";

  switch(action_id)
  {
    case 1:
      titre = messageRessources["Do you really want to accept this meeting?"];
      trclass = "accepted";
      action_content = "";
      if($('content_accepted_booth_'+mas_id))
      {
      	booth_content = $F('content_accepted_booth_'+mas_id);
      }
      if($('content_accepted_slot_'+mas_id)){
      	slot_content = $F('content_accepted_slot_'+mas_id);
      }
      
      txt_error = messageRessources["Can not accept this request: you or the other group are no longer available on this slot"];
      break;
    case 2:
      titre = messageRessources["Do you really want to decline this meeting?"];
      trclass = "declined";
      action_content = "";
      break;
    case 3:
      titre = messageRessources["Do you really want to cancel this meeting?"];
      trclass = "canceled";
      action_content = "";
      break;
    case 4:
      titre = messageRessources["Do you really want to archive this meeting?"];
      trclass = "hidden";
      action_content = "";
      break;
    case 5:
      titre = messageRessources["Do you really want to restore this meeting?"];
      trclass = "";
      action_content = "";
      break;
  }
  
  var cancel_reason = "<select class='formfield' name='reason_select' id='reason_select' onchange=\"showInputTag(this,4,'reason_text');\">";
  cancel_reason += "<option value=''>"+messageRessources["Please select a reason"]+":</option>";
  cancel_reason += "<option value='"+messageRessources["Not available"]+"'>"+messageRessources["Not available"]+"</option>";
  cancel_reason += "<option value='"+messageRessources["Not interested"]+"'>"+messageRessources["Not interested"]+"</option>";
  cancel_reason += "<option value='"+messageRessources["Do not match my needs"]+"'>"+messageRessources["Do not match my needs"]+"</option>";
  cancel_reason += "<option value='0'>"+messageRessources["Add another reason"]+"</option>";
  cancel_reason += "</select>&nbsp;&nbsp;";
  cancel_reason += "<br /><textarea  rows=5   name='reason_text' id='reason_text' class='formfield fontItalic'  onfocus='toggleInput(this)' onblur='toggleInput(this)'>"+messageRessources["write a personal note"]+"</textarea>";
  
  var accept_reason = "<br /><textarea  rows=5  name='reason_text' id='reason_text' class='formfield fontItalic'  onfocus='toggleInput(this)' onblur='toggleInput(this)'>"+messageRessources["write a personal note"]+"</textarea><br/><br/>";
  
  if(action_id == 2 || action_id == 3)
  {
    msg += cancel_reason;
  }
  if(action_id == 1)
  {
    msg += accept_reason;
  }
  msg += "<input type=hidden name=action_id id='action_id' value=\""+action_id+"\" />";
  msg += "<input type=hidden name=mas_id id='mas_id' value=\""+mas_id+"\" />";
  msg += "<input type=hidden name=txt_error id='txt_error' value=\""+txt_error+"\" />";
  msg += "<input type=hidden name=action_content id='action_content' value=\""+action_content+"\" />";
  msg += "<input type=hidden name=booth_content id='booth_content' value=\""+booth_content+"\" />";
  msg += "<input type=hidden name=slot_content id='slot_content' value=\""+slot_content+"\" />";
  
  msg +="<br/><input id='validate_form' type='button' value='"+messageRessources["Confirm"]+"' class='link0' onclick=\"regActionMeeting(new Array(&quot;"+afterSuccessFunction+"&quot;))\" />  "+messageRessources["or"]+"  "
	+ "<a id='cancel' class='link1' onclick='Modalbox.hide()'>"+messageRessources["Cancel"]+"</a>"
	+ "</form>"
	+ "<div id='upd_msg'></div>"
	+ "</div>";
	
	Modalbox.show(msg,{ width:420, title: titre, overlayClose : false,overlayOpacity:.50,
  afterLoad:
  	function() { 
  		new Ajax.Updater('combo_grp'+mas_id, SHOW_FREE_SLOTS_URL, {
	      parameters: {mas_id: mas_id},
	      asynchronous: true,
	      evalScripts: true,
	      method:'post',
	      onCreate: function(){ $('combo_grp'+mas_id).update(divLoader);},
	      onComplete: function() { Modalbox.resizeToContent(); }
	    });
  	} 
  }); 
}

/**
 * Appelle en Ajax la page qui va effectuer les modifications sur le meeting mas_id (accepter/decliner/canceler)
 */
function regActionMeeting(afterSuccessFunction)
{
	var form = $("popup_form");
	//on recupere toutes les variables
//  if(updatemas!=undefined)
//  {
//    target = updatemas;
//  }else{
//    target = 'calendar/updatemas';
//  }
	var params = null;
	if(form)  //serialization des paramètres du formulaire
	{
		params = form.serialize(true);
		if(params["reason_text"]==messageRessources["write a personal note"]  || params["reason_text"]==messageRessources["enter a comment"])  params["reason_text"]="";
	}
  if(params!=null && params!='')
  {
  	if(form.action_id && form.mas_id) {
	    new Ajax.Request(UPDATE_MAS,{
		  	parameters: params,
		    asynchronous:true,
		    onCreate:function() { Modalbox.resizeToContent(); $('validate_form').disabled = true; $('upd_msg').update(divLoader)},
		    onComplete: function(transport){
						var json = eval(transport.responseText);
//						if(form.action_id.value==1 && json.intervalsToReload){
//							ec.fire("multipostpone",json.intervalsToReload.join(","),'accept');
//						}else{
							showUpdMessage(json.update,afterSuccessFunction);
//						}
						$('validate_form').disabled = false; 
						if(waitingAnswerMeetings && typeof waitingAnswerMeetings == "function") waitingAnswerMeetings();
						if(agenda && json.intervalsToReload!=null)
						{
							agenda.reload(json.intervalsToReload);
						}
					}
	    });
	  }
  }
  
}

/**
 * met a jour le contener status dans la liste des meetings
 * @param {Object} mas_id
 */
function reloadPartial(id,type)
{
	var table_upd = 'table_'+id;
  new Ajax.Request(RELOAD_PARTIAL,{
  	parameters: {id: id, type: type},
    asynchronous:true,
    onCreate:function() {$(table_upd).update(divLoader)},
    onComplete:function(transport) {
    	var template = $('lineTemplate').innerHTML;
    	var json = eval(transport.responseText);
    	var data = null;
			if(json.bindings.length>0)
			{
 				data = json.bindings;
			}
			var html = render(template,data[0]);
    	$(table_upd).replace(html);
    }
  })
}

/**
 * cache le conteneur status
 * @param {Object} mas_id
 */
function hidePartial(id,type)
{
	var table_upd = 'table_'+id;
	var parent = $(table_upd).ancestors()[0];
	$(parent).remove();
	bt.loadDataCount();
}

/**
 * Permet d'ajouter un champ input en fonction de l'entrée du select que l'on choisit par défaut
 */
function showInputTag(elem,index,input){
	if(elem.selectedIndex==index)
	{
		if($(input))		$(input).show();
	}else{
		if($(input))		$(input).hide();
	}
}


/**
 * appelle en ajax une page qui affichera un contenu detaill�e sur la company pass�e en parametre
 * @param {Object} cpn_id
 */
function showInfo(cpn_id)
{
  if($('popinfo_'+cpn_id) && url_popcompany && url_popcompany.length > 0)
  {
    //$('popinfo_'+cpn_id).innerHTML = "sfd fdsfsd ffds fsdqff qsfsdfs fsdf<br/> fdf qsf";
    new Ajax.Updater('popinfo_'+cpn_id, url_popcompany,
                {parameters:{cpn_id: cpn_id},
                  asynchronous:true, 
                  evalScripts:true,
                  onCreate:function() {},
                  onComplete:function() {}
                  }
                );
  }
}

function goRegister(){
	document.location.href = REGISTER_URL;
}

function goTrial(){
	document.location.href = TRIAL;
}

function goMas(id){
	document.location.href = SHOW_MAS.substr(0,SHOW_MAS.length-1)+id;
}

function goProfile(){
	document.location.href = MY_PROFILE;
}


function reloadPage(){
	if(bt){
		bt.loadDataCount();
	}else{
		document.location.reload();
	}
}

function multipostpone(){
	var args = $A(arguments);
	Modalbox.show(SHOW_MULTI_PENDING_POSTPONE+"/postpone",{ width:780, title: "<b>"+messageRessources['Postpone several meeting requests']+":</b>", params: {str_int_ids: args[0], from:  args[1]}, method:'post', overlayClose : false,overlayOpacity:.50,
  	afterLoad: 	function() { Modalbox.resizeToContent();} 
  });
}

/**
 * build the base of the form associated with the update of a meeting request (might be a real meeting or a in touch )
 * @param mas_id  id of the meeting 
 * @param message message to display at the top of the box
 * @param transform action to pass to the actual update php function might be ( 'message' to transform a in touch message => meeting request, 'location' to change location or 'postpone' to postpone a meeting )
 * @param afterSuccessFunction  javascript code block to call after the update is done (mainly used a confirmation message in the box )
 * @returns {String} the HTML tags 
 */
function buildUpdateMeetingHTML(mas_id, message, transform, afterSuccessFunction )
{

	
	var txt = "<div id='popup'>" +
			"<div class='margin20'>"+
	"<form name='popup_form'  id='popup_form' >";
	txt += message;
 	txt += "<div id='combo_grp"+mas_id+"' style='margin:3px 0px;'></div>";
	txt += "<input id='validate_form' type='button' value='"+messageRessources["Confirm"]+"'  class='link0'  onclick=\"delay(new Array(&quot;"+afterSuccessFunction+"&quot;),null,'" + transform +  "');return false;\"/>  "+messageRessources["or"]+"  ";
 	txt += "<a id='cancel' class='link1' onclick='Modalbox.hide();return false;'>"+messageRessources["Cancel"]+"</a>" +
	  	"</form>" +
	  	"<div id='upd_msg'></div>" +
	  	"</div>" +
	  	"</div>";

	
	return txt;
	
}
/**
 * generic function to show a form to update a meeting request
 * @param tag   html tag that is used as the base of the form ( the form is update via an ajax request )
 * @param form_title title of the form
 * @param mas_id  meeting request id 
 * @param grp_id  group id ( which group receiver or emitter ?? ) 
 * @param int_id interval associated with the meeting if any
 * @param boo_id booth id associated with the request
 * 
 */
function showUpdateMeetingBox(tag,form_title,mas_id, grp_id,int_id,boo_id)
{
	  Modalbox.show(tag,{ width:420, title: form_title, overlayClose : false,overlayOpacity:.50,
		  afterLoad:
		  	function() { 
		  		new Ajax.Updater('combo_grp'+mas_id, SHOW_FREE_SLOTS_URL, {
			      parameters: {grp_id: grp_id, mas_id: mas_id,int_id: int_id,boo_id: boo_id},
			      asynchronous: true,
			      evalScripts: true,
			      method:'post',
			      onCreate: function(){ 
			    	  $('combo_grp'+mas_id).update(divLoader);
			    	  },
			      onComplete: function() {
			    		  Modalbox.resizeToContent(); 
			    		  }
			    });
		  	} 
		  });
}
/**
 * build a HTML block to display title
 * @param title
 * @returns {String} decorated title
 */
function buildTitleTag(title)
{
	return  "<b>"+ title +"</b>";
}

function postpone(mas_id, grp_id,int_id,boo_id,div,afterSuccessFunction)
{    
 var txt = buildUpdateMeetingHTML(mas_id, messageRessources["You can postpone this meeting"], 'postpone', afterSuccessFunction );
 showUpdateMeetingBox( txt, buildTitleTag(messageRessources["Postpone this meeting request"]), mas_id, grp_id,int_id,boo_id);
}

function letsmeet(mas_id, grp_id,int_id,boo_id,div,afterSuccessFunction,status){
	
	if(int_id==null && status == null){
		var titre = messageRessources["Change location"];
		var message = messageRessources["You can change your location"]+":<br />";
	}
	else
	{
		var titre = messageRessources["Let's meet"];
		var message = messageRessources["You can ask for a meeting"]+":<br />";
	}
	
 	if(int_id==null && status == null)
 		var transform = "location";
	else
		var transform = "message";
 	
 var tags = buildUpdateMeetingHTML(mas_id,message,transform, afterSuccessFunction);
 showUpdateMeetingBox(tags,buildTitleTag(titre),mas_id, grp_id,int_id,boo_id );
}
/*
function postpone(mas_id, grp_id,int_id,boo_id,div,afterSuccessFunction){
	
	var txt = "<div class='margin20'>"+
			"<form name='popup_form'  id='popup_form' >" +
			messageRessources["You can postpone this meeting"]+":<br />" +
 			"<div id='combo_grp"+mas_id+"' style='margin:3px 0px;'></div>";

	// REFACTORING PD
	//		txt += "<input id='validate_form' type='button' value='"+messageRessources["Confirm"]+"'  class='link0'  onclick=\"delay(new Array(&quot;"+afterSuccessFunction+"&quot;),null,false);return false;\"/>  "+messageRessources["or"]+"  ";
 		txt += "<input id='validate_form' type='button' value='"+messageRessources["Confirm"]+"'  class='link0'  onclick=\"delay(new Array(&quot;"+afterSuccessFunction+"&quot;),null,'postpone');return false;\"/>  "+messageRessources["or"]+"  ";
 
 		txt += "<a id='cancel' class='link1' onclick='Modalbox.hide();return false;'>"+messageRessources["Cancel postpone"]+"</a>" +
 	  	"</form>" +
 	  	"<div id='upd_msg'></div>" +
 	  	"</div>";
    
  Modalbox.show("<div id='popup'>"+txt+"</div>",{ width:420, title: "<b>"+messageRessources["Postpone this meeting request"]+":</b>", overlayClose : false,overlayOpacity:.50,
  afterLoad:
  	function() { 
  		new Ajax.Updater('combo_grp'+mas_id, SHOW_FREE_SLOTS_URL, {
	      parameters: {grp_id: grp_id, mas_id: mas_id,int_id: int_id,boo_id: boo_id},
	      asynchronous: true,
	      evalScripts: true,
	      method:'post',
	      onCreate: function(){ $('combo_grp'+mas_id).update(divLoader);},
	      onComplete: function() { Modalbox.resizeToContent(); }
	    });
  	} 
  });
}

function letsmeet(mas_id, grp_id,int_id,boo_id,div,afterSuccessFunction,status){
	
	var txt = "<div class='margin20'>"+
			"<form name='popup_form'  id='popup_form' >";
	if(int_id==null && status == null){
		var titre = "<b>"+messageRessources["Change location"]+"</b>";
		txt += messageRessources["You can change your location"]+":<br />";
	}else{
		var titre = "<b>"+messageRessources["Let's meet"]+"</b>";
		txt += messageRessources["You can ask for a meeting"]+":<br />";
	}		
 	txt += "<div id='combo_grp"+mas_id+"' style='margin:3px 0px;'></div>";
 	if(int_id==null && status == null){
		txt += "<input id='validate_form' type='button' value='"+messageRessources["Confirm"]+"'  class='link0'  onclick=\"delay(new Array(&quot;"+afterSuccessFunction+"&quot;),null,'location');return false;\"/>  "+messageRessources["or"]+"  ";
	}else{
		txt += "<input id='validate_form' type='button' value='"+messageRessources["Confirm"]+"'  class='link0'  onclick=\"delay(new Array(&quot;"+afterSuccessFunction+"&quot;),null,'message');return false;\"/>  "+messageRessources["or"]+"  ";
	}	
 	txt += "<a id='cancel' class='link1' onclick='Modalbox.hide();return false;'>"+messageRessources["Cancel"]+"</a>" +
 	  	"</form>" +
 	  	"<div id='upd_msg'></div>" +
 	  	"</div>";
 	  	
  Modalbox.show("<div id='popup'>"+txt+"</div>",{ width:420, title: titre, overlayClose : false,overlayOpacity:.50,
  afterLoad:
  	function() { 
  		new Ajax.Updater('combo_grp'+mas_id, SHOW_FREE_SLOTS_URL, {
	      parameters: {grp_id: grp_id, mas_id: mas_id,int_id: int_id,boo_id: boo_id},
	      asynchronous: true,
	      evalScripts: true,
	      method:'post',
	      onCreate: function(){ $('combo_grp'+mas_id).update(divLoader);},
	      onComplete: function() { Modalbox.resizeToContent(); }
	    });
  	} 
  });  		
}

*/









 /**
  * Permet d'afficher ou de cacher la div de postpone dans la popup pending meeting requests
  */
  
function hideAllLiActionPostpone(){
	$('meeting_ask_agenda').getElementsBySelector('LI.selectedLiOver').each(
		function(li){
			$(li).removeClassName('selectedLiOver');
		}
	);
	$('meeting_ask_agenda').getElementsBySelector('DIV.action').each(
		function(li){
			if(li!=null && li.style.display!='none')
			{
				new Effect.Fade($(li),{duration:0.1});
			}
		}
	);
	
	$('meeting_ask_agenda').getElementsBySelector('DIV.postpone').each(
		function(li){
			if(li!=null && li.style.display!='none')
			{
				new Effect.Fade($(li),{duration:0.1});
			}
		}
	);
}
  
function togglePostPoneDiv(div)
{
	hideAllLiActionPostpone();		
	$(div).addClassName('selectedLiOver');
//	if($(div+'_toggle').innerHTML == '▼'){
//		$(div+'_toggle').update('▲');
		new Effect.Appear($(div+'_postpone'),{duration:0.5, afterFinish: function(){
			$('cancel').replace("<a id='cancel' class='link1' onclick=\"hideDiv('"+div+"_postpone')\">"+messageRessources["Cancel postpone"]+"</a>");
		}});
//	}else{
//		$(div+'_toggle').update('▼');
//	}
}

function toggleActionDiv(div,content)
{
	hideAllLiActionPostpone();
	$(div).addClassName('selectedLiOver');
	
	$(div+'_action').update(content);
	new Effect.Appear($(div+'_action'),{duration:0.5, afterFinish: function(){
		$('cancel').replace("<a id='cancel' class='link1' onclick=\"hideDiv('"+div+"_action')\">"+messageRessources["Cancel"]+"</a>");
	}});
}


/**
 * envoie un message aux groups selectionnés
 */
function SendToSelected(form)
{
	if(typeof tinyMCE != "undefined") tinyMCE.triggerSave();
	var form = $(form);
	var params = null;
	if(form)  //serialization des paramètres du formulaire
	{
		params = form.serialize(true);
	}
  if(params!=null && params!='')
	{
    new Ajax.Request(SEND_MESSAGE,{
				parameters: params,
        asynchronous:true, 
        evalScripts:true,
        onCreate:function() {$('upd_msg').update(divLoader)},
				onComplete: function(transport){
						var json = eval(transport.responseText);
						showUpdMessage(json.update,"");
						waitingUnreadMessages();
						reload();
					}
        }
      );
  }
}

/**
 * Permet de positionner une div ajax sur une autre div;
 */  
function setPosFromDivToOtherDiv(divTo, divFrom, noHeight,mailbox){
	if($(divTo))
	{
		var pos = coordElement($(divFrom));
		Position.absolutize($(divTo));
		if(mailbox){
			$(divTo).setStyle({top:(pos.y)+'px',left: (pos.x)+'px', width:(pos.w-4)+'px', height: (pos.h)+'px' });
		}else{
			if(!noHeight){
				$(divTo).setStyle({top:(pos.y)+'px',left: (pos.x)+'px', width:(pos.w)+'px', height: (pos.h)+'px' });
			}else{
				$(divTo).setStyle({top:(pos.y)+'px',left: (pos.x)+'px', width:(pos.w)+'px'});
			}
		}
	}
}

/**
 * Permet d'afficher une zone combobox-like
 */
var select_like = false;
function showSelectLike(eltParent,element){
	if($(element) && $(eltParent))
  {
  	if($(element).style.display!='none')
  	{
  		new Effect.Fade($(element), {duration: 0.5});
	    select_like = false;
  	}else{
	  	var pos = coordElement($(eltParent));
			Position.absolutize($(element));
			$(element).setStyle({top:(pos.y+pos.h)+'px',left: (pos.x)+'px', width:(pos.w-4)+'px', height:'auto'});
			select_like = true;
	    new Effect.Appear($(element), {
	    	duration: 0.5
	    });
  	}
  	$$("ul.select_like_ul").each( function(c){
			if(c.style.display!='none' && c!=element)
			{
				c.hide();
			}
		});
  }
}

/**
 * recupere la liste des LMM en attente sur un slot et permet de les modifier
 */
function getLmmInfo(int_id, grp_id,accepted)
{
  Modalbox.show(SHOW_POPUP_LMM,{ width:780, title: "<b>"+messageRessources["Meeting request"]+": </b>", params: {int_id: int_id, grp_id: grp_id, accepted: accepted},overlayClose : false,overlayOpacity:.50, method: 'post'}); 		
}

/**
 * gere le report d'un rdv (accepté ou non) en autre lmm
 */
function delay(afterSuccessFunction,form,transform)
{
	var params = null;
	if(form)  //serialization des paramètres d'un formulaire quelconque
	{
		params = $(form).serialize(true);
	}
	if($('popup_form'))  //serialization des paramètres du formulaire de la popup si il est présent
	{
		params = $('popup_form').serialize(true);
	}
//  if(confirm("This request will be converted to a PENDING request,\n even if it's already accepted.\nDo you want to proceed?"))
//  {
    if(params!=null)
    {
    	if(parseInt(params['boo_id'])==0 && params['boo_name'].length<1){
    		var update = new Object();
    		update.valid = true;
    		update.classe = "red";
    		update.txt = messageRessources["You have to fill a new location or choose an existing one!"];
    		showUpdMessage(update,afterSuccessFunction);
//    		alert("You have to fill the new location or choose an existing location!")
    	}else{
    		params['transform'] = transform;
	    	var target = $('upd_msg');
		    new Ajax.Request(DELAY_MAS, {
		      parameters: params,
		      method:'post',
		      onCreate: function(){if(target) target.update(divLoader);},
		      onComplete: function(transport){
		      		var json = eval(transport.responseText);
	            showUpdMessage(json.update,afterSuccessFunction);
	            if(json.intervalsToReload!=null)
	            {
	              agenda.reload(json.intervalsToReload);
	            }
	            waitingAnswerMeetings();
		      }
		    });
	    }
    }
//  }
}

var focusDefault = null;
function toggleInput(elem,defaultComment)
{
	focusDefault = $(elem).defaultValue;
	if(defaultComment!=null){
		if($F(elem)==defaultComment)	$(elem).value='';
		else if($F(elem)==''){
			$(elem).value=defaultComment;
		}
	}else{
		if($F(elem)==focusDefault)	$(elem).value='';
		else if($F(elem)==''){
			$(elem).value=focusDefault;
			focusDefault = null;
		}
	}
}

 /**
  * Affiche et supprime l'aide contextuelle dans un cadre fixe de la page
  */
 function UnTipCalendar(){
 		setTimeout(function(){if($('help_middle')){	$('help_middle').hide();}},2000);
 }
 function TipCalendar(content){
 		if($('help_middle'))
		{
	 		$('help_middle').update(content);
	 		$('help_middle').show();
		}
 }
 
 function maxLength(elem,max){
 		var txt = elem.value;
 		var left = max - txt.length;
 		$("max_length_"+elem.id).update(left+" "+messageRessources["characters left."]);
 		if(left<=0){
 			elem.value = txt.substr(0,max);
 		}
 }
 function toggleUnderline(elem){ if($(elem).hasClassName('textUnderline')){$(elem).removeClassName('textUnderline')}else{$(elem).addClassName('textUnderline')} }
 
 
/*** Gestion des cookies en javascript ***/
function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	//if(Prototype.Browser.WebKit)	value = value.replace(/,/,';');
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if(c.indexOf(nameEQ) == 0)
		{
			var value = c.substring(nameEQ.length,c.length);
			//if(Prototype.Browser.WebKit)	value = value.replace(/;/,',');
			return value;
		}
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

/*** Gestion des Vidéos***/
/**
 * Fonction de parsing de l'url de la vidéo à partir d'une balise objet livrée par Youtube, Dailumotion, etc
 */
function parseURL(elem){
	var val = $(elem).value;
	if(val!=''){
		//on teste si c'est une vidéo youtube
		if(val.indexOf("youtube.com")>=0){
			//tout d'abord on récupère l'id de la vidéo
			deb = val.indexOf("v=",0);
			val = val.substr(deb+2);
			fin = val.indexOf("&",0);
			id = fin == -1 ? val : val.substr(0,fin);
			//on ajoute l'id à l'url du lien flash
			$(elem).value = "http://www.youtube.com/v/"+id+"?fs=1&hl=en_US";
		}else if(val.indexOf("wideo")>=0){
			//tout d'abord on récupère l'id de la vidéo
			deb = val.indexOf("video/",0);
			val = val.substr(deb+6);
			fin = val.indexOf(".html",0);
			id = fin == -1 ? val : val.substr(0,fin);
			//on ajoute l'id à l'url du lien flash
			$(elem).value = "http://sll.kewego.com/swf/p3/epix.swf?language_code=en&playerKey=0df9b773a15b&skinKey=7109c4112f57&sig="+id+"&autostart=true&advertise=1";
		}else if(val.indexOf("vimeo")>=0){
			//tout d'abord on récupère l'id de la vidéo
			deb = val.indexOf("com/",0);
			if(val.indexOf("player.vimeo")>=0)
			{
				deb = val.indexOf("video/",0);
				val = val.substr(deb+6);
			}else{
				val = val.substr(deb+4);
			}
			fin = val.indexOf("&",0);
			id = fin == -1 ? val : val.substr(0,fin);
			//on ajoute l'id à l'url du lien flash
			$(elem).value = "http://vimeo.com/moogaloop.swf?clip_id="+id+"&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=&amp;fullscreen=1&amp;autoplay=1&amp;loop=0";
		}else if(val.indexOf("dailymotion")>=0){
			//tout d'abord on récupère l'id de la vidéo
			deb = val.indexOf("video/",0);
			val = val.substr(deb+6);
			fin = val.indexOf("_",0);
			id = fin == -1 ? val : val.substr(0,fin);
			//on ajoute l'id à l'url du lien flash
			$(elem).value = "http://www.dailymotion.com/swf/video/"+id+"?width=&theme=none&foreground=%23F7FFFD&highlight=%23FFC300&background=%23171D1B&start=&animatedTitle=&iframe=0&additionalInfos=0&autoPlay=1&hideInfos=0";
		}else{
			if(val.indexOf("name=\"movie\"")>=0 || val.indexOf("embed")>=0){
				deb = val.indexOf("http",0);
				val = val.substr(deb);
				fin = val.indexOf("\"",0);
				val = val.substr(0,fin);
				$(elem).value = val;
			}
			else{
				$(elem).value = "";
				alert("No embeded vidéo found. Please retry.");
			}
		}
	}
}
/**
 * Récupération de la valeur d'une liste par radiobutton
 */
function getRadioButtonCheckedValue(radioObj)
{
 if(!radioObj)	return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}

/** check si un formulaire est vide ou pas **/
function checkEmpty(event)
{
	var cont = true;
	var form = Event.element(event);
	var elements = $(form).getElements();
	elements.each(function(c){
		if(c.value==''){
			cont = false;
			if($(c.id+'_ifr')){
				ifr = $(c.id+'_ifr');
				c = ifr.contentWindow.document.body;
				c.style.backgroundColor ='#fdd';
				setTimeout(function(){c.style.backgroundColor ='#fff';},3000);
			}else{
				$(c).setStyle({backgroundColor:'#fdd'});
				setTimeout(function(){$(c).setStyle({backgroundColor:'#fff'});},3000);
			}
		}
	});
	return cont;
}


/**
 * affiche/cache l'exemple de saisie d'un participant dans l'input box
 * @param sens {boolean}: true si on cache, false si on affiche
 */
function swapSample(elt,sens)
{
  valbox = $F(elt);
  //alert('ok1');
  if (sens && (valbox == 'john smith'))
  {
    $(elt).value = '';
    $(elt).style.color = '#000';
  }
  if (!sens && (valbox == ''))
  {
    $(elt).value = 'john smith';
    $(elt).style.color = '#888';
  }
  //alert('ok2');
}


/**
 * Extension des objets javascript
 */
 //This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisp*/)
  {
    var len = this.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
        fun.call(thisp, this[i], i, this);
    }
  };
}

/**
 * Etend la classe Array pour ajouter une fonction  "has" permettant de vérifier la présence d'un élément
 */

Array.prototype.has = function(value) {
	var i;
	for (var i = 0, loopCnt = this.length; i < loopCnt; i++) {
		if (this[i] == value) {
			return true;
		}
	}
	return false;
};

Array.prototype.find = function(func) {
	for (var i = 0, l = this.length; i < l; ++i) {
		var item = this[i];
		if (func(item))
			return item;
	}
	return null;
};


/**
 * Ajout de méthode à l'objet String javascript
 */
Object.extend(String.prototype, {
  empty: function() {
    return this == '' || this == 'undefined';
  },
  blank: function() {
    return /^\s*$/.test(this);
  },
  equals: function(value) {
    return this == value;
  },
  contains: function(value) {
    return this.indexOf(value)!=-1;
  },
  unserialize: function(json){
  	var ret = new Object();
  	if(json){
  		var values = this.split("&");
  		for (var i = 0, l = values.length; i < l; ++i) {
				var key = values[i].split("=")[0];
				var value = values[i].split("=")[1];
				ret[key] = value;
			}
  	}
  	return ret;
  }
});


/**
 * Ajout de méthode à l'objet Date javascript
 */
Object.extend(Date.prototype, {
  toFormatedString: function(format){ //exemple de format  Y-m-d H:i:s
  	string = format.replace("Y",this.getFullYear());
  	string = string.replace("y",this.getYear());
  	string = string.replace("m",this.getMonth()+1<10 ? "0"+(this.getMonth()+1) : this.getMonth()+1);
  	string = string.replace("d",this.getDate()<10 ? "0"+this.getDate() : this.getDate());
  	string = string.replace("H",this.getHours()<10 ? "0"+this.getHours() : this.getHours());
  	string = string.replace("i",this.getMinutes()<10 ? "0"+this.getMinutes() : this.getMinutes());
  	string = string.replace("s",this.getSeconds()<10 ? "0"+this.getSeconds() : this.getSeconds());
  	return string;
  }
});
Date.strtotime = function(string,timezoneoffset){
		// exemple format 2010-08-16 09:30:00
		//recup des données
		if(string!="undefined")
		{
			xiYear = parseInt(string.substr(0,4),10);
			xiMonth = parseInt(string.substr(5,2),10)-1;
			xiDate = parseInt(string.substr(8,2),10);
			xiHours = parseInt(string.substr(11,2),10);
			xiMinutes = parseInt(string.substr(14,2),10);
			xiSeconds = parseInt(string.substr(17,2),10);
		
			//transformation de la date
			
			var date = new Date(Date.UTC(xiYear,xiMonth,xiDate,xiHours,xiMinutes,xiSeconds,0));
			var ms = date.getTime() 
				+ (date.getTimezoneOffset() * 60000);  //bug sur les dates sur d'autres fuseaux horaires
			
			if(!isNaN(timezoneoffset)){
				ms = ms + timezoneoffset * 3600000;
			}
			newDate = new Date(ms);
		}else{
			newDate = new Date();
		}
		return newDate.getTime(); 
  };



/**
 * gestion des timezones
 */
var timeZonePHP = new Array();
timeZonePHP["Europe/Paris"] = 1;
timeZonePHP["America/Los_Angeles"] = -8;

/**
 * Exemple je me trouve au japon
 */
function transformToLocalTime(elem,type,timezone){
	d = new Date();
	localTime = d.getTime();
	/* Note sur la fontion getTimezoneOffset()
	 * This number will be positive if you are behind UTC (for example, Pacific Daylight Time), and negative if you are ahead of UTC (for example, Japan).	 
	 */ 
	localOffset = d.getTimezoneOffset() * 60000;
	conOffset = timeZonePHP[timezone]*3600000;
	
	totalOffset = (- localOffset - conOffset)/ 3600000 ; 
	if(type=='input_text'){
		var value = $(elem).value;
		date = new Date(Date.strtotime(value,timeZonePHP[timezone]));
		newdate = new Date(date.getFullYear(),date.getMonth(),date.getDate(),date.getHours()+totalOffset, date.getMinutes(),date.getSeconds());
		elem.value = value+" ( local: "+newdate.toFormatedString('Y-m-d H:i:s')+")";
	}else if(type=='select'){
		$$("#"+elem+" option").each( function(elem){
			var value = elem.innerHTML;
			date = new Date(Date.strtotime(value,timeZonePHP[timezone]));
		  newdate = new Date(date.getFullYear(),date.getMonth(),date.getDate(),date.getHours()+totalOffset, date.getMinutes(),date.getSeconds());
			elem.update(value+" ( local: "+newdate.toFormatedString('Y-m-d H:i:s')+")");
		});
	}else if(type=='agenda'){
		$$("."+elem).each( function(elem){
			var value = elem.id;
			tmp = value.split(":");
			nextDay = (parseInt(tmp[0]) + totalOffset) >= 24 ? "+1 day" : "<br/>" ;
			newHours = (parseInt(tmp[0]) + totalOffset) >= 24 ? parseInt(tmp[0]) + totalOffset - 24 : parseInt(tmp[0]) + totalOffset ;
			newMinutes = parseInt(tmp[1]);
			elem.update((newHours < 10 ? "0"+newHours : newHours)+":"+(newMinutes < 10 ? "0"+newMinutes : newMinutes)+" "+nextDay);
		});
	}
}
