/*
 * RmxScripts-3.12.1.js
 * Vlad Olteanu - 03 Jamvier 2012
 * Combination  de tous les JS pour www.remax-quebec.com
 * Seuls les JS 'librairies' n'ont pas ete incorpores
 */ 

// BROWSER DETECTION

function isChrome()	{return (navigator.userAgent.indexOf('Chrome')	!= -1);}
function isFirefox(){return (navigator.userAgent.indexOf('Firefox')	!= -1);}
function isIE()		{return (navigator.userAgent.indexOf('MSIE')	!= -1);}
function isIE9()	{return (navigator.userAgent.indexOf('MSIE 9')	!= -1);}
function isIE8()	{return (navigator.userAgent.indexOf('MSIE 8')	!= -1);}
function isIE7()	{return (navigator.userAgent.indexOf('MSIE 7')	!= -1);}
function isIE6()	{return (navigator.userAgent.indexOf('MSIE 6')	!= -1);}
function isOpera()	{return (navigator.userAgent.indexOf('Opera')	!= -1);}
function isSafari()	{return (navigator.userAgent.indexOf('Safari')	!= -1);}


// ---------------------------------------------- ELEMENT UTILS

// Used : 'search/recherche.jsp', 'static/deveniragent-only.jsp', 'static/deveniragent.jsp', 'static/googleearth.jsp'
function showElement(elemName){
    try {
		document.getElementById(elemName).style.display = "block";
    } catch(err) {
		//alert("Exception caught in showElement - " + elemName);
    }
}

// Used : 'inscription/envoiamis.jsp', 'inscription/renseignements.jsp', 'myremax/loginform.jsp', 'search/recherche.jsp', 'static/googleearth.jsp'
function hideElement(elemName){
    try {
		document.getElementById(elemName).style.display = "none";
    } catch(err) {
        //alert("Exception caught in hideElement - " + elemName);
    }
}

function addClassToElement(elem, classToAdd) {
	elem.className += ' '+classToAdd;
}

function removeClassFromElement(elem, classToRemove) {
	elem.className = elem.className.replace(classToRemove, '');
}

function contains(varArray, value){
    var present = false;
    var i;
    for(i = 0 ; i < varArray.length ; i++){
        if(value == varArray[i]){
            present = true;
        }
    }
    return present;
}

function remove(varArray, value){
    var newArray = [];
    var i;
    for(i = 0 ; i < varArray.length ; i++){
        if(value !== varArray[i]){
            newArray.push(varArray[i]);
        }
    }
    return newArray;
}

// ---------------------------------------------- CLASSES

/**
 *  Classe utilisee pour les images de l'ancienne fiche...
 */
function Media(data) {
    var arrayData = data.split('|');    
    this.imagePath = arrayData[0];
    this.imageDesc = arrayData[1];
}
Media.prototype.setImagePath = function(value) {  
    this.imagePath = value;
};
Media.prototype.getImagePath = function() {  
    return this.imagePath;
};
Media.prototype.getImageDesc = function() {  
    return this.imageDesc;
};

// --------------------------------------------------- JS BUNDLES

/**
 *  Classe utilisee afin d'obtenir les fonctionnalites d'un ResourcesBundle version Script.
 */
function Bundle(resourceMap) {
    this.msgMap = resourceMap;
}
Bundle.prototype.getString = function(key) {
	var val = this.msgMap[key];
	return (val != undefined) ? val : "???"+key+"???";
};

var javascriptResources_en = null;
function initJsResourcesEn() {
	javascriptResources_en = new Bundle({
		"error.general.firstname" : "The first name is not valid",
		"error.general.lastname" : "The last name is not valid",
		"error.general.email.sender" : "The sender's email is not valid",
		"error.general.email.recipient" : "The recipient's email is not valid",
		"error.general.phone.day" : "The day phone number is not valid. Ex : 123-456-7890",
		"error.general.phone.evening" : "The evening phone number is not valid. Ex : 123-456-7890",
		"error.general.invalid.caracter" : "Some characters are not valid. The excluded character are :", 
		"email.sent.success" : "The email was sent successfully",
		"email.error" : "The email could not be delivered. Please check that you have valid email addresses",
		"error.general.captcha.empty" : "Please type the word in the box below to the right",
		"error.general.subject" : "The subject is empty",
		"error.general.comments" : "There is no comments!",
		"error.bureau.transaction" : "No transaction type has been selected",
		"error.bureau.genre" : "No style has been selected",
		"error.bureau.pricerange" : "Maximum price is lower than minimum price",
		"error.captcha.text" : "The word entered does not match the one in the image",
		"myremax.update.search.question" : "Do you want to update the search?",
		"myremax.update.search.success" : "Search successfully saved.",
		"myremax.update.search.failed" : "An error occured while saving. Please try again.",
		"myremax.update.search.saved" : "Search criteria saved",
		"ajax.message.mail.success" : "Mail sent successfully",
		"ajax.message.mail.failure" : "An error occured, the administrator has been warned",
		"ajax.message.mail.captcha" : "Invalid security word, please verify and try again"
	});
}

var javascriptResources_fr = null;
function initJsResourcesFr() {
	javascriptResources_fr = new Bundle({
		"error.general.firstname" : "Le pr\u00E9nom n\'est pas valide",
		"error.general.lastname" : "Le nom de famille n\'est pas valide",
		"error.general.email.sender" : "Le courriel de l\'exp\u00E9diteur n\'est pas valide",
		"error.general.email.recipient" : "Le courriel du destinataire n\'est pas valide",
		"error.general.phone.day" : "Le t\u00E9l\u00E9phone de jour n\'est pas valide. Ex : 123-456-7890",
		"error.general.phone.evening" : "Le t\u00E9l\u00E9phone de soir n\'est pas valide. Ex : 123-456-7890",
		"error.general.invalid.caracter" : "Quelques caract\u00E8res sont invalides : ",
		"email.error" : "Le courriel n\'a pu \u00EAtre envoy\u00E9. V\u00E9rifier la validiti\u00E9 des adresses de courriel.",
		"email.sent.success" : "Le courriel a \u00E9t\u00E9 envoy\u00E9 avec succ\u00E8s",
		"error.general.captcha.empty" : "Veuillez entrer le mot dans la bo\u00EEte \u00E0 droite de celui-ci",
		"error.general.subject" : "Le sujet n\'est pas valide",
		"error.general.comments" : "Le commentaire n\'est pas valide",
		"error.bureau.transaction" : "Aucun type de transaction n\'a \u00E9t\u00E9 s\u00E9lectionn\u00E9",
		"error.bureau.genre" : "Aucun genre n\'a \u00E9t\u00E9 s\u00E9lectionn\u00E9",
		"error.bureau.pricerange" : "Le prix maximum est plus petit que le prix minimum",
		"error.captcha.text" : "Le mot inscrit n\'est pas identique \u00E0 celui de l\'image",
		"myremax.update.search.question" : "Voulez-vous \u00E9craser cette recherche avec celle-ci?",
		"myremax.update.search.success" : "Recherche sauvegard\u00E9e avec succ\u00E8s.",
		"myremax.update.search.failed" : "Une erreur est survenue lors de la sauvegarde. Veuillez recommencer.",
		"myremax.update.search.saved" : "Sauvegard\u00E9e",
		"ajax.message.mail.success" : "Message envoy\u00E9 avec succ\u00E8s",
		"ajax.message.mail.failure" : "Une erreur est survenue, l'administrateur en a \u00E9t\u00E9 averti", 
		"ajax.message.mail.captcha" : "Mot de securit\u00E9 invalide, veuillez v\u00E9rifier et r\u00E9essayer"
	});
}

function getBundleString(lang, key) {
	if (lang === 'fr') {
		if (javascriptResources_fr == null) {initJsResourcesFr();}
		return javascriptResources_fr.getString(key);
	}
	if (lang === 'en') {
		if (javascriptResources_en == null) {initJsResourcesEn();}
		return javascriptResources_en.getString(key);
	}
	return "???"+lang+"???";
}

// ---------------------------------------------- TYPE EXTENSIONS

Array.prototype.contains = function(search) {
    var i;
	for (i = 0; i < this.length; i++) {
        if (this[i] == search) {return true;}
    }
    
    return false;
};

String.prototype.getNumberOfOccurences = function(char) {
    var count = 0;
    var i;
    for (i = 0; i < this.length; i++) {
        if (this[i] == char) {
            count = count + 1;   
        }
    }
    return count;
};

// ----------------------------------------------

function getRequestObject() {
	if (window.XMLHttpRequest) {
		return(new XMLHttpRequest());
	} else if (window.ActiveXObject) {
		return(new ActiveXObject("Microsoft.XMLHTTP"));
	} else {
		return(null);
	}
}

/* =================================================================================== bureau.js */

// Used : 'find/recherche.jsp'
function displayBureau(element, region) {
    
    // Reset des background
    resetRegionBackground("region-");
    
    element.style.backgroundColor = SELECTED_BG;
    currentRegionIdBureau = region;
    
    if (previousCurrentRegionIdBureau !== -1) {
        hideElement('bureau-' + previousCurrentRegionIdBureau);
    }
    
    showElement('bureau-' + region);
    previousCurrentRegionIdBureau = region;
    addToRegionIdsArray(region);
}

// Used : 'office/home.jsp'
//TODO Should be a link in the JSP...
function forwardToBureau(lang, idbureau) {
    window.location = "/"+lang+"/find/"+idbureau+"/bureau.rmx";
}

// Used : 'office/home.jsp'
function showElementInBureau(elementName) {
	
	hideElement('accueil');
    hideElement('profil');
    hideElement('ouverture');
    hideElement('services');
    hideElement('equipe');
    hideElement('propriete');
    hideElement('courtierWebPage');
    
    showElement(elementName);
}

// Used : 'office/home.jsp'
function showOtherTypes()  {
	document.getElementById("genreSection").style.height = (isIE() || isSafari() || isOpera()) ? 120 : "120px;";    
    showElement('moretypes'); 
    hideElement('moreTypesLink');
}

// Used : 'office/home.jsp'
function emptySearchBureauForm() {
    
    document.getElementById("forSaleChk").checked = false;
    document.getElementById("forRentChk").checked = false;
    
    var input = document.getElementById("genre").getElementsByTagName("input");
    
    var i;
    for (i = 0; i < input.length; i++) {
        input[i].checked = false;
    }
    
    var selectMin = document.getElementById("selectPrixmin").getElementsByTagName("option");
    var selectMax = document.getElementById("selectPrixmax").getElementsByTagName("option");
    
    selectMin[0].selected = true;
    selectMax[0].selected = true;
}

function isGenreSelected(arrayInput) {
    var i;
	for (i = 0; i < arrayInput.length; i++) {
        if (arrayInput[i].checked) {return true;}
    }
    
    return false;   
}

function isPriceRangeValid(prixmin, prixmax) {

    var max = parseFloat(prixmax);
    var min = parseFloat(prixmin);

    return (max > min);
}

// Used : 'office/home.jsp'
function submitSearchFromBureau() {

    var prixmin = document.getElementById("selectPrixmin").value;
    var prixmax = document.getElementById("selectPrixmax").value;

    if (!document.getElementById("forSaleChk").checked && !document.getElementById("forRentChk").checked) {
        alert(getBundleString(lang, 'error.bureau.transaction'));
    } else if (!isGenreSelected(document.getElementById("genre").getElementsByTagName("input"))) {
        alert(unescape(getBundleString(lang, 'error.bureau.genre')));
    } else if (!isPriceRangeValid(prixmin, prixmax)) {
        alert(unescape(getBundleString(lang, 'error.bureau.pricerange')));
    } else {
        document.inscriptionSearchBureau.submit();    
    }    
}

