if (!jQuery.bs) jQuery.bs = { };

jQuery.bs = function(options) {
  return new (function(options) {
    var self = this;
    this.options = jQuery.extend({
      method: 'GET',
      debug: false,
      async: true
    },options);

    self.load = function(callUrl, callTarget, params) {
      jQuery.ajax({
        async: self.options.async,
        url: callUrl,
        type: self.options.method,
        data: params,
        success: function(ret){
          if (self.options.debug) self.debug(ret);
          $(callTarget).html(ret);
        }
      });
    },

    self.redirect =  function(url) {
      window.location.href = url;
      return true;
    },

    self.download =  function(url) {
      var id = 'iframe'+self.microtime();
      $('<iframe onload="bs.iframeunlock();" id="'+id+'" src="'+url+'"></iframe>').appendTo('#bs_remoteload');
      self.iframelock();
      return true;
    },

    self.iframeunlock = function() {
      $("#bs_remoteloaddialog").dialog("close");
    }

    self.iframelock = function() {
      $("#bs_remoteloaddialog").dialog({modal: true});
    },

    self.microtime = function () {
      var now = new Date().getTime() / 1000;
      var s = parseInt(now, 10);
      return Math.round((Math.round((now - s) * 1000) / 1000) + s);
    },

    self.form = function(model, title, url, params, elementData){
      if (params == null) params = {};
      if (elementData == null) elementData = {};
      jQuery.ajax({
        async: self.options.async,
        url: '/form',
        type: self.options.method,
        data: jQuery.extend({'bs_model': model, 'bs_title': title, 'bs_url': url, 'bs_elementData': elementData},params),
        success: function(ret){
          if (self.options.debug) self.debug(ret);
          $('#bs_ajax').html(ret);
        }
      });
    },

    self.formagic = function(url, params, elementData) {
      if (params == null) params = {};
      if (elementData == null) elementData = {};
      jQuery.ajax({
        async: self.options.async,
        url: url,
        type: self.options.method,
        data: jQuery.extend({'bs_form': true, 'bs_url': url, 'bs_elementData': elementData }, params),
        success: function(ret){
          if (self.options.debug) self.debug(ret);
          $('#bs_ajax').html(ret);
        }
      });
    },

    self.formagicIntegrate = function(url, params, elementData) {
      params = jQuery.extend({'bs_integrate': true }, params);
      self.formagic(url, params, elementData);
    }

    self.getparam = function(name, url) {
      url = (url) ? url: window.location.href;
      var regexS = "/"+name+"/([^&#]*)";
      var regex = new RegExp( regexS );
      var results = regex.exec(url);
      if( results == null ) {
        return "";
      } else {
        return results[1];
      }
    },

    self.getparams = function(url) {
      url = (url) ? url: window.location.href;
      parts = url.split("/");
      result = {};
      for(i=1;i<parts.length;i++) {
        if (i == 1) result.controller = parts[i];
        if (i == 2) result.action = parts[i];
        if (i > 2) {
          key = parts[i];
          value = (typeof parts[i+1] !== 'undefined') ? parts[i+1]: null;
          result[key] = value;
          i++
        }
      }
      return result;
    },

    self.formjqueryize = function(id) {
      // errors
      $(id).find('ul.errors').each(function() {
        $(this).fadeIn('slow');
      });
      // datepicker
      $(id).find('.datepicker').each(function() {
        $(this).datepicker({dateFormat:'dd.mm.yy', minDate:0});
      });
      // dynamic selects
      $(id).find('select').each(function() {
        var hidden = $('#'+$(this).attr('id')+'Id'); // is there a hidden value???
        if (hidden != null) {
          var hiddenValue = hidden.val();
        }
        if (hiddenValue != null) {
          $(this).val(hidden.val());
        }
      });
    },

    self.proxy =  function(called, params){
      var reply = false;
      jQuery.ajax({
        async: self.options.async,
        url: '/proxy',
        type: self.options.method,
        data: ({call: called, args: params}),
        dataType: 'json',
        success: function(ret){
          if (self.options.debug) self.debug(ret);
          reply = ret;
        }
      });
      return reply;
    },

    self.debug = function(data) {
      $('#bs_debug').prepend('<hr /><pre>'+JSON.stringify(data)+'</pre>');
    },

    self.check = function(data) {
      //if (data.error != null) alert(data.error);
    }

    return this;
  })(options);
};

var bs = jQuery.bs();

(function($) {

  /**
   * Poll _callback_ with an interval of _ms_. When
   * the retry function is called _callback_ will continue
   * to be invoked while increasing the interval by 50%.
   *
   * The _ms_ argument defaults to 1000 and allows a function in
   * its place like the example below.
   *
   *   $.poll(function(retry){
   *     $.get('something', function(response, status){
   *       if (status == 'success')
   *         // Do something
   *       else
   *         retry()
   *     })
   *   })
   *
   * @param  {int} ms
   * @param  {function} callback
   * @api public
   */

  $.poll = function(ms, callback) {
    if ($.isFunction(ms)) {
      callback = ms
      ms = 1000
    }
    (function retry() {
      setTimeout(function() {
        callback(retry)
      }, ms)
      ms *= 1.5
    })()
  }

})(jQuery)
