"use strict";
class RedNaoDragManager {
    public FormBuilder: RedNaoFormBuilder;
    public moveFunction: any;
    public IsResizing: boolean;
    public DragBehavior:DragItemBehaviorBase;
    public displayedDraggedElement:JQuery;
    public UnbindMoveFunction:any;

    constructor(formBuilder: any) {
        this.FormBuilder = formBuilder;
        this.moveFunction = null;
        this.IsResizing = false;
    }

    public MakeFieldsCatalogDraggable() {
        let items = rnJQuery(".rednaoformbuilder .component");
        for (let i = 0; i < items.length; i++) {
            this.MakeItemDraggable(rnJQuery(items[i]));

        }
    };

    public MakeAlreadySelectedElementsDraggable() {
        let items = rnJQuery("#redNaoElementlist .rednao-control-group");
        for (let i = 0; i < items.length; i++) {
            this.MakeItemDraggable(rnJQuery(items[i]));
        }
    };


    public MakeItemDraggable(jQueryElement) {
        let self = this;
        jQueryElement.mousedown(function (e) {
            self.SmartDonationsFormMouseDownFired(e, rnJQuery(this))
        });
        jQueryElement.find('input[type=submit],button,input[type=image]').click(function (e) {
            e.preventDefault();
            e.stopPropagation();
        });

        jQueryElement.find('.redNaoCheckBox').unbind('mouseover');
        jQueryElement.find('.redNaoCheckBox').unbind('click');
        jQueryElement.find('.iCheck-helper').unbind('mouseover');
        jQueryElement.find('.iCheck-helper').unbind('click');

        jQueryElement.find('.redNaoRadio').unbind('mouseover');
        jQueryElement.find('.redNaoRadio').unbind('click');

        jQueryElement.find('.select2-choice').unbind('mousedown');


    };

