function ouvre_fenetre(url, largeur, hauteur, nom_fenetre, autres_parametres) 
{
	var de = document.documentElement;
	var largeur_max = window.outerWidth || self.outerWidth || (de&&de.clientWidth) || document.body.clientWidth || 800;
	var hauteur_max = window.outerHeight || self.outerHeight || (de&&de.clientHeight) || document.body.clientHeight || 600;

	if (!hauteur) { hauteur = hauteur_max; }
	if (!largeur) { largeur = largeur_max; }

	var offset_largeur = (largeur_max - largeur)/2, offset_hauteur = (hauteur_max - hauteur)/2;  
	  
	if (nom_fenetre == '') 
	{ 
		nom_fenetre = 'fenetre_popup'; 
	}

	if (autres_parametres == '')
	{
		autres_parametres = ',scrollbars=yes,resizable=yes,directories=no,toolbar=no,titlebar=no,location=no,status=yes';
	}
	else if (autres_parametres.substring(0, 1) != ',')
	{
		autres_parametres = ',' + autres_parametres;
	}
	
	window.open(url,nom_fenetre,'width='+largeur+',height='+hauteur+',screenX='+offset_largeur+',screenY='+offset_hauteur+',top='+offset_hauteur+',left='+offset_largeur+autres_parametres);

	return;
}

// Permet d'ajouter des items choisi dans un select dans un autre.
function ajouter_combo(field1, field2, ajoute_avant, formulaire)
// field1 = le select de reference
// field2 = liste des items sélectionnés
{
	// on ramasse la liste des options selectionnées
	var selected_list = new Array();
	for (var i = 0; i < field1.options.length; i++)
	{
		if (field1.options[i].selected)
	    {
	    	selected_list[selected_list.length] = field1.options[i];
	    }
	}
	
	for (var j = 0; j < selected_list.length; j++)
	{
		var option_a_ajouter = selected_list[j];
		var valeur_value = option_a_ajouter.value;

		// avant il faut verifier si ca existe dans le selectbox courant
		var present = 0;	
		for (var k = 0; k < field2.length; k++ ) 
		{
			if (field2.options[k].value == valeur_value)
			{
				present = 1;
				k = field2.length; // pour arrêter ça là
			}
		}
		
		// si ca existe pas dans la liste, on l'ajoute et on montre notre selectbox de types ainsi que le bouton pour enlever
		// (au cas ou il serait caché)	
		if (present == 0)
		{
			field2.style.display = 'inline';	
			for (var i = field2.length - 1; i >= 0; i--) // on pousse chaque option d'une position
			{
				element = new Option(field2.options[i].text, field2.options[i].value);
				field2.options[i + 1] = element;
			}
		
			var valeur_text = option_a_ajouter.text;
			var valeur_value = option_a_ajouter.value;
			
			if (ajoute_avant && window.avant_ajouter_combo_value)
			{
				valeur_value = window.avant_ajouter_combo_value(valeur_value, formulaire);
			}

			if (ajoute_avant && window.avant_ajouter_combo_text)
			{
				valeur_text = window.avant_ajouter_combo_text(valeur_value);
			}
		
			element = new Option(valeur_text, valeur_value);
			field2.options[0] = element;                 
			field2.selectedIndex = 0;
		}
	}
}

// enlever un type de client de la liste du contact-client
// enleve un item du combo
function enlever_combo(field1, field2)
// field1 = le select de reference
// field2 = liste des items sélectionnés
{
	var dernier_selection;
	var elements_enleves = 0;
	// on ramasse la liste des options selectionnées en commencant par la fin
	for (var i = field2.options.length - 1; i >= 0; i--)
	{
		if (field2.options[i].selected)
	    {
	    	dernier_selection = i;
	    	for (var j = i + 1; j < field2.length; j++)
	    	{
	    		field2.options[j - 1].text = field2.options[j].text;
				field2.options[j - 1].value = field2.options[j].value;
	    	}

			// on peut enlever un élément à la liste
			field2.length--;        
			elements_enleves++;                          
	    }
	}
	
	if (elements_enleves)
	{
		// l'entrée sélectionnée sera celle qui précède l'entrée sélectionnée
		field2.selectedIndex = dernier_selection - 1;     
		// si on a enleve le 1er de la liste, on va mettre le 1er élément sélectionné (si y en reste)
		if (field2.length && field2.selectedIndex == -1)
		{
			field2.selectedIndex = 0;
		}	    	
	}
}

