﻿// (c) Copyright Microsoft Corporation.
// This source is subject to the Microsoft Permissive License.
// See http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx.
// All other rights reserved.

/*
    initialize          159
    _invalidate         233

    TabPanel            332
    initialize          544
*/

function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^|\\\\s)" + className + "(\\\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}


if(typeof Array.prototype.push != "function"){
	Array.prototype.push = ArrayPush;
	function ArrayPush(value){
		this[this.length] = value;
	}
}


Type.registerNamespace("CustomPage");

CustomPage.ScrollBars = function() { }
CustomPage.ScrollBars.prototype = {
    None : 0x00,
    Horizontal : 0x01,
    Vertical : 0x02,
    Both : 0x03,
    Auto : 0x04
}
CustomPage.ScrollBars.registerEnum("CustomPage.ScrollBars", true);

CustomPage.TabContainer = function(element) {
    CustomPage.TabContainer.initializeBase(this, [element]);    
    this._cachedActiveTabIndex = -1;
    this._activeTabIndex = -1;
    this._scrollBars = CustomPage.ScrollBars.None;
    this._tabs = null;
    this._header = null;
    this._body = null;
//    this._app_onload$delegate = Function.createDelegate(this, this._app_onload);
    
    this._buttons = null;
    this._index = null;
    this._current = null;
//    this._endRequest$delegate = Function.createDelegate(this, this._endRequestHandler);
    this._webPartsContentLoaded = false;
    
    this._tabPanelsInfo;
    this._pageManager;
    this._nextTabPanelId;
}
CustomPage.TabContainer.prototype = {
    
    add_activeTabChanged : function(handler) {
        this.get_events().addHandler("activeTabChanged", handler);
    },
    remove_activeTabChanged : function(handler) {
        this.get_events().removeHandler("activeTabChanged", handler);
    },
    raiseActiveTabChanged : function() {
        var eh = this.get_events().getHandler("activeTabChanged");
        if (eh) {
            eh(this, this.get_activeTabIndex());
        }
//        // added 4 lines
//        if (this._clientStateField) {
//            this.raisePropertyChanged("activeTabIndex");
//            this._clientStateField.value = this.saveClientState();
//        }
    },

    get_activeTabIndex : function() { 
        if (this._cachedActiveTabIndex > -1) {
            return this._cachedActiveTabIndex;
        }
        return this._activeTabIndex; 
    },
    set_activeTabIndex : function(value) {
        if (!this.get_isInitialized()) {
            this._cachedActiveTabIndex = value;
        } else {
            if (value < 0 || value >= this.get_tabs().length) {
                value = this.get_tabs().length - 1;
            }
            if (this._activeTabIndex != -1 && this._activeTabIndex < this.get_tabs().length) {
                this.get_tabs()[this._activeTabIndex]._set_active(false);
            }
            this._activeTabIndex = value;
            if (this._activeTabIndex != -1) {
                this.get_tabs()[this._activeTabIndex]._set_active(true);
            }
            
            this.raiseActiveTabChanged();
            this.raisePropertyChanged("activeTabIndex");            
        }
    },
    
    get_tabs : function() { 
        if (this._tabs == null) {
            this._tabs = [];
        }
        return this._tabs; 
    },
    
    get_activeTab : function() {
        if (this._activeTabIndex > -1) {
            return this.get_tabs()[this._activeTabIndex];
        }
        return null;
    },
    set_activeTab : function(value) {
        var i = Array.indexOf(this.get_tabs(), value);
        if (i == -1) {
            throw Error.argument("value", CustomPage.Resources.Tabs_ActiveTabArgumentOutOfRange);
        }
        this.set_activeTabIndex(i);
        
    },
    
    get_scrollBars : function() { 
        return this._scrollBars; 
    },
    set_scrollBars : function(value) { 
        if (this._scrollBars != value) {
            this._scrollBars = value; 
            this._invalidate();
            this.raisePropertyChanged("scrollBars");
        }
    },
    
    get_tabPanelsInfo : function() {
        return this._tabPanelsInfo;
    },
    
    set_tabPanelsInfo : function(value) {
        this._tabPanelsInfo = value;
    },
    
    get_pageManager : function() {
        return this._pageManager;
    },
    
    set_pageManager: function(value) {
        this._pageManager = value;
    },
    
    initialize : function() {
        CustomPage.TabContainer.callBaseMethod(this, "initialize");
        
        var elt = this.get_element();
        
        var header = this._header = document.createElement('div');
        header.id = elt.id + '_header';
        elt.appendChild(header);
        for (var i = 0; i < this._tabPanelsInfo.length; i++) {
            var s = document.createElement('span');
            s.id = '__tab_' + elt.id + '_TabPanel' + i;
            s.innerHTML = this._tabPanelsInfo[i].HeaderText;
            header.appendChild(s);
        }
        
        var body = this._body = document.createElement('div');
        body.id = elt.id + '_body';
        elt.appendChild(body);
        this._tabs = new Array();
        for (var i = 0; i < this._tabPanelsInfo.length; i++) {
            var tp = document.createElement('div');
            tp.id = elt.id + '_TabPanel' + i;
            body.appendChild(tp);
            Array.add(this._tabs, $create(CustomPage.TabPanel, {"tabPanelInfo": this._tabPanelsInfo[i], "headerTab":$get("__tab_" + elt.id + "_TabPanel" + i),"owner": this}, null, null, tp));
        }
        
        this._nextTabPanelId = this._tabPanelsInfo.length;
        
//        var header = this._header = $get(this.get_id() + "_header");
//        var body = this._body = $get(this.get_id() + "_body");

        // default classes
        CommonToolkitScripts.addCssClasses(elt, [
            "achilles__tab_container",
            "achilles__tab_default"
        ]);
        Sys.UI.DomElement.addCssClass(header, "achilles__tab_header");
        Sys.UI.DomElement.addCssClass(body, "achilles__tab_body");
        
        this._invalidate();
        
//        Sys.Application.add_load(this._app_onload$delegate);
    },
    dispose : function() {
//        Sys.Application.remove_load(this._app_onload$delegate);
        CustomPage.TabContainer.callBaseMethod(this, "dispose");
    },
    
    getFirstTab : function(includeDisabled) {
        var tabs = this.get_tabs();
        for(var i = 0; i < tabs.length; i++) {
            if (includeDisabled || tabs[i].get_enabled()) {
                return tabs[i];
            }
        }
        return null;
    },
    
    getLastTab : function(includeDisabled) {
        var tabs = this.get_tabs();
        for(var i = tabs.length -1; i >= 0; i--) {
            if (includeDisabled || tabs[i].get_enabled()) {
                return tabs[i];
            }
        }
        return null;
    },
    getNextTab : function(includeDisabled) {
        var tabs = this.get_tabs();
        var active = this.get_activeTabIndex();
        for (var i = 1; i < tabs.length; i++) {
            var tabIndex = (active + i) % tabs.length;
            var tab = tabs[tabIndex];
            if (includeDisabled || tab.get_enabled()) 
                return tab;
        }
        return null;
    },
    getPreviousTab : function(includeDisabled) {
        var tabs = this.get_tabs();
        var active = this.get_activeTabIndex();
        for (var i = 1; i < tabs.length; i++) {
            var tabIndex = (tabs.length + (active - i)) % tabs.length;
            var tab = tabs[tabIndex];
            if (includeDisabled || tab.get_enabled()) 
              return tab;
        }
        return null;
    },
    getNearestTab : function() {
        var prev = this.getPreviousTab(false);
        var next = this.getNextTab(false);
        if (prev && prev.get_tabIndex() < this._activeTabIndex) {
            return prev;
        } else if(next && next.get_tabIndex() > this._activeTabIndex) {
            return next;
        }
        return null;
    },
    saveClientState : function() {
        var tabs = this.get_tabs();
        var tabState = [];
        for(var i = 0; i < tabs.length; i++) {
            Array.add(tabState, tabs[i].get_enabled());
        }        
        var state = {
            ActiveTabIndex:this._activeTabIndex,
            TabState:tabState
        };
        return Sys.Serialization.JavaScriptSerializer.serialize(state);
    },
    _invalidate : function() {
        if (this.get_isInitialized()) {
            CommonToolkitScripts.removeCssClasses(this._body, [
                "achilles__scroll_horiz",
                "achilles__scroll_vert",
                "achilles__scroll_both",
                "achilles__scroll_auto"
            ]);
            switch (this._scrollBars) {
                case CustomPage.ScrollBars.Horizontal: 
                    Sys.UI.DomElement.addCssClass(this._body, "achilles__scroll_horiz"); 
                    break;
                case CustomPage.ScrollBars.Vertical: 
                    Sys.UI.DomElement.addCssClass(this._body, "achilles__scroll_vert"); 
                    break;
                case CustomPage.ScrollBars.Both: 
                    Sys.UI.DomElement.addCssClass(this._body, "achilles__scroll_both"); 
                    break;
                case CustomPage.ScrollBars.Auto: 
                    Sys.UI.DomElement.addCssClass(this._body, "achilles__scroll_auto"); 
                    break;
            }
        }
    },
    
    updatePositions: function() {
        for (var i = 0; i < this._tabs.length; i++) {
            this._tabs[i].updatePosition();
        }
    },
    
    _maxPanelNumberReached : function() {
        var maxLoggedIn = 8; var maxNotLoggedIn = 3;
        var userLoggedIn = Sys.Services.AuthenticationService.get_isLoggedIn()
        var limit = userLoggedIn ? maxLoggedIn : maxNotLoggedIn;
        if (limit > this._tabPanelsInfo.length)
            return false;
        
        var msg;
        if (userLoggedIn)
            msg = String.format("E\' stato raggiunto il limite massimo di pagine ({0}).", maxLoggedIn) ;
        else
            msg = String.format("E\' stato raggiunto il limite massimo di pagine ({0}), per gli utenti non autenticati. Per aggiungere altri elementi, è necessario autenticarsi.", maxNotLoggedIn) ;
        alert(msg);
        return true;
     
    },
   
    insertTabPanel: function(index) {
        if (this._maxPanelNumberReached()) return;
        var id = this._nextTabPanelId++;
        var elt = this.get_element();
        var tpi = new Object();
        tpi.HeaderText = 'Nuova Pagina';
        Array.insert(this._tabPanelsInfo, index, tpi);
        
        var s = document.createElement('span');
        s.id = '__tab_' + elt.id + '_TabPanel' + id;
        s.innerHTML = this._tabPanelsInfo[index].HeaderText;
        if (this._header.childNodes.length == index) {
            this._header.appendChild(s);
        }
        else {
            this._header.insertBefore(s, this._header.childNodes[index]);
        }
            
        var tp = document.createElement('div');
        tp.id = elt.id + '_TabPanel' + id;
        this._body.appendChild(tp);

        Array.insert(this._tabs, index, $create(CustomPage.TabPanel, {"tabPanelInfo": this._tabPanelsInfo[index], "headerTab": s,"owner": this}, null, null, tp));
        this._pageManager.saveProfile();
    },
    
    removeTabPanel : function(index) {
        if (this._tabs.length < 2) {
            alert("Questa pagina non può essere rimossa.");
            return;
        }
        var activeTabIndex = this.get_activeTabIndex();
        this._header.removeChild(this._header.childNodes[index]);
        this._body.removeChild(this._body.childNodes[index]);
        Array.removeAt(this._tabPanelsInfo, index);
        Array.removeAt(this._tabs, index);
        if (activeTabIndex == index) 
            this.set_activeTabIndex(index - 1); // implicit save
        else
             this._pageManager.saveProfile();
    }
}
CustomPage.TabContainer.registerClass("CustomPage.TabContainer", AjaxControlToolkit.ControlBase);