    public SmartDonationsFormMouseDownFired(e, draggedElement) {
        if (e.which != 1 || this.IsResizing)
            return;

        let focused = rnJQuery(':focus');
        if (focused.length > 0) {
            if (focused.closest('#smartFormPropertiesContainer').length > 0) {
                focused.blur();
            }
        }
        e.stopPropagation();
        e.preventDefault();
        if (typeof this.FormBuilder == 'undefined')//formbuilder is undefined when called from the style editor
            return;
        if (this.FormBuilder.FormBuilderDisabled)
            return;
        let draggedItemDisplayed = false;

        if (rnJQuery(this).hasClass('last'))
            return;

        let classOrigin = "";
        if (draggedElement.closest('.formelements').length > 0 || draggedElement.closest('.step-pane').length > 0)//step-pane for splitted forms;
            this.DragBehavior = new DragItemBehaviorExistingElement(this.FormBuilder, draggedElement);
        else
            this.DragBehavior = new DragItemBehaviorNewElement(this.FormBuilder, draggedElement);

        let self = this;
      /*  this.DragBehavior.ElementAdded = function (newElementJQuery) {
            self.MakeItemDraggable(newElementJQuery);
        };*/

        let offset = draggedElement.offset();


        let pageX = e.pageX;
        let pageY = e.pageY;
        let deltaX = pageX - offset.left;
        let deltaY = pageY - offset.top;
        // this.UnbindMovefunction();


        this.moveFunction = function (e) {
            if (e.pageX > pageX - 10 && e.pageX < pageX + 10 && e.pageY > pageY - 10 && e.pageY < pageY + 10)
                return;

            if (!draggedItemDisplayed) {
                self.displayedDraggedElement = self.DragBehavior.DisplayDraggedItem(classOrigin);
                draggedItemDisplayed = true;
                self.MakeItemDraggable(self.displayedDraggedElement);
            }

            self.displayedDraggedElement.offset({top: e.pageY - deltaY, left: e.pageX - deltaX});
            let list = rnJQuery("#redNaoElementlist .rednao-control-group,#redNaoElementlist .last,#redNaoSmartFormsPlaceHolder");
            let i;
            for (i=0; i < list.length; i++) {
                let currentElement = rnJQuery(list[i]);
                let offset = currentElement.offset();
                let width = currentElement.outerWidth(true);
                let height = currentElement.outerHeight(true);
                if (e.pageY > offset.top && e.pageX > offset.left && e.pageY < offset.top + height && e.pageX < offset.left + width) {
                    let position = "";
                    let sideWidth = width * .1;
                    if (e.pageX > offset.left + width - sideWidth)
                        position = 'right';
                    else if (e.pageX < offset.left + sideWidth)
                        position = 'left';
                    else if (e.pageY < offset.top + height / 2)
                        position = 'top';
                    else
                        position = 'bottom';

                    let target = rnJQuery(list[i]);
                    if (target.hasClass('last'))
                        position = 'top';

                    let subTarget = null;
                    let subTargetPosition = null;

                    if (target.hasClass('sfFieldWithFields')) {
                        for (let t = i + 1; t < list.length; t++) {
                            currentElement = rnJQuery(list[t]);
                            offset = currentElement.offset();
                            width = currentElement.outerWidth(true);
                            height = currentElement.outerHeight(true);
                            if (e.pageY > offset.top && e.pageX > offset.left && e.pageY < offset.top + height && e.pageX < offset.left + width) {
                                let sideWidth = width * .1;
                                if (e.pageX > offset.left + width - sideWidth)
                                    subTargetPosition = 'right';
                                else if (e.pageX < offset.left + sideWidth)
                                    subTargetPosition = 'left';
                                else if (e.pageY < offset.top + height / 2)
                                    subTargetPosition = 'top';
                                else
                                    subTargetPosition = 'bottom';

                                subTarget = rnJQuery(list[t]);
                                if (target.hasClass('last'))
                                    subTargetPosition = 'top';
                            }
                        }
                    }
                    self.DragBehavior.HoverInElement(target, position, self.displayedDraggedElement, subTarget, subTargetPosition);
                    return;
                }

            }

            self.DragBehavior.HoverInAnything(rnJQuery(list[i]), self.displayedDraggedElement, e.pageX, e.pageY);
        };

        this.UnbindMoveFunction = function (e) {
            if (self.moveFunction != null) {
                rnJQuery("body").unbind('mousemove', self.moveFunction);
                rnJQuery("body").unbind('mouseup', self.UnbindMoveFunction);
                self.moveFunction = null;

            }

            if (self.displayedDraggedElement == null)
                self.DragBehavior.ElementClicked();
            else {
                self.displayedDraggedElement.remove();
                self.displayedDraggedElement = null;
                let list = rnJQuery("#redNaoElementlist .rednao-control-group,#redNaoElementlist .last,#redNaoSmartFormsPlaceHolder");
                for (let i = 0; i < list.length; i++) {
                    let currentElement = rnJQuery(list[i]);
                    let offset = currentElement.offset();
                    let width = currentElement.outerWidth(true);
                    let height = currentElement.outerHeight(true);
                    if (e.pageY > offset.top && e.pageX > offset.left && e.pageY < offset.top + height && e.pageX < offset.left + width) {
                        let position = "";
                        let sideWidth = width * .1;
                        if (e.pageX > offset.left + width - sideWidth)
                            position = 'right';
                        else if (e.pageX < offset.left + sideWidth)
                            position = 'left';
                        else if (e.pageY < offset.top + height / 2)
                            position = 'top';
                        else
                            position = 'bottom';


                        let target = rnJQuery(list[i]);
                        if (target.hasClass('last'))
                            position = 'top';

                        let subTarget = null;
                        let subTargetPosition = null;

                        if (target.hasClass('sfFieldWithFields')) {
                            for (let t = i + 1; t < list.length; t++) {
                                currentElement = rnJQuery(list[t]);
                                offset = currentElement.offset();
                                width = currentElement.outerWidth(true);
                                height = currentElement.outerHeight(true);
                                if (e.pageY > offset.top && e.pageX > offset.left && e.pageY < offset.top + height && e.pageX < offset.left + width) {
                                    let sideWidth = width * .1;
                                    if (e.pageX > offset.left + width - sideWidth)
                                        subTargetPosition = 'right';
                                    else if (e.pageX < offset.left + sideWidth)
                                        subTargetPosition = 'left';
                                    else if (e.pageY < offset.top + height / 2)
                                        subTargetPosition = 'top';
                                    else
                                        subTargetPosition = 'bottom';

                                    subTarget = rnJQuery(list[t]);
                                    if (target.hasClass('last'))
                                        subTargetPosition = 'top';
                                }
                            }
                        }


                        self.DragBehavior.DragDrop(target, position, subTarget, subTargetPosition);
                        RedNaoEventManager.Publish('FormDesignUpdated');
                        return;
                    }

                }

                self.DragBehavior.DragDrop(null, null,null,null);
            }
        };


        rnJQuery("body").mouseup(self.UnbindMoveFunction);
        rnJQuery("body").mousemove(self.moveFunction);


    };

    /*public SwitchFormElements(draggedElementSource, target) {
        if (target.hasClass('last')) {
            return;
        }
        var clonedSource = draggedElementSource.clone();
        var clonedTarget = target.clone();

        var sourceId = draggedElementSource.attr('id');
        var targetId = target.attr('id');
        var targetIndex = -1;
        var sourceIndex = -1;


        for (let i = 0; i < RedNaoFormElements.length; i++) {
            if (RedNaoFormElements[i].Id == targetId)
                targetIndex = i;

            if (RedNaoFormElements[i].Id == sourceId)
                sourceIndex = i;
        }


        if (sourceIndex >= 0 && targetIndex >= 0) {

            if (targetIndex > sourceIndex)
                targetIndex--;
            var aux = RedNaoFormElements[sourceIndex];

            RedNaoFormElements.splice(sourceIndex, 1);
            RedNaoFormElements.splice(targetIndex, 0, aux);



        }

    };*/
}