// cette fonction sert a selectionner (ou le contraire) tous les items d'un select (objet passé en parametre + state)
function combo_select_all_items (combo_name, statut) {

    for(var i=0; i<combo_name.options.length; i++){
        combo_name.options[i].selected=statut;
    }
}

function isValidNumber(valeur, param) {

  if (valeur=='')  {
    return true;
  }
  valeur=valeur.replace(',','.'); // on accepte les virgules, le script va se charger de les convertir
  valeur=valeur.replace(' ',''); // on accepte les espaces

  valeur=valeur.replace(/^\./,"0.");

  valeur=fix_decimals(valeur);

  if (param == 2) { param = 1; } // javascript aime pas les ,

  if (param==0) {
  // Accepte tout les nombres du format anglais (. pour les decimals) accepte les nb négatif. ex : -15.20
  return /^[-]?\d+(\.\d+)?$/.test(valeur);
  } else if (param==1) {
  // Nb format anglais, valeurs négative pas accepté : 15.20
    return /^\d+(\.\d+)?$/.test(valeur);
  } else if (param==2) {
  // Accepte les , pour les decimals (format francais) mais pas les nb négatif. 10,25 ou 10.25
    return /^\d+([\.\,]\d+)?$/.test(valeur);
  } else if (param==3) {
  // Format francais + nb negatif : -10,25 ou -10.25
    return /^[-]?\d+([\.\,]\d+)?$/.test(valeur);
  } else if (param==4) { 
    // accepte pas les decimals : 15 ou -15
    return /^[-]?\d+?$/.test(valeur);
  } else if (param==5) { 
    // pas de decimals, nb positif seulement : 20
    return /^\d+?$/.test(valeur);
  } else if (param==6) { 
    // decimals acceptés, nb positif seulement : 20 (et on ignore le .00) on accepte le dollar et l'espace
    valeur=valeur.replace('$','');
    valeur=valeur.replace('.00','');
    return /^\d+(\.\d+)?$/.test(valeur);
  }
}

function checkMail(xemail)
{
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (filter.test(xemail)) return true;
	else return false;
}

function set_valeur_select(champ, valeur)
{
	var ancienne_valeur = champ.value;
	champ.value = valeur;
	if (!champ.value) // si la valeur n'existe pas dnas le dropdown, on remets celle qui était là.
	{
		champ.value = ancienne_valeur;
	}
	
	// on va lui donner une 2e chance
	if (champ.value != valeur)
	{
		for (i = 0; i < champ.options.length; i++)
		{
			if (champ.options[i].value == valeur)
			{
				champ.selectedIndex = i;
				i = champ.options.length;
			}
		}
	}
}

function getSelectedRadio(buttonGroup) {
   // returns the array number of the selected radio button or -1 if no button is selected
   if (buttonGroup[0]) { // if the button group is an array (one button is not an array)
      for (var i=0; i<buttonGroup.length; i++) {
         if (buttonGroup[i].checked) {
            return i
         }
      }
   } else {
      if (buttonGroup.checked) { return 0; } // if the one button is checked, return zero
   }
   // if we get to this point, no radio button is selected
   return -1;
} // Ends the "getSelectedRadio" function

function getSelectedRadioValue(buttonGroup) {
   // returns the value of the selected radio button or "" if no button is selected
   var i = getSelectedRadio(buttonGroup);
   if (i == -1) {
      return "";
   } else {
      if (buttonGroup[i]) { // Make sure the button group is an array (not just one button)
         return buttonGroup[i].value;
      } else { // The button group is just the one button, and it is checked
         return buttonGroup.value;
      }
   }
} // Ends the "getSelectedRadioValue" function



function fix_decimals(zstr) {

  var zstr_len=zstr.length;

  var first_found=0;

  var znew_str='';

  for (t=zstr_len; t>=0 ;t--) {
    if ((zstr.substr(t,1) == '.') || (zstr.substr(t,1) == ',')) {
      if (first_found==0) {
	    first_found=1;
		if (zstr_len-t<=3) {
		  znew_str=zstr.substr(t,1)+znew_str;
		}
      }
	} else {
	  if (zstr.substr(t,1) != ' ')
	  {
	    znew_str=zstr.substr(t,1)+znew_str;
	  }
	}
  }
  return znew_str;  
}

function trimTexte(txt) {
	while ('' + txt.charAt(txt.length-1)== ' ') {
		txt = txt.substring(0,txt.length-1);
	}
	while ('' + txt.charAt(0) == ' ') {
		txt = txt.substring(1,txt.length);
	}

	return txt;
}

