MILES_PER_KM = 0.621371192;

Date.weekdays = $w("M T W T F S S");
Date.first_day_of_week = 1;

var Application = Class.create({
  initialize: function() {
    this.authToken = null;
  },
  
  ajaxRequest: function(method, url, params) {
    var requestParams = {
      asynchronous: true, 
      evalScripts: true, 
      method: method,
      parameters: {}
    };
    
    if (params.spinnerNode && !params.onLoading && !params.onComplete) {
      requestParams.onLoading = app.showSpinnerFor(params.spinnerNode, "Please wait...");
      requestParams.onComplete = app.hideSpinnerFor(params.spinnerNode);
    }
    if (params.onSuccess) requestParams.onSuccess = params.onSuccess;
    if (params.onFailure) requestParams.onFailure = params.onFailure;
    if (params.onComplete) requestParams.onComplete = params.onComplete;
    if (params.parameters) requestParams.parameters = params.parameters;
    
    requestParams.parameters.authenticity_token = this.authToken;
    
    if (params.onLoading) params.onLoading();
    return new Ajax.Request( url, requestParams );
  },
  
  submitFormWithAjax: function(method, form, spinnerNode, onSuccess) {
    this.ajaxRequest(method, form.readAttribute('action'), { spinnerNode: spinnerNode, onSuccess: onSuccess, parameters: form.serialize(true) })
  },
  
  ajaxRequestOptions: function(method, success, failure, loading, complete) {
    return {
      asynchronous: true, 
      evalScripts: true, 
      method: method || 'get', 
      onSuccess: success,
      onFailure: failure,
      onLoading: loading,
      onComplete: complete,
      parameters: {
        authenticity_token: this.authToken
      }
    };
  },
  
  spinner: function(text) {
    var paragraph = new Element('p').addClassName('spinner');
    var img = new Element('img', {src: '/images/spinner.gif'});
    var span = new Element('span').update(text);
    
    paragraph.insert(img);
    paragraph.insert(span);
    
    return paragraph;
  },
  
  showSpinnerFor: function(element, text) {
    element = $(element);
    
    if (this.hasSpinner(element)) {
      return;
    }
    
    element.hide();
    element.insert({after: this.spinner(text)});
  },
  
  hideSpinnerFor: function(element) {
    element = $(element);
    
    if (this.hasSpinner(element)) {
      element.next().remove();
      element.show();
    }
  },
  
  hasSpinner: function(element) {
    var next = element.next();
    
    return next && next.hasClassName('spinner');
  },
  
  showFlash: function (type_, text_) {
    var flashElement = $('flash');
    var typeElement = flashElement.down('.' + type_);
    
    if (!typeElement) {
      typeElement = new Element('div').addClassName('flash_info ' + type_);
      
      flashElement.insert(typeElement);
    }
    
    typeElement.update(text_);
  },
  
  clearFlash: function(type_) {
    var flashElement = $('flash');
    var typeElement = flashElement.down('.' + type_);
    
    if (typeElement) {
      typeElement.remove();
    }
  },

  updateErrors: function(messages) {
    if (messages && messages.size() > 0) {
      this.showFlash('error', messages.join('<br/>'));
    }
    else {
      this.clearFlash('error');
    }
  },
  
  redirect: function(json_) {
    window.location.href = json_.location;
  },
  
  updateNotificationSenderName: function() {
    return $('invitationSenderName').update($('email_friends_invitation_sender_name').value.escapeHTML());
  },
  
  formatDistance: function(distanceInMeters) {
    if (isNaN(parseFloat(distanceInMeters))) return '';
    
    var distance = distanceInMeters / 1000.0 * (people.userSettings.preferable_length_unit == 'mile' ? MILES_PER_KM : 1);    
    var distanceString = (distance < 100 ? (distance * 100.0).round() / 100.0 : distance.round() );
    return distanceString + ' ' + (people.userSettings.preferable_length_unit == 'mile' && distance != 1.0 ? 'miles' : 'km') ;
  }
});

Initializer.run(Application, 'app');

// create shortcut for debugging purposes but only if firebug is enabled
if (typeof(console) != "undefined") {
  window.p = console.debug;
}