/* =========================================================================== calculette-1.0.js */

// Used : 'inscription/fiche.jsp', 'inscription/ficheComplete.jsp'
function popCalculette(price, lang) {
	var window_width, window_height;  

	if (isFirefox()) {	        
    	window_width = 550;  
		window_height = 450;  
    } else {
        window_width = 550;  
		window_height = 475; 
    }
	var window_left = (screen.availWidth/2)-(window_width/2);  
	var window_top = (screen.availHeight/2)-(window_height/2);  
	var winParms = "height="+window_height+", width="+window_width+", left="+window_left+", top="+window_top+", menubar=0, scrollbars=0, status=0, toolbar=0";  
	var newwindow = window.open('/'+lang+'/calculette.rmx?price='+price,'_blank', winParms);  
	newwindow.focus();
}

// Used : 'inscription/calculette.jsp'
function checkAndSubmit(lang) {  
    
	// Get...
    var downpayment = Number(document.hypoForm.downPayment.value);
    var mortgage = Number(document.hypoForm.mortgage.value);
    var price = Number(document.hypoForm.price.value);
    var amortization = document.hypoForm.amortization.value;
    var frequency = document.hypoForm.frequency.value;
    var interest = document.hypoForm.interest.value;
    
    // Check...
    if (downpayment == '')		{downpayment = 0;}
	if (downpayment > price)	{downpayment = price;}
	
	// Submit...
    var parameters = 'calculette/' + price + '/' + downpayment + '/' + mortgage + '/' + interest + '/' + amortization + '/' + frequency;
    http('GET', contextPath+'/'+parameters+'/'+'calculateMortgage.rmx', checkAndSubmitCallback);
}
function checkAndSubmitCallback(obj) {
    try {
        window.opener.document.getElementById('mortgageTotal').innerHTML = obj;
        window.opener.document.getElementById('mortgageAction').innerHTML = (lang == 'fr') ? 'Modifier' : 'Modify';
    } catch (e) {}
    
    document.getElementById('paymentByMonth').value = obj;	
}

// Used : 'inscription/calculette.jsp'
function calculateTotalMortgage() {
    
	var price = Number(document.hypoForm.price.value);
	var downpayment = Number(document.hypoForm.downPayment.value);
    var mortgage =  price - downpayment;
    
    if (mortgage < 0) {
    	document.hypoForm.downPayment.value = price;
        document.hypoForm.mortgage.value = 0;
    } else {
        document.hypoForm.mortgage.value = mortgage;
    }
}

// Used : 'inscription/calculette.jsp'
function numbersonly(myfield, e, dec) {

	var key;
	if (window.event) {
   		key = window.event.keyCode;
 	} else if (e) {
   		key = e.which;
   	} else {
   		return true;
  	}
	
	if ((("0123456789"+dec).indexOf(String.fromCharCode(key)) > -1)) 		{return true;}   
	if ((key==null)||(key==0)||(key==8)||(key==9)||(key==13)||(key==27)) 	{return true;}
   
	return false;
}

/* ================================================================================= checkbox.js */
/* Simulation du comportement d'un checkbox qui est en fait une image. */

function getCheckboxValue(name) {
    try {
       return (document.getElementById(name).value == "true");
    } catch (err) {
        return null;
    }
}

// Used : 'search/recherche.jsp'
function setCheckbox(name, state) {
    
    var image = contextPath + "/images/search/" + (state ? "check.gif" : "uncheck.gif");
    
    try {document.getElementById(name).value = state.toString();} catch (er1) {}
    
    if (name == "checkboxAllVilles" || name == "checkboxAllSubregions") {  
        var shortName = name.replace(/checkbox/, "imgCheckbox");
        document.getElementById(shortName).src = image;
    } else {  
		try {document.getElementById(name).src = image;} catch(er2) {}
    }
}

// Used : 'search/recherche.jsp'
function toggleCheckbox(name) {

	if (currentSubregionId !== -1 || currentRegionId !== -1){
		// Get value before click
        var checkboxValue = getCheckboxValue(name);
        // Invert value before click
        setCheckbox(name, !checkboxValue);
 
       	if (name.match("checkboxAllVilles")) {
        	checkAllVillesFromSubregion();
    	} else if (name.match("checkboxAllSubregions")) {
        	checkAllSubregionFromRegion();  
    	}
    }
}

/* ============================================================================== fiche-3.1.1.js */

var currentActiveTab = 'fiche';
//var idFirstVideo = 0; //Never used?
var NAVTHUMB = "navThumb-";
var NAVTHUMBDESC = "navThumbDesc-";
var currentThumbItem = 0;

var playerActive = false;
var mediaCalled = false;
var albumCalled = false;

var fontSizeables = ["batisseTitle", "batisseItem1", "batisseItem2", "batisseItem3", "dimensionsTitle", "dimensionsListItem1", "dimensionsListItem2", "dimensionsListItem3", "fraisTitle", "fraisItem1", "fraisItem2", "fraisItem3", "descriptionTitle", "descriptionParagraph", "supplementairesTitle", "caracteristiquesTitle", "piecesTitle"];

var mapLoaded = false;

// Used in inscription/media.jsp
function nextThumbnailItem(mediaLength, hasalbum){
    var elm = document.getElementById(NAVTHUMB + currentThumbItem);
    elm.style.borderColor = '#FFFFFF';
    
    currentThumbItem = currentThumbItem + 1;
    if(currentThumbItem == mediaLength){
        currentThumbItem = 0;
    }
    displayMedia(hasalbum);
}

// Used in inscription/media.jsp
function prevThumbnailItem(mediaLength, hasalbum){
    var elm = document.getElementById(NAVTHUMB + currentThumbItem);
    elm.style.borderColor = '#FFFFFF';
    
    if(currentThumbItem == 0){
        currentThumbItem = mediaLength -1;
    }else{
        currentThumbItem = currentThumbItem - 1;
    }
    displayMedia(hasalbum);
}

// Used in inscription/media.jsp
function setCurrentThumbItem(current, hasalbum){
    try {
        var elm = document.getElementById(NAVTHUMB + currentThumbItem);
        elm.style.borderColor = '#FFFFFF';
    } catch (e) {}
    
    currentThumbItem = current;
    displayMedia(hasalbum);
}

function displayMedia(hasalbum){
    var elm = document.getElementById(NAVTHUMB + currentThumbItem);
    elm.style.borderColor = '#4E87BC';
    var cName = elm.className;

    if(cName == 'mediaPhotoThumb'){
        playerActive = false;
        var imgs = elm.getElementsByTagName("img");
        var desc = imgs[0].alt;
        var src = imgs[0].src.replace(/thumbs/, "stage");
        var inner = '<img style="border: solid #D83634 1px;" src="' + src + '" alt="'+desc+'" title="'+desc+'"/>';
        document.getElementById("mediaDisplayDesc").innerHTML = desc;
        document.getElementById("mediaDisplay").innerHTML = inner;
    }else if(cName == 'mediaPanoThumb'){
        playerActive = true;
        var src = document.getElementById('navPanoPath-' + currentThumbItem).innerHTML;
        var desc = elm.getElementsByTagName("img")[0].alt;
        document.getElementById("mediaDisplayDesc").innerHTML = desc;
        var panotag = '<applet code="ptviewer.class" archive="/applet/ptviewer.jar" codebase="http://media.remax-quebec.com" width="739" height="400">';
        panotag += '<param name=file value="http://media.remax-quebec.com/img/pano/'+src+'">';
        panotag += '<param name=cursor value="MOVE">';
        panotag += '<param name=showToolbar value="false">';
        panotag += '<param name=fov value="165">';
        panotag += '<param name=quality value="3">';
        panotag += '<param name=auto value="0.25">';
        panotag += '<param name=pan value="90">';
        panotag += '<param name=oversampling value="2.4">';
        panotag += '<param name=imgLoadFeedback value="true">';
        panotag += '</applet>';
        document.getElementById("mediaDisplay").innerHTML = panotag;
    }else if(cName == 'mediaVideoThumb'){
        playerActive = true;
        var src = document.getElementById('navVideoPath-' + currentThumbItem).innerHTML;
        var desc = elm.getElementsByTagName("img")[0].alt;
        var videoContent = "";
        if(isIE()){
            videoContent = VIDEOTAG2[0] + src + VIDEOTAG2[1];
        }else{
            videoContent = VIDEOTAG[0] + src + VIDEOTAG[1] + src + VIDEOTAG[2];
        }
        document.getElementById("mediaDisplay").innerHTML = videoContent;
        document.getElementById("mediaDisplayDesc").innerHTML = desc;
    }
}

function fillPanoramicImageTag(obj){
    document.getElementById("mediaDisplay").innerHTML = obj;
}

function pause(numberMillis) {
	var now = new Date();
	var exitTime = now.getTime() + numberMillis;
	while (true) {
		now = new Date();
		if (now.getTime() > exitTime) 
			{return;}
	}
}

function toggleVideoTabState(elm, tabName, current, hasalbum){
    toggleTabState(elm, tabName);
    if(!mediaCalled){
        setTimeout('setCurrentThumbItem(' + current + ', ' + hasalbum + ')', 300);
    }else{
        setCurrentThumbItem(current, hasalbum);
    }
}

function toggleTabState(elm, tabName){
    if(bodyLoaded){ // failsafe pour eviter de montrer l'erreur unsupported browser detected ... 
        if(tabName == 'other'){
            toggleTabState(document.getElementById(currentActiveTab + "Tab"), currentActiveTab);
        }else{
            if(tabName == "media"){
                if(!mediaCalled){
                    var codechambre = document.getElementById("hidCodeChambre").value;
                    var idinscr = document.getElementById("hidIdinscr").value;
                    var nomPhoto = document.getElementById("hidNomPhoto").value;
                    var hasalbum = document.getElementById("hidHasalbum").value;
                    http('GET', contextPath + '/' + lang + '/getMediaContent.rmx?codechambre=' + codechambre + "&idinscr=" + idinscr + "&nomphoto=" + nomPhoto + "&hasalbum=" + hasalbum, fillMediaStage);
                }
                hideElement("ficheStageLeft");
                hideElement("ficheStageRight");
                hideElement("roomContainer");
                showElement("mediaStage");
            }
            if(tabName == "album"){

                if(!albumCalled){
                    var codechambre = document.getElementById("hidCodeChambre").value;
                    var idinscr = document.getElementById("hidIdinscr").value;
                    var nomPhoto = document.getElementById("hidNomPhoto").value;
                    var hasalbum = document.getElementById("hidHasalbum").value;
                    http('GET', contextPath + '/' + lang + '/getAlbumContent.rmx?codechambre=' + codechambre + "&idinscr=" + idinscr + "&nomphoto=" + nomPhoto + "&hasalbum=" + hasalbum, fillAlbumStage);
                }
            }

            if(tabName !== 'media' && tabName !== 'fiche'){
                showElement(tabName + 'Stage');
            }

            if (tabName !== currentActiveTab) {

                if(tabName == 'album'){
                    showElement(tabName + 'Stage');
                }

                if(tabName == 'fiche'){
                        showElement("ficheStageLeft");
                        showElement("ficheStageRight");
                        showElement("roomContainer");
                        hideElement("mediaStage");
                }

                if(tabName == 'carte'){
                    showElement("carteStage");
                }

                if(currentActiveTab == 'carte'){
                    hideElement("carteStage");
                }

                if(currentActiveTab == 'album'){
                    hideElement("albumStage");
                }

                if(currentActiveTab == 'media'){
                    hideElement("mediaStage");
                }

                if(currentActiveTab == 'fiche'){
                    hideElement("ficheStageLeft");
                    hideElement("ficheStageRight");
                    hideElement("roomContainer");
                }
            }
            document.getElementById(currentActiveTab + 'Tab').className = 'ficheOnglet';
            elm.className = 'ficheOngletActive';
            currentActiveTab = tabName;
        }   
    }   
}

