function ajaxCall(method,url,params,onsuccess,onfailure)
{
 onsuccess = onsuccess || function() {};
 onfailure = onfailure || function() {}; 
 
 new Ajax.Request(url,
 {
  method: method,
  parameters: params,
  onSuccess: function(transport)
  {
    onsuccess(transport.responseJSON.result);
  },
  onFailure: function(transport) 
    { 
      if (transport.status==406)
      {
        onfailure(transport.responseJSON.error)
      }
      else
      {
        onfailure(transport.status+" ("+transport.statusText+")");
      }
    }
 });
}

function ajaxGet(url,params,onsuccess,onfailure)
{
  ajaxCall("GET", url, params, onsuccess, onfailure);
}

function ajaxPost(url,params,onsuccess,onfailure)
{
  ajaxCall("POST", url, params, onsuccess, onfailure);
}

// ----------------------------------------

Position.getWindowSize = function(w) {
  var width, height;
  w = w ? w : window;
  width = w.innerWidth || (w.document.documentElement.clientWidth || w.document.body.clientWidth);
  height = w.innerHeight || (w.document.documentElement.clientHeight || w.document.body.clientHeight);
  return { width: width, height: height };
}
								  
Position.center = function(element, y)
{
      var options = Object.extend({
      zIndex: 55,
      update: false
      }, arguments[1] || {});

      var element = $(element);

      if(!element._centered){
      Element.setStyle(element, {position: 'fixed', zIndex: options.zIndex });
      element._centered = true;
      }
       
      var dims = Element.getDimensions(element);
       
      Position.prepare();
      var winSize = Position.getWindowSize();
      var winWidth = winSize.width;
      var winHeight = winSize.height;
       
      var offLeft = (Position.deltaX + Math.floor((winWidth-dims.width)/2));
      var offTop = y ? y : (Position.deltaY + Math.floor((winHeight-dims.height)/2));
      element.style.top = ((offTop != null && offTop > 0) ? offTop : '0')+ 'px';
      element.style.left = ((offLeft != null && offLeft > 0) ? offLeft :'0') + 'px';

      if (options.update) {
      Event.observe(window, 'resize', function(evt) { Position.center(element); }, false);
      Event.observe(window, 'scroll', function(evt) { Position.center(element); }, false);
      }
}

function leftZero(n, totalDigits)
{
  n = n.toString();
  if (totalDigits > n.length)
  {
    n = "00000000000000000000000000".substr(0,totalDigits-n.length) + n;
  }
 return n;
}
		 
function radioValue(group)
{
  return $$('input:checked[type="radio"][name="'+group+'"]').pluck('value');
}

function setRadioValue(group,value)
{
  $$('input[type="radio"][name="'+group+'"]').each(function(el) 
  {
    el.checked = false;
  });
  var r = $$('input[type="radio"][name="'+group+'"][value="'+value+'"]');
  if (r.length>0)
  {
    r[0].checked = true;
  }
}

function goto(url,params)
{
  var q = $H(params).toQueryString();
  if (q)
  {
    url += "?"+q;
  }
  window.location.href=url;
}

function makeTabs(tabClass,container,init)
{
  $$("."+tabClass).invoke("observe","click", setContainer.bindAsEventListener({container: container, tabClass: tabClass}));
  if (init)
  {
    $(container).update($("tab-"+init).innerHTML);
    $(init).addClassName("selected");
  }
}

function setContainer(ev)
{
  var el = ev.element();
  var tabClass = this.tabClass;
  if (!el.hasClassName(tabClass))
  {
    el = el.up("."+tabClass);
  }
  var id = el.identify();
  var container = $(this.container);

  var from = $("tab-"+id);
  new Effect.Opacity(this.container, { from: 1.0, to: 0.0, duration: 0.7,
      afterFinish: function()
      {
        container.update(from ? from.innerHTML : "setContainer: element tab-"+id+" is not found");
        $$("."+tabClass).invoke("removeClassName","selected");
        $(id).addClassName("selected");
      }
  });
  new Effect.Opacity(this.container, { from: 0.0, to: 1.0, duration: 0.5, queue: "end" });
}

// -----------------------------------------------------

function openShadowWindow(id,y)
{
  var win = $(id);
  Position.center(win, y);
  shaderOn();
  new Effect.Grow(win);
}

function closeShadowWindow(id)
{
  var win = $(id);
  win.hide();
  shaderOff();
}

// http://www.hunlock.com/blogs/Snippets:_Howto_Grey-Out_The_Screen
function getShader()
{
  var dark=$('darkenScreenObject');
  if (dark)
  {
    return dark;
  }
  // If you are getting errors in IE see: http://support.microsoft.com/default.aspx/kb/927917
  var tbody = $$("body")[0];
  var tnode = new Element('div', {id: "darkenScreenObject"});
  tnode.setStyle({
    position: 'fixed',
    top: '0px',
    left: '0px',
    overflow: 'hidden',
    display: 'none'
  });
  tbody.insert(tnode);
  return tnode;
}

function shaderOn() 
{
  var options = {}; 
  var zindex = 50;
  var opacity = 70;
  var opaque = (opacity / 100);
  var bgcolor = '#000000';

  var dark = getShader();

  var body = $$("body")[0];
  var layout = body.getDimensions();
  var pageWidth = layout.width;
  var pageHeight = layout.height;

  dark.setStyle({
    opacity: opaque,
    MozOpacity: opaque,
    filter: 'alpha(opacity='+opacity+')',
    zIndex: zindex,
    backgroundColor: bgcolor,
    width: pageWidth+"px",
    height: pageHeight+"px",
    display: 'block'
  });
} 

function shaderOff()
{
  var dark = getShader();
  dark.hide();
}

function stuffSelectFromList(select, list)
{
  var tpl = new Template("<option value='#{value}'>#{text}</option>");
  $(select).update(
    list.eachSlice(2).map(function(el)
    {
      return tpl.evaluate({value: el[0], text: el[1]});
    })
  );
}

function populateSelect(id, url, params, onerror)
{
  var select = $(id);
  ajaxGet(url, params, 
  function(reply) {
    stuffSelectFromList(id,reply.list);
    setCurrentValue($(id), reply.value);
  }, onerror);
}

function decreaseText(el)
{
  var text = el.innerHTML;
  var n = parseInt(text);
  el.update(n ? n-1 : 0);
}

/////////////////////////////////////

function openSeparateWindow(url, params)
{
  newWin = window.open(url, "_blank", params);
  newWin.focus();
}

////////////////////////////////

function filterNumber(str)
{
  return str.replace(/[^\d\.]/g,"");
}
      
var filterInputTable = {
  "filter-number": filterNumber
};

function filterInput(event)
{
  var input = event.element();
  var classes = $w(input.className);
  var s = input.value;
  classes.each(function(cl)
  {
    if (cl in filterInputTable)
    {
      s = filterInputTable[cl](s);
    }
  });
  input.value = s;
}

function initInputFilters()
{
  $$(".filter-number").invoke("observe","change",filterInput);
}

$(document).observe("dom:loaded",function()
{
  initInputFilters();
});

