if(!utils) {
    var utils = {};
}
//init tooltips
utils.tooltips = {
    init: function(tooltips){

        tooltips = tooltips || jQuery(".tooltip");
        if(tooltips.size()){
            //create tooltip div content
            if(!jQuery('#divToolTip').size()){
                jQuery('<div id="divToolTip"> </div>').appendTo('body');
            }

            tooltips.each(function(){
                jQuery(this).tooltip({
                    tip: '#divToolTip',
                    lazy: false,
                    onBeforeShow:function(){
                        //config tooltip in offset, position and width
                        var offsetArray = new Array(0, 0),
                        positionArray = new Array("top", "center");
                        var elm = this;
                        var trigger = elm.getTrigger();
                        jQuery((trigger)[0].className.split(/\s+/)).each(function(i, cls) {
                            if(cls.indexOf('cfgtt-') === 0) {
                                cls += '-';

                                //get Offset x & y
                                offsetArray[0] = /offy:\d+/.test(cls) ? parseInt(cls.match(/offy:(\d+)/)[1], 10) : 0;
                                offsetArray[1] = /offx:\d+/.test(cls) ? parseInt(cls.match(/offx:(\d+)/)[1], 10) : 0;

                                //get Position x & y
                                positionArray[0] = cls.match(/ypos:([^\s-]+)/)[1];
                                positionArray[1] = cls.match(/xpos:([^\s-]+)/)[1];

                                //get width option tooltip
                                var width = /width:\d+/.test(cls) ? parseInt(cls.match(/width:(\d+)/)[1], 10) : 'auto';

                                //set offset tooltip
                                elm.getConf().offset = offsetArray;
                                //set position tooltip
                                elm.getConf().position = positionArray;
                                //set width tooltip
                                elm.getTip().css('width',width);
                            }
                        });

                        //Conversion devise
                        if(typeof Currencies != "undefined"){
                            if(Currencies.ratesTab != null){
                                Currencies._save(jQuery("#divToolTip .tPrice"));
                                Currencies._convert(Currencies.ratesTab.currencies, jQuery("#selectCurrency").val(), jQuery("#divToolTip .tPrice"));
                            }
                        }
                    }
                });
            });
            jQuery('.tooltip').click(function(){
                return false;
            });
        }
    }
};

utils.getUrlParameter = function(name, encode){
    name = name.replace(/[\[]/g,"\\\[").replace(/[\]]/g,"\\\]");

    var regexS = "[\\?&#]"+name+"=([^&#]*)";
    var regex = new RegExp(regexS);
    if (encode == true) {
        var results = regex.exec( unescape(encodeURIComponent(window.location.href) ));   
    } else {
        var results = regex.exec( unescape(window.location.href) );   
    }

    if (results == null) {
        return "";
    } else {
        return results[1].replace(/[+]/g, " ");
    }
};

utils.getMultipleUrlParameter = function( name ){
    name = name.replace(/[\[0-9\]]/g,"");
    var regexS = "[\\?&#]"+name+"\\[[0-9]*\\]=([^&#]*)";
    var regex = new RegExp(regexS, 'g');
    var results = regex.exec(unescape(window.location.href));
    var hrefS = unescape(window.location.href);
    var results = hrefS.match(regex);
    var values = new Array();
    if(results != null){
        for(var i=0; i<results.length; i++){
            values.push(results[i].split("=")[1]);
        }
    }
    return values;
};

//clear default text in field
utils.OLDclearInput  = {
    init: function(el){
        utils.clearInput.setField(el);
    },
    setField:function (el){
        //focus listener
        el.focus( function(){
            var el = jQuery(this);
            var val = el.val();
            //if no data in the key "placeholder" set key width value of the field
            if (!el.data('placeholder')) {
                el.data('placeholder', val);
            }
            //then remove text in the field
            if(val === el.data('placeholder')) {
                el.val('');
            }
        });
        //blur listener
        el.blur( function () {
            //in blur event if field still empty write data in key "placeholder" or nothing
            var el = jQuery(this);
            if (el.val() === '') {
                console.log('c');
                el.val(el.data('placeholder') || '');
            }
        });
    }
};

