/*
*	Dynamic Browser
*	A reusable JS class for providing dynamic filtering, sorting and pagination
*	
*	Requires Trapeze jQuery distribution
*	
*	Taylan Pince (tpince at trapeze dot com) - February 13, 2009
*/

$.namespace("trapeze.DynamicBrowser");

trapeze.DynamicBrowser = $.Class.extend({
    
    target : "",
    selector : "",
    active_params : {},
    base_url : "",
    filters : {},
    filter_list : "",
    
    filter_template : '<a href="%(href)" class="tag">%(title): %(text)</a>',
    
    filter_content : function(evt) {
        this.load_content(this.build_url($(evt.target).attr("href"), true));
        
        return false;
    },
    
    modify_content : function(evt) {
        this.load_content(this.build_url($(evt.target).attr("href"), false));
        
        return false;
    },
    
    load_content : function(url) {
        $(this.target).addClass("stand-by").load(
            url,
            {},
            this.parse_content.bind(this)
        );
        
        $(this.selector).removeClass("active");
        
        for (var filter in this.filters) {
            if (filter in this.active_params) {
                $(this.filters[filter][1] + "[href$='" + filter + "=" + this.active_params[filter] + "']").addClass("active");
            }
        }
        
        if (url.substring(url.indexOf("?") + 1).length > 0) {
            window.location.hash = "#" + url.substring(url.indexOf("?") + 1);
        } else {
            window.location.hash = "#.";
        }
        
        this.update_filter_list();
    },
    
    parse_content : function() {
        $(this.target).removeClass("stand-by");
        
        trapeze.init_markers(this.target);
    },
    
    update_filter_list : function() {
        if (this.filter_list) {
            $(this.filter_list).find("a.tag").remove();
            
            for (var filter in this.filters) {
                if (filter in this.active_params) {
                    var obj = $(this.filters[filter][1] + "[href$='" + filter + "=" + this.active_params[filter] + "']");
                    
                    $(this.filter_list).find("strong").after(trapeze.render_template(this.filter_template, {
                        "href" : obj.attr("href"),
                        "title" : this.filters[filter][0],
                        "text" : obj.text()
                    }));
                }
            }
            
            if ($(this.filter_list).find("a.tag").size() > 0) {
                $(this.filter_list).show();
            } else {
                $(this.filter_list).hide();
            }
        }
    },
    
    clear_filters : function() {
        for (var key in this.active_params) {
            if (key in this.filters || key == "page") {
                delete this.active_params[key];
            }
        }
        
        this.load_content(this.build_query());
        
        return false;
    },
    
    parse_query : function(url) {
        var params = {};
        
        if (url.indexOf("#") > -1) {
            var queries = url.substring(url.indexOf("#") + 1).split("&");
        } else if (url.indexOf("?") > -1) {
            var queries = url.substring(url.indexOf("?") + 1).split("&");
        } else {
            return params;
        }
        
        for (var i = 0; i < queries.length; i++) {
            var pair = queries[i].split("=");
            
            if (pair[0] != "") {
                params[pair[0]] = pair[1];
            }
        }
        
        return params;
    },
    
    build_url : function(url, filtered) {
        var params = this.parse_query(url);
        
        if ("page" in this.active_params && !("page" in params)) {
            delete this.active_params.page;
        }
        
        if ("order" in this.active_params && "sort-by" in params) {
            delete this.active_params.order;
        }
        
        for (var key in params) {
            if (filtered && key in this.filters && key in this.active_params && this.active_params[key] == params[key]) {
                delete this.active_params[key];
            } else {
                this.active_params[key] = params[key];
            }
        }
        
        return this.build_query();
    },
    
    build_query : function() {
        var query = [];
        
        for (var key in this.active_params) {
            query.push(key + "=" + this.active_params[key]);
        }
        
        return this.base_url + "?" + query.join("&");
    },
    
    init : function(options) {
        this.target = options.target;
        this.filter_list = options.filter_list;
        
        var url = window.location.toString();
        
        if (url.indexOf("?") > -1) {
            window.location.href = url.replace("?", "#");
        } else if (url.indexOf("#") > -1) {
            var base_url_delimiter = url.indexOf("#");
        } else {
            var base_url_delimiter = url.length;
        }
        
        this.base_url = url.substring(0, base_url_delimiter);
        this.active_params = this.parse_query(url);
        
        if ("modifiers" in options) {
            this.selector = options.modifiers + ", ";
            
            $(options.modifiers).live("click", this.modify_content.bind(this));
        }
        
        if ("filters" in options) {
            this.filters = options.filters;
            
            for (var filter in this.filters) {
                this.selector += this.filters[filter][1] + ", ";
                
                $(this.filters[filter][1]).click(this.filter_content.bind(this));
            }
        }
        
        this.selector = this.selector.substring(0, this.selector.length - 2);
        
        if (this.filter_list) {
            $(this.filter_list).find("a.tag").live("click", this.filter_content.bind(this));
            $(this.filter_list).find("a.clear").live("click", this.clear_filters.bind(this));
            $(this.filter_list).hide();
        }
        
        if (url.indexOf("#") > -1) {
            this.load_content(this.build_url(url, false));
        }
    }
    
});

