var Stand = {};

Stand.externalLinks = {
  init : function()
  {
    var links = $('a[rel="external"]');
    
    links.bind(
      'click', function(event) {
        window.open(this.href);
        event.preventDefault();
        return false;
      }  
    );
  }
};

Stand.tweetest = {
  tweetlist : function(tweets)
  {
    if ( ! document.getElementById('twitter-feed') ) return false;
    
    var statusHTML = [];
    for ( var i = 0, ii = tweets.length; i < ii; i++ ) {
      var
      username = tweets[i].user.screen_name,
      logo = tweets[i].user.profile_image_url,
      status = tweets[i].text.replace(
        /((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g,
        function (url) {
          return '<a rel="external" href="' + url + '">' + url + '</a>';
        }).replace(/\B(@|#)([_a-z0-9]+)/ig,

        function (reply) {
          if ( reply.charAt(0) == '@' ) {
            return reply.charAt(-1) + 
            '<a title="view ' + reply + '&#8217;s timeline at twitter.com" rel="external" href="http://twitter.com/' + reply.substring(1) + '">' + 
              reply + 
            '</a>';
          } else if ( reply.charAt(0) == '#' )   {
            return reply.charAt(-1) + 
            '<a rel="external" title="search ' + reply + ' at twitter.com" href="http://twitter.com/#!/search?q=%23' + reply.substring(1) + '">' + 
              reply + 
            '</a>';
          }

        }
      );

      statusHTML.push(
        '<li>' +
        '<a title="view this status at twitter.com" rel="external" href="http://twitter.com/' + username + '/statuses/' + tweets[i].id_str + '">' +
        '<img src="' + logo + '" alt="" />' +
        '</a>' +
        '<p>'+status+'</p>' +
        '<p class="time"><a title="view this status at twitter.com" rel="external" href="http://twitter.com/' + username + '/statuses/' + tweets[i].id_str + '">' + Stand.tweetest.relativeTime(tweets[i].created_at) + '</a></p>' + 
        '</li>'
      );
    }
    document.getElementById('twitter-feed').innerHTML = statusHTML.join('');
  },

  relativeTime : function(time_value)
  {
    var values = time_value.split(" ");

    time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];

    var
    parsed_date = Date.parse(time_value),
    relative_to = (arguments.length > 1) ? arguments[1] : new Date(),
    delta = parseInt((relative_to.getTime() - parsed_date) / 1000);

    delta = delta + (relative_to.getTimezoneOffset() * 60);

    if (delta < 60) {
      return 'less than a minute ago';
    } else if(delta < 120) {
      return 'about a minute ago';
    } else if(delta < (60*60)) {
      return (parseInt(delta / 60)).toString() + ' minutes ago';
    } else if(delta < (120*60)) {
      return 'about an hour ago';
    } else if(delta < (24*60*60)) {
      return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
    } else if(delta < (48*60*60)) {
      return '1 day ago';
    } else {
      return (parseInt(delta / 86400)).toString() + ' days ago';
    }
  }
};

Stand.formValidation =
{
  init: function()
  {
    if ( ! document.getElementsByTagName('form') ) return;
    var forms = document.getElementsByTagName('form');
    
    for ( var i = 0; i < forms.length; i++ )
    {
      Core.addEventListener(
        forms[i], 'submit', Stand.formValidation.submitListener
      );
    }
  },
  
  rules:
  {
    required: /\S/,
    positiveInteger: /^\d*[1-9]\d*$/,
    positiveOrZeroInteger: /^\d+$/,
    integer: /^-?\d+$/,
    decimal: /^-?\d+(\.\d+)?$/,
    email: /^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$/,
    telephone: /^(\+\d+)?( |\-)?(\(?\d+\)?)?( |\-)?(\d+( |\-)?)*\d+$/,
    filename: /^(0)[1-5](_)[a-z]+(-)?[a-z]+(_)[a-z](.)(jpg|pdf|doc|mpg|mp3|mov|m4v|mp4)/
  },
  
  errors:
  {
    required: 'Please fill in this required field',
    positiveInteger: 'This field may only contain a positive whole number.',
    positiveOrZeroInteger: 'This field may only contain a non-negative whole number.',
    integer: 'This field may only contain a whole number.',
    decimal: 'This field may only contain a number.',
    email: 'Please enter a valid email address.',
    telephone: 'Please enter a valid telephone number into this field.',
    filename: 'Please name this file with the correct naming scheme'
  },
  
  submitListener: function(event)
  {
    var fields = this.elements;
    
    for ( var i = 0; i < fields.length; i++ )
    {
      var
      className = fields[i].className,
      classRegExp = /(^| )(\S+)\b/g,
      classResult;
      
      while ( classResult = classRegExp.exec(className) )
      {
        var
        oneClass = classResult[2],
        rule = Stand.formValidation.rules[oneClass],
        para = document.createElement('p'),
        container = fields[i].parentNode,
        error_msg;
        if ( typeof rule != 'undefined' )
        {
          if ( !rule.test(fields[i].value) )
          {
            fields[i].focus();
            
            if ( !container.getElementsByTagName('p')[0] )
            {
              error_msg = document.createTextNode(Stand.formValidation.errors[oneClass]);
              para.appendChild(error_msg);
              para.className = 'error-msg';
              container.appendChild(para);
              Core.addClass(fields[i], 'error');
              
              Core.addEventListener(
                fields[i], 'blur', function()
                {
                  if ( rule.test(this.value) && this.parentNode.lastChild.nodeName == 'P' )
                  {
                    this.parentNode.removeChild(this.parentNode.lastChild);
                    Core.removeClass(this, 'error');
                  }
                }
              );
            }
            
            Core.preventDefault(event);
            return;
          }
        }
      }
    }
  }

};

$(function() {
  Stand.externalLinks.init();
  Stand.tweetest;
});
