﻿/// <reference name="MicrosoftAjax.js"/>
Type.registerNamespace("Pacem.UI");

Pacem.UI.DragBehavior = function(element) {
    Pacem.UI.DragBehavior.initializeBase(this, [element]);

    this._refPoint = new Sys.UI.Point(0.0, 0.0); 
    this._active = false;

    this._pressHandler;
    this._releaseHandler;
    this._moveHandler;
}

Pacem$UI$getMouseCoords = function(ev) {
    if (ev.pageX || ev.pageY) {
        return new Sys.UI.Point(ev.pageX, ev.pageY);
    }
    var body = document.documentElement ? document.documentElement : document.body;
    var x = ev.clientX + body.scrollLeft - body.clientLeft;
    var y = ev.clientY + body.scrollTop - body.clientTop;
    return new Sys.UI.Point(
           isNaN(x) ? 0.0 : x,
           isNaN(y) ? 0.0 : y
        );
}

Pacem.UI.DragBehavior.prototype = {
    initialize: function() {
        Pacem.UI.DragBehavior.callBaseMethod(this, 'initialize');

        this._pressHandler = Function.createDelegate(this, this._onPress);
        this._releaseHandler = Function.createDelegate(this, this._onRelease);
        this._moveHandler = Function.createDelegate(this, this._onMove);

        $addHandler(this.get_element(), "mousedown", this._pressHandler);
        $addHandler(document.body, "mouseup", this._releaseHandler);
        $addHandler(document.body, "mousemove", this._moveHandler);
    },
    dispose: function() {
        $clearHandlers(this.get_element());
        $removeHandler(document.body, "mouseup", this._releaseHandler);
        $removeHandler(document.body, "mousemove", this._moveHandler);
        Pacem.UI.DragBehavior.callBaseMethod(this, 'dispose');
    },
    _onPress: function(evt) {
        this._active = true;
        this._refPoint = this._getMouseCoords(evt);
        var args = new Pacem.UI.MouseEventArgs(this._refPoint);
        this.raiseDragStarted(args);
        //
        evt.preventDefault();
        evt.stopPropagation();
    },
    _onRelease: function(evt) {
        if (this._active == true) {
            var coords = this._getMouseCoords(evt);
            evt.preventDefault();
            evt.stopPropagation();
            this._active = false;
            var args = new Pacem.UI.MouseEventArgs(coords);
            this.raiseDragFinished(args);
        }
    },
    _onMove: function(evt) {
        if (this._active == true) {
            var coords = this._getMouseCoords(evt);
            var args = new Pacem.UI.DraggingEventArgs(this._refPoint, coords);
            this.raiseDragging(args);
            //
            evt.preventDefault();
            evt.stopPropagation();
        }
    },
    _getMouseCoords: function(ev) {
        return Pacem$UI$getMouseCoords(ev);
    },
    add_dragging: function(handler) {
        /// <summary>
        /// Add an event handler for the dragging event
        /// </summary>
        /// <param name="handler" type="Function" mayBeNull="false">
        /// Event handler
        /// </param>
        /// <returns />
        this.get_events().addHandler('dragging', handler);
    },
    remove_dragging: function(handler) {
        /// <summary>
        /// Remove an event handler from the dragging event
        /// </summary>
        /// <param name="handler" type="Function" mayBeNull="false">
        /// Event handler
        /// </param>
        /// <returns />
        this.get_events().removeHandler('dragging', handler);
    },
    raiseDragging: function(eventArgs) {
        /// <summary>
        /// Raise the dragging event
        /// </summary>
        /// <param name="eventArgs" type="Pacem.UI.DraggingEventArgs" mayBeNull="false">
        /// Event arguments for the dragging event
        /// </param>
        /// <returns />
        var handler = this.get_events().getHandler('dragging');
        if (handler) {
            handler(this, eventArgs);
        }
    },
    add_dragStarted: function(handler) {
        /// <summary>
        /// Add an event handler for the dragStarted event
        /// </summary>
        /// <param name="handler" type="Function" mayBeNull="false">
        /// Event handler
        /// </param>
        /// <returns />
        this.get_events().addHandler('dragStarted', handler);
    },
    remove_dragStarted: function(handler) {
        /// <summary>
        /// Remove an event handler from the dragStarted event
        /// </summary>
        /// <param name="handler" type="Function" mayBeNull="false">
        /// Event handler
        /// </param>
        /// <returns />
        this.get_events().removeHandler('dragStarted', handler);
    },
    raiseDragStarted: function(eventArgs) {
        /// <summary>
        /// Raise the dragStarted event
        /// </summary>
        /// <param name="eventArgs" type="Pacem.UI.MouseEventArgs" mayBeNull="false">
        /// Event arguments for the dragStarted event
        /// </param>
        /// <returns />
        var handler = this.get_events().getHandler('dragStarted');
        if (handler) {
            handler(this, eventArgs);
        }
    },
    add_dragFinished: function(handler) {
        /// <summary>
        /// Add an event handler for the dragFinished event
        /// </summary>
        /// <param name="handler" type="Function" mayBeNull="false">
        /// Event handler
        /// </param>
        /// <returns />
        this.get_events().addHandler('dragFinished', handler);
    },
    remove_dragFinished: function(handler) {
        /// <summary>
        /// Remove an event handler from the dragFinished event
        /// </summary>
        /// <param name="handler" type="Function" mayBeNull="false">
        /// Event handler
        /// </param>
        /// <returns />
        this.get_events().removeHandler('dragFinished', handler);
    },
    raiseDragFinished: function(eventArgs) {
        /// <summary>
        /// Raise the dragFinished event
        /// </summary>
        /// <param name="eventArgs" type="Pacem.UI.MouseEventArgs" mayBeNull="false">
        /// Event arguments for the dragFinished event
        /// </param>
        /// <returns />
        var handler = this.get_events().getHandler('dragFinished');
        if (handler) {
            handler(this, eventArgs);
        }
    }
}
Pacem.UI.DragBehavior.registerClass('Pacem.UI.DragBehavior', Sys.UI.Behavior);