function fillMediaStage(obj){
    document.getElementById("mediaStage").innerHTML = obj;
    mediaCalled = true;
}

var mediaArray = new Array();

// INNER
function fillAlbumStage(obj){

    document.getElementById("albumStage").innerHTML = obj;
    albumCalled = true;
    
    var count = document.getElementById("countMedia").innerHTML;
    
    for (i = 0; i < count; i++) {
        var data = document.getElementById("infoMedia-" + i).innerHTML;
        
        var med = new Media(data);
        mediaArray[i] = med;
    }
    
    for (i = 0; i < 4; i++) {
        try {
            var singleMedia = mediaArray[i];
            var fullPath = 'http://media.remax-quebec.com/img/album/' + singleMedia.getImagePath();
            // document.getElementById("img-" + i).src = fullPath;
            document.getElementById("img-" + i).style.backgroundImage = "url(" + fullPath + ")";
            document.getElementById("desc-" + i).innerHTML = singleMedia.getImageDesc();
            document.getElementById("imgAlbum-" + i).style.display = "block";
        } catch (e) {}
    }      
}

var currentAlbumPage = 1;
var nbPerpage = 4;

// Used in inscription/album.jsp
function previousAlbumPage(nbMedias){
    var nbPages = getNbPages(nbMedias, nbPerpage);
    var newPage = 0;
    if(currentAlbumPage == 1){
        newPage = nbPages;
    }else{
        newPage = currentAlbumPage - 1;
    }
    hideOldAlbumPage(currentAlbumPage, nbMedias);
    showCurrentPage(newPage, nbMedias);
    currentAlbumPage = newPage;
    setPagerTitle(currentAlbumPage, nbMedias);
}

// Used in inscription/album.jsp
function nextAlbumPage(nbMedias){
    var nbPages = getNbPages(nbMedias, nbPerpage);
    var newPage = 0;
    if(currentAlbumPage == nbPages){
        newPage = 1;
    }else{
        newPage = currentAlbumPage + 1;
    }
    hideOldAlbumPage(currentAlbumPage, nbMedias);
    showCurrentPage(newPage, nbMedias);
    currentAlbumPage = newPage;
    setPagerTitle(currentAlbumPage, nbMedias);
}

// INNER
function setPagerTitle(currentPage, nbmedias){
    var str = "Page " + currentPage + "&nbsp;" + ((lang == 'fr') ? "de" : "of") + "&nbsp;" + getNbPages(nbmedias, nbPerpage);
    document.getElementById("albumPager").innerHTML = str;
}

// INNER
function hideOldAlbumPage(page, nbMedias){
    var start = (page - 1) * nbPerpage;
    var cpt;
    for(cpt = start ; cpt < (start + nbPerpage) ; cpt++){
        if(cpt < nbMedias){
            hideElement("imgAlbum-" + cpt);
        }
    }
}

// INNER
function showCurrentPage(page, nbMedias){
    var start = (page - 1) * nbPerpage;
    var i = 0;
    var cpt;
    for(cpt = start ; cpt < (start + nbPerpage) ; cpt++){
        if(cpt < nbMedias){
            
            var singleMedia = mediaArray[cpt];
            var fullPath = 'http://media.remax-quebec.com/img/album/' + singleMedia.getImagePath();
            // document.getElementById("img-" + i).src = fullPath;
            document.getElementById("img-" + i).style.backgroundImage = "url(" + fullPath + ")";
            document.getElementById("desc-" + i).innerHTML = singleMedia.getImageDesc();
            document.getElementById("imgAlbum-" + i).style.display = "block";
        }
        else {
            document.getElementById("imgAlbum-" + i).style.display = "none";
        }
        
        i++;
    }
}

// INNER
function getNbPages(nbMedias, nbPerpage){
   return Math.ceil(nbMedias / nbPerpage);
}

// Used in inscription/fiche.jsp
function toggleToCarte(elm, tabName, lat, lng) {
    toggleTabState(elm, tabName);
    // loading de la map ici...
    if (!mapLoaded) {
        loadGMap(lat, lng, null, null);
        mapLoaded = true;
    }   
}

function showFicheElement(element) {

    if(playerActive){
        // afficher la photo principale
        playerActive = false;
        var elm = document.getElementById(NAVTHUMB + currentThumbItem);
        elm.style.borderColor = '#FFFFFF';
        currentThumbItem = 0;
        displayMedia(true);
    }
        
    hideElement('renseignement');
    hideElement('envoisami');
    hideElement('layerCalculette');

    showElement(element);    
    
}

VIDEOTAG = [];
VIDEOTAG[0] = '<object id="mediaPlayer" width="739" height="400" \n' +
              'classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" \n' +
              'codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701" \n' +
              'standby="Loading Microsoft Windows Media Player components..." type="application/x-oleobject"> \n' +
              '<param name="fileName" value="';
VIDEOTAG[1] = '">' +
              '<param name="animationatStart" value="true">\n' +
              '<param name="transparentatStart" value="false">\n' +
              '<param name="autoStart" value="true">\n' +
              '<param name="showControls" value="false">\n' +
              '<param name="loop" value="false">\n' +
              '<param name="stretchToFit" value="true">\n' +
              '<embed type="application/x-mplayer2" ' +
              'pluginspage="http://microsoft.com/windows/mediaplayer/en/download/" ' +
              'id="mediaPlayer" ' +
              'name="mediaPlayer" displaysize="0" autosize="0" ' +
              'bgcolor="darkblue" showcontrols="false" showtracker="0" showdisplay="0" showstatusbar="0" videoborder3d="0" ' + 
              'width="739" height="400" src="';
VIDEOTAG[2] = '" autostart="true" designtimesp="5311" loop="false"></embed></object>';


VIDEOTAG2 = [];
VIDEOTAG2[0] = '<object id="MediaPlayer" height="400" width="739" \n' +
            'classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" \n' +
            'codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701" \n' +
            'standby="Loading Microsoft Windows� Media Player components..." \n' +
            'type="application/x-oleobject"> \n' +
            '<param name="URL" value="';
VIDEOTAG2[1] = '">\n' +
            '<param name="showcontrols" value="true">\n' +
            '<param name="stretchtofit" value="false">\n' +
            '<embed height="400" width="739" src="" ' +
                'showcontrols="true"  ' +
                'stretchtofit="true"  ' +
                'pluginspage="http://www.microsoft.com/Windows/MediaPlayer/"  ' +
                'name="MediaPlayer"  ' +
                'autostart=1  ' +
                'type="application/x-mplayer2"> ' +
             '</embed> ' +
             '</object> ';

/* =============================================================================== housegroup.js */

// Used : 'lacollection/visites.jsp', 'tours/visites.jsp'
function displayGroups(element, id, type) {
    
    // Reset des background
    resetRegionBackground("region-");
    
    // Changement de background pour l'element choisi
    element.style.backgroundColor = SELECTED_BG;    
    
    // Ajout dans le tableau des regions
    addToRegionIdsArray(id);
    
    if 		(type == 'libre') 		{type = 'openhouse';}
    else if (type == 'virtuelle') 	{type = 'virtualtour';}
    else if (type == 'reprise') 	{type = 'reprisefinance';}
    else if (type == 'collection')	{type = 'laCollection';}
    
    // Call Ajax pour recuperer la liste des villes
    http('GET', contextPath+'/'+type+'/'+id+'/getvisites.rmx', displayGroupsCallback);
}
function displayGroupsCallback(obj) {
    document.getElementById('listvisite').innerHTML = obj;
}

// Used : 'find/recherche.jsp', 'lacollection/visites.jsp', 'tours/visites.jsp'
function addHouseGroupId(id) {
    region.push(id);
}

// Used : 'find/recherche.jsp', 'lacollection/visites.jsp', 'tours/visites.jsp'
function houseGroupRedirect(adress) {
    window.location = adress;
}

/* ============================================================================= mapfunctions.js */

function loadGMap(lat, lng, zoom, baseIconPath) {
    
    baseIconPath = contextPath + "/images/fiche/pointeur.png";
    zoom = 13;
    
    // Declaration de la map à placer dans la page jsp
    var map = new GMap2(document.getElementById("carteStage"));

    // Declaration de l'icone de base - plus tard, on pourrait y mettre des paramètres
    var baseIcon = createBaseIcon(baseIconPath);
    
    // Declaration du point central de la map (selon lat et lng)
    var point = getPointFromLatLng(lat,lng);

    // Declaration du marqueur
    var marker = getMarkerFromPoint(point, baseIcon);

    // Paramètrage de la carte à afficher - tous les controles
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl()); 
    map.setCenter(point, zoom);
    map.addOverlay(marker);
}

// INNER
function createBaseIcon(path) {
    var baseIcon = new GIcon();
    baseIcon.image = path;
    baseIcon.iconSize = new GSize(64, 64);
//    baseIcon.shadowSize = new GSize(37, 34);
    baseIcon.iconAnchor = new GPoint(32, 32);
    baseIcon.infoWindowAnchor = new GPoint(9, 2);
//    baseIcon.infoShadowAnchor = new GPoint(18, 25);
    return baseIcon;
}

//INNER
function getPointFromLatLng(lat, lng) {
    var point = new GLatLng(lat, lng);
    return point;
}

// INNER
function getMarkerFromPoint(point, baseIcon) {
    var marker = new GMarker(point, baseIcon);
    return marker;
}

/* ================================================================================== newhome.js */

// Used : 'home/newHome.jsp'
function getVilles(idVille){
	
	var request = getRequestObject();
	var idgenres = document.getElementById("idgenres").value;
	var prixmax = document.getElementById("prixMax").value;
	var prixmin = document.getElementById("prixMin").value;
	var idregion = document.getElementById("regionsCombo").value;
	
	request.onreadystatechange= function(){
		if((request.readyState == 4) && (request.status == 200)){
			document.getElementById("divComboVilles").innerHTML = '<select id="comboboxVilles" name="villeIdsStr">'+request.responseText+'</select>';
		}	
	};
	
	request.open("GET","./getvillesforajax.rmx?idregion="+idregion+"&idgenres="+idgenres+"&prixmax="+prixmax+"&prixmin="+prixmin+"&idVille="+idVille,true);
	request.send(null);	
}

// Used in home/newHome.jsp
function checkRangeMax(prixMin,prixMax){
	if(prixMin > prixMax){
		document.getElementById("prixMin").selectedIndex = prixMax;	
	}
}

// Used in home/newHome.jsp
function checkRangeMin(prixMin,prixMax){
	if(prixMin > prixMax){
		document.getElementById("prixMax").selectedIndex = prixMin;	
	}
}

// Used in home/newHome.jsp
function loadDoc(villeId){
	checkRangeMin(document.getElementById('prixMin').selectedIndex, document.getElementById('prixMax').selectedIndex);
	getVilles(villeId);
}

