/**
 * Functions for login form.
 */
var Login = {
  /**
   * The prompt to be used.
   * @param {Object} el
   */
  prompt : function(el) {
    el = $(el);
    return (el.id == 'quick_login') ? 'Username' : 'Password';
  },
  
  /**
   * Login box blured.
   * @param {Object} el
   */
  onBlur : function(el) {
    el = $(el);
    if($F(el) == '') {
      el.value = this.prompt(el);
      el.addClassName('prompt');
    } else {
      el.removeClassName('prompt');
    }
  },
  
  /**
   * Login box focused.
   * @param {Object} el
   */
  onFocus : function(el) {
    el = $(el);
    if($F(el) == this.prompt(el)) {
      el.value = '';
      el.removeClassName('prompt')
    }
  },
  
  /**
   * Switch password box.
   * @param {Object} el
   */
  switchPassword : function(el) {
    el = $(el);
    if(el.id == 'faux_password') {
      el.hide();
      $('quick_password').show();
      $('quick_password').focus();
    } else if(el.value == '') {
      el.hide();
      $('faux_password').show();
    }
  }
};


/**
 * FAQ functions.
 */
var Faq = {
  /**
   * Toggle answer.
   * @param {Object} el
   */
  toggleAnswer : function(el) {
    el = $(el);
    el.up('li').siblings().each(function(faq) {
      faq.down('.answer').hide();
    });
    el.up('li').down('.answer').toggle();
  }  
};


/**
 * Form-item functions.
 */
var FormItem = {
  /**
   * Add a visual indicator when an image is flagged for deletion.
   * @param {Object} checkbox
   */
  flagFormImageForDelete: function(checkbox) {
    var thumb = checkbox.up('.form-item').down('img');
    if(thumb) checkbox.checked ? thumb.hide() : thumb.show();
  }
};


/**
 * Function for flash messages.
 * @param {Object} el
 */
var Flash = {
  /**
   * 
   * @param {Object} type
   * @param {Object} msg
   */
  addMessage : function(type, msg) {
    var flash = $('flash_messages');
    if(!flash) {
      flash = new Element('div', {id: 'flash_messages'});
      new Insertion.After($('header'), flash);
    }
    
    var classNames = 'flash-message flash-' + type;
    msg = '<p>' + msg + '</p>';
    var flashMsg = new Element('div', {'class': classNames}).update(msg);
    flashMsg.observe('click', Flash.hideMessage.bindAsEventListener(Flash));
    new Insertion.Top(flash, flashMsg);
  },
  
  /**
   * Hide message.
   * @param {Object} el
   */
  hideMessage : function(el) {
    el = $(el);
    try {
      el = el.element();
      el.hasClassName('flash-message') ? el.hide() : el.up('.flash-message').hide();
    } catch(e) {
      el.hide();
    }
  }
};


/**
 * Functions for search form.
 */
var Search = {
  /**
   * Reset search.
   */  
  reset : function() {
    $('search_form').reset();
    $('what').value = '';
    $('where').selectedIndex = 0;    
  },
  
  /**
   * Toggle advanced form.
   */
  toggleAdvanced : function() {    
    $('search_form').toggleClassName('advanced');
    $('search_form').toggleClassName('basic');
    $('search_type').value = $('search_form').className;
    var isBasic = $F('search_type') == 'basic';
    $('advanced_part_category_id').disabled = isBasic;
    $('advanced_part_manufacturer_id').disabled = isBasic;
    $('advanced_part_model').disabled = isBasic;
    $('advanced_bike_category_id').disabled = isBasic;
    $('advanced_bike_manufacturer_id').disabled = isBasic;
    $('advanced_bike_model').disabled = isBasic;
    $('advanced_part_condition_id').disabled = isBasic;
    $('advanced_max_price').disabled = isBasic;
  },
  
  /**
   * 
   */
  toggleShortlistIndicator : function(adId) {
    $('ad_' + adId).down('h3').toggleClassName('shortlisted');    
  }
};


/**
 * Functions for ad wizard.
 */
var AdWizard = {
  /**
   * 
   * @param {Object} el
   */
  addFileField : function(el) {
    el = $(el);
    var count = $('file_field_list').select('.file-field').size();
    var fieldName = 'images[image' + (count + 1) + ']';
    
    var div = new Element('div', {'class': 'file-field'});
    var field = new Element('input', {name: fieldName, type: 'file', size: 15});
    var link = new Element('a', {href: '#'}).update('Remove');
    link.observe('click', function() {
      AdWizard.removeFileField(link);
    });
    div.insert(field);
    div.insert(link);
    
    $('file_field_list').insert(div);
  },
  
  /**
   * 
   * @param {Object} el
   */
  removeFileField : function(el) {
    el = $(el);
    el.up('div.file-field').remove();
  }
}


/**
 * Behaviour to add ajax pagination.
 */
var RemotePagination = Behavior.create({
  initialize : function() {
    this.ajaxLoader = this.element.up('.mini-pagination').up().down('img.ajax-loader');
    this.list = this.element.up('.mini-pagination').up().down('ul.list');
  },
  
  onclick : function(e) {
    var ajaxLoader = this.ajaxLoader;
    if(this.ajaxLoader) this.ajaxLoader.show();
    if(this.list) this.list.setStyle({opacity: 0.5});
    new Ajax.Request(this.element.href, {
      method: 'get',
      onComplete: function() {
        if(ajaxLoader) ajaxLoader.hide();
      }
    });
    return false;
  }
});

/**
 * Behaviours.
 */

Event.observe(window, 'load', function() {
  // Ajaxify mini-pagination.
  Event.addBehavior.reassignAfterAjax = true;
  Event.addBehavior({
    '.mini-pagination a' : RemotePagination
  });  
});


// Fix document#getElementById in IE.
if(/msie/i.test(navigator.userAgent)) {
  document.nativeGetElementById = document.getElementById;
  document.getElementById = function(id) {
    var elem = document.nativeGetElementById(id);
    if(elem) {
      // Make sure that it is a valid match on id.
      if(elem.attributes['id'].value == id) {
        return elem;
      } else {
        // Otherwise find the correct element.
        for(var i=1;i<document.all[id].length;i++) {
          if(document.all[id][i].attributes['id'].value == id) {
            return document.all[id][i];
          }
        }
      }
    }
    return null;
  };
}