// Select box extentions
var selectExt = {
  purge: function(element) {
    var element = $(element);
    while(element.length > 0) {
      element.remove(0);  
    }
  },
  addOption: function(element, value, label) {
    var element = $(element);
    element.options[element.options.length] = new Option(label, value, false, false);
  },
  populate: function(element, array, purge) {
    var element = $(element);
    if(typeof(array) != 'object') array = array.evalJSON;
    if(arguments[2]) element.purge();
    for(var i = 0; i < array.length; i++) {
      var pair = Object.values(array[i]);
      element.addOption(pair[0], pair[1]);
    }
  },
  selectByValue: function(element, value) {
    var element = $(element);
    for(var i = 0; i < element.options.length; i++) {
      if(element.options[i].value == value) {
        element.selectedIndex = i;
        return i;
      }
    }
    return false;
  },
  removeByValue: function(element, value) {
    var element = $(element);
    for(var i = 0; i < element.options.length; i++) {
      if(element.options[i].value == value) {
        element.remove(i);
      }
    }
  }
}
Element.addMethods('select', selectExt);

// Generic element extensions
Element.addMethods({
  scrollTo: function(element, left, top){
    var element = $(element);
    if (arguments.length == 1){
      var pos = element.cumulativeOffset();
      window.scrollTo(pos[0], pos[1]);
    } else {
      element.scrollLeft = left;
      element.scrollTop  = top;
    }
    return element;
  }
});

// Math object extensions
Object.extend(Math, {
  formatNumber:function(n, options){
    var options = Object.extend({
      decimals:0,
      currency:false,
      currencySymbol: '$ ',
      formatWhole:true,
      wholeDelimiter:',',
      decimalDelimiter:'.',
      rounding: false
    },options);

    if (options.rounding) {
      n = this.round(n * this.pow(10, options.decimals)) / this.pow(10, options.decimals);
    }

    var nArr = new Array();
    nArr = String(n).split('.');

    var whole = (typeof nArr[0]!='undefined')?nArr[0]:'0';
    if(options.formatWhole){
      var exp = /(\d+)(\d{3})/;
      while (exp.test(whole)) {
        whole = whole.replace(exp, '$1' + options.wholeDelimiter + '$2');
      }
    }

    if(typeof nArr[1]!='undefined'){
      var remainder = nArr[1];
    }else{
      var remainder = '';
      for(var i=0;i<options.decimals;i++){remainder += '0'}
    }

    var pfix = options.currency?options.currencySymbol:'';

    if(options.decimals<=0) return pfix + whole;

    var a = new Array();
    for(var i = 0; i < options.decimals; i++){
      if(remainder.charAt(i) != '') a[i] = remainder.charAt(i);
      else a[i] = '0';
    }

    return pfix + whole + options.decimalDelimiter + a.join("");
  }
});

/**
 * Extend the Ajax.Request object to add function to abort() current Ajax Request
 * 
 * @source http://blog.pothoven.net/2007/12/aborting-ajax-requests-for-prototypejs.html
 */
Object.extend(Ajax.Request.prototype, {
  abort: function() {
    // prevent and state change callbacks from being issued
    this.transport.onreadystatechange = Prototype.emptyFunction;
    // abort the XHR
    this.transport.abort();
    // update the request counter
    Ajax.activeRequestCount--;
  }
});

Ajax.Responders.register({
  onComplete: function()
  {
    if (Ajax.activeRequestCount < 0) Ajax.activeRequestCount = 0;
  }
});

/**
 * Create class to handle popup windows
 * 
 * @source Popup code adapted :: http://snook.ca/archives/javascript/prototypepowere
 */
var Popup = Class.create();
Popup.prototype =
{
  initialize: function(options)
  {
    this.options = {
      url: '#',
      name: '_blank',
      width: 600,
      height: 400,
      window: false,
      scrollbars: 'yes',
      resizable: 'yes',
      toolbar: 'no',
      location: 'yes'
    }
    Object.extend(this.options, options || {});
    this.options['window'] = window.open(this.options.url, this.options.name, 'width='+this.options.width+',height='+this.options.height+',scrollbars='+this.options.scrollbars+',resizable='+this.options.resizable+',toolbar='+this.options.toolbar+',location='+this.options.location+'');
  }
}