function round_decimals(original_number, decimals, pad_with_zeros_or_not) 
{
	var result1 = original_number * Math.pow(10, decimals)
	var result2 = Math.round(result1)
	var result3 = result2 / Math.pow(10, decimals)
	if (pad_with_zeros_or_not)
	{
		return pad_with_zeros(result3, decimals)
	}
	else
	{
		return result3;
	}	
}

function pad_with_zeros(rounded_value, decimal_places) 
{
	// Convert the number to a string
	var value_string = rounded_value.toString()
	
	// Locate the decimal point
	var decimal_location = value_string.indexOf(".")
	
	// Is there a decimal point?
	if (decimal_location == -1) 
	{	
		// If no, then all decimal places will be padded with 0s
		decimal_part_length = 0
	
		// If decimal_places is greater than zero, tack on a decimal point
		value_string += decimal_places > 0 ? "." : ""
	}
	else 
	{	
		// If yes, then only the extra decimal places will be padded with 0s
		decimal_part_length = value_string.length - decimal_location - 1
	}
	
	// Calculate the number of decimal places that need to be padded with 0s
	var pad_total = decimal_places - decimal_part_length
	
	if (pad_total > 0) 
	{	
		// Pad the string with 0s
		for (var counter = 1; counter <= pad_total; counter++) 
		value_string += "0"
	}
	
	return value_string
}

function remplace_html(texte)
{
	texte = texte.replace(/<p>/ig, "\n\n");
	texte = texte.replace(/<br>/ig, "\n");
	texte = texte.replace(/&nbsp;/ig, ' ');
	
	return texte;
}

// AJAX STUFF //
var req;
function loadXMLDoc(url, formulaire) 
{
	req = false;
    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest) {
    	try {
			req = new XMLHttpRequest();
        } catch(e) {
			req = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
       	try {
        	req = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
          		req = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		req = false;
        	}
		}
    }
    
	if(req) {
		req.onreadystatechange = processReqChange;
		req.open("GET", url, true);
		req.send("");
	}
	else
	{
		document.forms[formulaire].submit();
		return true;
	}
}

function processReqChange() 
{
	// only if req shows "complete"
	if (req.readyState == 4) 
	{
		// only if "OK"
		if (req.status == 200) 
		{
			// ...processing statements go here...
			response = req.responseXML.documentElement;
			method = response.getElementsByTagName('method')[0].firstChild.data;
			result = response.getElementsByTagName('result')[0].firstChild.data;
			eval(method + '(\'\', result)');
		} 
		else 
		{
			alert("There was a problem retrieving the XML data:\n" + req.statusText);
		}
	}
}

function query_string(qs_params) 
{
	var query = window.location.search.substring(1);
	var parms = query.split('&');
	for (var i=0; i<parms.length; i++) 
	{
	   	var pos = parms[i].indexOf('=');
   		if (pos > 0) 
   		{
      		var key = parms[i].substring(0,pos);
      		var val = parms[i].substring(pos+1);
      		qs_params[key] = val;
      	}
   	}
}

function formatCurrency(num, langue) 
{
	num = num.toString().replace(/\$|\,/g,'');
	if (langue == 'fr')
	{
		separateur = ' ';
	}
	else if (langue == 'en')
	{
		separateur = ',';
	}
	
	if(isNaN(num))
	{
		num = "0";
	}
	
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	
	if(cents<10)
	{
		cents = "0" + cents;
	}
	
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
	num = num.substring(0,num.length-(4*i+3)) + separateur + num.substring(num.length-(4*i+3));
			
	if (langue == 'fr')
	{
		return (((sign)?'':'-') + num + ',' + cents + ' $');
	}
	else
	{
		return (((sign)?'':'-') + '$' + num + '.' + cents);
	}		
}

function rentcheck(id_rentcheck, langue)
{
	if (langue == 'fr' && !confirm('Le service "Cliquer pour louer" n\'est offert qu\'en anglais seulement.\n\nVoulez-vous continuer?'))
	{
		return false;
	}
	
	ouvre_fenetre('/mod-bin/externe/rentcheck.cgi?id=' + id_rentcheck, 750, 750, 'RentCheck', '');
	return false;
}

var http_request = false;
var callback_function;
var request_output_type;

// escape() encodes most of the stuff we need to encode.
// it misses single (%27), double quotes (%22), the plus sign (%2B) and slash (%2F)
// so we replace those manually...

function URLencode(param) {
    return escape(param).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F');
}

