﻿// PageColumn.js


Type.registerNamespace('CustomPage');

CustomPage.PageColumn = function CustomPage$PageColumn(associatedElement) {
CustomPage.PageColumn.initializeBase(this, [associatedElement]);

    this._dataType = "PageItem";

    this._uniqueId;
    this._view;
    this._allowLayoutChange = true;
    
    this._dropIndex = -1;
    this._floatContainer;
    
    this._items;
    
    this._itemTable;
    this._itemTableLeft;
    this._itemTableRight;
    this._itemTableTop;
    this._itemTableBottom;
    this._itemTableContainer;
   
    this._dropCueElements;
    
    this._isVertical = true;
    this._pageColumnInfo;
    this._closeItem$delegate = Function.createDelegate(this, this._closeItem);
}

CustomPage.PageColumn.prototype = {

    get_pageColumnInfo : function this$get_pageColumnInfo() {
        return this._pageColumnInfo;
    },

    set_pageColumnInfo : function set_pageColumnInfo(value) {
        this._pageColumnInfo = value;
    },
    
    get_items : function this$get_items() {
        return this._items;
    },
    
//    get_itemTable : function this$get_itemTable() {
//        return this._itemTable;
//    },
    
    get_uniqueId : function this$get_uniqueId() {
        return this._uniqueId;
    },

    set_uniqueId : function this$set_uniqueId(value) {
        this._uniqueId = value;
    },

    get_view : function this$get_view() {
        return this._view;
    },

    set_view : function this$set_view(value) {
        this._view = value;
    },
    
    get_allowLayoutChange : function() {
        return this._allowLayoutChange;
    },
    
    set_allowLayoutChange : function(value) {
       this._allowLayoutChange = value;
    },
    
    set_width: function(value) {
        var elt = this.get_element();
        if (elt.style.width != value) {
            for(var i = 0; i < this._items.length; i++)
                this._items[i].onColumnWidthChange(value);
        }
        elt.style.width = value; 
    },
    
    _createFloatContainer: function(pageItem) {
       var floatContainer = document.createElement("div");
       
       floatContainer.style.filter = "progid:DXImageTransform.Microsoft.BasicImage(opacity=0.75);";
       floatContainer.style.opacity = "0.75";

       floatContainer.style.position = "absolute";
       floatContainer.style.zIndex = 32000;

       var pageItemElement = pageItem.get_element().childNodes[0];
       var currentLocation = Sys.UI.DomElement.getLocation(pageItemElement);
       Sys.UI.DomElement.setLocation(floatContainer, currentLocation.x, currentLocation.y);
       floatContainer.style.display = "block";

       floatContainer.style.width = pageItemElement.offsetWidth + "px"; //'500px'; //
       floatContainer.style.height = pageItemElement.offsetHeight + "px"; //'70px'; // 
       
       var clone = pageItemElement.cloneNode(true);
       clone.style.width = '100%';
       floatContainer.appendChild(clone);

       return floatContainer;
    },

    initialize : function this$initialize() {
        CustomPage.PageColumn.callBaseMethod(this, "initialize");
        
        this._items = new Array();
        this._dropCueElements = new Array();
        
        var elt = this.get_element(); //td
        elt.style.verticalAlign = 'top';
        
        var table = document.createElement('table');
        table.cellSpacing = '0'; table.cellPadding = '0'; table.border = '0'; table.style.width = '97%';
        table.id = elt.id + '_column';
        elt.appendChild(table);
        
        var tr = table.insertRow(0);
        this._itemTableContainer = tr.insertCell(0);
        this._itemTableContainer.style.verticalAlign = 'top';
        
        this._itemTable = document.createElement('table'); 
        this._itemTable.cellSpacing = '0'; this._itemTable.cellPadding = '2'; this._itemTable.border = '0'; this._itemTable.style.width = '100%'; this._itemTable.style.height = '100%';
        this._itemTableContainer.appendChild(this._itemTable);

        this._addDropCueBar(this._itemTable, 0);
        
        this._addFooter(this._itemTable);
        
        if (typeof(this._pageColumnInfo.Items) == 'undefined' || this._pageColumnInfo.Items == null) {
            this._pageColumnInfo.Items = new Array();    
        }
            
        for (var i = 0; i < this._pageColumnInfo.Items.length; i++) {
            var itemInfo = this._pageColumnInfo.Items[i];
            var idx = i * 2;
            var td = this._itemTable.insertRow(idx + 1).insertCell(0);
            td.vAlign = 'top'; 
            
            Array.insert(this._items, i, this._createPageItem(td, itemInfo));
            this._addDropCueBar(this._itemTable, idx + 2);
        }
        
        if (this._pageColumnInfo.Items.length)
            this._view.get_element().style.height= "";
           
        if (this._view.get_pageManager().get_allowPageDesign() && this._allowLayoutChange) {
            Sys.Preview.UI.DragDropManager.registerDropTarget(this);
        }
    },
    
    dispose: function() {
        CustomPage.PageColumn.callBaseMethod(this, "dispose");
//        for(var i = 0; i < this._items.length; i++) {
//            this._items[i].remove_close(this._closeItem$delegate);
//        }
    },
    
    _createPageItemInfo : function(webPartDescription) {
        var newPageItemInfo = new Object();
        newPageItemInfo.Id = "pi" + new Date().getTime();
        newPageItemInfo.PopulateServicePath = webPartDescription.get_pageItemPopulateServicePath();
        newPageItemInfo.PopulateServiceMethod = webPartDescription.get_pageItemPopulateServiceMethod();
        newPageItemInfo.PopulateContext = webPartDescription.get_pageItemPopulateContext();
        newPageItemInfo.Title = webPartDescription.get_pageItemTitle();
        newPageItemInfo.TitleUrl = webPartDescription.get_pageItemTitleUrl();
        newPageItemInfo.TitleImage = webPartDescription.get_pageItemTitleImage();
        newPageItemInfo.TitleImageUrl = webPartDescription.get_pageItemTitleImageUrl();
        newPageItemInfo.TitleImageAlt = webPartDescription.get_pageItemTitleImageAlt();
        newPageItemInfo.Collapsed = false;
        newPageItemInfo.PageItemType = webPartDescription.get_pageItemType();
        newPageItemInfo.MaximumRows = webPartDescription.get_pageItemMaxRows();
        newPageItemInfo.ContentType = webPartDescription.get_contentType();
        newPageItemInfo.RefreshInterval = 0;
        newPageItemInfo.ClientClass = webPartDescription.get_pageItemClass();
        return newPageItemInfo;
    },
    
    _createPageItem : function(element, itemInfo) {
        if (itemInfo.ClientClass == null)
            itemInfo.ClientClass = "CustomPage.PageItem";
        switch (itemInfo.ClientClass) {
            case "CustomPage.PageItem":
                return $create(CustomPage.PageItem, {pageItemInfo: itemInfo, column:this}, {"close": this._closeItem$delegate}, null, element)
            
            case "CustomPage.AdItem":
                return $create(CustomPage.AdItem, {pageItemInfo: itemInfo, column:this}, {"close": this._closeItem$delegate}, null, element)
        }
    },
    
    _insertItem : function(itemInfo, index) {
        if (this._maxItemNumberReached()) return;
        var idx = index * 2;
        var td = this._itemTable.insertRow(idx + 1).insertCell(0);
        td.vAlign = 'top';
        this._view.get_element().style.height= "";
        Array.insert(this._pageColumnInfo.Items, index, itemInfo);
        
        Array.insert(this._items, index, this._createPageItem(td, itemInfo));
        this._addDropCueBar(this._itemTable, idx + 2);
        this._view.get_pageManager().saveProfile();
    },
    
    moveItem : function(pageItem, index) {
        var fromCol = pageItem.get_column();
        var idx;
        if (fromCol == this) {
            var fromInd;
            for (var i = 0; i < this._items.length; i++) {
                if (this._items[i] == pageItem) {
                    fromInd = i;
                    break;
                }
            }
            if (fromInd == index) return;
            if (fromInd < index)
                idx = (index - 1) * 2;
            else
                idx = index * 2;
        }   
        else
            idx = index * 2;
        fromCol.removeItem(pageItem);
        var tr = this._itemTable.insertRow(idx + 1);
        tr.appendChild(pageItem.get_element());
        pageItem.set_column(this);
        Array.insert(this._items, index, pageItem);
        Array.insert(this._pageColumnInfo.Items, index, pageItem.get_pageItemInfo());
        this._addDropCueBar(this._itemTable, idx + 2);
        this._view.get_element().style.height= "";
        this._view.get_pageManager().saveProfile();
    },
    
    removeItem : function(pageItem) {
        var index, idx;
        for (var i = 0; i < this._items.length; i++) {
            if (this._items[i] === pageItem) {
                index = i;
                idx = index * 2;
                break;
            }
        }
        this._removeDropCueBar(this._itemTable, idx + 2);
        Array.removeAt(this._items, index);
        Array.removeAt(this._pageColumnInfo.Items, index);
        var elt = pageItem.get_element();
        elt.parentNode.removeChild(elt);
        this._itemTable.deleteRow(idx + 1);
        this._view.resetHeight();
    },
    
    _closeItem: function(sender, e) {
        this.removeItem(sender);
        this._view.get_pageManager().saveProfile();
    },
    
    _addFooter: function(table) {
        var td = table.insertRow(table.rows.length).insertCell(0);
        td.style.padding = '0px';
        td.height = '50px';
    },
    
    _addDropCueBar : function(table, rowIndex) {
        var tr = table.insertRow(rowIndex);
        var td = tr.insertCell(0);
        td.style.paddingTop = '1px'; td.style.paddingBottom = '1px';
        
        var it = document.createElement('table');
        it.cellSpacing = '0'; it.cellPadding = '0'; it.border = '0'; it.style.width = '100%';
        it.style.visibility = 'hidden';
        it.className = 'cuebar';
        td.appendChild(it);
        
        var itd = it.insertRow(0).insertCell(0);
        itd.style.fontSize = '0px';
        
        var div = document.createElement('div');
        div.style.margin = '0px 0px 0px 0px';
        div.style.height = '5px';
        div.style.width = '100%';
        itd.appendChild(div); 
        
        Array.insert(this._dropCueElements, rowIndex/2, it);
    },
    
    _removeDropCueBar : function(table, rowIndex) {
        table.deleteRow(rowIndex);
        Array.removeAt(this._dropCueElements, rowIndex/2);
    },
    
    startDragDrop : function this$startDragDrop(pageItem) {
        this._view.get_pageManager().updatePositions();

        _floatContainer = this._createFloatContainer(pageItem);
        document.body.appendChild(_floatContainer);
        Sys.Preview.UI.DragDropManager.startDragDrop(this, _floatContainer, pageItem);
    },

    get_dragDataType : function this$get_dragDataType() {
        return this._dataType;
    },

    getDragData : function this$getDragData(context) {
        return context;
    },

    get_dragMode : function this$get_dragMode() {
        return Sys.Preview.UI.DragMode.Copy;
    },

    onDragStart : function this$onDragStart() {
    },

    onDrag : function this$onDrag() {
    },

    onDragEnd : function this$onDragEnd(cancelled) {
//        Sys.Debug.assert(_floatContainer != null, "_floatContainer is null");
//        Sys.Debug.assert(_floatContainer.parentNode == document.body,
//            "_floatContainer is not parented to document.body");

        document.body.removeChild(_floatContainer);
    },

    get_dropTargetElement : function this$get_dropTargetElement() {
        return this._itemTable
    },

    canDrop : function this$canDrop(dragMode, dataType, data) { 
        if (CustomPage.PageItem.isInstanceOfType(data)) {
          var pageItem = data;
          return ((dragMode == Sys.Preview.UI.DragMode.Copy) &&
                (dataType == this._dataType) && (pageItem.get_allowColumnChange() || (pageItem.get_column() == this)) 
                && (this._getDropIndex() != -1));   
        }
        
        if (Sys.Preview.UI.Controls.WebParts.WebPartDescription.isInstanceOfType(data)) {
            var webPartDescription = data;
           return ((dragMode == Sys.Preview.UI.DragMode.Copy) &&
                    (dataType == 'WebPart') && (webPartDescription.get_allowZoneChange() || (webPartDescription.get_zone() == this))  
                    && (this._getDropIndex() != -1));
        }
        return false;           
    },
    
    drop : function this$drop(dragMode, dataType, data) {
        this.toggleDropCues(false, this._dropIndex, false);
        if (Sys.Preview.UI.Controls.WebParts.WebPartDescription.isInstanceOfType(data)) {
            this._insertItem(this._createPageItemInfo(data), this._dropIndex);
            return;
        }
        
        if (CustomPage.PageItem.isInstanceOfType(data)) {
            this.moveItem(data, this._dropIndex);
            return;
        }
    },

    _pageItemMoved : function(pageItem, dropColumn, dropIndex) {
        if (dropColumn != pageItem.get_column()) {
            return true;
        }

        if (dropIndex == pageItem.get_columnIndex() || dropIndex == (pageItem.get_columnIndex() + 1)) {
            return false;
        }

        return true;
    },

    onDragEnterTarget : function this$onDragEnterTarget(dragMode, dataType, data) {
        var dropIndex = this._getDropIndex();
        this.toggleDropCues(true, dropIndex, false);
        this._dropIndex = dropIndex;
    },

    onDragLeaveTarget : function this$onDragLeaveTarget(dragMode, dataType, data) {
        this.toggleDropCues(false, this._dropIndex, false);
    },

    onDragInTarget : function this$onDragInTarget() {
        var dropIndex = this._getDropIndex();
        if (dropIndex != this._dropIndex) {
            this.toggleDropCues(false, this._dropIndex, true);
            this.toggleDropCues(true, dropIndex, true);
            this._dropIndex = dropIndex;
        }
    },

    toggleDropCues : function this$ToggleDropCues(show, index, ignoreOutline) {
        if (index == -1) {
            return;
        }
        var dropCue = this._dropCueElements[index];
        if (dropCue && dropCue.style) {
            if (dropCue.style.height == "100%" && !dropCue.webPartZoneHorizontalCueResized) {
                var oldParentHeight = dropCue.parentElement.clientHeight;
                var realHeight = oldParentHeight - 10;
                dropCue.style.height = realHeight + "px";
                var dropCueVerticalBar = dropCue.getElementsByTagName("DIV")[0];
                if (dropCueVerticalBar && dropCueVerticalBar.style) {
                    dropCueVerticalBar.style.height = dropCue.style.height;
                    var heightDiff = (dropCue.parentElement.clientHeight - oldParentHeight);
                    if (heightDiff) {
                        dropCue.style.height = (realHeight - heightDiff) + "px";
                        dropCueVerticalBar.style.height = dropCue.style.height;
                    }
                }
                dropCue.webPartZoneHorizontalCueResized = true;
            }
            dropCue.style.visibility = (show ? "visible" : "hidden");
        }
    },

    getItemIndex : function this$getPageItemIndex(location) {
        var x = location.x;
        var y = location.y; 
        if ((x < this._itemTableLeft) || (x > this._itemTableRight) ||
            (y < this._itemTableTop) || (y > this._itemTableBottom)) {
            return -1;
        }
        var vertical = this._isVertical;
        var pageItems = this._items;
        var pageItemsCount = pageItems.length;
        for (var i = 0; i < pageItemsCount; i++) {
            var pageItem = pageItems[i];
            if (vertical) {
                if (y < pageItem.get_middleY()) {       
                    return i;
                }
            }
            else {
                if (x < pageItem.get_middleX()) {
                    return i;
                }
            }
        }
        return pageItemsCount;
    },
    updatePosition : function this$updatePosition() {
        var topLeft = __cpTranslateOffset(0, 0, this._itemTable, null, false);
        this._itemTableLeft = topLeft.x;
        this._itemTableTop = topLeft.y;
        this._itemTableRight = (this._itemTable != null) ? topLeft.x + this._itemTable.offsetWidth : topLeft.x;
        this._itemTableBottom = (this._itemTable != null) ? topLeft.y + this._itemTable.offsetHeight : topLeft.y;
        
        for (var i = 0; i < this._items.length; i++) {
            this._items[i].updatePosition(); 
        }
    },
    _getDropIndex : function() {
        return this.getItemIndex(__cpGetPageEventLocation(window._event, false));
    },
    
    _maxItemNumberReached : function() {
        var maxLoggedIn = 50; var maxNotLoggedIn = 8;
        var userLoggedIn = Sys.Services.AuthenticationService.get_isLoggedIn()
        var limit = userLoggedIn ? maxLoggedIn : maxNotLoggedIn;
        if (limit > this._view.getTotalItemNumber())
            return false;
        
        var msg;
        if (userLoggedIn)
            msg = String.format("E\' stato raggiunto il limite massimo di elementi su una pagina ({0}).", maxLoggedIn) ;
        else
            msg = String.format("E\' stato raggiunto il limite massimo di elementi su una pagina ({0}), per gli utenti non autenticati. Per aggiungere altri elementi, è necessario autenticarsi.", maxNotLoggedIn) ;
        alert(msg);
        return true;
    }
}