utils.clearInput  = {
    init: function(el){
        utils.clearInput.setField(el);
    },
    setField:function (el){
        //focus listener
        el.focus( function(){
            var el = jQuery(this);
            var val = el.val();
            //If focus then remove text in the field
            if(val == el[0].title) {
                el.val('');
            }
        });
        //blur listener
        el.blur( function () {
            //in blur event if field still empty write title or nothing
            var el = jQuery(this);
            if (el.val() == '') {
                el.val(el[0].title || '');
                //APAC & Subamerica local case
                if (jQuery("body.home") && typeof homeBookingEngine != "undefined"){
                    homeBookingEngine.localLink.removeClass('hidden');
                    homeBookingEngine.country.addClass('hidden');
                    homeBookingEngine.city.addClass('hidden');
                }
            }
        });
        el.blur();
    }
};

utils.printDate = function (dateObj, dateFormat) {
    var m = dateObj.getMonth();
    var d = dateObj.getDate();
    var y = dateObj.getFullYear();
    var s = {};
    s["%d"] = (d < 10) ? ("0" + d) : d;
    s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m);
    s["%Y"] = y;
    s["%%"] = "%";
    var re = /%./g;
    /*if (!Calendar.is_ie5 && !Calendar.is_khtml)
		return str.replace(re, function (par) { return s[par] || par; });*/
    var a = dateFormat.match(re);
    for (var i = 0; i < a.length; i++) {
        var tmp = s[a[i]];
        if (tmp) {
            re = new RegExp(a[i], 'g');
            dateFormat = dateFormat.replace(re, tmp);
        }
    }

    return dateFormat;
};

utils.convertDistance = function(distance, unit){
    if (unit == null) {
        unit = "km";
    }
    if(distance != null){
        if(unit != "km"){
            return ((distance/1.609)/1000).toFixed(2);
        }
        else{
            return (distance/1000).toFixed(2);
        }
    }
    else return;
};

utils.shortenDescription = function(text){
    var description = text.substr(0, text.lastIndexOf(" ",130));
    return description + "...";
};

utils.isEmpty = function(ob){
    for(var i in ob){
        return false;
    }
    return true;
}

utils.rewriteTitle = function(){
    var domName = document.domain.replace(/www\.|secure\.|s\-/, "");
    document.title = domName.charAt(0).toUpperCase() + domName.substr(1).toLowerCase();
}

utils.addCurrencyParamToBookLinks = function(links, selectId){
    if(jQuery("#"+selectId).length > 0){
        links.click(function(){
            this.href = this.href + "&currencyCode="+ jQuery("#"+selectId).val();
        });
    }
}

utils.initComplementaryBrandHotelAlert = function(links, isModal){
    var datas = {
        modal: isModal,
        drag: false,
        redim: false,
        iframe: false,
        ajax: false,
        width: 500,
        height: null,
        type: "alert",
        ref: "search"
    };

    var lang = (jQuery("html").attr("lang")=="en") ? "gb" : jQuery("html").attr("lang");

    jQuery.get('/'+lang+'/booking/popins.htm', function(data) {
        if(jQuery("div.popin").size==0){
            jQuery("body").append(data);
        }
        jQuery("div.search p, div.search div.btn").hide();
        links.click(function(){

            popins.openPopin(jQuery('div.' + datas.ref), datas);
            if(jQuery(this).hasClass("tChangeDates")){
                //renvoyer vers une url sur AH, a vir ac Damien
                //jQuery("#compBrandHotelPopinButtons .submit").attr("href", this.href + "&forward=true");
                bookUrl = jQuery(this).parents(".calendar").find(".tBookLink").attr("href");
                jQuery("#compBrandHotelPopinButtons .submit").attr("href", bookUrl + "&forward=true");
            }
            else
                jQuery("#compBrandHotelPopinButtons .submit").attr("href", this.href + "&forward=true");
            jQuery("#compBrandHotelPopinButtons, #tCompBrandHotelMsg").show();
            return false;

        });
    });
}

