/// <reference name="MicrosoftAjax.js"/>

Type.registerNamespace("TenOverNine.Framework");

TenOverNine.Framework.StyleableButtonBehavior = function(element) {
    TenOverNine.Framework.StyleableButtonBehavior.initializeBase(this, [element]);
    
    this._linkButton = null;
    this._linkButtonClickHandler = null;
    this._markupMode = null;
};

TenOverNine.Framework.StyleableButtonBehavior.prototype = {
    initialize: function() {
        TenOverNine.Framework.StyleableButtonBehavior.callBaseMethod(this, 'initialize');

        //If the markupMode property was set, then we need to create any additional markup
        if( this._markupMode )
        {
            var lButton = this._generateExtraMarkup();

            //If there was extra markup generated, then insert the new element
            //and hide the input button            
            if( lButton )
            {
                this._linkButton = lButton;

                var elem = this.get_element();
                elem.parentNode.insertBefore(lButton, elem);
                elem.style.display = 'none';
            }
        }

        //If there is extra markup, then hookup a click
        //handler on the link to fire the click event of the button        
        if( this._linkButton )
        {        
            this._linkButtonClickHandler = Function.createDelegate(this, this.linkButtonClick);
            $addHandler(this._linkButton, 'click', this._linkButtonClickHandler);
        }
    },
    
    get_markupMode: function() {
        return this._markupMode;
    },
    set_markupMode: function(value) {
        this._markupMode = value;
    },
    
    get_linkButton: function() {
        return this._linkButton;
    },
    set_linkButton: function(value) {
        this._linkButton = value;
    },
    
    _generateExtraMarkup: function() {
        switch (this.get_markupMode()) {
            case TenOverNine.Framework.StyleableButtonMarkupMode.Button:
                return null;
            case TenOverNine.Framework.StyleableButtonMarkupMode.Link:
                return this._generateLinkMarkup();
            case TenOverNine.Framework.StyleableButtonMarkupMode.DoubleDoors:
                return this._generateDoubleDoorsMarkup();
            case TenOverNine.Framework.StyleableButtonMarkupMode.TripleDoors:
                return this._generateTripleDoorsMarkup();
            case TenOverNine.Framework.StyleableButtonMarkupMode.Quadrants:
                return this._generateQuadrantsMarkup();
            default:
                return null;
        }
    },
    
    _generateLinkMarkup: function() {
        var elem = this.get_element();

        var lButton = document.createElement('a');
        lButton.setAttribute('href', '*');
        this._copyAttributes(elem, lButton);

        lButton.appendChild(document.createTextNode(elem.value));
        
        return lButton;
    },
    
    _generateDoubleDoorsMarkup: function() {
        var elem = this.get_element();

        var lButton = document.createElement('a');
        lButton.setAttribute('href', '*');
        this._copyAttributes(elem, lButton);

        var span = document.createElement('span');
        lButton.appendChild(span);

        span.appendChild(document.createTextNode(elem.value));
        
        return lButton;
    },
    
    _generateTripleDoorsMarkup: function() {
        var elem = this.get_element();

        var lButton = document.createElement('a');
        lButton.setAttribute('href', '*');
        this._copyAttributes(elem, lButton);

        var span1 = document.createElement('span');
        lButton.appendChild(span1);

        var span2 = document.createElement('span');
        span1.appendChild(span2);

        span2.appendChild(document.createTextNode(elem.value));
        
        return lButton;
    },
    
    _generateQuadrantsMarkup: function() {
        var elem = this.get_element();

        var lButton = document.createElement('a');
        lButton.setAttribute('href', '*');
        this._copyAttributes(elem, lButton);
        
        lButton.appendChild(document.createElement('em'));
        var span = document.createElement('span');
        lButton.appendChild(span);
        span.appendChild(document.createElement('span'));
        span.appendChild(document.createElement('em'));
        span.appendChild(document.createTextNode(elem.value));
        
        return lButton;
    },
    
    _copyAttributes: function(source, target) {
        target.className = source.className;
        target.title = source.title;
        target.disabled = source.disabled;
    },
    
    linkButtonClick: function(e) {
        e.preventDefault();
        this.get_element().click();
    },
    
    dispose: function() {        
        //Add custom dispose actions here
        TenOverNine.Framework.StyleableButtonBehavior.callBaseMethod(this, 'dispose');
    }
};

TenOverNine.Framework.StyleableButtonBehavior.registerClass('TenOverNine.Framework.StyleableButtonBehavior', Sys.UI.Behavior);

TenOverNine.Framework.StyleableButtonMarkupMode = function(){};

TenOverNine.Framework.StyleableButtonMarkupMode.prototype = {
    Button:         1,
    Link:           2,
    DoubleDoors:    3,
    TripleDoors:   4,
    Quadrants:      5
};

TenOverNine.Framework.StyleableButtonMarkupMode.registerEnum('TenOverNine.Framework.StyleableButtonMarkupMode');

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
