SKOBBLERwidgets = (typeof SKOBBLERwidgets =='undefined')?{}: SKOBBLERwidgets;


SKOBBLERwidgets.barChart = function(container, trigger, data , options) {

	this.init(container, trigger, data, options);
}

SKOBBLERwidgets.barChart.prototype = {
    container: null,
    trigger: null,
    chartContainer: null,
    labelsContainer: null,
    closer:null,
	data: null,
	options: null,
    bars: null,
    labels: null,
    visible: false,
    defaultCN: null, // default class names for bars
    //constructor 
    init: function(container, trigger, data, options) {
        this.container = $$("."+container)[0];
        this.trigger = $$("."+trigger)[0];
        this.chartContainer = $$('.js_barChart')[0];
        this.closer = $$('.js_closeRd')[0];
        this.labelsContainer = $$('.js_labels')[0];

        this.bars = this.chartContainer.childElements();

        this.defaultCN = this.getDefaultClassNames(this.bars);
		this.data = new Array();
        if(data != null) {
            this.loadData(data);
        } else {
            this.loadDataFromTemplate();
        }
        this.labels = new Array();
		this.options = options || {};
		this.applyOptions();
        this.attachEvents();
        this.draw(); //sets this.bars
        
    },

    //public
   loadData: function(data) {
     this.data = new Array();
     // assoc array to simple array 0-indexed {"1":0,"2":1,"3":0,"4":2,"5":2}
     $H(data).each(function(elem) {
            this.data[parseInt(elem[0])-1] = elem[1];
        }.bind(this)
     );
    },

    //public
    show: function() {
        if(this.visible == true) {
            this.hide();
        } else {
            this.container.show();
            this.assignClassNames(this.data, this.bars);
            this.animate();
            this.visible = true;
        }

    },

    //public
    hide: function() {
        this.resetBars();
        this.container.hide();
        this.visible = false;

    },

    //public
    isVisible: function() {
      return this.visible;
    },

    //public
    draw: function() {
        this.labelsContainer.innerHTML = "";
        var left = 10;
        for(var i=0; i<this.bars.length; i++){
            var label = document.createElement("div");
            label = this.labelsContainer.appendChild(label);
            label = $(label);
            label.innerHTML = this.data[i];
            label.addClassName('lab');
            this.labels[i] = label;
        }

        var max = this.max(this.data);
        this.toPercent(this.data, max);
        this.assignClassNames(this.data, this.bars);
        for(var i=0; i<this.bars.length; i++){
            this.bars[i].hide();
            this.bars[i].style.height = "0px";
            this.bars[i].style.left = left + "px";
            this.labels[i].style.left = (left-10) + "px";
            //this.assignClassName(this.bars[i],  this.data[i]);

            left += 40;
        }

    },

    //public
    animate: function() {
        for(var i=0; i<this.bars.length; i++) {
            this.bars[i].show();
            new Effect.Parallel([
                new Effect.Morph(this.bars[i], {
                    style: "height: "+(this.options.maxSize * this.data[i]) + "px;",
                    duration: 1.5
                }),

                new Effect.Morph(this.labels[i], {
                    style: "bottom: "+(this.options.maxSize * this.data[i] + 2) + "px;",
                    duration: 1.5
                })
            ],{duration: 1.5});

        }
    },


    //private
    attachEvents: function() {
        Event.observe(this.trigger, "click", this.show.bind(this));
        Event.observe(this.closer, "click", this.hide.bind(this));
    },

   

    //private
    getDefaultClassNames: function(bars) {
       var cn = new Array();
         for(var i=0; i<bars.length; i++){
            cn[i] = bars[i].classNames();
         }
        return cn;
    },

    //private
    loadDataFromTemplate: function() {
       
        for(var i=0; i<this.bars.length; i++){
            this.data[i] = parseInt(this.bars[i].innerHTML);
            this.bars[i].innerHTML = "";
        }
    },

    
    //private
    applyOptions: function() {
        this.options.maxSize = this.options.maxSize || 150;
        //not used yet
        //this.options.type = this.options.type || "vertical"; // horizontal OR vertical //"b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "b10"
        this.options.barClassNames = this.options.barClassNames || ["b1", "b5", "b6", "b8", "b10"];
		
	},

    

    //private
    clearClassNames: function(bars, defaultCN) {
        for(var i=0; i<bars.length; i++){
            bars[i].className = defaultCN[i];
         }
    },

    //private
    sort: function(data) {
     
        var swapped = true;
        do {
            swapped = false;
            for(var i=0; i<data.length-1; i++) {
                if(data[i][1]> data[i+1][1]) {
                    var aux = data[i];
                    data[i] = data[i+1];
                    data[i+1] = aux;
                    
                    swapped = true;
                }
            }
        }while(swapped == true);
        return data;
    },

    /**
     * Not used
     */
    _assignClassName: function(bar, percent) {
        percent = percent * 100;
        var step = Math.round(100/this.options.barClassNames.length);
        var j = 0;
        for(var i=0; i<100; i+=step) {
            if(percent>=i && percent<=i+step) { // <= :)
                bar.addClassName(this.options.barClassNames[j]);
            }
            j++;
        }
    },

    //private
    assignClassNames: function(data, bars) {
        this.clearClassNames(bars, this.defaultCN);
        
        var cn = new Array();
        for(var i=0; i<data.length; i++){
            cn[i] = [i, data[i]];
        }
        this.sort(cn);
        var no = this.options.barClassNames.length;
        for(var i=cn.length-1; i>=0; i--) {
            if(typeof cn[i+1] == 'undefined' || cn[i+1][1] != cn[i][1]) {
                --no;
            }
            bars[cn[i][0]].addClassName(this.options.barClassNames[no]);
        }
    },
    
    //private
    resetBars: function() {
        for(var i=0; i<this.bars.length; i++){
            this.bars[i].hide();
            this.bars[i].style.height = "0px";
            this.labels[i].style.bottom = "0px";
        }
    },

    
    //private
    max: function(data){
        var maximum = -1;
        for(var i=0; i<data.length; i++) {
            if(maximum<data[i])
                maximum = data[i];
        }
        return maximum;
    },

    //private
    toPercent: function(data, max) {
        for(var i=0; i<data.length; i++) {
            data[i] = data[i]/max;
        }
    }



}
