// Controlleur primaire

var Front = new function()
{
    var options;

    //Login automatique :-D
    var time_ajax_login;

    this.init = function(){

        // extension des options par défaut
        Front.options = $.maplage.defaults;

        // initialisation des outils
        Util.init(Front.options);

        /* *********************************************************************
         *  Initialisation générique
         ******************************************************************** */

        $("div.rate_me").each(function(){
            var $$ = $(this).text("");
            var data = $$.metadata();
            $$.rater(
                Util.action2href("lieu/note")+"?id="+data.lieu_id,
                {
                    style: 'basic',
                    curvalue: data.rating,
                    ratable:    data.ratable
                }
            );
        });




        // Tous les datepicker (calendrier) construit selon les specifications http://jqueryui.com/
        $.datepicker.setDefaults($.extend({showMonthAfterYear: false}, $.datepicker.regional['fr']));
        $(".jQuery-ui-datepicker").datepicker({dateFormat: 'dd/mm/yy',
                                                    changeMonth: true,
                                                    changeYear: true,
                                                    minDate: 1,
                                                    showButtonPanel: true,
                                                    defaultDate: +7});

        // Tous les tabs (onglets) construit selon les specifications http://jqueryui.com/demos/tabs/
        $(".jQuery-ui-tabs").tabs();

        // Tous les accordion construit selon les specifications http://jqueryui.com/
        $(".jQuery-ui-accordion").accordion({clearStyle: true, collapsible: true, active: false});

        // Tous les dialog construit selon les specifications
        // TODO Problème avec les dialogs quans plusieurs présents sous chrome
        $(".jQuery-ui-dialog").dialog({autoOpen: false});
        // jQuery-ui-dialog-button class="{dialog_selector:'jQuery-selector'}"
        $(".jQuery-ui-dialog-button").each(function()
        {
            data = $(this).metadata();
            if(data.dialog_selector)
            {
                //alert(data.dialog_selector);
                $(this).click(function()
                {
                    //alert(data.dialog_selector);
                    $(data.dialog_selector).dialog("option", "position", ["center",50]);
                    $(data.dialog_selector).dialog('open');
                    return false;
                });
            }
            else
            {
                dbg("Le metada dialog_selector n'est pas définie")
            }
        });

        // Tous les progressbar construit selon les specifications
        $(".jQuery-ui-progressbar").progressbar({value: 0});

        // 
        if($("#moteur-camping-dateDebut"))
        {
             $("#moteur-camping-dateDebut").change(function(){
                d = $("#moteur-camping-dateDebut").datepicker( 'getDate' );
                // alert(d);//Thu Dec 24 2009 00:00:00 GMT+0100 (CET)
                $("#moteur-camping-dateFin").datepicker('option', 'minDate',d);
            });

        }

        // Tous les boutons (rel pour mettre un lien)
        $(".jQuery-ui-button[rel]").bind("click", function(){
            window.open($(this).attr('rel'));return(false);
        });
        $(".jQuery-ui-button")
        .addClass("ui-corner-all").addClass("ui-state-default")
        .bind("mouseover",function(){$(this).addClass   ("ui-state-hover");})
        .bind("mouseout" ,function(){$(this).removeClass("ui-state-hover");})
        .bind("mousedown",function(){$(this).addClass   ("ui-state-active");})
        .bind("mouseup"  ,function(){$(this).removeClass("ui-state-active");});


        // Tous les boutons (rel pour mettre un lien)
        $(".jQuery-ui-button[rel]").bind("click", function(){
            window.open($(this).attr('rel'));return(false);
        });
        $(".jQuery-ui-button")
        .addClass("ui-corner-all").addClass("ui-state-default")
        .bind("mouseover",function(){$(this).addClass   ("ui-state-hover");})
        .bind("mouseout" ,function(){$(this).removeClass("ui-state-hover");})
        .bind("mousedown",function(){$(this).addClass   ("ui-state-active");})
        .bind("mouseup"  ,function(){$(this).removeClass("ui-state-active");});


        /* *********************************************************************
         *  Initialisation spécifique
         ******************************************************************** */

        if($("#navigation_carte_france"))
        {
            $("#navigation_carte_france").dialog({autoOpen: false,  width: 568});
            $("#navigation_carte_france").dialog("option", "position", ["center",50]);
        }
         /////// autocompletion

         // Moteur (utilisation uniquement du second paramètre (nom de la ville))
         if ($(".moteur_commune_search").length)
            $(".moteur_commune_search").autocomplete(Util.action2href("commune/autocomplete"), {
                selectFirst: true,
                max: 20,
                highlight: false,
                scroll: true,
                scrollHeight: 300,
                autoFill: false,
                delay: 100,
                formatItem: function(row) {
                    return row[1];
                },
                formatResult: function(row) {
                    //$(".moteur_commune_search_result").val(row[0].split('/').pop());
                    return row[1];
                },
                resultsClass: "ui-autocomplete-results"
        });

        // Recherche
         if ($("#commune_search").length)
            $("#commune_search").autocomplete(Util.action2href("commune/autocomplete"), {
                selectFirst: true,
                max: 20,
                highlight: false,
                scroll: true,
                scrollHeight: 300,
                autoFill: false,
                delay: 100,
                formatItem: function(row) {
                    return row[1];
                },
                formatResult: function(row) {
                    return row[0];
                },
                resultsClass: "ui-autocomplete-results"
        })
        .bind("result", function() {
            location.href = $(this).val();
            $(this).val("loading...")
        })
        .one("click", function(){$(this).val("");});

        if ($("#sejour_search").length)
        $("#sejour_search").autocomplete(Util.action2href("commune/autocomplete"), {
                selectFirst: true,
                max: 20,
                highlight: false,
                scroll: true,
                scrollHeight: 300,
                autoFill: false,
                delay: 100,
                extraParams: {
                    commune_module: $("#sejour_search").metadata().commune_module,
                    param_pro:      $("#sejour_search").metadata().param_pro
                },
                formatItem: function(row) {
                    return row[1];
                },
                formatResult: function(row) {
                    return row[0];
                },
                resultsClass: "ui-autocomplete-results"
        })
        .bind("result", function() {
            location.href = $(this).val();
            $(this).val("loading...")
        })
        .one("click", function(){$(this).val("");});

        //jCarousel
        if ($("#carousel").length && $.jcarousel) {
            var data = $("#carousel").metadata();
            $('#carousel').jcarousel({
                visible:    4,
                start:        data.current
            });
        }
        // transformation des dates
        $(".date").each(function() {
            $(this).text(Util.prettyDate(Util.subs($(this).text(), 5)+"Z"));
        });
		
		//inscription CGU
        if ($("#cgu").length)
		{
			$("form.inscrit_create_form").submit(function(){
				if (!$("#cgu").attr("checked"))
				{
					alert("Vous devez accepter les Conditions Générales d'Utilisation pour continuer");
					return false;
				}
				return true;
			});
		}
		
        // login
        if ($("#loginform").length)
            Front.login();

        // initialisation du référencement
        if (Front.options.seo_user)
            Seo.init(Front.options);

        //préchargement des images
        Util.preload(Front.options.images_to_preload);

        // affichage du modal, si il y en a un à afficher
        if (Front.options.modal)
            Front.modal(Admin.options.modal);

        // thumbnails sur les liens
        $("a.linklook").each(function(){
            var $this = $(this)
            var thumb = "http://images.websnapr.com/?url=" + $this.attr("href").replace("/http:\/\//", "" ) + "&size=m";

            $this.cluetip({
                onShow: function($a, $b) {
                    $b.html(
                        $("<img>").attr("src", thumb).attr("class", "websnapr").css("width", "100%")
                    );
                }
            })
            .click(function(){location.href = $this.attr("href")})
            .before($("<img>").attr("src", thumb).css("height", 20));
        });
		
		// les liens de fiches pratiques s'ouvrent en target blank
		$("#fiche .infos a").not("a.prev").not("a.next").attr("target", "_blank");


        // liens externes
        $('a[href^=http:]')
            .not('[href^=http://www.maplage.fr]')
            .not('[href^=http://maplage.fr]')
            .not('[href^=http://dev.maplage.fr]')
            .not('[href^=http://prof.estat.com]')
            .not('[target]')
            .addClass("external").attr({target: "_blank"});
//        $("a[href*='http://']:not([href*='"+location.hostname+"'])").click( function() {
//            window.open(this.href);
//            return false;
//        }).addClass("external").attr({ target: "_blank" });


                
        // traitement de la gmap
        if (Front.options.gmap && $("#gmap").length)
            Gmap.init($("#gmap"));
        if (Front.options.gmap && $("#GmapRight").length)
            Gmap.init($("#GmapRight"));

        // affichage des widgets, si il y en a à afficher
        if ($(".widget_ajax").length)
            $(".widget_ajax").widget();
	
		// tabs des flux RSS entrants
		$("#fortabs > ul").tabs();

        

		
		// trick pour désactiver les vrais liens ( PART 1 )
		$("#apitabs ul.tabs_me li a").each(function(){
		    $(this).data("my_url", $(this).attr("href"));
		});
		
		var disable1 = [];
		if($("#apitabs ul.tabs_me1 li a.hotel").hasClass("disable_me"))
			var disable1 = [1];
			
		dbg(disable1);
		
		$("#apitabs ul.tabs_me1").tabs({
			disabled: disable1,
			unselected: true
		});
		
		var disable2 = [1,3];
		if($("#apitabs ul.tabs_me2 li a.voiture").hasClass("disable_me"))
			var disable2 = [1,2,3];

		$("#apitabs ul.tabs_me2").tabs({
			disabled: disable2,
			unselected: true
		});
		
		// trick pour désactiver les vrais liens ( PART 2 )
		$("#apitabs ul.tabs_me li.ui-tabs-disabled a").rebind("click", function(e){
		e.stopPropagation();																
		    location.href=$(this).data("my_url");
		    return false;
		});
 	

                if ($("#listchoix_open").length)
			var active = parseInt($("#listchoix_open").attr("class"));
	        else
		        var active = 0;

         
         /* Accordions  */
		 $(".accordion").accordion({
                autoheight: false,
                animated: false ,
                alwaysOpen: false,
                navigation: false,
                active: false
		    });




		// caledrier de l'agenda
//		var htmlCalendar = $.ajax({
//		    url: Util.getHref("eventCalendar"),
//		    async: false
//		 }).responseText;
//		$("#commune-uidp").html( htmlCalendar );



        // Champ de selection de commune par departement.
        // @see select_commune_by_departement_tag()
		if ($("#geo_nav_departement").length)
	    {
	        var $sel_dep = $('#geo_nav_departement');
	        var $sel_com = $('#geo_nav_commune');

	        $sel_dep.selectChain({
	            target:    $sel_com,
	            url:         Util.getHref("communesForSelect"),
	            type:        'post',
				data:        {departement_id: $sel_dep.val()}
	        });
			$sel_com.bind("change", function(){
                    $("#geo_nav_commune").show();
			});
            if ($sel_dep.val() != 0) $sel_dep.trigger("change");
	    }


	    $("#jump_departement").change(function(){
		    var href = $(this).val();
		    if (href)
			location.href = href;
		});

	    /*
        $("#timer_counter").countdown({
			//since: new Date($("#timer_counter").attr("rel")),
			//until: new Date($("#timer_counter").attr("rel")),
			since: new Date("2008","10","09","13","00","00"),
			format: 'dHMS',		
			compact: true, 
        		description: ''
		});
        */

        // Chargement de fichiers javascript 
        /** @todo */
//        $.ajax({
//          type: "GET",
//          url: "test.js",
//          dataType: "script"
//        });


    } // Fin de la function d'initialisation

    this.login = function()
    {
        $("#username, #password").each(function() {
            $(this).one("click", function() {
                $(this).val("");
            });
        });
    };

}