// CustomPage.TabPanel ///////////////////////////////////////////

CustomPage.TabPanel = function(element) {
    CustomPage.TabPanel.initializeBase(this, [element]);
    this._active = false;
    this._tab = null;
    this._headerOuter = null;
    this._headerInner = null;
    this._header = null;
    this._owner = null;
    this._enabled = true;

    this._scrollBars = CustomPage.ScrollBars.None;    
    this._header_onclick$delegate = Function.createDelegate(this, this._header_onclick);
    this._header_onmouseover$delegate = Function.createDelegate(this, this._header_onmouseover);
    this._header_onmouseout$delegate = Function.createDelegate(this, this._header_onmouseout);
    this._header_onmousedown$delegate = Function.createDelegate(this, this._header_onmousedown);
    this._oncancel$delegate = Function.createDelegate(this, this._oncancel);
    
    this._renameMenuEntryHandler = Function.createDelegate(this, this._renameHandler);
    this._insertMenuEntryHandler = Function.createDelegate(this, this._insertTabPanel);
    this._removeMenuEntryHandler = Function.createDelegate(this, this._removeTabPanel);
    
    this._e1 = null;
    
    this._headerTextEditedHandler$delegate = Function.createDelegate(this, this._headerTextEditedHandler);
    this._editingBox = null;
    this._tabPanelInfo;
    this._columns;
    this._viewTable;
    this._populated = false;
}
CustomPage.TabPanel.prototype = {
    
    get_tabPanelInfo: function() {
        return this._tabPanelInfo;
    },
    
    set_tabPanelInfo: function(value) {
        this._tabPanelInfo = value;
    },
    
    add_click : function(handler) {
        this.get_events().addHandler("click", handler);
    },
    remove_click : function(handler) {
        this.get_events().removeHandler("click", handler);
    },
    raiseClick : function() {
        var eh = this.get_events().getHandler("click");
        if (eh) {
            eh(this, Sys.EventArgs.Empty);
        }
    },
    
    get_headerText : function() { 
        if (this.get_isInitialized()) {
            return this._header.innerHTML;
        }
        return ""; 
    },
    set_headerText : function(value) { 
        if (!this.get_isInitialized()) {
            throw Error.invalidOperation(String.format(CustomPage.Resources.Tabs_PropertySetBeforeInitialization, 'headerText'));
        }
        if (this._headerText != value) {
            this._header.innerHTML = value;
            this.raisePropertyChanged("headerText");
        }
    },
    
    get_headerTab : function() {
        return this._header;
    },
    set_headerTab : function(value) {
        if (this._header != value) {
            if (this.get_isInitialized()) {
                throw Error.invalidOperation(String.format(CustomPage.Resources.Tabs_PropertySetAfterInitialization, 'headerTab'));
            }
            this._header = value;
            this.raisePropertyChanged("value");
        }
    },
        
    get_enabled : function() {
        return this._enabled;
    },
    set_enabled : function(value) {
        if (value != this._enabled) {
            this._enabled = value;
            if (this.get_isInitialized()) {
                if (!this._enabled) {
                    this._hide();
                } else {
                    this._show();
                }
            }
            this.raisePropertyChanged("enabled");
        }
    },
    
    get_owner : function() {
        return this._owner;
    },
    set_owner : function(value) {
        if (this._owner != value) {
            if (this.get_isInitialized()) {
                throw Error.invalidOperation(String.format(CustomPage.Resources.Tabs_PropertySetAfterInitialization, 'owner'));
            }
            this._owner = value;
            this.raisePropertyChanged("owner");
        }
    },
    
    get_scrollBars : function() {
        return this._scrollBars;
    },
    set_scrollBars : function(value) {
        if (this._scrollBars != value) {
            this._scrollBars = value;
            this.raisePropertyChanged("scrollBars");
        }
    },
    
    get_tabIndex : function() {
        var id = this.get_element().id;
        var tabs = this._owner.get_tabs();
        for (var i = 0; i < tabs.length; i++) {
            if (tabs[i].get_element().id == id) {
                return i;
            }
        }
        return -1;
    }, 
    _get_active : function() { 
        return this._active; 
    },
    _set_active : function(value) { 
        this._active = value; 
        if (value) 
            this._activate(); 
        else 
            this._deactivate();
    },
    
    get_columns : function this$get_columns() {
        return this._columns;
    },

    get_pageManager: function() {
        return this._owner.get_pageManager();
    },
    
    initialize : function() {
        CustomPage.TabPanel.callBaseMethod(this, "initialize");
        
//        var owner = this.get_owner();
//        while (!owner) {
//            this.set_owner($get(this.get_ownerID));
//        }
//        if (!owner) {
//            throw Error.invalidOperation(CustomPage.Resources.Tabs_OwnerExpected);
//        }
        
        this._headerOuterWrapper = document.createElement('span');
        this._headerInnerWrapper = document.createElement('span');
        this._tab = document.createElement('span');
        this._header.parentNode.replaceChild(this._tab, this._header);
        this._tab.appendChild(this._headerOuterWrapper);
        this._headerOuterWrapper.appendChild(this._headerInnerWrapper);
        this._headerInnerWrapper.appendChild(this._header);
        $addHandlers(this._header, {
            click:this._header_onclick$delegate,
            mouseover:this._header_onmouseover$delegate,
            mouseout:this._header_onmouseout$delegate,
            mousedown:this._header_onmousedown$delegate,
            dragstart:this._oncancel$delegate,
            selectstart:this._oncancel$delegate,
            select:this._oncancel$delegate
        });
        Sys.UI.DomElement.addCssClass(this._headerOuterWrapper, "achilles__tab_outer");
        Sys.UI.DomElement.addCssClass(this._headerInnerWrapper, "achilles__tab_inner");
        Sys.UI.DomElement.addCssClass(this._header, "achilles__tab_tab");
        Sys.UI.DomElement.addCssClass(this.get_element(), "achilles__tab_panel");

        if (!this._enabled) {
            this._hide();
        }
        
        this._e1 = document.createElement('span');
        this._e1.innerHTML = '&#9660<br />';
        Sys.UI.DomElement.addCssClass(this._e1, "achilles__tab_tab");
        this._e1.style.fontSize = '10px';
        this._e1.style.color = '#777777';
        this._e1.style.lineHeight = '10px';
        this._e1.style.verticalAlign = 'top';
        this._e1.title = 'Opzioni';
        
        this._headerInnerWrapper.appendChild(this._e1);
        
        var div = document.createElement('div');
        div.id = this.get_id() + '_menuitems_';
        if(Sys.Browser.agent === Sys.Browser.InternetExplorer) {
            this._e1.appendChild(div);  
        }
        else {
            document.documentElement.appendChild(div);
        }
        Sys.UI.DomElement.setVisible(div, false);
        this._menu = $create(CustomPage.TabPanelMenu, {'menuHeader':this._e1 }, {'renameTabPanel':this._renameMenuEntryHandler, 'insertTabPanel':this._insertMenuEntryHandler, 'removeTabPanel':this._removeMenuEntryHandler}, null, div);
        
        this._viewTable = document.createElement('table');
        this._viewTable.style.width = "100%";
        var elt = this.get_element();
        elt.appendChild(this._viewTable);
        
        this._viewTable.insertRow(0);
      
        if (typeof(this._tabPanelInfo.Columns) == 'undefined' || this._tabPanelInfo.Columns == null) {
            this._tabPanelInfo.Columns = new Array();
        }
        if (this._tabPanelInfo.Columns.length == 0) {
            Array.add(this._tabPanelInfo.Columns, new Object());
            Array.add(this._tabPanelInfo.Columns, new Object());
        }
        
        elt.style.height = "300px";
        this._columns = new Array();
        
        this._deactivate(); // all panels deactivated by default;
    },
    
    dispose : function() {    
        if (this._dynamicPopulateBehavior) {
            this._dynamicPopulateBehavior.dispose();
            this._dynamicPopulateBehavior = null;
        }
        $common.removeHandlers(this._header, {
            click:this._header_onclick$delegate,
            mouseover:this._header_onmouseover$delegate,
            mouseout:this._header_onmouseout$delegate,
            mousedown:this._header_onmousedown$delegate,
            dragstart:this._oncancel$delegate,
            selectstart:this._oncancel$delegate,
            select:this._oncancel$delegate
        });
        
        if (this._menu) {
            this._menu.remove_renameTabPanel(this._renameMenuEntryHandler);
            this._menu.remove_insertTabPanel(this._insertMenuEntryHandler);
            this._menu.remove_removeTabPanel(this._removeMenuEntryHandler);
            this._menu = null;
        }
        
        CustomPage.TabPanel.callBaseMethod(this, "dispose");
    },

    getTotalItemNumber : function() {
        var total = 0;
        for (var i=0; i < this._tabPanelInfo.Columns.length; i++) {
            total += this._tabPanelInfo.Columns[i].Items.length;
        }
        return total;
    },
    createColumn: function(columnInfo) {
        var tableRow = this._viewTable.rows[0];
        var cell = tableRow.insertCell(tableRow.cells.length);
        Array.add(this._columns, $create(CustomPage.PageColumn, {view: this, pageColumnInfo: columnInfo}, null, null, cell));
        this._setColumnsWidth(tableRow);
    },
    
    
    addColumn: function() {
        Array.add(this._tabPanelInfo.Columns, new Object());
        this.createColumn(this._tabPanelInfo.Columns[this._tabPanelInfo.Columns.length - 1]);
    },
    
    removeColumn: function() {
        if (this._columns.length == 1) return;
        var colToRemove = this._columns[this._columns.length - 1];
        var lastRemainingCol = this._columns[this._columns.length - 2];
        while(colToRemove.get_items().length > 0) {
            lastRemainingCol.moveItem(colToRemove.get_items()[colToRemove.get_items().length - 1], lastRemainingCol.get_items().length);
        }
        
        var tableRow = this._viewTable.rows[0];
        var cell = tableRow.cells[tableRow.cells.length - 1];
        while (cell.childNodes.length > 0)
            cell.removeChild(cell.firstChild);
        tableRow.deleteCell(tableRow.cells.length - 1);
        Array.removeAt(this._columns, this._columns.length - 1);
        Array.removeAt(this._tabPanelInfo.Columns, this._tabPanelInfo.Columns.length - 1);
        this._setColumnsWidth(tableRow);
    },
    
    _setColumnsWidth: function(tableRow) {
        var colNumber = tableRow.cells.length;
        var colWidth = Math.floor(100/colNumber) + '%';
        for(var i=0; i < this._columns.length; i++) {
            this._columns[i].set_width(colWidth);
        }
    },
    
    updatePosition : function this$UpdatePosition() {
        for (var i = 0; i < this._columns.length; i++) {
            this._columns[i].updatePosition();
        }
    },
    
    resetHeight : function CustomPage$TabPanel$resetHeight() {
       var elt = this.get_element();
       for (var i=0; i < this._columns.length; i++) {
            if (this._columns[i].get_items().length > 0) {
                elt.style.height = "";
                return;
            }
       }
       elt.style.height = "300px"; 
    },
    
    _renameHandler : function(sender, e) {
        this._editingBox = $create(CustomPage.EditingTextBox, { 'textToEdit': this.get_headerText()}, {'textEdited':this._headerTextEditedHandler$delegate}, null, this._headerInnerWrapper);
    },
    _insertTabPanel : function(sender, e) {
        this._owner.insertTabPanel(this.get_tabIndex() + 1);
    },
    _removeTabPanel : function(sender, e) {
        this._owner.removeTabPanel(this.get_tabIndex());
    },
    
    _headerTextEditedHandler : function(sender, e) {
        var newText = sender.get_textInserted();
        if (this._editingBox) {
            this._editingBox.remove_textEdited(this._headerTextEditedHandler$delegate);
            this._editingBox.dispose();
            this._editingBox = null;
        }
        this.set_headerText(newText);
        this._tabPanelInfo.HeaderText = newText;
        this._owner.get_pageManager().saveProfile();    
    },
    
    _activate : function() {
        var elt = this.get_element();
        Sys.UI.DomElement.setVisible(elt, true);
        Sys.UI.DomElement.addCssClass(this._tab, "achilles__tab_active");
        
        if (!this._populated) {
            this._populate();
        }
        
        this._show();
    },
    _deactivate : function() {
        var elt = this.get_element();
        Sys.UI.DomElement.setVisible(elt, false);
        Sys.UI.DomElement.removeCssClass(this._tab, "achilles__tab_active");
    },
    _show : function() {
        this._tab.style.display = '';
    },
    _hide : function() {
        this._tab.style.display = 'none';
        if (this._get_active()) {
            var next = this._owner.getNearestTab(false);
            if (!!next) {
                this._owner.set_activeTab(next);
            }
        }
        this._deactivate();
    },
    _populate : function() {
        for (var i = 0; i < this._tabPanelInfo.Columns.length; i++) {
            this.createColumn(this._tabPanelInfo.Columns[i]);
        }
        this._populated = true;
    },
    _header_onclick : function(e) {
        this.raiseClick();
        this.get_owner().set_activeTab(this);
    },
    _header_onmouseover : function(e) {
        Sys.UI.DomElement.addCssClass(this._tab, "achilles__tab_hover");
    },
    _header_onmouseout : function(e) {
        Sys.UI.DomElement.removeCssClass(this._tab, "achilles__tab_hover");
    },
    _header_onmousedown : function(e) {
        e.preventDefault();
    },
    _oncancel : function(e) {
        e.stopPropagation();
        e.preventDefault();
    }
}
CustomPage.TabPanel.registerClass("CustomPage.TabPanel", Sys.UI.Control);

