var Slidebar = function(container, img_url, base_value)
{
    this.container = container;
    if (!(this.image = this.container.getElementsByTagName('img')[0])) {
        this.container.appendChild(document.createElement('img'));
        this.image = this.container.getElementsByTagName('img')[0]
    }
    this.img_url = img_url;
    this.base_value = base_value;
    this.onChange = null;
    this.onValueSet = null;

    for (var score = 0; score <= this.max_score; score += 1) {
        var url = this.img_url + '/_k/scores/' + String(score) + '.gif';
        this.score2imageurl[score] = url;
        preloadImage(url)
    }

    this._setHandlers();
}


Slidebar.prototype = {
    container : null,
    image : null,
    img_url : '',
    base_value : 0.0,
    max_score : 10.0,
    score : 0,
    state : {
        dragging : false,
        value_set : false
    },
    score2imageurl : {},
    onChange : null,
    onValueSet : null,

    getScoreImage : function(score)
    {
        if(isNaN(score))
        {
            var index = 0;
        }else
        {
            var index = parseInt(Math.round(score));
        }
        if (!this.score2imageurl[index]) throw("No image for score '" + score + "'");
        return this.score2imageurl[index];
    },

    setScore : function(score)
    {
        this.score = score;
        try {
            this.image.src = this.getScoreImage(this.score);
        }catch(e) {alert(e)}

        if (this.onChange) this.onChange(this.score);
    },
    getScore : function()
    {
        return slide.score;
    },


    _getScoreFromMouse : function()
    {
        var e = window.event;
        var posX = e.clientX + document.body.scrollLeft;
        var left = 843 + $('wrapper').offsetLeft - document.documentElement.scrollLeft;
        var offset = posX - left;
        var width = slide.container.offsetWidth;

        var score = offset / width * this.max_score - 0.03;
//        score = Math.ceil(score);
        score = Math.max(0, score);
        score = Math.min(slide.max_score, score);
        //Just hack
        if(score >= 9.3)
        		score = 10;
        return score;
    },

    _setHandlers : function()
    {
        addEventHandler(this.container, 'mouseover', this._onMouseOver);
        addEventHandler(this.container, 'mousemove', this._onMouseMove);
        addEventHandler(this.container, 'mouseout', this._onMouseOut);
        addEventHandler(this.container, 'click', this._onClick);
    },

    _onMouseOver : function()
    {
        if (!slide.state.value_set) slide.state.dragging = true;
    },

    _onMouseOut : function()
    {
        slide.state.dragging = false;
        if (!slide.state.value_set) slide.setScore(slide.base_value);
    },

    _onMouseMove : function()
    {
        if (!slide.state.dragging) return;
        slide.setScore(slide._getScoreFromMouse());
    },

    _onClick : function()
    {
        slide.state.dragging = false;
        slide.setScore(slide._getScoreFromMouse());
        slide.state.value_set = true;
        if (slide.onValueSet) slide.onValueSet();
    }
}