// Used in home/newHome.jsp
function submitSearchForm(){
	document.getElementById('inscriptionSearchForm').submit();
}

/* ================================================================================ remax-3.1.js */

// Used : 'inscription/ficheComplete.jsp'
function initMap(lat, lng, elem, zoom, iconPath) {
    if (!zoom) {zoom = 13;}

    var latlng = new google.maps.LatLng(lat, lng);
    var opts = {
    	zoom: zoom,
    	center: latlng,
    	disableDefaultUI: true,
    	navigationControl: true,
    	mapTypeControl: true,
    	scaleControl: true,
    	streetViewControl: true,
    	navigationControlOptions: {style: google.maps.NavigationControlStyle.ZOOM_PAN},
    	mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR},
    	mapTypeId: google.maps.MapTypeId.HYBRID
    };
    var map = new google.maps.Map(elem, opts);
    new google.maps.Marker({
        position: latlng,
        map: map,
        icon: iconPath
    });
}

/* ======================================================================= rmxfunctions-3.1.1.js */

// Initialisation d'un tableau utilise à l'interne afin de pouvoir savoir
// quelle ID sont utilise dans le html.
var region = new Array();
 
var contextPath = "";
var lang = "";
//var INTERVAL = 0;
var bodyLoaded = false;

// Groupe de varialbe plus ou moins utiles
//var imagePathCheck = "/images/search/";
//var imageOnlyCheck = "check.gif";
//var imageOnlyUncheck = "uncheck.gif";
//var imageCheck = "/images/search/check.gif";
//var imageUncheck = "/images/search/uncheck.gif";

/**
 *  Represente des indices a utiliser lorsque la methode extractDataFromTemplate
 *  est appelle. Plusieurs retour de valeur sont possibles.
 */ 
var INDEX_VILLE = 0;    // represente l'index pour la donnee villeid
var INDEX_SUB = 1;      // represente l'index pour la donnee sous-region
var INDEX_REGION = 2;

/**
 *  Represente les elements courants qui sont selectionnes
 */
var currentSubregionId = -1;
var currentRegionId = -1;
var subIdToDisplayVilleFromPreviousSearch = -1;
var currentRegionIdBureau = -1;
var previousCurrentRegionIdBureau = -1;

//var movieName = "carte";

/**
 *  Represente les differentes listes utilises
 */
var currentTotalVilleByRegionList = []; // Liste de ville par region
var currentSubregionVilleList = [];     // Liste de ville par sous-region
var currentSubregionList = [];          // Liste des sous-region
var nbTotalVille = 0;

/*
 *  Represente les elements selectionne et utilise pour la recherche.
 */
var regionIds = [];     // Liste des regions selectionnee
var subIds = [];        // Liste des sous-region selectionnee
var villeIds = [];      // Liste des villes selectionnee

/**
 *  Represente les differentes couleurs utilise pour les mouse over
 */
var TRANSPARENT = 'transparent';
var WHITE = '#FFFFFF';
var BLUE_HOVER = '#75A1BE';
var FONT_COLOR = '#666666';
var SELECTED_BG = '#BACBD2';
var CURRENT = '#C8DFED';

/**
 *  Valeurs hash a passer dans l'url de la fiche pour les differents onglets ...
 */

//var HASH_VIRTUELLE = "vv";
//var HASH_ALBUM = "ap";
//var HASH_CARTE = "cg";



/*******************************************************************************
 *
 *  DEBUT DES FONCTIONS
 *
 ******************************************************************************/

// Used : 'base.jsp'
function setApplicationParameters(path, lng) {
	contextPath = path;
	lang = lng;
}

// Used : 'base.jsp'
//TODO Pretty sure this is obsolete...
function parseUrlHash(latititude, longitude) {
    var hashValue = location.hash;
    
    if(hashValue == "#"+"ap"){//Album
        try {toggleTabState($('#albumTab'), 'album');} catch(e){}
    }else if(hashValue == "#"/+"vv"){//Visite Virtuelle
        try {toggleTabState($('#mediaTab'), 'media');} catch(e){}
    }else if(hashValue == "#"+"cg"){//Carte
        try {toggleToCarte($('#carteTab'), 'carte', latititude, longitude);} catch(e){}
    }
}

// Used in agent/contactcard.jsp
// Used in agent/courriel.jsp
// Used in inscription/calculette.jsp
// Used in base.jsp
//TODO Should not actually be used...
function doneLoading(msg){
    if(msg !== ''){
        alert(msg);
    }
    bodyLoaded = true;
}

/**
 **************************************************************
 *   Cette section contient les fonctions utilise lors des    *
 *   mouse over et mouse out                                  *
 **************************************************************
 */

// Used in search, can't pinpoint call location
function setChildrenColor(element, hover){
    var spans = element.getElementsByTagName("span");
    var i;
    for(i = 0 ; i < spans.length ; i++){
        spans[i].style.color = (hover) ? WHITE : FONT_COLOR;
    }
}

//TODO Change to CSS :hover property
// Used : 'find/recherche.jsp', 'find/recherchemap.jsp', 'find/recherchemaptest.jsp', 'lacollection/visites.jsp', 'search/recherche.jsp', 'tours/visites.jsp'
function regionHover(elm, idregion){
    if(idregion !== currentRegionId && !contains(regionIds, idregion)){
        elm.style.backgroundColor = BLUE_HOVER;
        var spans = elm.getElementsByTagName("span");
        var i;
        for(i = 0 ; i < spans.length ; i++){
            spans[i].style.color = WHITE;
        }
    }
}

//TODO Change to CSS :hover property
// Used : 'find/recherche.jsp', 'find/recherchemap.jsp', 'find/recherchemaptest.jsp', 'lacollection/visites.jsp', 'search/recherche.jsp', 'tours/visites.jsp'
function regionOut(elm, idregion){
    if(idregion !== currentRegionId && !contains(regionIds, idregion)){
        elm.style.backgroundColor = TRANSPARENT;
        var spans = elm.getElementsByTagName("span");
    var i;
    for(i = 0 ; i < spans.length ; i++){
            spans[i].style.color = FONT_COLOR;
        }
    }
}

	//TODO Change to CSS :hover property
// Used : 'find/recherche.jsp'
function elementOut(element, id) {
    if (currentRegionIdBureau !== id) {
        element.style.backgroundColor = TRANSPARENT;
        var spans = element.getElementsByTagName("span");
	        var i;
	        for(i = 0 ; i < spans.length ; i++){
            spans[i].style.color = FONT_COLOR;
	        }
	    }
	}
	
	//TODO Change to CSS :hover property
// Used : 'find/recherche.jsp'
function elementHover(element, id) {
    element.style.backgroundColor = BLUE_HOVER; 
    var spans = element.getElementsByTagName("span");
	        var i;
	        for(i = 0 ; i < spans.length ; i++){
        spans[i].style.color = WHITE;
	    }
	}

	//TODO Change to CSS :hover property
	// Used : 'search/recherche.jsp'
	function subregionHover(elm, idsub){
	    if(!contains(subIds, idsub) && (currentSubregionId !== idsub)){
	        elm.style.backgroundColor = BLUE_HOVER;
	        spans = elm.getElementsByTagName("span");
	        var i;
	        for(i = 0 ; i < spans.length ; i++){
	            spans[i].style.color = WHITE;
	        }
	    }
	}
	
	//TODO Change to CSS :hover property
	// Used : 'search/recherche.jsp'
	function subregionOut(elm, idsub){
	    if(!contains(subIds, idsub) && (currentSubregionId !== idsub)){
	        elm.style.backgroundColor = WHITE;
	        spans = elm.getElementsByTagName("span");
	        var i;
	        for(i = 0 ; i < spans.length ; i++) {
	            spans[i].style.color = FONT_COLOR;
	        }
	    }
	}

/*******************************************************************************
 *
 *  CETTE SECTION CONTIENT TOUTES LES FONCTIONS RELIeS A L'EXTRACTION DE DONNES
 *
 ******************************************************************************/

/**
 *  Cette methode effectue un parsing afin d'extraire des donnees a partir du template
 *  template.ajax.ie.*
 */
// INNER FUNCTION
 function extractDataFromTemplate(content) {
    
    var splittedContent = content.split('-');

    var ville = splittedContent[1];
    var subregion = splittedContent[2];
    var region = splittedContent[3];
    
    var arrayOfData = [];
    arrayOfData[INDEX_VILLE] = ville;
    arrayOfData[INDEX_SUB] = subregion;
    arrayOfData[INDEX_REGION] = region;
        
    return arrayOfData;
}

/********************************************************************************
 *                                                                              *
 *  CETTE SECTION CONTIENT LES FONCTIONS QUI PERMETTENT DE FAIRE CHANGER LE     *
 *  VISUEL DE CERTAINS eLeMENTS (GeNeRALE a TOUS)
 *                                                                              *
 *******************************************************************************/

/**
 *  Cette methode est utilise pour remettre le label des regions à sa couleur
 *  par defaut.
 */
function resetRegionBackground(encapsulatedValueString) {
    var i;
    for (i = 0; i < region.length; i++) {
        try {
            element  = document.getElementById(encapsulatedValueString + region[i]);
            element.style.backgroundColor = TRANSPARENT;
            
            var spans = element.getElementsByTagName("span");
            var j;
            for(j = 0 ; j < spans.length ; j++){
                spans[j].style.color = FONT_COLOR;
            }
        } catch (err) {}
    }         
}

/**
 *  Cette methode ajoute la region selectionnee dans un tableau vide afin de
 *  garder le comportement visuel voulue. (pour corriger un bug d'affichage aussi)
 */

function addToRegionIdsArray(id) {
    regionIds = new Array();
    regionIds.push(id);
}

/* =================================================================================== search.js */

// INNER FUNCTION
function setFlashCurrentRegionId(categorie){
    
    var inner = '<object type="application/x-shockwave-flash" ';
    	inner += 'data="' + contextPath + '/swf/region-' + currentRegionId + '.swf?paramstr=' + lang + '-' + categorie + '" ';
    	inner += 'width="337" height="286"> ';
    	inner += '<param name="movie" value="' + contextPath + '/swf/region-' + currentRegionId + '.swf?paramstr=' + lang + '-' + categorie + '" />' ;
    	inner += '<embed src="' + contextPath + '/swf/region-' + currentRegionId + '.swf?paramstr=' + lang + '-' + categorie + '" ';
    	inner += 'width="337" height="286">' ;
    	inner += '</embed> </object> ';
    document.getElementById("mapArea").innerHTML = inner;
}