// CustomPage.TabPanelMenu /////////////////////////////////////////////

CustomPage.TabPanelMenu = function(element) {
    CustomPage.TabPanelMenu.initializeBase(this, [element]);
    
    this._links = null;
    this._renameEntry_onclick$delegate = Function.createDelegate(this, this._raiseRenameTabPanel);
    this._deleteEntry_onclick$delegate = Function.createDelegate(this, this._removeTabPanelHandler);
    this._insertEntry_onclick$delegate = Function.createDelegate(this, this._insertTabPanelHandler);
    
    this._menuHeader = null;
     
    this._headerClickHandler = null;
    this._onMouseOutHandler = null;
    this._bodyClickHandler = null;
    this._popupVisible = false;
    this._popupBehavior = null;
    
//    this._top = 40;
//    this._left = -80;
    
    this._dropShadow = null;
}

CustomPage.TabPanelMenu.prototype = {

    initialize : function() {
        CustomPage.TabPanelMenu.callBaseMethod(this, "initialize");
        
        var elt = this.get_element();
        elt.style.textAlign = 'left';

        var ul = document.createElement('ul');
        Sys.UI.DomElement.addCssClass(ul, "options");
        elt.appendChild(ul);
        
        this._links = new Array();
        Array.add(this._links, this._createLink("Rinomina", this._renameEntry_onclick$delegate));
        Array.add(this._links, this._createLink("Elimina", this._deleteEntry_onclick$delegate));
        Array.add(this._links, this._createLink("Nuova Pagina", this._insertEntry_onclick$delegate));
        
        for (i=0; i < this._links.length; i++) {
            ul.appendChild(this._createMenuEntry(this._links[i]));
        }   
        
        this._popupBehavior = $create(AjaxControlToolkit.PopupBehavior, { 'id':elt.id + 'PopupBehavior', 'parentElement':this._menuHeader }, null, null, elt);
        
        this._headerClickHandler = Function.createDelegate(this, this._onHeaderClick);
        $addHandler(this._menuHeader, 'click', this._headerClickHandler);
        
        this._onMouseOutHandler = Function.createDelegate(this, this._onMouseOut);
        $addHandler(elt, 'mouseout', this._onMouseOutHandler);
        
        this._bodyClickHandler = Function.createDelegate(this, this._onBodyClick);
        $addHandler(document.body, 'click', this._bodyClickHandler);
        
        this._dropShadow = $create(AjaxControlToolkit.DropShadowBehavior,{'id':elt.id + 'DropShadowBehavior', 'TrackPosition': false, 'Width': 1, 'Opacity': .2 }, null, null, ul);
        
    },
    
    dispose : function() {
        if (this._links) {    
            $removeHandler(this._links[0], 'click', this._renameEntry_onclick$delegate);
            $removeHandler(this._links[1], 'click', this._deleteEntry_onclick$delegate);
            $removeHandler(this._links[2], 'click', this._insertEntry_onclick$delegate);
            this._links = null;
        }
        
        $removeHandler(this._menuHeader, 'click', this._headerClickHandler);
        
        var elt = this.get_element();
        $removeHandler(elt, 'mouseout', this._onMouseOutHandler);
        $removeHandler(document.body, 'click', this._bodyClickHandler);
        
        if (this._popupBehavior) {
            this._popupBehavior.dispose();
            this._popupBehavior = null;
        }
        
        CustomPage.TabPanelMenu.callBaseMethod(this, "dispose");
    },
    
    add_renameTabPanel : function(handler) {
        this.get_events().addHandler("renameTabPanel", handler);
    },
    
    remove_renameTabPanel : function(handler) {
        this.get_events().removeHandler("renameTabPanel", handler);
    },
    
    add_insertTabPanel : function(handler) {
        this.get_events().addHandler("insertTabPanel", handler);
    },
    
    remove_insertTabPanel : function(handler) {
        this.get_events().removeHandler("insertTabPanel", handler);
    },
    
    add_removeTabPanel : function(handler) {
        this.get_events().addHandler("removeTabPanel", handler);
    },
    
    remove_removeTabPanel : function(handler) {
        this.get_events().removeHandler("removeTabPanel", handler);
    },

    _createLink : function(text, handler) {
        var a = document.createElement('a');
        a.href = 'javascript:void(0);';
        a.innerHTML = text;
        $addHandler(a, 'click', handler);
        return a;
    },
    
    _createMenuEntry : function(link) {
        var li = document.createElement('li');
        Sys.UI.DomElement.addCssClass(li, "d-item");
        li.appendChild(link);
        return li;
    },
    
    _raiseRenameTabPanel : function(e) {
        this.hidePopup();
        var eh = this.get_events().getHandler("renameTabPanel");
        if (eh) {
            eh(this, Sys.EventArgs.Empty);
        }
    },
    
    _raiseInsertTabPanel : function(e) {
        this.hidePopup();
        var eh = this.get_events().getHandler("insertTabPanel");
        if (eh) {
            eh(this, Sys.EventArgs.Empty);
        }
    },
    
    _raiseRemoveTabPanel : function(e) {
        this.hidePopup();
        var eh = this.get_events().getHandler("removeTabPanel");
        if (eh) {
            eh(this, Sys.EventArgs.Empty);
        }
    },
    
    _removeTabPanelHandler : function(e) {
        this._raiseRemoveTabPanel();
    },
    
    _insertTabPanelHandler : function(e) {
        this._raiseInsertTabPanel();
    },
    
    showPopup : function() {
        var old = CustomPage.TabPanelMenu.__VisiblePopup;
        if (old && old._popupBehavior) {
            old.hidePopup();
        }
        
        this._popupBehavior.set_x(-30);
        this._popupBehavior.set_y(20);
        this._popupBehavior.show();
        this._popupVisible = true;
        this._dropShadow.setShadow();
        CustomPage.TabPanelMenu.__VisiblePopup = this;
    },

    hidePopup : function() {
        this._popupBehavior.hide();
        this._popupVisible = false;
        CustomPage.TabPanelMenu.__VisiblePopup = null;
    },
    
    _onHeaderClick : function(e) {
        if (!this._popupVisible) {
            this.showPopup();
        }
        else
            this.hidePopup();
            
        if (e) {
            e.stopPropagation();
        }
    },
    
    set_menuHeader : function(value) {
        this._menuHeader = value;
    },
    
    get_menuHeader : function() {
        return this._menuHeader;
    },
    
    _onMouseOut : function(e) {
        if(this._checkMouseLeave(this._element, e)) {
            this.hidePopup();
        }
    },
    
    _containsDOM : function(container,containee){
        var isParent=false;
        do{
            if((isParent=container==containee))
                break;containee=containee.parentNode;
        }
        while(containee!=null);return isParent;
    },

    _checkMouseLeave : function(element, e){
        e=(e)?e:((window.event)?window.event:"");
        window.status=e;
        if(e.rawEvent.relatedTarget){
            return !this._containsDOM(element,e.rawEvent.relatedTarget);
        }else{
            if(element.contains(e.rawEvent.toElement)){
                return(false);
            }else{
                return(true);
            }
        }
    },
    
    _onBodyClick : function() {
        if (this._popupVisible) {
            this.hidePopup();
        }
    }
}
CustomPage.TabPanelMenu.__VisiblePopup = null;
CustomPage.TabPanelMenu.registerClass("CustomPage.TabPanelMenu", Sys.UI.Control);


