//  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 = 'pointer';
  }
  
  ,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); };
  }

};