/*
 * CheckBox - checkbox definovany obrazky - tedy vlastnim stylem
 */
var ScrollBox = JAK.ClassMaker.makeClass({
    NAME: "ScrollBox",
    VERSION: "1.0"
});


ScrollBox.prototype.$constructor = function(
        box, content, slider, value)
{
    this.box = box;
    this.content = content;
    this.slider = slider;
    
    JAK.signals.addListener(this, 'change', '_sliderChange', this.slider);

    this.axisAction = JAK.Events.addListener(this.box, 'keydown', 
            this, '_arrowKey', false);

    if((JAK.Browser.client != 'ie') && (JAK.Browser.client != 'opera')
        && (JAK.Browser.client != 'safari'))
    {
    	this.rollAction = JAK.Events.addListener(this.box,'DOMMouseScroll',
                this, "_wheelAction", false,true);
    } else {
        this.rollAction = JAK.Events.addListener(this.box,'mousewheel',
                this, "_wheelAction", false,true);
    }

    this.reload(value);
}

ScrollBox.prototype.reload = function(value){
    //console.log('box: '+this.box.offsetHeight);
    //console.log('content: '+this.content.offsetHeight);

    if (this.box.offsetHeight >= this.content.offsetHeight){
        this.slider.rootElm.style.visibility = 'hidden';
        this.slider._valueToPx(100, 'key');
    } else {
        this.slider.rootElm.style.visibility = 'visible';
        if (isNaN(parseInt(value))){
            this.slider._valueToPx(100, 'key');
        } else {
            value = (parseInt(value) - 100)* -1;
            this.slider._valueToPx(value, 'key');
        }
    }
}

ScrollBox.prototype._sliderChange = function(o){
    var value = (o.target.actualValue - 100) * -1;
    var contH = this.content.offsetHeight - this.box.offsetHeight;
    //var contH = this.content.offsetHeight;
    var top = (contH/100) * value;
    
    this.box.scrollTop = parseInt(top);
}


/**
 * Ovladani slideru pomoci klavesnice - reaguje na sipky, pageup, pagedown
 * @param {object} e event udalost pro zmacknuti sipky
 * @param {object} elm element na kterem je navesena udalost
 **/
ScrollBox.prototype._arrowKey = function(e,elm){
    var percents = this.slider.getValue();
    switch(e.keyCode){
	case 38 :   // up arrow
	    if(percents < 100){
                // XXX: vyska radku nelze ziskat pokud neni nastavena a i tak
                // nemusi byt v pixelech (this.content.style.lineHeight)
                var lh = 20;
                var ch = this.content.offsetHeight;

                this.box.scrollTop = this.box.scrollTop - lh;
                var newpercents = (Math.round(this.box.scrollTop/(ch/100)) - 100) * -1;

                if (newpercents != percents)
                    this.slider._valueToPx(newpercents, 'key');
	    }
	    JAK.Events.cancelDef(e);
	    break;
	case 40 :   // down arrow
	    if(percents > 0){
                // XXX: vyska radku nelze ziskat pokud neni nastavena a i tak
                // nemusi byt v pixelech (this.content.style.lineHeight)
                var lh = 20;
                var ch = this.content.offsetHeight;

                this.box.scrollTop = this.box.scrollTop + lh;
                var newpercents = (Math.round(this.box.scrollTop/(ch/100)) - 100) * -1;

                if (newpercents != percents)
                    this.slider._valueToPx(newpercents, 'key');
	    }
	    JAK.Events.cancelDef(e);
	    break;
	case 33 :   // page up
	    if(percents < 100){
                this.slider._valueToPx(percents+1, 'key');
	    }
	    JAK.Events.cancelDef(e);
	    break;
	case 34 :   // page down
	    if(percents > 0){
	        this.slider._valueToPx(percents-1, 'key');
            }
	    JAK.Events.cancelDef(e);
	    break;
	default :
            // nothing to do ;)
	    break;
	}
}

/**
 * Metoda pro sjednoceni navratovych hodnot kolecka mysi
 * @param {object} e event udalost predavana metode pri scrolovani koleckem mysi
 **/
ScrollBox.prototype._mouseWheelDelta = function(e){
    if(e.wheelDelta){
        delta = (e.wheelDelta/120);
    } else if(e.detail) {
    	delta = -(e.detail/3);
    }
    return delta;
}

/**
 * Ovladani slideru pomoci kolecka mysi
 * @param {object} e udalost scrolovani koleckem mysi
 * @param {object} elm element na kterem je navesena udalost wheelscroll
 **/
ScrollBox.prototype._wheelAction = function(e,elm){
	JAK.Events.cancelDef(e);
	var delta = this._mouseWheelDelta(e);
	pm = Math.round(delta + 0);

        this.slider._valueToPx(this.slider.getValue()+pm, 'key');
}