utils.initExternalHotelAlert = function(links, isModal){
    var datas = {
        modal: isModal,
        drag: false,
        redim: false,
        iframe: false,
        ajax: false,
        width: 500,
        height: null,
        type: "alert",
        ref: "search"
    };

    var lang = (jQuery("html").attr("lang")=="en") ? "gb" : jQuery("html").attr("lang");
    jQuery.get('/'+lang+'/booking/popins.htm', function(data) {
        if(jQuery("div.popin").length==0){
            jQuery("body").append(data);
        }
        jQuery("div.search p, div.search div.btn").hide();
        links.click(function(){
            popins.openPopin(jQuery('div.' + datas.ref), datas);
            jQuery("#compBrandHotelPopinButtons .submit").attr("href", this.href);
            jQuery("#compBrandHotelPopinButtons, #tExternalHotelMsg").show();
            return false;
        });
    });
}

utils.initExternalHotelAlertHome = function(div, form, linkForm){
    var datas = {
        modal: true,
        drag: false,
        redim: false,
        iframe: false,
        ajax: false,
        width: 500,
        height: null,
        type: "alert",
        ref: "search",
        show : div
    };


    jQuery.get('/'+form.lang+'/booking/popins.htm', function(data) {
        if(jQuery("div.popin").length==0){
            jQuery("body").append(data);
        }
        if(popins.opened != null){//si popins deja instancié
            popins.openPopin(jQuery('div.' + datas.ref), datas);
        }
        else{
            popins.init();
            popins.openPopin(jQuery('div.' + datas.ref), datas);
        }
        jQuery("div.search p, div.search div.btn").hide();
        jQuery(datas.show).show();

        //form.stopSubmitInProgressEffect();
        jQuery(".btn a.submit").bind("click", {
            _this : form
        }, function(e){
            var _this = e.data._this;
            _this.$currentForm.attr("action", linkForm);
            _this.defaultPostSubmit = true;
            _this.$currentForm.submit();

            return false;
        });
    });
}

utils.initGenericPopin = function(popinSrc, popinContentSrc, modal, drag, redim, iframe, ajax, width, height, type, ref, show){
    console.log('initGenericPopin');
    var datas = {
        modal: modal ? modal : true,
        drag: drag ? drag : false,
        redim: redim ? redim : false,
        iframe: iframe ? iframe : false,
        ajax: ajax ? ajax : false,
        width: width ? width : 500,
        height: height ? height : null,
        type: type ? type : "alert",
        ref: ref ? ref : "search",
        show : show ? show : div
    };

    var lang = (jQuery("html").attr("lang")=="en") ? "gb" : jQuery("html").attr("lang");

    jQuery.get('/'+lang+popinSrc, function(data) {
        if(jQuery("div.popin").length==0){
            jQuery("body").append(data);
        }
        if(popins.opened != null){//si popins deja instancié
            popins.openPopin(jQuery('div.' + datas.ref), datas);
        }

        else{
            popins.init();
            popins.openPopin(jQuery('div.' + datas.ref), datas);
        }
        jQuery("div.search p, div.search div.btn").hide();
        jQuery(datas.show).show();

        //form.stopSubmitInProgressEffect();
        jQuery(".btn a.submit").bind("click", {
            _this : form
        }, function(e){
            var _this = e.data._this;
            _this.$currentForm.attr("action", linkForm);
            _this.defaultPostSubmit = true;
            _this.$currentForm.submit();

            return false;
        });
    });
}

utils.initConfirmPopin = function(tpl,div,target){
    var datas = {
        modal: true,
        drag: false,
        redim: false,
        iframe: false,
        ajax: false,
        width: 500,
        height: null,
        type: "alert",
        ref: "search",
        show : div
    };


    jQuery.get(tpl, function(data) {
        if(jQuery("div.popin").length==0){
            jQuery("body").append(data);
        }
        if(popins.opened != null){//si popins deja instancié
            popins.openPopin(jQuery('div.' + datas.ref), datas);
        }

        else{
            popins.init();
            popins.openPopin(jQuery('div.' + datas.ref), datas);
        }
        jQuery("div.search p, div.search div.btn").hide();
        jQuery(datas.show).show();

        //form.stopSubmitInProgressEffect();
        jQuery(".search .btn a.submit").attr("href",target);
    });
}

utils.formatDateElement = function(str){
    if(Number(str) < 10) return "0"+str;
    else return str;
}

