
function clone(obj)
{
	if(typeof obj !== 'undefined') {
		clone.prototype = Object(obj);
		return new clone;
	}
}

/*
 * available options: ajax_url, wrapper, form, load_indicator
*/

function Component(options)
{
  this.options = options;
  this.loading_count = 0;

  var self = this;

  $(function()
  {
    self.onReady();
  });
}


Component.prototype.onReady = function()
{
  var selectors = {};
  var e = ['wrapper', 'form', 'load_indicator']
  for (var i=0; i<e.length; i++)
  {
    selectors[e[i]] = this.options[e[i]];
  }

  Component.getElements(this, selectors);
}

Component.getElements = function(obj, selectors)
{
  for (var k in selectors)
  {
    var sel = selectors[k];
    if (sel == undefined) continue;

    obj[k] = $(sel)[0];
  }

}

Component.callFlash = function(id, fn, params, on_result)
{
  var m = swfobject.getObjectById(id);
  if (m != undefined && m[fn] != undefined)
  {
    var result =  m[fn](params);
    if (on_result)
      on_result(result);

    return result;
  }

  var wait_elapsed = 0;
  var wait_timeout = 5000;
  var wait_step = 50;

  var wait_t = setInterval(function ()
  {
    var m = swfobject.getObjectById(id);
    if (m == undefined || m[fn] == undefined)
    {
      wait_elapsed += wait_step;
      if (wait_elapsed >= wait_timeout)
        clearTimeout(wait_t);

     return;
    }

    clearTimeout(wait_t);

    var result =  m[fn](params);
    if (on_result)
      on_result(result);

  }, wait_step);
}


Component.getFormValues = function(formsel)
{
  var values = {};
  var a = $(formsel).serializeArray();
  for (var k in a)
  {
    if (!a[k]['name']) continue;
    values[a[k]['name']] = a[k]['value'];
  }

  return values;
}


Component.extractCssParam = function(attrib_value, prefix)
{
  var a = attrib_value.split(' ');
  for (var i=0; i<a.length; i++)
  {
    if (a[i].substr(0, prefix.length) == prefix)
    {
      var c = a[i].split('-');
      return c[c.length-1];
    }
  }

  return null;
}

Component.prototype.loading = function(status)
{
  this.loading_count += status ? 1 : -1;

  if (this.load_indicator)
    $(this.load_indicator).css('display', this.loading_count > 0 ? 'inline' : 'none');
}


Component.prototype.cmpGet = function(method, params, callback, datatype)
{
  this.loading(1);

  if (typeof(params) == 'function')
  {
    datatype = callback;
    callback = params;
    params = '';
  }

  var self = this;

  $.get(this.options.ajax_url+'&ajaxmethod='+method+'&'+params, function(data)
  {
    self.loading(0);
    callback(data);
  }, datatype);
}

Component.prototype.cmpPost = function(method, params, postdata, callback, datatype)
{
  this.loading(1);

  if (typeof(params) == 'function')
  {
    datatype = postdata;
    callback = params;
    params = '';
    postdata = {};
  }
  else if (typeof(params) == 'object')
  {
    datatype = callback;
    callback = postdata;
    postdata = params;
    params = '';
  }

  if (typeof(postdata) == 'function')
  {
    datatype = callback
    callback = postdata;
    postdata = {};
  }

  var self = this;

  $.post(this.options.ajax_url+'&ajaxmethod='+method+'&'+params, postdata, function(data)
  {
    self.loading(0);
    callback(data);
  }, datatype);
}


Component.openModalWin = function(url, w, h, arg, resize, left, top)
{
  try {
      PWin.close();
  } catch(e) { }
  var args = new Array(window, arg);

  return openModalWin(url, args, w, h, resize, left, top);
}

Component.fillVars = function(s, vars)
{
  for (key in vars)
  {
    s = s.replace('{!'+ key + '}', vars[key]);
  }
  return s;
}

