 
var AjaxManager = new function() {
    
    var _self = this;
    
    var _hash = "";
    var _locale = "";
    
    this.init = function() {
        
        _locale = $("html").attr("lang");
        
        setHashByHref();
        loadAjaxByHash();
        
        initHashChange();
        initAjaxPost();
        initAjaxGet();
        
        return {
            loadContent: loadContent,
            domReadyContent: domReadyContent,
            ajaxGet: ajaxGet,
            ajaxPost: ajaxPost,
            activeContent: activeContent,
            hardUpdateHash: hardUpdateHash
        };
    };
    
    var hardUpdateHash = function(hash) {
        
        _hash = hash;
        location.hash = "#" + hash;
        
    };
    
    var setHashByHref = function() {
        
        var hrefMatch;
        if (hrefMatch = location.pathname.match(/^\/(.{0,2}\/?)([^#]+)/)) {
            
            if (hrefMatch[2] != "/") {
                location = "/" + hrefMatch[1] + "#/" + hrefMatch[2];
            }
        }
    };

    var loadAjaxByHash = function() {
        
        var hash = location.hash;
        if (hash && hash != "#" + _hash) {
            ajaxGet("/" + (hash.replace('#',_locale)));
        }
    };

    var initHashChange = function() {
        
        $(window).hashchange(loadAjaxByHash);
    };

    var initAjaxGet = function() {
        
        $("a").live('click', function() {
            
            var elt = this;
                
            if ( $(elt).hasClass("ajax") ) {
                    
                ajaxGet($(elt).attr('href'));
                return false;
            }
            
            if ( $(elt).hasClass("logout") ) {
                    
                ajaxPost("/en/","_logout=1");
                hardUpdateHash("/");
                return false;
            }
        });
        
        $(".blankTarget").live("click",function(e) {
            e.preventDefault() ;
            var elt = this;
            window.open($(elt).attr("href"));
            return false;
        });
    };
    
    var initAjaxPost = function() {
        
        $("form").live('submit', function() {
    
            var form = this;
            var button = $(form).find(":submit"); // XXX: to improve in case of multiples buttons
            
            if ( $(form).hasClass("ajax") ) {
                
                var params = $(form).serialize() + '&' + $(button).filter(':submit').attr('name') + '=' + $(button).attr('value');
                ajaxPost($(form).attr('action'),params);
        
                return false;
            }
    
        });
    };
    
    var ajaxGet = function(href) {
        var elt = this;
        
        var r = /^(\/..)(\/.*)$/;
        var path = r.exec(href);
        
        if(!Boolean(path)) return ;
        
        if (path[1].match(_locale)) {
            
            $.get(path[1] + '/content' + path[2], loadContent);
            
            if (!(location.hash == path[2])) { _hash = location.hash = path[2] }
        
        } else {
            location = path[1] + '/#' + path[2];
        }
    };
    
    var ajaxPost = function (href,params) {
    
        var elt = this;
        
        var r = /^(\/..)(\/.*)$/;
        var path = r.exec(href);
        
        $.post(path[1] + '/content' + path[2], params, loadContent);
    };
    
    var loadContent = function(data) {
    
        var data = $(data);
        //
        var content = (data.find('#content'))[0];
    
        if (content) {
            $("#content").replaceWith( content );
        }
    
        var locales = (data.find('#locales .lang'))[0];
        if (locales) {
            $(".lang").replaceWith( locales );
        }
    
        var wrapper_classes = (data.find('#wrapper_classes'))[0];
        if (wrapper_classes) {
            $("#wrapper").attr('class',$(wrapper_classes).html());
        }
    
        var title = (data.find('#title'))[0];
        if (title) {
            document.title = $(title).html();
        }
    
        $(".bottomlinks a").removeClass("active");
        var href = data.find("#href").html();
        if (href) {
            
            $(".bottomlinks a[href='"+ href +"']").addClass("active");
            
            if (!!_gaq) {
                _gaq.push(['_trackPageview', '/ajax' + href]) ;
            }
        }
        
        activeContent();
    };
    
    var activeContent = function() {
        window.activeContentClosure(false) ;
        window.activeContentClosure(true) ;
    };
    
    var domReadyContent = function() {
        // inits and launch on DOMREADY
        window.domReadyClosure() ;
    };
} 



$(document).ready(function() {
    ajaxManager = AjaxManager.init();
    ajaxManager.domReadyContent() ;
    ajaxManager.activeContent();
});