/* *****************************************************************************
 *  Moteur
 **************************************************************************** */

var mm;
var moteur=null;

// Constructeur
function Moteur(moteur)
{
    //Initialisation des propriétés de l'objet
    this.pros = [];
    this.moteur = moteur;
    this.prixMin = 1;
    this.prixMax = 999999;
    this.todo = [];
    this.nbExact = 0; // Nombre de résultats corespondants exactement aux critaires
    this.nbPartiel = 0; // Nombre de résultats corespondants partiellement aux critaires
};
//Définition des méthodes de l'objet
//Méthode d'instance
Moteur.prototype.init = function()
{
    if(this.moteur != null)
    {
        for(key in this.moteur)
        {
            var unMoteur = this.moteur[key];
            this.todo[unMoteur.nom] = 10;
        }
        Moteur.progress();
        for(key in this.moteur)
        {
            var unMoteur = this.moteur[key];
            var url = unMoteur.url;//+"?callback=?";
            //Moteur.log("call "+unMoteur.nom+" :\n"+ url);
            this.call(url);
        }
    }
    else
    {
        alert('pas de moteur')
    }
};
Moteur.prototype.addPros = function(pros)
{
    //Moteur.log('adds');
    for(pro in pros){this.pros.push(pro);}
    //this.pros.concat(pros);
};
Moteur.prototype.addPro = function(pro)
{
    //Moteur.log('add');
    this.pros.push(pro);
};
Moteur.prototype.aff = function()
{
    Moteur.html('');
    try{ // trie et filtre
        this.pros.sort(Moteur.sortP);
        pros = this.pros;
        pros = this.filterP(this.pros); // retourne 2 listes de pros
    }
    catch(e){
        Moteur.log("EXCEPTION : [sort()]"+e)
    }
    for (i in pros)
    { // Affichage
        pro = pros[i];
        if(pro == "Marquer"){
            //Moteur.append('<div id="moteur_info_result_partiel" style="display:none"><div class="partiel ui-widget ui-state-active ui-corner-all"><span class="value">0</span> réponses correspondant partiellement à vos critères</div></div>');
            Moteur.append('<div id="moteur_info_result_partiel" style="display:none"><div class="partiel ui-widget ui-state-active ui-corner-all"><span class="value">0</span> résultats dont les disponibilités ne sont pas garanties  par nos partenaires</div></div>');
        }else{
            Moteur.append(pro.html);
        }
    }
};

