Trackster.Utilities = Class.create();

Object.extend(Trackster.Utilities, {
  bind: function() {
    Trackster.Utilities.setJSClass();
    Trackster.Utilities.ieButtonFix();
    Trackster.Utilities.closeButtons();
    Trackster.Utilities.bindTimezone();
  },

  setJSClass: function() {
    var body = document.getElementsByTagName('body');
    body = body[0];
    body.className += " js";
  },

  ieButtonFix: function() {
    if (navigator.appVersion.match(/\bMSIE\b/)) {
      var buttons = document.getElementsByTagName('button');
      for(i = 0; i < buttons.length; i++) {
        buttons[i].onclick = function() {
          var buttons = document.getElementsByTagName('button');
          for(j = 0; j < buttons.length; j++) {
            if(buttons[j] != this) {
              buttons[j].name = null;
            }
          }
          return true;
        }
      }
    }
  },

  closeButtons: function() {
    var flashes = document.getElementsByClassName('flash');
    for(var i = 0; i < flashes.length; i++) {
      var flash = flashes[i];

      var close = document.createElement('a');
      var closeImg = document.createElement('img');
      closeImg.src = '/images/close_icon.png';
      closeImg.alt = 'Hide this message';
      close.appendChild(closeImg);
      close.href = '#';
      close.className = 'close';

      Event.observe(close, 'click', function(event, element) {
        this.parentNode.removeChild(this);	
        event.stop();
      }.bindAsEventListener(flash));
    
      if(flash.childNodes.length == 0) {
        flash.appendChild(close);
      } else {
        flash.insertBefore(close, flash.childNodes[0]);
      }
    }
  },

  bindOpenid: function() {
    var openidField = $('openid_field');
    var openidFieldTrigger = $('openid_field_trigger');
    
    if(openidField && openidFieldTrigger) {
      openidField.hide();

      openidFieldTrigger.observe('click', function(e) {
        e.stop();
        openidField.toggle();
      });
    }
  },

  bindTimezone: function() {
    var userCountry = $('user_country');
    var userTimezone = $('user_timezone');

    if(userCountry && userTimezone) {
      var selected = userTimezone.value;
      
      if(userCountry.value == "")
      {
        while(userTimezone.childNodes.length > 0)
        {
          userTimezone.removeChild(userTimezone.childNodes[0]);
        }
        
        userTimezone.disabled = true;
        var option = document.createElement('option');
        option.value = "";
        option.appendChild(document.createTextNode("Select your country first"));

        userTimezone.appendChild(option);
      }
      else
      {
        var zones = Timezone[userCountry.value];
        
        var options = "";
        var last = userTimezone.value;

        while(userTimezone.childNodes.length > 0)
        {
          userTimezone.removeChild(userTimezone.childNodes[0]);
        }
       
        for(i = 0; i < zones.length; i++)
        {
            var option = document.createElement('option');
            option.value = zones[i];
            option.appendChild(document.createTextNode(zones[i].replace("_", " ")));
            if(selected == zones[i])
            {
              option.setAttribute('selected', 'selected');
            }

            userTimezone.appendChild(option);
        }
        
        userTimezone.disabled = false;
      }

      userCountry.observe('change', function(e) {
        var userCountry = $('user_country');
        var userTimezone = $('user_timezone');
       
        var selected = userTimezone.value;
        if(userCountry.value == "")
        {
          while(userTimezone.childNodes.length > 0)
          {
            userTimezone.removeChild(userTimezone.childNodes[0]);
          }
        
          var option = document.createElement('option');
          option.value = "";
          option.appendChild(document.createTextNode("Select your country first"));
          userTimezone.appendChild(option);
          userTimezone.disabled = true;
        }
        else
        {
          var zones = Timezone[userCountry.value];
          
          while(userTimezone.childNodes.length > 0)
          {
            userTimezone.removeChild(userTimezone.childNodes[0]);
          }

          for(i = 0; i < zones.length; i++)
          {
            var option = document.createElement('option');
            option.value = zones[i];
            option.appendChild(document.createTextNode(zones[i].replace("_", " ")));
            if(selected == zones[i])
            {
              option.setAttribute('selected', 'selected');
            }
            userTimezone.appendChild(option);
          }
          userTimezone.disabled = false;
        }
      });
    }
  }
});

Trackster.Utilities.InputDefault = Class.create({
  delegate: null, 

  initialize: function(element, defaultText, options) {
    if(element.tagName.toLowerCase() == "select") {
      return new Trackster.Utilities.SelectDefault(element, defaultText, options);
    } else {
      return new Trackster.Utilities.TextFieldDefault(element, defaultText, options);
    }
  }
});