// Used : 'search/recherche.jsp'
function displaySubregions(elm, idregion, fromPage) {
    
	if (currentSubregionId == '') {currentSubregionId = -1;}
	if (currentRegionId == '') {currentRegionId = -1;}
	
    showElement('divCheckallSubregions');
    
    // Vidage de la section  
    hideElement("villesCheckboxes");
    
    if(currentSubregionId !== -1 && !contains(subIds, currentSubregionId)){
        try { document.getElementById("subregion-" + currentRegionId + "-" + currentSubregionId).style.backgroundColor = WHITE; } catch (e) {}
    }
    
    /* desactivation du current */
    if(currentRegionId !== -1 && !contains(regionIds, currentRegionId)){
        document.getElementById("region-" + currentRegionId).style.backgroundColor = WHITE;
        var spans = document.getElementById("region-" + currentRegionId).getElementsByTagName("span");
        var i;
        for(i = 0 ; i < spans.length ; i++){
            spans[i].style.color = FONT_COLOR;
        }
    }
    if(currentRegionId !== -1){
        hideElement('subregions-' + currentRegionId);
    }
    
    /* activation du clicked */
    if(!contains(regionIds, idregion)){
        elm.style.backgroundColor = CURRENT;
        var elspans = elm.getElementsByTagName("span");
        var i;
        for(i = 0 ; i < elspans.length ; i++){
            elspans[i].style.color = FONT_COLOR;
        }
    }
    
    // Attribution de la region courante
    currentRegionId = idregion;
    document.getElementById("regionIdCurrentHidden").value = idregion;
    
    // envoyer la nouvelle region id au flash
    if(fromPage){
        setFlashCurrentRegionId(searchCategorie);
    }
    
    // On montre les sous-regions
    showElement('subregions-' + idregion);
    
    setCheckbox("checkboxAllVilles", false);
    
    if (listOfRegionWithAllSelected.contains(currentRegionId)) {
        setCheckbox("checkboxAllSubregions", true);
    }
    else {
        setCheckbox("checkboxAllSubregions", false);
    }
    
    // call ajax ici pour r�cup�rer le nombre de villes!
    http('GET', contextPath + '/' + lang + '/getcountvilles.rmx?idregion=' + idregion + '&cat=' + searchCategorie, getResultFromCountVille); 

}

// Used in search, cannot pinpoint call location..
function flashDisplayVilles(regid, id, categorie){
    displayVilles(regid, id, contextPath, lang, categorie);
}

function resetFlashMap(){
    var inner = '<object type="application/x-shockwave-flash" ';
    	inner += 'data="' + contextPath + '/swf/searchregions.swf" ';
    	inner += 'width="337" height="286"> ';
    	inner += '<param name="movie" value="' + contextPath + '/swf/searchregions.swf" ;/>' ;
    	inner += '<embed src="' + contextPath + '/swf/searchregions.swf" ';
    	inner += 'width="337" height="286">' ;
    	inner += '</embed> </object> ';
    document.getElementById("mapArea").innerHTML = inner;
}

function getCountVilleByRegionId(regionId) {
    http('GET', contextPath + '/' + lang + '/getcountvilles.rmx?regionid=' + regionId + '&cat=searchCategorie', getResultFromCountVille); 
}

function getResultFromCountVille(obj) {
    nbTotalVille = obj;
}

function getVilleByRegionList(arraySubregion) {
    
    currentTotalVilleByRegionList = [];
    var i;
    for (i = 0; i < arraySubregion.length; i++) {
        http('GET', contextPath + '/' + lang + '/getvilles.rmx?subregionid=' + arraySubregion[i] + '&cat=' + searchCategorie + '&regionid=' + currentRegionId, extractNumberOfVille);      
    }
    
    return currentTotalVilleByRegionList;
}

/**
 *  Cette methode affiche les villes selon la sous-region passe en paramètre 
 */
function displayVilles(regId, subid, contextPath, lang, categorie){
    
    if (getCheckboxValue("checkboxAllSubregions")) {
        return;
    }
    
   hideElement('villesCheckboxes');

    // desactivation du derier lien , s'il y a lieu
    if(currentSubregionId !== -1 && !contains(subIds, currentSubregionId)) {

        try {
            document.getElementById("subregion-" + currentSubregionId).style.backgroundColor = WHITE;
            spans = document.getElementById("subregion-" + currentSubregionId).getElementsByTagName("span");
            var i;
            for(i = 0 ; i < spans.length ; i ++){
                spans[i].style.color = FONT_COLOR;
            }
        } catch (e) { }
    }
    
    // activation du lien present
    if(!contains(subIds, subid + "-" + regId)){
        
        document.getElementById("subregion-" + subid + "-" + regId).style.backgroundColor = CURRENT;
        spans = document.getElementById("subregion-" + subid + "-" + regId).getElementsByTagName("span");
        var i;
        for(i = 0 ; i < spans.length ; i ++){
            spans[i].style.color = FONT_COLOR;
        }
    }
    
    currentSubregionId = subid + "-" + regId;
    document.getElementById("subregionIdCurrentHidden").value = currentSubregionId;
    
    // Effectue le call Ajax
    var ajaxPath = contextPath + '/' + lang + '/getvilles.rmx?subregionid=' + subid + '&rand=' + Math.random() + '&cat=' + categorie + '&regionid=' + currentRegionId;
    http('GET', ajaxPath, fillVilles);    
    
}

/*******************************************************************************
 *
 *  CETTE SECTION COMPORTE LES FONCTIONS QUI SONT APPELLe A LA SUITE D'UN CALL
 *  AJAX. CES FONCTIONS ONT TOUS UN obj EN PARAMeTRE (REPONSE DU CALL AJAX)
 *
 ******************************************************************************/

/**
 *  Cette methode est responsable d'ajoute les villes trouve dans l'objet passe
 *  en parametre (a la suite d'un call AJAX)
 */
function extractNumberOfVille(obj) {
    
    var element = document.createElement("tempVillesCheckboxes");
    
    element.innerHTML = obj;
    
    var divs = element.getElementsByTagName('div');
    
    // Effectue le comptage des villes presente
    var j;
    for (j = 0; j < divs.length; j++) {
        
        if (divs[j].id.length > 0) {
            
            var values = extractDataFromTemplate(divs[j].id);
            currentTotalVilleByRegionList.push(values[INDEX_VILLE]);
        }        
    }
}

/**
 *  Cette methode est appelle après que la methode checkAllVillesFromSubregion
 *  ai fait un call Ajax afin de recupere la liste des villes pour une sous-region.
 *  Le paramètre obj contient les elements HTML qui permet d'afficher les villes.
 *  Les ID des villes se retrouvent dans les tags HTML.
 */
function checkAllVilles(obj) {
    
    showElement('ajaxloading');
    
    // Effectue un parsing du chuck de HTML reçu pour en extraire les ids des villes.
    var subregion  = fillVilleListBySubRegion(obj);
    
    // Verification du checkboxCheckedState
    var checkboxCheckedState = getCheckboxValue("checkboxAllVilles");
    var i;    
    for (i = 0; i < currentSubregionVilleList.length; i++) {
        
        if (checkboxCheckedState && !contains(villeIds, currentSubregionVilleList[i])) {
            villeCheck(currentSubregionVilleList[i], subregion, currentRegionId);
        }
        else if (!checkboxCheckedState && contains(villeIds, currentSubregionVilleList[i])) {
            villeCheck(currentSubregionVilleList[i], subregion, currentRegionId);
        }
    }
    
    hideElement('ajaxloading');
}

function checkIfAllSelected(nbSelected, total, name) {
    
    if (nbSelected !== 0 && total !== 0 && nbSelected == total) {
        setCheckbox(name, true);
        return true;
    } else {
        setCheckbox(name, false);
        return false;
    }
}

/**
 *  Cette fonction est appelle à la suite d'un call Ajax qui recupère la liste des
 *  villes selon une sous-region. En plus, d'afficher les cases cochees ou non, 
 *  cette fonction fait un comptage des villes affichees.
 */
function fillVilles(obj){ 
    
    document.getElementById("villesCheckboxes").innerHTML = obj;
    
    var divs = document.getElementById("villesCheckboxes").getElementsByTagName('div');
    
    // Effectue le comptage des villes presentes
    currentSubregionVilleList = [];
    var j;
    for (j = 0; j < divs.length; j++) {

        if (divs[j].id.length > 0 && divs[j].className !== "regionCheckbox noCheck") {
            
            var values = extractDataFromTemplate(divs[j].id);           
            currentSubregionVilleList.push(values[INDEX_VILLE]);
            
            if (contains(villeIds, values[INDEX_VILLE] + "-" + values[INDEX_SUB] + "-" + values[INDEX_REGION])) {
                setCheckbox("villeChk-" + values[INDEX_VILLE] + "-" + values[INDEX_SUB] + "-" + values[INDEX_REGION], true);
            }
        }
    }
    
    // Effectue une verification si les villes sont tt selectionnee
    checkIfAllSelected(parseInt(document.getElementById("subregionSpan-" + currentSubregionId).innerHTML), currentSubregionVilleList.length, "checkboxAllVilles");
    
    // Affiche la liste de villes
    showElement("villesCheckboxes");
}

function fillVillesIE(){
    var divs = document.getElementById("villesCheckboxes").getElementsByTagName('div');
    
    // Effectue le comptage des villes presentes
    currentSubregionVilleList = [];
    var j;
    for (j = 0; j < divs.length; j++) {    

        if (divs[j].id.length > 0 && divs[j].className !== "regionCheckbox noCheck") {          
        
            var values = extractDataFromTemplate(divs[j].id);
            currentSubregionVilleList.push(values[INDEX_VILLE]);
            
            if (contains(villeIds, values[INDEX_VILLE] + "-" + values[INDEX_SUB] + "-" + values[INDEX_REGION])) {
                setCheckbox("villeChk-" + values[INDEX_VILLE] + "-" + values[INDEX_SUB] + "-" + values[INDEX_REGION], true);
            }
        }
    }
    
    // Effectue une verification si les villes sont tt selectionnee
    checkIfAllSelected(parseInt(document.getElementById("subregionSpan-" + currentSubregionId).innerHTML), currentSubregionVilleList.length, "checkboxAllVilles");
    // Affiche la liste de villes
    showElement("villesCheckboxes");
}

/**
 *  Cette fonction parse du HTML afin d'extraire les IDs des villes pour une 
 *  sous-region donnee.
 *
 *  @return: Renvoie le nombre de Id de ville insere dans la liste
 */
function fillVilleListBySubRegion(obj) {

    
    try{
        // Attribue la section des villes recu à parti de obj
        var element = document.createElement("tempVilleCheckboxes");
        element.innerHTML = obj;
                
        var divs = element.getElementsByTagName('div');

        
        // Effectue le comptage des villes presentes
        currentSubregionVilleList = [];
        var j;
        for (j = 0; j < divs.length; j++) {

            if(divs[j].className == "regionCheckbox noCheck"){
                // ne pas compter ... pas d'inscriptions dans cette ville
               
            }else{
                if (divs[j].id.length > 0 && divs[j].className !== "regionCheckbox noCheck") {
                    
                    var values = extractDataFromTemplate(divs[j].id);
                    currentSubregionVilleList.push(values[INDEX_VILLE]);
           
                }
            }
        }
        
        return values[INDEX_SUB];
        
    }catch(err){}
}


/*******************************************************************************
 *
 *  CETTE SECTION COMPORTE LES FONCTIONS QUI SONT REPONSABLES DE LA GESTION DES
 *  VILLES. QUELQUES-UNES DE CES FONCTION FONT DES CALL AJAX.
 *
 ******************************************************************************/

/**
 *  Cette methode est appelle lorsque le bouton TOUS est clique a� partir des 
 *  SOUS-ReGIONS. En fait, cette methode doit effectuer la selection de toutes
 *  les villes dans toutes les sous-regions.
 */
// ajout d'un boolean pour valider si le travail du check est vraiment termine parce que ca peut prendre un moment
// dans le cas ou la region contient beaucoup de villes
var checkingSubregions = false;