Pacem.UI.MouseEventArgs = function(mousePosition) {
    /// <summary>
    /// Event arguments used when the motion of a Tween has changed.
    /// </summary>
    /// <param name="mousePosition" type="Sys.UI.Point" mayBeNull="false">
    /// Start position for this dragging event (x,y Sys.UI.Point).
    /// </param>
    Pacem.UI.MouseEventArgs.initializeBase(this);
    this._position = mousePosition;
}
Pacem.UI.MouseEventArgs.prototype = {
    get_position: function() {
        /// <value type="Sys.UI.Point" DomElement="false" mayBeNull="true">
        /// Actual position (x,y Sys.UI.Point).
        /// </value>
        return this._position;
    }
}
Pacem.UI.MouseEventArgs.registerClass('Pacem.UI.MouseEventArgs', Sys.EventArgs);

Pacem.UI.DraggingEventArgs = function(startPosition, actualPosition) {
    /// <summary>
    /// Event arguments used when the motion of a Tween has changed.
    /// </summary>
    /// <param name="startPosition" type="Sys.UI.Point" mayBeNull="false">
    /// Start position for this dragging event (x,y Sys.UI.Point).
    /// </param>
    /// <param name="actualPosition" type="Sys.UI.Point" mayBeNull="false">
    /// Actual position (x,y Sys.UI.Point).
    /// </param>
    Pacem.UI.DraggingEventArgs.initializeBase(this, [actualPosition]);

    this._startPosition = startPosition;
    //this._actualPosition = actualPosition;
}
Pacem.UI.DraggingEventArgs.prototype = {
    get_startPosition: function() {
        /// <value type="Sys.UI.Point" DomElement="false" mayBeNull="false">
        /// Start position for this dragging event (x,y Sys.UI.Point).
        /// </value>
        return this._startPosition;
    }/*,
    get_delta: function() {
    /// <value type="Sys.UI.Point" DomElement="false" mayBeNull="true">
    /// Delta (x,y JSON object) between actual and start position.
    /// </value>
    return this._delta;
    },
    get_actualPosition: function() {
        /// <value type="Sys.UI.Point" DomElement="false" mayBeNull="true">
        /// Actual position (x,y Sys.UI.Point).
        /// </value>
        return this._actualPosition;
    }*/
}
Pacem.UI.DraggingEventArgs.registerClass('Pacem.UI.DraggingEventArgs', Pacem.UI.MouseEventArgs);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();