//  Simply Buttons, version 2.0
//  (c) 2007-2009 Kevin Miller
//
//  This script is freely distributable under the terms of an MIT-style license.
// 
/*-----------------------------------------------------------------------------------------------*/
// 
// * Adjusts the buttons so that they will not have an outline when they are pressed.
// * If the browser is mobile then we replace the buttons with inputs for compatibility.
// * Disables the text in the buttons from being selected.
// * The default styles here are meant for use with the Sliding Doors technique http://alistapart.com/articles/slidingdoors/
//     to be used for IE so we can have nice states with a horrid browser too!
//
/*-----------------------------------------------------------------------------------------------*/

var SimplyButtons = {
    options: {
        hyperlinkClass: 'button',
        activeButtonClass: 'button_active',
        states: {
            outer: {
                active: {
                    backgroundPosition: 'bottom left'
                },
                inactive: {
                    backgroundPosition: 'top left'
                }
            },
            inner: {
                active: {
                    backgroundPosition: 'bottom right'
                },
                inactive: {
                    backgroundPosition: 'top right'
                }
            }
        },
        iphone: {
            replaceButtons: true
        }
    },

    buttons: [],

    iphone: false,

    init: function (options) {
        for (var property in options) {
            this.options[property] = options[property];
        }

        this.iphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i));

        this.process(document.getElementsByTagName('button'), false);
        this.process(document.getElementsByTagName('a'), true);

        if (this.iphone && this.options.iphone.replaceButtons) {
            this.remove();
        }
    },

    process: function (elements, links) {
        var linkTest = new RegExp('\\b' + this.options.hyperlinkClass + '\\b');
        for (var a = 0; a < elements.length; a++) {
            if ((links && linkTest.test(elements[a].className)) || !links) {
                if (this.iphone && !links) {
                    this.mobile(elements[a]);
                }
                else {
                    this.disable(elements[a]);
                    this.setup(elements[a]);
                }

                if (!links) {
                    this.buttons.push(elements[a]);
                }
            }
        }
    },

    mobile: function (element) {
        var input = document.createElement('input');
        input.setAttribute('type', element.getAttribute('type') == 'submit' ? 'submit' : 'button');

        var attributes = new Array('id', 'name', 'value', 'class', 'onclick', 'onmouseover', 'onmouseout', 'onpress', 'onfocus', 'onblur', 'onmouseup', 'onmousedown');
        for (var a = 0; a < attributes.length; a++) {
            if (element.getAttribute(attributes[a])) {
                input.setAttribute(attributes[a], element.getAttribute(attributes[a]));
            }
        }

        input.style.marginLeft = element.style.marginLeft;
        input.style.marginRight = element.style.marginRight;

        element.parentNode.insertBefore(input, element);

    },

    remove: function () {
        for (var a = 0; a < this.buttons.length; a++) {
            this.buttons[a].parentNode.removeChild(this.buttons[a]);
        }
    },

    disable: function (element) {
        element.onselectstart = function () { return false; };
        element.style.MozUserSelect = 'none';
        element.style.KhtmlUserSelect = 'none';
        element.style.UserSelect = 'none';
        element.style.cursor = 'default';
    },

    setup: function (element) {
        if (document.all) {
            if (element.tagName == 'BUTTON') {
                element.attachEvent('onfocus', this.bind(this.toggle, this, element));
            }
            else {
                element.attachEvent('onmousedown', this.bind(this.toggle, this, element));
            }
            element.attachEvent('onmouseup', this.bind(this.toggle, this, element));
        }
        else {
            element.onfocus = function () { this.blur(); };
        }
    },

    toggle: function (o, element) {
        if (element.tagName != 'BUTTON' && element.tagName != 'A') {
            while (element.tagName != 'A') {
                element = element.parentNode;
            }
        }
        if (event.type == 'focus' || event.type == 'mousedown') {
            element.className += ' ' + o.options.activeButtonClass;
            o.style(element.childNodes[0], o.options.states.inner.active);
            o.style(element.childNodes[0].childNodes[0], o.options.states.outer.active);
            element.blur();
        }
        else {
            element.className = element.className.replace(o.options.activeButtonClass, '');
            o.style(element.childNodes[0], o.options.states.inner.inactive);
            o.style(element.childNodes[0].childNodes[0], o.options.states.outer.inactive);
        }
    },

    style: function (element, styles) {
        for (var property in styles) {
            element.style[property] = styles[property];
        }
    },

    bind: function (func) {
        var args = [];
        for (var a = 1; a < arguments.length; a++) {
            args.push(arguments[a]);
        }
        return function () { return func.apply(this, args); };
    }
};
