/*global jQuery*/
(function($) {
        $.fn.progressBar = function(params) {
                // apply defaults
                var params = $.extend({
                        image_width: 0,
                        min: 0,
                        max: 100,
                        value: 0,
                        progress_image: "images/bar.png",
                        display_percentage: true,
                        text: ""
                }, params);

                var measured_width = 0;

                return this.each(function() {
                        var progress_bar = $(this);

                        // save the parameters
                        $(this).data("params", params);



                        // ==============================
                        // | Public API for ProgressBar |
                        // ==============================

                        this.setValue = function(value, text) {
                                var text = text || false;
                                var params = $(this).data("params");
                                var fraction = (value - params.min) / (params.max - params.min);
                                var left_position = Math.round(fraction * $(this).width() - params.image_width);
                                progress_bar.css({
                                        backgroundPosition: "" + left_position.toString() + "px 0px"
                                });
                                if(params.display_percentage) {
                                        $(this).text(Math.round(fraction * 100) + "%");
                                } else {
                                        if(text) {
                                                $(this).text(text);
                                                params.text = text;
                                        }
                                }
                                params.value = value;
                                $(this).data("params", params);
                        };

                        this.getValue = function() {
                                return $(this).data("params").value;
                        };

                        this.setMinimum = function(value) {
                                var params = progress_bar.data("params");
                                params.min = Number(value);
                                progress_bar.data("params", params);
                                this.setValue(this.getValue());
                        };

                        this.setMaximum = function(value) {
                                var params = progress_bar.data("params");
                                params.max = Number(value);
                                progress_bar.data("params", params);
                                this.setValue(this.getValue());
                        };

                        this.getMinimum = function() {
                                return $(this).data("params").min;
                        };

                        this.getMaximum = function() {
                                return $(this).data("params").max;
                        };

                        this.setText = function(text) {
                                var params = $(this).data("params");
                                params.text = text;
                                if(!params.display_percentage) {
                                        $(this).text(text);
                                }
                                $(this).data("params", params);
                        };

                        this.getParameters = function() {
                                return $(this).data("params");
                        };

                        // initialize the component
                        progress_bar.css({
                                background: progress_bar.css("backgroundColor") + " url('" + $.media_url + params.progress_image + "') -" + params.image_width.toString() + "px 0px no-repeat"
                        }).data("params", params);

                        progress_bar.get(0).setValue(params.value, params.text);
                });
        };
})(jQuery);
