// vim: et:ts=4:sw=4:sts=4:ft=javascript

/*@
Ox.SmallTimeline <f:Ox.Element> SmallTimeline Object
    () ->              <f> SmallTimeline Object
    (options) ->       <f> SmallTimeline Object
    (options, self) -> <f> SmallTimeline Object
    options <o> Options object
    self    <o> shared private variable
@*/

Ox.SmallTimeline = function(options, self) {

    self = self || {};
    var that = Ox.Element({}, self)
            .defaults({
                duration: 0,
                find: '',
                matches: [],
                points: [0, 0],
                position: 0,
                subtitles: [],
                videoId: '',
                width: 0
            })
            .options(options || {})
            .addClass('OxTimelineSmall')
            .mousedown(mousedown)
            .mouseleave(mouseleave)
            .mousemove(mousemove)
            .bindEvent({
                drag: function(event, e) {
                    mousedown(e);
                }
            });

    $.extend(self, {
        $images: [],
        $markerPoint: [],
        $subtitles: [],
        $tooltip: Ox.Tooltip({
            animate: false
        }).css({
            textAlign: 'center'
        }),
        hasSubtitles: self.options.subtitles.length,
        height: 16,
        margin: 8
    });

	that.css({
		width: (self.options.width + self.margin) + 'px',
		height: (self.height + self.margin) + 'px'
	});

    self.$line = $('<img>')
        .addClass('OxTimelineSmallImage')
        .attr({
            src: '/' + self.options.videoId + '/timelines/timeline.16.0.png'
        })
        .css({
            position: 'absolute',
            left: '4px',
            top: '4px',
            width: self.options.width,
            height: '16px'
        })
        .appendTo(that.$element);

    self.$markerPosition = $('<img>')
        .addClass('OxMarkerPosition')
        .attr({
            src: Ox.UI.PATH + 'png/videoMarkerPlay.png'
        })
        .css({
            position: 'absolute',
            width: '9px',
            height: '5px',
            zIndex: 10
        })
        .appendTo(that.$element);

    setPosition();

    ['in', 'out'].forEach(function(v, i) {
        var titleCase = Ox.toTitleCase(v);
        self.$markerPoint[i] = $('<img>')
            .addClass('OxMarkerPoint' + titleCase)
            .attr({
                src: Ox.UI.PATH + 'png/videoMarker' + titleCase + '.png'
            })
            .appendTo(that.$element);
        setMarkerPoint(i);
    });

    function getPosition(e) {
        return e.offsetX / self.options.width * self.options.duration;
    }

    function getSubtitle(position) {
        var subtitle = null;
        Ox.forEach(self.options.subtitles, function(v) {
            if (v['in'] <= position && v['out'] >= position) {
                subtitle = v;
                return false;
            }
        });
        return subtitle;
    }

    function mousedown(e) {
        var $target = $(e.target);
        if (
            $target.hasClass('OxTimelineSmallImage') ||
            $target.hasClass('OxTimelineSmallSubtitles')
        ) {
            self.options.position = getPosition(e);
            setPosition();
            that.triggerEvent('change', {
                position: self.options.position
            });
        }
        e.preventDefault();
    }

    function mouseleave(e) {
        self.$tooltip.hide();
    }

    function mousemove(e) {
        var $target = $(e.target),
            position,
            subtitle;
        if (
            $target.hasClass('OxTimelineSmallImage') ||
            $target.hasClass('OxTimelineSmallSubtitles')
        ) {
            position = getPosition(e);
            subtitle = getSubtitle(position);
            self.$tooltip.options({
                    title: subtitle ?
                        '<span class=\'OxBright\'>' +
                        Ox.highlight(subtitle.value, self.options.find, 'OxHighlight').replace(/\n/g, '<br/>') +
                        '</span><br/>' +
                        Ox.formatDuration(subtitle['in'], 3) + ' - ' + Ox.formatDuration(subtitle['out'], 3) :
                        Ox.formatDuration(position, 3)
                })
                .show(e.clientX, e.clientY);
        } else {
            self.$tooltip.hide();
        }

    }

    function setMarker() {
        self.$markerPosition
            .css({
                left: parseInt(
                    self.options.position / self.options.duration * self.options.width
                ) + 'px',
                top: '2px',
            });
    }

    function setMarkerPoint(i) {
        var position = self.options.points[i];
        self.$markerPoint[i]
            .css({
                left: (position % self.options.width) + 'px',
                top: (parseInt(position / self.options.width) * (self.height + self.margin) + 16) + 'px',
            });
    }

    function setPosition() {
        self.options.position = Ox.limit(self.options.position, 0, self.options.duration);
        setMarker();
    }

    function setWidth() {
		self.$line.css({
			width: self.options.width + 'px',
		});
        setMarker();
        setMarkerPoint(0);
        setMarkerPoint(1);
    }

    self.setOption = function(key, value) {
        //Ox.print('onChange:', key, value)
        if (key == 'points') {
            //Ox.print('key', key, 'value', value)
            setMarkerPoint(0);
            setMarkerPoint(1);
        } else if (key == 'position') {
            setPosition();
        } else if (key == 'width') {
            setWidth();
        }
    };

    return that;

};