(function ($) {
  var m = {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '"' : '\\"',
    '\\': '\\\\'},
  s = {
  'array': function (x)
  {
    var a = ['['], b, f, i, l = x.length, v;
    for (i = 0; i < l; i += 1)
    {
      v = x[i];
      f = s[typeof v];
      if (f)
      {
        v = f(v);
        if (typeof v == 'string')
        {
            if (b) {
                a[a.length] = ',';
            }
            a[a.length] = v;
            b = true;
        }
      }
    }
    a[a.length] = ']';
    return a.join('');
  },
  'boolean': function (x)
  {
    return String(x);
  },
  'null': function (x)
  {
    return "null";
  },
  'number': function (x)
  {
    return isFinite(x) ? String(x) : 'null';
  },
  'object': function (x)
  {
    if (x)
    {
      if (x instanceof Array)
      {
        return s.array(x);
      }
      var a = ['{'], b, f, i, v;
      for (i in x)
      {
        v = x[i];
        f = s[typeof v];
        if (f)
        {
          v = f(v);
          if (typeof v == 'string')
          {
            if (b) a[a.length] = ',';
            a.push(s.string(i), ':', v);
            b = true;
          }
        }
      }
      a[a.length] = '}';
      return a.join('');
      }
    return 'null';
  },
  'string': function (x)
  {
    if (/["\\\x00-\x1f]/.test(x))
    {
      x = x.replace(/([\x00-\x1f\\"])/g, function(a, b)
      {
        var c = m[b];
        if (c) return c;
        c = b.charCodeAt();
        return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
      });
    }
    return '"' + x + '"';
  }
  };

	$.toJSON = function(v)
  {
		var f = isNaN(v) ? s[typeof v] : s['number'];
		if (f) return f(v);
	};
	
	$.parseJSON = function(v, safe)
  {
		if (safe === undefined) safe = $.parseJSON.safe;
		if (safe && !/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(v))
			return undefined;
		return eval('('+v+')');
	};
	
	$.parseJSON.safe = false;
  
  $.trace = function(data, text)
  {
    var msg = $.toJSON(data);
    if (text != undefined) msg = text + ':' + msg;
    alert(msg);
  };
  
})(jQuery);
//$._url - predefined
(function($)
{
  $._url       = 'index.php';
  $._apc_int   = 1000;
  $._apc_fun   = null;
  $._indicator = null;
  
  $._dh  = function()
  {
    
  };

  $._json = function()
  {        
		var args = $.makeArray(arguments);
	
    var url  = $._url;
    var fun  = isset(args[0]) ? args[0] : $._dh;
    var cmd  = args[1];
    var ind  = 2;
    
    if (typeof(args[0]) == 'string')
    {
      url  = args[0];      
      fun  = args[1];
      cmd  = args[2];
      ind  = 3;
    }    

    var argsc = {cmd:cmd};
    for (var i = ind; i < args.length; i++)
    {
      argsc['a' + (i - ind).toString()] = (typeof(args[i]) == 'object') ? $.toJSON(args[i]) :  args[i];    
    }
    
    if (isset($._post_files))
    {
      var files = $._post_files;
      $._post_files = null;
      
      var fnName = fun.toString().substr('function'.length);
      var fnName = fnName.substr(0, fnName.indexOf('('));
      if (fnName.length < 3)
      {
        $._fun_cache = fun;
        fnName = 'jQuery._fun_cache';
      }
      
      $._json(url, function(apcID)
      {
        $('#upload_form').remove();
        var frmID = 'frame_' + (new Date()).getTime();
        var apcID = apcID;
        var data  = [{name:'APC_UPLOAD_PROGRESS',val:apcID}, {name:'ret', val:fnName}, {name:'axID', val:frmID}];
        _each(argsc, function(val, key) { data.push({name:key, val:val}); });
                
        var tpl = '\
          <iframe id="#{frmID}" name="#{frmID}" style="border: none; position:absolute;left:-1000px; top:-1000px;"></iframe>\
          <form style="display:none" target="#{frmID}" enctype="multipart/form-data" id="upload_form" action="#{url}" method="POST">\
          ##input##\
            <input type="hidden" name="#{name}" value="#{val}"/>\
          ##input##\
          </form>';
        $('body').append(_t(tpl, 'url', url, 'input', data, 'frmID', frmID));        
        $('#upload_form').append(files);
        $('#upload_form').submit();
        if (isset($._apc_fun))
        {
          $._apc_fun(0, true);
          setTimeout(function()
          {
            var tmFun = arguments.callee;          
            
            $._json(function(data)
            {
              if ($._apc_fun(data)) setTimeout(tmFun, $._apc_int);  
            }, 'ProgressGet', apcID);
          }, $._apc_int);
        }
      }, 'UID');   
    }
    else
    {      
      if (isset($._indicator))
      {
        $._indicator(true);
        var funOld = fun;
        fun = function(data)
        {          
          funOld(data);
          $._indicator(false);
        }
      }
      argsc['ax'] = 1;
      $.post(url, argsc, fun, 'json');
    }    
  };
 
  $._frm_del = function(frameID)
	{
		var obj = document.getElementById(frameID);
		if (obj != null) obj.parentNode.removeChild(obj);
	};
})(jQuery);