function URLdecode(param) {
    return unescape(param).replace(/\%2B/g, '+').replace(/\%22/g, '"').replace(/\%27/g, "'").replace(/\%2F/g, '/');
}

function ajaxReq() {
	var url = ajaxReq.arguments[0];
	var method = ajaxReq.arguments[1].toUpperCase();
	request_output_type = ajaxReq.arguments[2].toLowerCase(); // supported : XML, JSON, HTML
	callback_function = ajaxReq.arguments[3];

	var content_type = '';
	if(request_output_type == 'json'){
		// content_type = 'text/plain';
		content_type = 'application/json';
	}
	else if(request_output_type == 'xml' || request_output_type == 'html'){
		content_type = 'text/' + request_output_type;
	}
	else {
		alert("Missing Argument : Supported Output Type.");
		return false;
	}

	var params = '';
	if(method == 'GET'){
		params = params + '?';
	}

	if (ajaxReq.arguments[4] == 'skip_params_concat') {
		// le travail est deja fait
		params = ajaxReq.arguments[5];
	}
	else {
		for(var i = 4; i < ajaxReq.arguments.length; i++){
			if(eval(i%2) != 0){
				params = params + URLencode(ajaxReq.arguments[ i ]);
			}
			else{
				if(params != '?' && params != ''){
					params = params + '&';
				}
				params = params + ajaxReq.arguments[ i ] + '=';
			}
		}
	}

	http_request = false;
	if(window.XMLHttpRequest){ // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if(http_request.overrideMimeType){
			// Note: The line http_request.overrideMimeType('text/xml');
			// Will trigger an error in FF if the page retrieve by XMLHttpRequest is not valid XML
			// See https://bugzilla.mozilla.org/show_bug.cgi?id=311724
			http_request.overrideMimeType(content_type);
		}
	}
	else if(window.ActiveXObject){ // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}

	if(!http_request){
		alert("Giving up! :( Impossible de créer une instance XMLHTTP");
		return false;
	}

	if(method == 'GET'){
		url = url + params;
	}
	http_request.open(method, url, true);

	http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	http_request.onreadystatechange = dispatchRequestContents;

	if(method == "POST"){
		http_request.send(params);
	}
	else{
		http_request.send(null);
	}
}

function dispatchRequestContents(){
	if(http_request.readyState == 4){
		if(http_request.status == 200){
			// on appelle la fonction demandée
			var param_data;
			if(request_output_type == 'xml'){
				param_data = http_request.responseXML;
			}
			else if (request_output_type == 'html'){
				param_data = http_request.responseText;
			}
			else if (request_output_type == 'json'){
				param_data = new Object();
				param_data = eval("(" + http_request.responseText + ")");
			}
			eval(callback_function + "(param_data)");
		}
		else{
			alert("There was a problem retrieving data.\nStatus : " + http_request.status + "\nError : " + http_request.statusText);
		}
	}
}

function find_cobrand() {
	var vhostname = document.location.hostname.toLowerCase();
	
	if (vhostname.indexOf("qc.yahoo") > -1) {
		cobrand_yahoo = true ;
	}else if (vhostname.indexOf("torontosun") > -1) {
		cobrand_torontosun = true ;
	}else if (vhostname.indexOf("findarental") > -1) {
		cobrand_findarental = true;
	}
}

function split_villes(pville) {
	var newville = '';
	if (pville) {
		newville = pville.replace(/[-]/g,'-<wbr />');
	}
	document.write(newville);	
	return true;

}


function generatePlayerOngletVideo(plangue) {

	if (plangue == "fr") 	{
		CanoeVideoStandalone.SetPublisher(1745097732);
		CanoeVideoStandalone.SetPlayer(28107321001);
		CanoeVideoStandalone.SetStyle({ bgcolor: '#ffffff', width: 730, height: 505 });
		CanoeVideoStandalone.SetAdTag('http://ad.doubleclick.net/adi/can.fr.canoe.homes/bcplayer-videos;');
	}else {
		CanoeVideoStandalone.SetPublisher(1745097732);
		CanoeVideoStandalone.SetPlayer(28096220001);
		CanoeVideoStandalone.SetStyle({ bgcolor: '#ffffff', width: 730, height: 505 });
		CanoeVideoStandalone.SetAdTag('http://ad.doubleclick.net/adi/can.en.canoe.homes/bcplayer-videos;');
	}
	CanoeVideoStandalone.SetPlayerContainer('#player_brightcove');
	CanoeVideoStandalone.SetAdContainer('#ad');
	
	CanoeVideoStandalone.GeneratePlayer();

}