Trackster.Utilities.TextFieldDefault = Class.create({
  element: null,
  defaultText: '',
  changed: false,
  options: {
    'defaultClassName': null
  },

  initialize: function(element, defaultText, options) {
    this.element = element;
    this.defaultText = defaultText;
    this.options = Object.extend(this.options, options);

    if(this.element.value == "")
    {
      this.element.value = this.defaultText;
      if(options['defaultClassName'] != null) {
        this.element.addClassName(this.options['defaultClassName']);
      }

      Event.observe(this.element, 'focus', function(event) {
        if(!this.changed) {
          this.element.value = "";
          if(this.options['defaultClassName'] != null) {
            this.element.removeClassName(this.options['defaultClassName']);
          }
        }
      }.bindAsEventListener(this));

      Event.observe(this.element, 'blur', function(event) {
        if(this.element.value == "") {
          this.changed = false;
          this.element.value = this.defaultText;
          if(this.options['defaultClassName'] != null) {
            this.element.addClassName(this.options['defaultClassName']);
          }
        } else {
          this.changed = true;
        }
      }.bindAsEventListener(this));
    }
  }
});

Trackster.Utilities.SelectDefault = Class.create({
  element: null,
  defaultText: '',
  changed: false,
  options: {
    'defaultClassName': null
  },

  initialize: function(element, defaultText, options) {
    this.element = element;
    this.defaultText = defaultText;
    this.options = Object.extend(this.options, options);

    // Actually check the option selected attribute, as this will give us a clearer indication of 
    // whether anything is actually selected.

    var selectedIndex = null;
    var options = this.element.getElementsByTagName('option');
    for(var i = 0; i < options.length; i++) {
      if(options[i].getAttribute('selected') != null) {
        selectedIndex = i;  
      }
    }

    if(selectedIndex == null) {
      // Insert a fax default value
      var defaultOption = document.createElement('option');
      defaultOption.value = "";
      defaultOption.text = this.defaultText;
      defaultOption.selected = "selected";
      
      if(this.element.childNodes.length == 0) {
        this.element.appendChild(defaultOption);
      } else {
        this.element.insertBefore(defaultOption, this.element.childNodes[0]);
      }
      
      if(this.options['defaultClassName'] != null) {
        this.element.addClassName(this.options['defaultClassName']);
      }

      Event.observe(this.element, 'focus', function(event, defaultOption) {
        if(!this.changed) {
          this.element.removeChild(defaultOption);

          if(this.options['defaultClassName'] != null) {
            this.element.removeClassName(this.options['defaultClassName']);
          }
          this.changed = true;
        }
      }.bindAsEventListener(this, defaultOption));
    }
  }
});

Trackster.Utilities.ChangeListener = Class.create({
  sourceInput: null,
  loop: null,
  originalValue: '',
  changed: false,

  initialize: function(sourceInput, options) {
    options = Object.extend({ onChange: function(value, changed) {}, interval: 50 }, options);
    this.sourceInput = $(sourceInput);
    
    this.originalValue = this.sourceInput.value;
    this.onChange = options.onChange;

    if(this.originalValue != '') {
      this.changed = true;
    }
    
    this.sourceInput.observe('focus', function() {
      this.loop = setInterval(this.checkChange.bindAsEventListener(this), options.interval);
    }.bindAsEventListener(this));
    
    this.sourceInput.observe('blur', function() {
      clearInterval(this.loop);
    }.bindAsEventListener(this));
  },

  checkChange: function() {
    this.changed = (this.sourceInput.value != this.originalValue);
    this.onChange(this.sourceInput.value, this.changed);
  },

  onChange: function(value, changed) {}
});

Trackster.Utilities.AutoDomain = Class.create({
  initialize: function(businessElement, domainElement) {
    Event.observe(businessElement, 'change', function(event, businessElement, domainElement) {
      if(domainElement.value == "") {
        domainElement.value =  businessElement.value.toString().gsub(/\W/, '').toLowerCase();
      }
    }.bindAsEventListener(this, businessElement, domainElement));
  }
});

Object.extend(Trackster.Utilities.AutoDomain, {
  bind: function() {
    var businessElement = $('user_company_name');
    var domainElement = $('user_subdomain');
    
    if(businessElement && domainElement) {
      var complete = new Trackster.Utilities.ChangeListener(businessElement, {
        onChange: function() {
          var domainElement = $('user_subdomain');
          domainElement.value = this.sourceInput.value.toString().gsub(/\W/, '').toLowerCase();
        }
      });
    }
  }
});
