'use strict';
/*@
Ox.Resizebar <f> Resizebar
    options <o> Options object
        collapsed   <b|false> Inital collapse state
        collapsible <b|true> If true, can be collapsed/expanded
        edge        <s|left> Edge
        elements    <a|[]> Elements of the bar
        orientation <s|horizontal> Orientation ('horizontal' or 'vertical')
        panel       <o|null> Panel object
        resizeable  <b|true> If true, can be resetted to default or original size
        resizeable  <b|true> If true, can be resized
        resize      <a|[]> Array of sizes
        size        <n|0> Default size
        tooltip     <b|s|false> If true, display tooltip, if string, append it
    self <o> Shared private variable
    ([options[, self]]) -> <o:Ox.Element> Resizebar object
@*/
Ox.Resizebar = function(options, self) {

    self = self || {};
    var that = Ox.Element({}, self)
        .defaults({
            collapsed: false,
            collapsible: false,
			defaultSize: null,
            edge: 'left',
            orientation: 'horizontal',
			resettable: false,
            resizable: false,
            resize: [],
            size: 0,
            tooltip: false
        })
        .options(options || {})
        .update({
            collapsed: function() {
                that.css({cursor: getCursor()});
                self.$tooltip && self.$tooltip.options({title: getTooltipTitle()});
            }
        })
        .addClass('OxResizebar Ox' + Ox.toTitleCase(self.options.orientation))
        .bindEvent(Ox.extend({
			dragstart: onDragstart,
			drag: onDrag,
			dragpause: onDragpause,
			dragend: onDragend
        }, self.options.resettable ? {
        	doubleclick: reset,
			singleclick: toggle
        } : {
        	anyclick: toggle
        }))
        .append(Ox.$('<div>').addClass('OxSpace'))
        .append(Ox.$('<div>').addClass('OxLine'))
        .append(Ox.$('<div>').addClass('OxSpace'));

    if (Ox.isString(self.options.tooltip)) {
        // FIXME: Use Ox.Element's tooltip
        self.$tooltip = Ox.Tooltip({title: getTooltipTitle()});
        that.on({
            mouseenter: self.$tooltip.show,
            mouseleave: self.$tooltip.hide
        });
    }

	self.clientXY = self.options.orientation == 'horizontal'
		? 'clientY' : 'clientX';
	self.dimensions = Ox.UI.DIMENSIONS[self.options.orientation];
	self.edges = Ox.UI.EDGES[self.options.orientation];
	self.isLeftOrTop = self.options.edge == 'left' || self.options.edge == 'top';

    that.css({cursor: getCursor()});

    function getCursor() {
        var cursor = '';
        if (self.options.collapsed) {
            cursor = self.options.orientation == 'horizontal'
                ? (self.isLeftOrTop ? 's' : 'n')
                : (self.isLeftOrTop ? 'e' : 'w');
        } else {
            if (self.options.resizable) {
                cursor = self.options.orientation == 'horizontal'
                    ? 'ns' : 'ew';
            } else if (self.options.collapsible) {
                cursor = self.options.orientation == 'horizontal'
                    ? (self.isLeftOrTop ? 'n' : 's')
                    : (self.isLeftOrTop ? 'w' : 'e');
            }
        }
        return cursor + '-resize';
    }

    function getTooltipTitle() {
        var title = '';
        if (self.options.collapsed) {
            title = Ox._('Click to show');
        } else {
            if (self.options.resizable) {
                title = Ox._('Drag to resize');
            }
            if (self.options.collapsible) {
                title = title
                    ? Ox._('{0}{1} click to hide', [
						title, self.options.resettable ? ',' : ' or'
					])
                    : Ox._('Click to hide');
            }
			if (self.options.resettable) {
				title += ' or doubleclick to reset'
			}
        }
        if (title && self.options.tooltip) {
            title += ' ' + self.options.tooltip;
        }
        return title;
    }

	function onDragstart(data) {
        if (self.options.resizable && !self.options.collapsed) {
            Ox.$body.addClass('OxDragging');
            self.drag = {
                startPos: data[self.clientXY],
                startSize: self.options.size
            }
        }
		that.triggerEvent('resizestart', {size: self.options.size});
	}

	function onDrag(data) {
        if (self.options.resizable && !self.options.collapsed) {
            var delta = data[self.clientXY] - self.drag.startPos,
                size = self.options.size;
            self.options.size = Ox.limit(
                self.drag.startSize + delta * (self.isLeftOrTop ? 1 : -1),
                self.options.resize[0],
                self.options.resize[self.options.resize.length - 1]
            );
            Ox.forEach(self.options.resize, function(value) {
                if (
					self.options.size >= value - 8
					&& self.options.size <= value + 8
				) {
                    self.options.size = value;
                    return false; // break
                }
            });
			if (self.options.size != size) {
                that.css(
						self.edges[self.isLeftOrTop ? 2 : 3],
						self.options.size + 'px'
					)
					.triggerEvent('resize', {size: self.options.size});
			}
		}
	}

	function onDragpause() {
        if (self.options.resizable && !self.options.collapsed) {
            if (self.options.size != self.drag.startSize) {
				that.triggerEvent('resizepause', {size: self.options.size});
            }
		}
	}

	function onDragend() {
        if (self.options.resizable && !self.options.collapsed) {
            Ox.$body.removeClass('OxDragging');
            if (self.options.size != self.drag.startSize) {
				that.triggerEvent('resizeend', {size: self.options.size});
            }
		}
	}

    function reset() {
        if (self.options.resizable && !self.options.collapsed) {
            that.triggerEvent('reset');
        }
    }

    function toggle() {
        if (self.options.collapsible) {
            self.options.collapsed = !self.options.collapsed;
            that.css({cursor: getCursor()});
            self.$tooltip && self.$tooltip.hide(function() {
                self.$tooltip.options({title: getTooltipTitle()});
            });
			that.triggerEvent('toggle', {collapsed: self.options.collapsed});
        }
    }

    return that;

};