function checkAllSubregionFromRegion() {
    checkingSubregions = true;
    setCheckbox("checkboxAllSubregions", getCheckboxValue("checkboxAllSubregions"));
    http('GET', contextPath+'/'+lang+'/getvillesfromregion.rmx?regionid='+currentRegionId+'&cat='+searchCategorie, checkAllSubregion);
}

// Used in search/recherche.jsp
function checkAllSubregion(obj) {

    hideElement('villesCheckboxes');
    
    var addAll = getCheckboxValue("checkboxAllSubregions");
    
    document.getElementById("tempSelectAllSubregion").innerHTML = obj;  
    var listOfSubIds = document.getElementById("listOfSubIds").innerHTML;
    
    var listOfSubArray = listOfSubIds.split("-");
	var i;
    for (i = 0; i < listOfSubArray.length; i++) {


        var listOfVille = document.getElementById("subIdCheckAll-" + listOfSubArray[i]).innerHTML;
        var listOfVilleArray = listOfVille.split("-");
        var j;
        for (j = 0; j < listOfVilleArray.length; j++) {

            // Cette methode renvoie true s'il y eu un ajout de ville
            if (addAll && !contains(villeIds, listOfVilleArray[j] + "-" + listOfSubArray[i] + "-" + currentRegionId)) {
                var adding = toggleVilleFromList(listOfVilleArray[j] + "-" + listOfSubArray[i] + "-" + currentRegionId);
                updateNumberOfSelectedItem(adding, listOfSubArray[i], currentRegionId);
                
                document.getElementById("subregion-" + listOfSubArray[i] + "-" + currentRegionId).style.backgroundColor = SELECTED_BG;
        
                var spans = document.getElementById("subregion-" + listOfSubArray[i] + "-" + currentRegionId).getElementsByTagName("span");
				var l;
                for (l = 0; l < spans.length; l++) {
                    spans[l].style.color = FONT_COLOR;
                }
                
            }
            else if (!addAll && contains(villeIds, listOfVilleArray[j] + "-" + listOfSubArray[i] + "-" + currentRegionId)) {
                
                var adding = toggleVilleFromList(listOfVilleArray[j] + "-" + listOfSubArray[i] + "-" + currentRegionId);
                updateNumberOfSelectedItem(adding, listOfSubArray[i], currentRegionId);
                
                document.getElementById("subregion-" + listOfSubArray[i] + "-" + currentRegionId).style.backgroundColor = WHITE;
        
                var spans = document.getElementById("subregion-" + listOfSubArray[i] + "-" + currentRegionId).getElementsByTagName("span");
				var k;
                for (k = 0; k < spans.length; k++) {
                    spans[k].style.color = FONT_COLOR;
                }
            }
        }
    }
    
    if (addAll) {
        listOfRegionWithAllSelected.push(currentRegionId);
    } else {
    	listOfRegionWithAllSelected = remove(listOfRegionWithAllSelected, currentRegionId);
    }

    // Update les champs caches du formulaire
    updateHiddenFields();
    checkingSubregions = false;
}

/**
 *  Cette methode est appelle lorsque le bouton TOUS est clique à partir des 
 *  VILLES. En fait, cette methode doit effectuer la selection de toutes
 *  les villes dans la sous-region selectionne
 */
function checkAllVillesFromSubregion() {

    var checkBoxValue = getCheckboxValue("checkboxAllVilles");
    var imgs = document.getElementById("villesCheckboxes").getElementsByTagName("img");
	var i;
    for (i = 0; i < imgs.length; i++) {
    
        var elementId = imgs[i].id;

        var data = elementId.split("-");

        if (elementId.indexOf('villeChk-') !== -1) {

            var idVille = data[1];

            if (checkBoxValue && !contains(villeIds,  data[1] + "-" + data[2] + "-" + data[3])) {
                villeCheck(idVille, data[2], data[3]);
            }
            
            if (!checkBoxValue && contains(villeIds,  data[1] + "-" + data[2] + "-" + data[3])) {
                villeCheck(idVille, data[2], data[3]);
            }       
        }

    }
    
    var regionNb = parseInt(document.getElementById("regionSpan-" + currentRegionId).innerHTML);
    
    if (regionNb == nbTotalVille) {
        setCheckbox('checkboxAllSubregions', true);
        listOfRegionWithAllSelected.push(currentRegionId);
        hideElement('villesCheckboxes');
    } else {
        setCheckbox('checkboxAllSubregions', false);
    }
    
    updateHiddenFields();   
}

/*
 *  C'est un comportement de toggle qui est implemente ici. Si la ville est 
 *  est dejà selectionne, elle est enleve de la liste, sinon, on l'ajoute
 */
//Used above..
function toggleVilleFromList(villeid) {
    
    if(contains(villeIds, villeid)){      
        villeIds = remove(villeIds, villeid);
        return false;
    } else {  
        villeIds.push(villeid);
        return true;
    }    
}

/**
 *  Cette fonction est appelle quand une ville est coche/decoche dans la liste.
 *  La ville est ajoute/enleve de la liste, son checkbox update et ensuite 
 *  une verification est faite pour savoir si toutes les villes sont coches!
 */
//Used above...
function villeCheck(villeid, subregionid, regionid){

    // Cette methode renvoie true s'il y eu un ajout de ville
    var adding = toggleVilleFromList(villeid + "-" + subregionid + "-" + regionid);
    
    // Update le nombre d'item selectionne
    
    updateNumberOfSelectedItem(adding, subregionid, regionid);
    
    // Update les champs caches du formulaire
    updateHiddenFields();
    
    // Update le checkbox de la ville correspondante
    setCheckbox("villeChk-" + villeid + "-" + subregionid + "-" + regionid, adding);
    
    // Valide si toutes les villes sont selectionnees
    checkIfAllSelected(parseInt(document.getElementById("subregionSpan-" + subregionid + "-" + regionid).innerHTML), currentSubregionVilleList.length, "checkboxAllVilles");   
}

/**
 *  Cette fonction rempli les champs caches du formulaire
 */
//Used above... CODE FAIL...
function updateHiddenFields() {
    
    var element = document.getElementById("villeIdsHidden");
    element.value = villeIds.toString();
    
    element = document.getElementById("subregionIdsHidden");
    element.value = subIds.toString();
    
    element = document.getElementById("regionIdsHidden");
    element.value = regionIds.toString();
    
    element = document.getElementById("listOfCurrentRegionWithAllSelected");
    element.value = listOfRegionWithAllSelected.toString();
    
}

/**
 *  Cette fonction gère le comptage de villes à travers les regions et sous-regions
 *  @param: add - Determine si l'operation est d'ajouter une ville ou non
 */
//Used above...
function updateNumberOfSelectedItem(add, subregionid, regionid) {
    
    if (add) {
        
        if(!contains(subIds, subregionid + "-" + regionid)){
            subIds.push(subregionid + "-" + regionid);
            document.getElementById("subregion-" + subregionid + "-" + regionid).style.backgroundColor = SELECTED_BG;
        }
        
        var nb = parseInt(document.getElementById("subregionSpan-" + subregionid + "-" + regionid).innerHTML);
        
        if(isNaN(nb)){
            nb = 1;
        }else{
            nb = nb + 1;
        }
        
        document.getElementById("subregionSpan-" + subregionid + "-" + regionid).innerHTML = nb;
        
        var reNb = parseInt(document.getElementById("regionSpan-" + regionid).innerHTML);
        
        if(isNaN(reNb)){
            regionIds.push(regionid);
            document.getElementById("region-" + regionid).style.backgroundColor = SELECTED_BG;
            reNb = 1;
        }else{
            reNb = reNb + 1;
        }
        
        document.getElementById("regionSpan-" + regionid).innerHTML = reNb;    
        
    } else {
        
        var nb = parseInt(document.getElementById("subregionSpan-" + subregionid + "-" + regionid).innerHTML);
        
        if(!isNaN(nb) && nb > 1){
            nb = nb - 1;
        }else{
            subIds = remove(subIds, subregionid + "-" + regionid);
            document.getElementById("subregion-" + subregionid + "-" + regionid).style.backgroundColor = CURRENT;
            nb = "";
        }
        
        document.getElementById("subregionSpan-" + subregionid + "-" + regionid).innerHTML = nb;
        
        var reNb = parseInt(document.getElementById("regionSpan-" + regionid).innerHTML);
        
        if(!isNaN(reNb) && reNb > 1){
            reNb = reNb - 1;
        }else{
            regionIds = remove(regionIds, regionid);
            document.getElementById("region-" + regionid).style.backgroundColor = CURRENT;
            reNb = "";
        }
        
        document.getElementById("regionSpan-" + regionid).innerHTML = reNb;
    }    
}

// Used : 'search/recherche.jsp'
function selectAllGenres() {
    
    var elementGenre = document.getElementById("genreCheckboxes");
    var listOfCheckbox = elementGenre.getElementsByTagName("input");
    var value = false;
    
    if (listOfCheckbox[0].checked) {
        value = true;
    }
    var i;
    for (i = 1; i < listOfCheckbox.length; i++) {
        listOfCheckbox[i].checked = value;
    }

    try {
        var elementGenreSupp = document.getElementById("autresCheckboxes");
        listOfCheckbox = elementGenreSupp.getElementsByTagName("input");
		var i;
        for (i = 0; i < listOfCheckbox.length; i++) {
            listOfCheckbox[i].checked = value;
        }    
    }  catch (ex) {}
}

// Used : 'search/recherche.jsp'
function checkIfAllGenreSelected() {
    
    var elementGenre = document.getElementById("genreCheckboxes");
    var listOfCheckbox = elementGenre.getElementsByTagName("input");
    var value = true;
	var i;
    for (i = 1; i < listOfCheckbox.length; i++) {
        if (!listOfCheckbox[i].checked) {
            value = false;
        }
    }
    
    try {
        elementGenre = document.getElementById("autresCheckboxes");
        var listOfCheckboxSupp = elementGenre.getElementsByTagName("input");
        var i;
        for (i = 0; i < listOfCheckboxSupp.length; i++) {
            if (!listOfCheckboxSupp[i].checked) {
                value = false;
            }
        }
    } catch (e) {}
    
    listOfCheckbox[0].checked = value;
}

// Used : 'search/recherche.jsp'
function checkUnifamilliale(elm) {
    // la liste des inufamilliales : 11,4,2,3,5,6,10
    document.getElementById("genreChk-11").checked = elm.checked;
    document.getElementById("genreChk-4").checked = elm.checked;
    document.getElementById("genreChk-2").checked = elm.checked;
    document.getElementById("genreChk-3").checked = elm.checked;
    document.getElementById("genreChk-5").checked = elm.checked;
    document.getElementById("genreChk-6").checked = elm.checked;
}

// Used : 'search/recherche.jsp'
function toggleUnifamilliale() {
    if(
        document.getElementById("genreChk-11").checked &&
        document.getElementById("genreChk-4").checked &&
        document.getElementById("genreChk-2").checked &&
        document.getElementById("genreChk-3").checked &&
        document.getElementById("genreChk-5").checked &&
        document.getElementById("genreChk-6").checked ){
            document.getElementById("genreChk-0").checked = true;
    }else{
        document.getElementById("genreChk-0").checked = false;
    }

}

/********************************************************************************
 *                                                                              *
 *   CETTE SECTION CONTIENT LES FONCTIONS QUI PERMETTENT DE REMPLIR LE BEAN     *
 *   DE RECHERCHE CORRECTEMENT                                                  *
 *                                                                              *
 *******************************************************************************/