utils.manageCallcenterDatas = function(isDisplayed){
    if(isDisplayed == true){
        var zone = utils.getCookieContent("userBrowsingZoneLocalization") == undefined ? "home" : utils.getCookieContent("userBrowsingZoneLocalization");
        var lang = (jQuery("html").attr("lang")=="en") ? "gb" : jQuery("html").attr("lang");
        var datasUrl = "/hotel-cms/"+lang+"/booking/call-center-"+zone+".js";
        jQuery.getJSON(
            datasUrl,
            function(datas){
                var $callCenterTemplate = jQuery(".insetSupportWrapper");
                $callCenterTemplate.setTemplateURL("/"+lang+"/templates-v66/booking/callcenter.tpl");
                $callCenterTemplate.setParam("lang", getCodeLangue(lang));
                $callCenterTemplate.processTemplate(datas);
                utils.tooltips.init(jQuery(".insetSupportWrapper .tooltip"));
                jQuery(".insetSupport").show();
            }
            );
    }
}

utils.getCookie = function(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

utils.getCookieContent = function(name){
    var cookieContent = utils.getCookie(name);
    if(cookieContent && cookieContent != ''){
        cookieContent = decodeURIComponent(cookieContent);
        return cookieContent.split('|');
    }
}

utils._utf8_decode = function(utftext) {
    var string = "";
    var i = 0;
    var c = c1 = c2 = 0;

    while ( i < utftext.length ) {

        c = utftext.charCodeAt(i);

        if (c < 128) {
            string += String.fromCharCode(c);
            i++;
        }
        else if((c > 191) && (c < 224)) {
            c2 = utftext.charCodeAt(i+1);
            string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
            i += 2;
        }
        else {
            c2 = utftext.charCodeAt(i+1);
            c3 = utftext.charCodeAt(i+2);
            string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }

    }
    return string;
}

utils.decode = function (string) {
    return this._utf8_decode(unescape(string));
}

utils.getAmenitieLabel = function(amenitieObject, amenitiesLabels){
    if(amenitiesLabels && amenitiesLabels[amenitieObject.code]){
        if(amenitieObject.subAmenities != null && amenitieObject.subAmenities.length > 0){
            var sLabel = new String();
            for(var i=0; i < amenitieObject.subAmenities.length; i++){
                sLabel += amenitiesLabels[amenitieObject.subAmenities[i].code];
                if(amenitieObject.subAmenities[i].free != null){
                    if(amenitieObject.subAmenities[i].free == "true") sLabel += " (" + i18n.amenities.free +")";
                    else sLabel += " (" + i18n.amenities.notfree +")";
                }
                sLabel += "<br />";
            }
            sLabel = sLabel.replace(/[\"]/g, '&quot;');
            return sLabel;
        }
        else{
            var sLabel = new String();
            sLabel = amenitiesLabels[amenitieObject.code];
            if(amenitieObject.free != null){
                if(amenitieObject.free == "true") sLabel += " (" + i18n.amenities.free +")";
                else sLabel += " (" + i18n.amenities.notfree +")";
            }
            sLabel = sLabel.replace(/[\"]/g, '&quot;');
            return sLabel;
        }
    }
    else return "";
}

utils.printTaxDateLabel = function(str, dateIn, dateOut){
    var s = {};
    s["%x"] = dateIn;
    if(dateOut) s["%y"] = dateOut;

    var re = /%./g;

    var a = str.match(re);
    for (var i = 0; i < a.length; i++) {
        var tmp = s[a[i]];
        if (tmp) {
            re = new RegExp(a[i], 'g');
            str = str.replace(re, tmp);
        }
    }

    return str;
}

utils.getTaxDateLabel = function(taxObject){
    var str = "";
    if(taxObject.taxPeriodLimited != true){
        var taxDate = new Date(taxObject.period.yearIn, taxObject.period.monthIn-1, taxObject.period.dayIn, 12, 0, 0);
        str += " (<i>"+ utils.printTaxDateLabel(i18n.tax.since, utils.printDate(taxDate, i18n.calendar.displayDateFormat)) + "</i>)<br />";
    }
    else{
        var taxDateIn = new Date(taxObject.period.yearIn, taxObject.period.monthIn-1, taxObject.period.dayIn, 12, 0, 0);
        var taxDateOut = new Date(taxObject.period.yearOut, taxObject.period.monthOut-1, taxObject.period.dayOut, 12, 0, 0);
        str += " (<i>"+ utils.printTaxDateLabel(i18n.tax.from, utils.printDate(taxDateIn, i18n.calendar.displayDateFormat), utils.printDate(taxDateOut, i18n.calendar.displayDateFormat)) + "</i>)<br />";
    }
    return str;
}

utils.getTaxLabels = function(taxesArray, type){
    var str = "";
    str += "<strong>" + i18n.tax[type] + "</strong><br />";
    for(var j=0; j < taxesArray.length; j++){
        if(taxesArray[j] != null){
            str += taxesArray[j].taxLabel;
            if(taxesArray[j].taxExtraInfo != null && taxesArray[j].taxExtraInfo != "") str += " (<i>" + taxesArray[j].taxExtraInfo +"</i>)";

            if(taxesArray[j].percent == null){
                str += " :  <span class=\"tPrice\"><span class=\"tAmount\">" + taxesArray[j].amount+"</span>&nbsp;<span class=\"tCurrency\">"+ taxesArray[j].currencyCode +"</span></span>";
            }
            else
                str += " : " + taxesArray[j].percent + "%";

            str += utils.getTaxDateLabel(taxesArray[j]);
        }
    }
    return str;
}

utils.initCommissionBox = function(show, lang){
    if(show == true){
        var commissionBox = jQuery(".tCommissionBox");
        commissionBox.setTemplateURL("/"+lang+"/templates-v66/booking/commissions.tpl");
        commissionBox.processTemplate();
        commissionBox.show();
    }
}

utils.writeIdBox = function(datas, lang){
    var idProTpl = jQuery("#identificationProTemplate");

    if(jQuery(".logo").find("a").attr("title")!="businesstravel.accorhotels.com"){
        idProTpl.setTemplateURL("/"+lang+"/templates-v66/booking/identification-pro.tpl");
    }else{// si bus
        if(jQuery("#rates").attr("id")=="rates" || jQuery("#options").attr("id")=="options" || jQuery("#summary").attr("id")=="summary" || jQuery("#confirm").attr("id")=="confirm" || jQuery("#room-dates").attr("id")=="room-dates"){
            idProTpl.setTemplateURL("/"+lang+"/templates-v66/booking/identification-pro-bus.tpl");
        }else{
            idProTpl.setTemplateURL("/"+lang+"/templates-v66/booking/identification-pro.tpl");
        }

    }
    idProTpl.processTemplate(datas);
}
utils.getRateIe6 = function (elem,name){
    elem.value = name;
//return utils.decode(utils.getUrlParameter(name));
}

utils.startSubmitInProgressEffect = function(btnSubmit) {
    var offset = btnSubmit.offset();
    //btnSubmit.parent().prepend('<div style="position:absolute; z-index:2000; width:'+btnSubmit.parent().width()+'px; height:'+btnSubmit.parent().height()+'px;" />');
    btnSubmit.wrap('<div class="submitInProgress" />');
    var btnSubmitWidth = btnSubmit.width();
    var loaderWidth = 16;
    var loaderMarginLeft = (btnSubmitWidth / 2) - (loaderWidth / 2);
    btnSubmit.prepend('<div class="loader" style="margin-left:'+loaderMarginLeft+'px"></div>');
}

//Arr�t de l'effet "loader" lors du retour Ajax
utils.stopSubmitInProgressEffect = function() {
    jQuery(".tBookLink").find('.loader').remove();
    jQuery(".tBookLink").parent().replaceWith(this.btnSubmit);

}

utils._setReservationCenter = function(UrlCenterPopup, ClassCenterPopup){
    if (UrlCenterPopup != null) {
        // Ajout du lien avec l'URL
        jQuery(".central-reservation").wrap(function() {
            //jQuery(this).text()
            return '<a class="' + ClassCenterPopup + '" href="' + UrlCenterPopup + '"></a>';
        });
    }
}