Moteur.proGetPrixMin = function(pro)
{
    prix_min = null;
    if(pro.prix_min)
    {
        return pro.prix_min
    }
    for(y in pro.produits)
    {
        produit = pro.produits[y]
        for(z in produit.disponibilites)
        {
            disponibilite = produit.disponibilites[z];
            
            disponibilite_prix = parseFloat(disponibilite.prix);

            if(disponibilite_prix != 0)
            {
                if(!prix_min)
                {
                    prix_min = disponibilite_prix;
                }
                if(disponibilite_prix < prix_min)
                {
                    prix_min = disponibilite_prix;
                }
            }
        }
    }
    if(prix_min){
        pro.prix_min = prix_min;
        //Moteur.log('proGetPrixMin('+pro.nom+') -> '+prix_min);
    }
    return prix_min;
}
Moteur.sortP = function(a, b)
{
    //Compare "a" and "b" in some fashion, and return -1, 0, or 1

    //trie par distance
    ret = a.distance - b.distance;
    if(ret == 0){
        //trie par prix
        pa = Moteur.proGetPrixMin(a);
        pb = Moteur.proGetPrixMin(b);
        ret = (pa-pb);
    }
    return ret ;
}
Moteur.prototype.filterP = function(prosIn)
{
    prosOut = [];
    prosFin = [];
    for(i in prosIn)
    {
        pro = prosIn[i];
        //Moteur.log(pro.nom + " prixMin="+Moteur.proGetPrixMin(pro) + " this.prixMin="+this.prixMin + " this.prixMax="+this.prixMax)
        if(Moteur.proGetPrixMin(pro) > this.prixMin  &&  Moteur.proGetPrixMin(pro) < this.prixMax)
        {
            prosOut.push(pro);
        }
        else
        {
            prosFin.push(pro);
        }
    }
    this.nbExact   = prosOut.length;
    this.nbPartiel = prosFin.length;
    return prosOut.concat("Marquer",prosFin);
}
Moteur.prototype.call = function(url)
{
    try{
        jQuery.ajax({
            dataType: 'json',
            type: 'post',
            url: url,
            async: false,
            success: function(data)
            {
                //Moteur.log("OK \n"+this.url+"\n"+this+"\n"+data.toSource()+"\n"+data);
                for (i in data.pros)
                {
                    pro = data.pros[i];
                    //Moteur.log("PRO "+i+"\n "+ pro.nom);
                    mm.addPro(pro);
                }
                //alert("call -> success : data.moteur="+data.moteur);
                mm.todo[data.moteur] = 75;
                Moteur.progress();
                mm.aff();
                mm.todo[data.moteur] = 100;
                Moteur.progress();
            },
            error: function(xhr)
            {
                Moteur.log("ERROR \n"+this.url+"\n"+this+"\n"+xhr.responseText+"\n"+xhr.toSource()+"\n"+xhr);
            }
        });
    }
    catch(e)
    {
        Moteur.log("EXCEPTION : "+e)
    }
};
Moteur.prototype.toString = function()
{
    return (this.pros);
};
//Méthode de classe ou Méthode statique
Moteur.log = function(msg)
{
    $("#moteur_log").append("<div><pre>"+msg+"</pre></div>");
};
Moteur.append = function(msg)
{
    $("#moteur_result").append(msg);
};
Moteur.html = function(msg)
{
    $("#moteur_result").html(msg);
};
Moteur.progress = function()
{
    tt = 0;
    dv = 0;
    for(i in mm.todo){
        tache = mm.todo[i];
        tt += tache;
        dv++;
    }
    pourCent = 0;
    if(dv != 0){
        pourCent = tt/dv;
    }
    $("#moteur_progressbar").progressbar( 'value' , pourCent );
    if(pourCent == 100){
        if(mm.pros.length){
            //$("#moteur_progressbar").html(''+(mm.pros.length)+' résultats, dont '+(mm.nbExact)+' correspondant exactement et '+(mm.nbPartiel)+' correspondant partiellement.');
            $("#moteur_progressbar").hide();
            $("#moteur_info_result_exact   .value").html(mm.nbExact);
            $("#moteur_info_result_partiel .value").html(mm.nbPartiel);
            if(mm.nbExact   != 0){$("#moteur_info_result_exact"  ).show();}
            if(mm.nbPartiel != 0){$("#moteur_info_result_partiel").show();}
        }else{
            $("#moteur_progressbar").html("Votre requête n'a retourné aucun résultat");
        }
    }
    
}


var canyousea = {
	onBeginAnim: function()
	{
		//rien
	},
	onEndAnim: function()
	{
		$("#canyouseaWrapper").remove();
	}
};


jQuery(function(){
    Config.init(page_options);
    Front.init();
    if(moteur)
    {
        mm = new Moteur(moteur);
        $('#BoxMoteur').tabs();
        mm.init();
    }
});