//USed below...
function setCharAt(str, index, chr) {
    if(index > str.length-1){
        return str;
    }
    return str.substr(0,index) + chr + str.substr(index+1);
}

//TODO Used in search/recherche.jsp
function addCaracteristiqueToBean(element) {

    var elementName = element.name;
    var bitpos = elementName.substring(elementName.indexOf("-") + 1);
    var elementValue = element.value;
    var completeString = setCharAt(document.getElementById("caracteristiquesHidden").value, bitpos - 1, elementValue);
    document.getElementById("caracteristiquesHidden").value = completeString;
}

//INNER FUNCTION
function isVisible(str){
	return (document.getElementById(str).style.display.indexOf("block") !== -1);
}


// Used : 'search/recherche.jsp'
function toggleAdvancedCriteria(categorie){
    
    if (categorie == 'residentielle') {
        
        if(isVisible("typesAutres")) {
            hideElement("typesAutres");
            hideElement("autresTypes");
            hideElement("autresCheckboxes");
            hideElement("autreCac");
            hideElement("autreCaracteristiques");
            hideElement("advancedSubmitBtn");
            document.getElementById("advancedCriteriaVisibleHidden").value = "false";
        } else {
            showElement("typesAutres");
            showElement("autresTypes");
            showElement("autresCheckboxes");
            showElement("autreCac");
            showElement("autreCaracteristiques");
            showElement("advancedSubmitBtn");
            document.getElementById("advancedCriteriaVisibleHidden").value = "true";
        }
        
    } else if (categorie == 'commerciale') {
        
        if(isVisible("autreCaracteristiques")){
            hideElement("autreCaracteristiques");
            document.getElementById("advancedCriteriaVisibleHidden").value = "false";
        } else{
            showElement("autreCaracteristiques");
            document.getElementById("advancedCriteriaVisibleHidden").value = "true";
        }
        
    }  else if (categorie == 'terrain') {
        
        if (isVisible("autreCaracteristiques")) {
            hideElement("autreCaracteristiques");
            document.getElementById("advancedCriteriaVisibleHidden").value = "false";
        } else{
            showElement("autreCaracteristiques");
            document.getElementById("advancedCriteriaVisibleHidden").value = "true";
        }
        
    } else if (categorie == 'ferme') {
        
        if(isVisible("autreCac")) {
            hideElement("autreCac");
            hideElement("autreCaracteristiques");
            document.getElementById("advancedCriteriaVisibleHidden").value = "false";
        } else {
            showElement("autreCac");
            showElement("autreCaracteristiques");
            document.getElementById("advancedCriteriaVisibleHidden").value = "true";
        }
    }
}

// Used : 'search/recherche.jsp'
function setTransactionType() {
	
    var sale = document.getElementById("forSaleChk").checked;
    var rent = document.getElementById("forRentChk").checked;
    var transactionType = '';
    
    if (sale && rent) {
        transactionType= 'locavente';
    } else if (!sale && rent) {
        transactionType = 'location';
    } else if (sale && !rent) {
        transactionType = 'vente';
    } else {
		transactionType = '';
    }
    
    document.getElementById('transactionTypeHidden').value = transactionType;
}

//TODO Used in search/recherche.jsp
function submitInscriptionSearchForm() {
    if(checkingSubregions){
        // alert("checkingSubregions : " + checkingSubregions);
    }else{
        document.getElementById('inscriptionSearchForm').submit();
    }
}

//TODO Used in search/recherche.jsp
function setIdsArray(cities, subregions, regions) {
    villeIds = getArrayFromString(cities);
    subIds = getArrayFromString(subregions);
    regionIds = getArrayFromString(regions);   
}

//TODO Used in search/recherche.jsp
function getArrayFromString(text) {
    return text.split(',');
}

/* ====================================================================== userfunctions-3.1.1.js */

//TODO Bundle this message... and check value of 'lang'... don't think it works...

var targetFavorite = '';

function toggleFavoritesCallback(obj){
	
	if (obj != '') {
		document.getElementById(targetFavorite).innerHTML = obj;	
	} else {
		var errorMsg = (lang == 'en') ? "An error occured, please make sure you are logged in and try again."
									  : "Une erreur est survenue, svp vérifier que vous êtes connecté et réessayer.";
		alert(errorMsg);
	}
}

/* Used : 'search/resultcards.jsp', 'inscription/ficheComplete.jsp' & 'inscription/fiche.jsp' */
function addToFavorites(idinscr, codeChambre, from) {
	if (from == 'oldFiche') {targetFavorite = 'favoritesAction';}
	else if (from == 'newFiche') {targetFavorite = 'favoritesLink';}
	else {targetFavorite = 'favorites-'+codeChambre+idinscr;}
	
    http('GET', contextPath+'/'+lang+'/addToFavorites.rmx?codechambre='+codeChambre+"&idinscr="+idinscr+"&from="+from, toggleFavoritesCallback);
}
function removeFromFavorites(idinscr, codeChambre, from) {
    
	var confirmationMsg = (lang == 'en') ? "Do you want to remove this listing from your list of favorites ?"
                             		 	 : "Voulez-vous retirer cette inscription de votre liste de favoris ?";
	if(confirm(confirmationMsg)){	
		if (from == 'oldFiche') {targetFavorite = 'favoritesAction';}
		else if (from == 'newFiche') {targetFavorite = 'favoritesLink';}
		else {targetFavorite = 'favorites-'+codeChambre+idinscr;}
		
		http('GET', contextPath+'/'+lang+'/removeFromFavorites.rmx?codechambre='+codeChambre+"&idinscr="+idinscr+"&from="+from, toggleFavoritesCallback);
	}
}

var compareList = [];

// Used : 'search/resultcards.jsp'
function removeFromFavoritesAndDom(idinscr, codeChambre, searchIndex){
	
    if(removeFromFavorites(idinscr, codeChambre, searchIndex)) {        
        
        hideElement(codeChambre + idinscr + "-" + searchIndex);
        if(!(contains(compareList, codeChambre + '' + idinscr))){
            compareList.push(codeChambre + '' + idinscr);
        }
        toggleCompareList(codeChambre, idinscr, null);

        var value = document.getElementById('nbResultats').innerHTML;
        document.getElementById('nbResultats').innerHTML = value - 1;

        if ((value - 1) < 15) {
            document.getElementById('pagerContent').innerHTML = "";
        }   
    }
}

// Used : 'search/resultcards.jsp'
function toggleCompareList(codeChambre, idinscr, elm){
	
    if(contains(compareList, codeChambre + '' + idinscr)){
        compareList = remove(compareList, codeChambre + '' + idinscr);
    }else{
        compareList.push(codeChambre + '' + idinscr);
    }
    
    if(compareList.length > 1){
        showElement("comparaisonsLink");
    }else if(compareList.length < 2){
        hideElement("comparaisonsLink");
    }
    
    if(elm !== null){
        var imgElement = elm.getElementsByTagName("img")[0];
        var src = imgElement.src;
        if(src.indexOf("uncheck.gif") !== -1){
            src = src.replace(/uncheck.gif/,"check.gif");
        }else{
            src = src.replace(/check.gif/,"uncheck.gif");
        }
        imgElement.src = src;
    }   
}

// Used : 'search/results.jsp'
function showComparisonsPage(){
    var location = contextPath + "/" + lang + "/showComparisons.rmx?ids=";
    var ids = "";
    var i;
    for(i = 0 ; i < compareList.length ; i++){
        ids += compareList[i] + "-";
    }
    window.location = location + ids.substring(0, ids.length -1);
}

// Used : 'myremax/searches.jsp'
function displayChangeTitleForm(titleId, inputId){
    hideElement(titleId);
    showElement(inputId);
}

// Used : 'myremax/searches.jsp'
function hideChangeTitleForm(titleId, inputId){
    showElement(titleId);
    hideElement(inputId);
}

// Used : 'myremax/searches.jsp'
function saveSearchTitle(titleId, inputId, txtId, id){
    var title = document.getElementById(txtId).value;
    if(title !== '' && title.length < 36){
        http('GET', contextPath + '/' + lang + '/saveSearchTitle.rmx?title=' + title + "&id=" + id, function(){});
        document.getElementById(titleId).innerHTML = title;
        hideChangeTitleForm(titleId, inputId);
    }
}

// Used : 'search/results.jsp'
function refreshSortingOrder(sel, currentPage) {
    var page = removeParameterFromURL(currentPage);
    window.location.href = contextPath + page + "?orderby=" + sel[sel['selectedIndex']].value;
}

// Used : 'search/results.jsp'
function refreshPrePage(sel, currentPage){
    var page = removeParameterFromURL(currentPage);
    window.location.href = contextPath + page + "?perpage=" + sel[sel['selectedIndex']].value;
}

function removeParameterFromURL(url) {
	var page = "";
    page = (url.indexOf("?") == -1) ? url : url.substr(0, url.indexOf("?")); 
    page = (page.indexOf("fr") == -1) ? page.replace("en", "fr") : page.replace("fr", "en"); 
	//TODO Pourquoi faut-il inverser la langue? Voir source...
    return page;
}


// Used : 'search/results.jsp'
function showUpdateSearchForm(idsearch){
    
    if (confirm(unescape(getBundleString(lang, 'myremax.update.search.question')))) {
        http('GET', contextPath+'/'+lang+'/updateSearchBean.rmx?id='+idsearch, updateSearchCallback);
    }    
}
function updateSearchCallback(obj) {
    if (obj == "200") {
        alert(unescape(getBundleString(lang, 'myremax.update.search.success')));
        document.getElementById("saveSearchLinkContent").innerHTML = "<span style=\"color: #2E619A; font-size: 10px; font-family: Arial, Helvetica, sans-serif;\">" + unescape(getBundleString(lang, 'myremax.update.search.saved')) + "</span>";
    } else {
        alert(unescape(getBundleString(lang, 'myremax.update.search.failed')));
    }
}

/* ================================================================================================================= */

function updateDivWidth(idinsc) {
	var div = document.getElementById('div'+idinsc);
	var img = document.getElementById('img'+idinsc);
	div.style.width = img.offsetWidth+'px';
}

/* ================================================================================================================= */
/* ================================================================================================================= */

function isFieldFilled(inputField, tipsDiv, tipsText) {
	if (inputField.val() != '') {
		inputField.removeClass("ui-state-error");
		return true;
	} else {
		inputField.addClass("ui-state-error");
		updateTips(tipsDiv, tipsText);
		inputField.focus();
		return false;
	}
}

function isEmailValid(inputField, tipsDiv, tipsText) {
	var validEmailRegex = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
	if (validEmailRegex.test(inputField.val())) {
		inputField.removeClass("ui-state-error");
		return true;
	} else {
		inputField.addClass("ui-state-error");
		updateTips(tipsDiv, tipsText);
		inputField.focus();
		return false;
	}
}

function isPhoneNumberValid(inputField, tipsDiv, tipsText) {
	var validPhoneNumberRegex = /^\d{3}\-\d{3}\-\d{4}$/;
	if (validPhoneNumberRegex.test(inputField.val())) {
		inputField.removeClass("ui-state-error");
		return true;
	} else {
		inputField.addClass("ui-state-error");
		updateTips(tipsDiv, tipsText);
		inputField.focus();
		return false;
	}
}

var INVALID_CHARACTERS = "#$%{}&<>[]/|\\"; 

