
var ajax_ready = false;
var cmp_queries = {} 
var current_query = {}

function buildQuery(q, encode)
{
  if (encode === undefined) encode = true
  var a = [];
  for (var name in q)
  {
    var val = encode ? encodeURIComponent(q[name]) : q[name];
    a.push(name+'='+val);
  }
  return a.join('&');  
}

/*

componentPost() options:
  url           : request url. If empty, then url = current page's URL
  type          : Type of data to be returned to callback function: "xml", "html", "script", "json", "jsonp", or "text". (see jQuery.post() ), default "html"
  id            : target element id. If empty, then id = component_name
  wait_content  : Content to show in element #id while waiting response: false - nothing, true - loading indicator (default), string - custom html. Works only if id is given.     
  query         : (hash) url query to append to request url.  
*/

function componentPost(component_name, component_method, data, options, callback)
{
  var id = (options.id !== undefined) ? options.id : component_name;
  if (id)
  {
    var content = '<img src="/cms/backend/gui/ajaxload.gif" alt="waiting.."/>';
   
    if (options.wait_content !== undefined)
    {
      if (typeof options.wait_content == 'string')
        content = options.wait_content
      else if (!options.wait_content)
        content = '';
    }
        
    if (content != '')
      $('#'+id).html(content);
      
  }
  
  url = options.url;
  if (!url) url = window.location.pathname + window.location.search;
  
  var pos = url.indexOf("?");
  if (pos != -1) url = url.substr(0, pos);
  
  var q = (options.query !== undefined) ? options.query : {};
  q._component = component_name;
  q._method = component_method;
  url += '?' + buildQuery(q);
    
  type = options.type ? options.type : "html";
    
  $.post(url, data, callback, type);
}


function cmpPost(cmp_name, cmp_method, id, query, data, callback)
{ 
  if (!ajax_ready) return false;
  
  options = { id: id, query: query }
  componentPost(cmp_name, cmp_method, data, options, function(data)
  {
    if (callback && !callback(data)) return;
    $('#'+id).html(data);    
  });
  return false;    
}

function cmpQuery(query)
{
  if (!ajax_ready) return false;

  for (var k in query)
  {
    current_query[k] = query[k];
  }
  SWFAddress.setValue('?' + buildQuery(current_query, false))  
  return false;
}

function onAjaxQueryChange(cmp_name, onchange_fn)
{
  var def_query = [];
  for (var k in cmp_queries[cmp_name])
  {
    def_query[k] = cmp_queries[cmp_name][k]
  }
  $(document).ready(function(){      
    SWFAddress.addEventListener(SWFAddressEvent.CHANGE, function(e){
      var changed = false;
      var old_query = {}
      var names = SWFAddress.getParameterNames();
      for (var key in cmp_queries[cmp_name])
      {     
        found = false;
        for (var i in names)
        {
          if (names[i] == key) { found = true; break; } 
        }
        //if (!found) continue;
              
        var val = found ? SWFAddress.getParameter(key) : def_query[key]        
        var oldval = cmp_queries[cmp_name][key]
        if (val != oldval)
        {  
          cmp_queries[cmp_name][key] = val;
          changed = true;       
        }
        old_query[key] = oldval                
      }
      if (!changed) return;       
      onchange_fn(cmp_queries[cmp_name], old_query)
    })
  })
}


$(document).ready(function(){
  ajax_ready = true;
  SWFAddress.addEventListener(SWFAddressEvent.CHANGE, function(e){
    var names = SWFAddress.getParameterNames();
    for (var i in names)
    {
      current_query[names[i]] = SWFAddress.getParameter(names[i])
    } 
    for (var k in current_query)
    {
      found = false;
      for (var i in names)
      {
        if (names[i] == k) { found = true; break; } 
      }
      if (!found) delete current_query[k];      
    } 
  })
});



function number_format( number, decimals, dec_point, thousands_sep ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)

    var n = number, prec = decimals;
    n = !isFinite(+n) ? 0 : +n;
    prec = !isFinite(+prec) ? 0 : Math.abs(prec);
    var sep = (typeof thousands_sep == "undefined") ? ',' : thousands_sep;
    var dec = (typeof dec_point == "undefined") ? '.' : dec_point;

    var s = (prec > 0) ? n.toFixed(prec) : Math.round(n).toFixed(prec); //fix for IE parseFloat(0.55).toFixed(0) = 0;

    var abs = Math.abs(n).toFixed(prec);
    var _, i;

    if (abs >= 1000) {
        _ = abs.split(/\D/);
        i = _[0].length % 3 || 3;

        _[0] = s.slice(0,i + (n < 0)) +
              _[0].slice(i).replace(/(\d{3})/g, sep+'$1');

        s = _.join(dec);
    } else {
        s = s.replace('.', dec);
    }

    return s;
}