CustomPage.PageColumn.registerClass("CustomPage.PageColumn", Sys.UI.Control, Sys.Preview.UI.IDragSource, Sys.Preview.UI.IDropTarget);
    
function __cpGetOffset(e,a){
    if(a.offsetY&&a.offsetY)
    return {x:a.offsetX,y:a.offsetY};
    var b=Sys.UI.DomElement.getLocation(e),
        c=window.pageXOffset+a.clientX-b.x,
        d=window.pageYOffset+a.clientY-b.y;
        return {x:c,y:d}
}    

function __cpTranslateOffset(b,c,a,e,f){
    while(typeof a!="undefined"&&a!=null&&a!=e){
        b+=a.offsetLeft;
        c+=a.offsetTop;
        var d=a.tagName;
        if(d!="TABLE"&&d!="BODY"){
            if(a.clientLeft)
                b+=a.clientLeft;
            if(a.clientTop)
                c+=a.clientTop
        }
        if(f&&d!="BODY"){
            b-=a.scrollLeft;
            c-=a.scrollTop
        }
        a=a.offsetParent
    }
    return new Point(b,c)
}


function __cpGetPageEventLocation(a,c){
    if(typeof a=="undefined"||a==null)
        a=window._event;
    var b=__cpGetOffset(a.target,a.rawEvent);
    var p = __cpTranslateOffset(b.x,b.y,a.target,null,c);
    return p;
}

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();