//TODO Find better way to do this...
function areCharactersValid(inputField, tipsDiv, tipsText) {
    var i; var comment = inputField.val();
    for (i=0; i < comment.length; i++) {
        var letter = comment.charAt(i).toLowerCase();
        if (INVALID_CHARACTERS.indexOf(letter) !== -1) {
        	inputField.addClass("ui-state-error");
        	updateTips(tipsDiv, tipsText);
        	inputField.focus();
           	return false;
        }
    }
  	inputField.removeClass("ui-state-error");
    return true;
}

function updateTips(tipsDiv, tipsText) {
	if (tipsDiv != null) {
		tipsDiv.text(tipsText).css('color', 'red');
	}
}

function commonSuccessHandler(data, formId, formTipsId) {
	var rspParts = data.split('|');
	if (rspParts[0] == 'OK') {
		$('#'+formId).dialog('close');
	} else {
		if ($('#'+formId).dialog('isOpen')) {
			updateTips($('#'+formTipsId), getBundleString(lang, rspParts[1]));	
		}
	}
}

function unescapeHtml(html) {
	return $('<div>'+html+'</div>').html();	
}

// ----------------------------------------------------------------------------

//Used : 'search/results.jsp'
function showSaveSearchForm(){
	$('#saveSearchForm').dialog('open');
}

// Used : 'search/results.jsp'
function saveSearch(){
    var title = document.getElementById('txtSaveSearch').value;
    
    if(title !== "" && title.length < 36){
        http('GET', contextPath+'/'+lang+'/saveSearchBean.rmx?title='+ title, saveSearchCallback);
    }else{
    	alert((lang == 'en') ? 'The search title can not exceed 36 characters.'
    	                     : 'Le titre de la recherche ne peut exc\u00e9der 36 caract\u00e8res.');
    }
}
function saveSearchCallback(obj){
    if(obj == "200"){
    	var msg = (lang == "en") ? "Search criteria saved" : "Sauvegard&eacute;e";
        document.getElementById("saveSearchLinkContent").innerHTML = "<span style=\"color: #2E619A; font-size: 10px; font-family: Arial, Helvetica, sans-serif;\">"+msg+"</span>";      
    }
    $('#saveSearchForm').dialog('close');
}

// ----------------------------------------------------------------------------

//Used : 'myremax/loginform.jsp'
function showRecoverPasswordForm() {
	$('#lostPswdForm').dialog('open');
}

//Used : 'myremax/loginform.jsp'
function recoverPassword() {
	if (isEmailValid($('#forgotPasswordInput'), null, '')) {
		http('GET', contextPath+'/'+lang+'/recoverPassword.rmx?email='+$('#forgotPasswordInput').val(), recoverPasswordCallback);
	}
}
function recoverPasswordCallback(obj){

	$('#jqueryPopup').text(unescape(obj.split('|')[1]));
	$('#jqueryPopup').dialog('open');
	if (obj.split('|')[0] == 'OK') {
		$('#lostPswdForm').dialog('close');
	}
}

// ----------------------------------------------------------------------------

// Related JSPs : 'agent/card.jsp', 'agent/sendMailBorkerForm.jsp'

function showSendMailBrokerForm(){
	$('#sendMailBrokerForm').dialog('open');
}
function validateSendMailBrokerForm() {

    var ready = true;
    ready = ready && isFieldFilled($('#smbfPrenom'), $('#smbfTips'), getBundleString(lang, 'error.general.firstname'))
    			  && areCharactersValid($('#smbfPrenom'), $('#smbfTips'), getBundleString(lang, 'error.general.invalid.caracter')+INVALID_CHARACTERS);
	ready = ready && isFieldFilled($('#smbfNom'), $('#smbfTips'), getBundleString(lang, 'error.general.lastname'))
				  && areCharactersValid($('#smbfNom'), $('#smbfTips'), getBundleString(lang, 'error.general.invalid.caracter')+INVALID_CHARACTERS);
	ready = ready && isEmailValid($('#smbfEmail'), $('#smbfTips'), getBundleString(lang, 'error.general.email.sender'));
	ready = ready && isFieldFilled($('#smbfSubject'), $('#smbfTips'), getBundleString(lang, 'error.general.subject'))
				  && areCharactersValid($('#smbfSubject'), $('#smbfTips'), getBundleString(lang, 'error.general.invalid.caracter')+INVALID_CHARACTERS);
	ready = ready && areCharactersValid($('#smbfCommentaires'), $('#smbfTips'), getBundleString(lang, 'error.general.invalid.caracter')+INVALID_CHARACTERS);
	return ready;
}
function sendMailBrokerForm() {
	
	var formUrl = contextPath+'/'+lang+'/contactAgent.rmx';
    var formData = 	'idagent='+$('#smbfIdagent').val()+
    				'&firstname='+escape($('#smbfPrenom').val())+
    				'&lastname='+escape($('#smbfNom').val())+
    				'&email='+$('#smbfEmail').val()+
    				'&subject='+escape($('#smbfSubject').val())+
    				'&comments='+escape($('#smbfCommentaires').val());
	$.ajax({
		type: "POST",
		url: formUrl,
		data: formData,
		dataType: "jsonp",
		crossDomain: true,
		jsonp: false,
		jsonpCallback: "sendMailBrokerFormCallback",
		beforeSend: function() {smbfSending = true; $('#smbfSending').show();},
		error: function(reqObj, txtStatus, errThrown) {},//alert(txtStatus+'/'+errThrown);
		success: function(data) {commonSuccessHandler(data, 'sendMailBrokerForm', 'smbfTips');},
		complete: function() {smbfSending = false; $('#smbfSending').hide();}
	});
}

// ----------------------------------------------------------------------------

// Related JSPs : 'inscription/fiche.jsp', 'inscription/ficheComplete.jsp', 'inscriprion/sendInfosFriendForm.jsp'

function showSendInfosFriendsForm() {
	$('#sendInfosFriendsForm').dialog('open');
}
function validateSendInfosFriendsForm() {

	var ready = true;
	ready = ready && isFieldFilled($('#siffFirstname'), $('#siffTips'), getBundleString(lang, 'error.general.firstname'))
				  && areCharactersValid($('#siffFirstname'), $('#siffTips'), getBundleString(lang, 'error.general.invalid.caracter')+INVALID_CHARACTERS);
	ready = ready && isFieldFilled($('#siffLastname'), $('#siffTips'), getBundleString(lang, 'error.general.lastname'))
				  && areCharactersValid($('#siffLastname'), $('#siffTips'), getBundleString(lang, 'error.general.invalid.caracter')+INVALID_CHARACTERS);	
	ready = ready && isEmailValid($('#siffSender'), $('#siffTips'), getBundleString(lang, 'error.general.email.sender'));
	ready = ready && isEmailValid($('#siffRecipient'), $('#siffTips'), getBundleString(lang, 'error.general.email.recipient'));
	ready = ready && areCharactersValid($('#siffComments'), $('#siffTips'), getBundleString(lang, 'error.general.invalid.caracter')+INVALID_CHARACTERS);
	ready = ready && isFieldFilled($('#siffCaptcha'), $('#siffTips'), getBundleString(lang, 'error.general.captcha.empty'));
	return ready;
}
function sendInfosFriendsForm() {
	
	var formUrl = contextPath+'/'+lang+'/envoiamis.rmx';
	var formData = 	'codechambre='+$('#siffCodechambre').val()+
					'&idinscr='+$('#siffIdinscr').val()+
					'&firstname='+escape($('#siffFirstname').val())+
					'&lastname='+escape($('#siffLastname').val())+
					'&emailSender='+$('#siffSender').val()+
					'&emailRecipient='+$('#siffRecipient').val()+
					'&captcha='+$('#siffCaptcha').val()+
					'&comments='+escape($('#siffComments').val()); 
	$.ajax({
		type: "POST",
		url: formUrl,
		data: formData,
		dataType: "jsonp",
		crossDomain: true,
		jsonp: false,
		jsonpCallback: "sendInfosFriendsFormCallback",
		beforeSend: function() {siffSending = true; $('#siffSending').show();},
		error: function(reqObj, txtStatus, errThrown) {},//alert(txtStatus+'/'+errThrown);
		success: function(data) {commonSuccessHandler(data, 'sendInfosFriendsForm', 'siffTips');},
		complete: function() {siffSending = false; $('#siffSending').hide();}
	});
}

// ----------------------------------------------------------------------------

//Used : 'inscription/fiche.jsp', 'inscription/ficheComplete.jsp', 'inscriprion/requestInfosBrokersForm.jsp' 

function showRequestInfosBrokersForm(brokers) {
	$('#requestInfosBrokersForm').dialog('open');
	$('#ribfIdagents').val(brokers);
}
function validateRequestInfosBrokersForm() {

	var ready = true;
    ready = ready && isFieldFilled($('#ribfFirstname'), $('#ribfTips'), getBundleString(lang, 'error.general.firstname'))
    			  && areCharactersValid($('#ribfFirstname'), $('#ribfTips'), getBundleString(lang, 'error.general.invalid.caracter')+INVALID_CHARACTERS);
	ready = ready && isFieldFilled($('#ribfLastname'), $('#ribfTips'), getBundleString(lang, 'error.general.lastname'))
    			  && areCharactersValid($('#ribfLastname'), $('#ribfTips'), getBundleString(lang, 'error.general.invalid.caracter')+INVALID_CHARACTERS);
	ready = ready && isEmailValid($('#ribfEmail'), $('#ribfTips'), getBundleString(lang, 'error.general.email.sender'));
	ready = ready && isPhoneNumberValid($('#ribfDayphone'), $('#ribfTips'), getBundleString(lang, 'error.general.phone.day'));
	ready = ready && isPhoneNumberValid($('#ribfNightphone'), $('#ribfTips'), getBundleString(lang, 'error.general.phone.evening'));
	ready = ready && isFieldFilled($('#ribfComments'), $('#ribfTips'), getBundleString(lang, 'error.general.comments'))
				  && areCharactersValid($('#ribfComments'), $('#ribfTips'), getBundleString(lang, 'error.general.invalid.caracter')+INVALID_CHARACTERS);
	ready = ready && isFieldFilled($('#ribfCaptcha'), $('#ribfTips'), getBundleString(lang, 'error.general.captcha.empty'));
	return ready;
}		
function sendRequestInfosBrokersForm() {
	
	var formUrl = contextPath+'/'+lang+'/renseignements.rmx';
	var formData = 	'codechambre='+$('#ribfCodechambre').val()+
					'&idinscr='+$('#ribfIdinscr').val()+
					'&idagents='+$('#ribfIdagents').val()+
					'&firstname='+escape($('#ribfFirstname').val())+
					'&lastname='+escape($('#ribfLastname').val())+
					'&email='+$('#ribfEmail').val()+
					'&dayphone='+$('#ribfDayphone').val()+
					'&nightphone='+$('#ribfNightphone').val()+
					'&captcha='+$('#ribfCaptcha').val()+
					'&comments='+escape($('#ribfComments').val());
	$.ajax({
		type: "POST",
		url: formUrl,
		data: formData,
		dataType: "jsonp",
		crossDomain: true,
		jsonp: false,
		jsonpCallback: "requestInfosBrokersFormCallback",
		beforeSend: function() {ribfSending = true; $('#ribfSending').show();},
		error: function(reqObj, txtStatus, errThrown) {},//alert(txtStatus+'/'+errThrown);
		success: function(data) {commonSuccessHandler(data, 'requestInfosBrokersForm', 'ribfTips');},
		complete: function() {ribfSending = false; $('#ribfSending').hide();}
	});
}