// CustomPage.EditingTextBox //////////////////////////////

CustomPage.EditingTextBox = function(element) {
    CustomPage.EditingTextBox.initializeBase(this, [element]);
    
    this._replacedControl = null;
    this._textBox = null;
    
    this._onMouseOutHandler;
    this._bodyClickHandler;
    
    this._textToEdit = null;
}

CustomPage.EditingTextBox.prototype = {
    
     get_textInserted : function() {
        if (this._textBox) {
            return this._textBox.value;
        }
        return null;
     },
     
     get_textToEdit : function() {
        return this._textToEdit;
     },
     
     set_textToEdit : function(value) {
        this._textToEdit = value;
     },
     
     initialize : function() {
        CustomPage.EditingTextBox.callBaseMethod(this, "initialize");
        
        var elt = this.get_element(); //innerHeaderWrapper
        this._replacedControl = elt.firstChild;
        
        this._textBox = document.createElement("input");
        this._textBox.setAttribute("type", "text");
        this._textBox.setAttribute("value", this._textToEdit);
        this._textBox.id = "__editing_box__";
        Sys.UI.DomElement.addCssClass(this._textBox, "s_editbox");
        
        Sys.UI.DomElement.addCssClass(this._textBox, "ajax__tab_tab");
        elt.replaceChild(this._textBox, this._replacedControl);
        
        this._textBox.focus();
        
//        this._onMouseOutHandler = Function.createDelegate(this, this._onMouseOut);
//        $addHandler(this._textBox, 'mouseout', this._onMouseOutHandler);

        this._bodyClickHandler = Function.createDelegate(this, this._onBodyClick);
        $addHandler(document.body, 'click', this._bodyClickHandler);
        
     },
     
     dispose : function() {    
        var elt = this.get_element();
        
//        if (this._onMouseOutHandler) {
//            $removeHandler(this._textBox, 'mouseout', this._onMouseOutHandler);
//            this._onMouseOutHandler = null;
//        }
        
        if (this._bodyClickHandler) {
            $removeHandler(document.body, 'click', this._bodyClickHandler);
            this._bodyClickHandler = null;
        }
        
        elt.replaceChild(this._replacedControl, this._textBox);
        this._textBox = null;
        
        CustomPage.EditingTextBox.callBaseMethod(this, "dispose");
    },
    
    add_textEdited : function(handler) {
        this.get_events().addHandler("textEdited", handler);
    },
    
    remove_textEdited : function(handler) {
        this.get_events().removeHandler("textEdited", handler);
    },
    
    _raiseTextEdited : function() {
        var eh = this.get_events().getHandler("textEdited");
        if (eh) {
            eh(this, Sys.EventArgs.Empty);
        }
    },
    
    _onMouseOut : function(e) {
        if(this._checkMouseLeave(this._textBox, e)) {
            this._raiseTextEdited();
        }
    },
    
    _containsDOM : function(container,containee){
        var isParent=false;
        do{
            if((isParent=container==containee))
                break;containee=containee.parentNode;
        }
        while(containee!=null);return isParent;
    },

    _checkMouseLeave : function(element, e){
        e=(e)?e:((window.event)?window.event:"");
        window.status=e;
        if(e.rawEvent.relatedTarget){
            return !this._containsDOM(element,e.rawEvent.relatedTarget);
        }else{
            if(element.contains(e.rawEvent.toElement)){
                return(false);
            }else{
                return(true);
            }
        }
    },
    
    _onBodyClick : function(element, e) {
       if(element.target.id != '__editing_box__')
            this._raiseTextEdited();
    }
}

CustomPage.EditingTextBox.registerClass("CustomPage.EditingTextBox", Sys.UI.Control);

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();