if(arrJsLoaded == undefined) {

var arrJsLoaded = {}, E_JS_ERROR=0, E_JS_WARNING=1, E_JS_NOTICE=2, E_JS_EXEPTION=3;

var component = {}, content = {}, pattern = {};

var init = {

  arrInitInstance: {},
  _inrvs: {},
  _time: 1,
  _arrJs: {},

  elementStaticObject: function(strElementObjectName, strTreadId, strExecUid, mixPlus)
  {
    var elementObject;
    if(elementObject = eval(strElementObjectName))
    {
      elementObject.initialize(strTreadId, strExecUid, mixPlus);
    }
    else
    {
      this.waitForSingleObject(strElementObjectName, this._bind(function(_this)
      {
        eval(strElementObjectName+'.initialize(strTreadId, strExecUid, mixPlus)');
      }, this, strElementObjectName, strTreadId, strExecUid, mixPlus));
    }    
  },
  elementObject: function(strElementObjectName, strTreadId, strExecUid, mixPlus)
  {
    var elementObject;
    if(elementObject = eval(strElementObjectName))
    {
      this.arrInitInstance[strElementObjectName] = new elementObject(strTreadId, strExecUid, mixPlus);
    }
    else
    {
      this.waitForSingleObject(strElementObjectName, this._bind(function(_this)
      {
        _this.arrInitInstance[strElementObjectName] = eval('new '+strElementObjectName+'(strTreadId, strExecUid, mixPlus)');
      }, this, strElementObjectName, strTreadId, strExecUid, mixPlus));
    }
  },
  waitForSingleObject: function(strObj, onLoadHandler)
  {
    this._inrvs[strObj] = setInterval(this._bind(function(_this)
    {
      if(eval(strObj))
      {
        clearInterval(_this._inrvs[strObj]);
        delete _this._inrvs[strObj];
        onLoadHandler();
      }  
    }, this, strObj, onLoadHandler), this._time);
  },
  waitForSingleJsFile: function(file, onL)
  {
    if(!this._arrJs[file])
    {
      this._arrJs[file] = true;
      
      var el = document.createElement('script');
      el.src = '/'+file;
      
      document.getElementsByTagName('head')[0].appendChild(el);  
    } 
    this.waitForSingleObject('arrJsLoaded["'+file+'"]', onL);
  },
  
  _bind: function(__method) {
    var args = $A(arguments), object = args.shift();
    return function() {
      return __method.apply(object, args.concat($A(arguments)));
  }
}  

}

/*
 * KERNEL JS FUNCTIONS
 */
 
/** 
* return value in php print_r fprmat 
* @param mixed mixVar
* @return string
*/   

function trigger_error(mixError, intErrCode)
{
  
  switch (intErrCode) {
  case E_JS_ERROR:
      strMessageType = 'E_JS_ERROR';
      strMessageColor = 'red';
      break;
  case E_JS_WARNING:
      strMessageType = 'E_JS_WARNING';
      strMessageColor = 'blue';
      break;
  case E_JS_NOTICE:
      strMessageType = 'E_JS_NOTICE';
      strMessageColor = '#FFFF00';
  break;
    default:
      strMessageType  = '';
      strMessageColor = '';
  }  
  
  strMoreInfo = 'more info: '; 
  
  if(typeof mixError == 'object')
  {
    try{
      strMessage = mixError.message;
    } catch(e){strMessage = ''};    
  
    try{
      strMoreInfo += ' FILE:'+mixError.fileName
    } catch(e){};
    
    try
    {
      strMoreInfo += ' LINE:'+mixError.lineNumber;
    }catch(e){};  
  }
  else
  {
    strMessage = mixError;
  }    


  krnConsole('<span style="color:'+strMessageColor+'"><b>'+strMessageType+'</b></span> '+strMessage, "javascript message report", strMoreInfo);
}

/** 
 * analog php function krnConsole 
 */   
function krnConsole(mixVar, strMessageHead, strOptions)
{
  if(strMessageHead == null)
  {
    strMessageHead = 'console message from javascript';
  }
  if(strOptions == null)
  {
    strOptions = '';
  }  
  
  if(mixVar == undefined)
  {
    strMessage = 'undefined'
  }
  else if(mixVar == null)
  {
    strMessage = 'NULL'
  }
  else if(typeof mixVar == 'string')
  {
    strMessage = (strOptions != '') ? mixVar : mixVar.escapeHTML();
  }
  else if(typeof mixVar == 'number')
  {
    strMessage = mixVar;
  }
  else
  {
     strMessage = krnPrintR(mixVar).escapeHTML().replace(/\n/g, '<br>').replace(/ /g, '&nbsp;');
  }    
  if(window.hackerConsole)
    window.hackerConsole.out(strMessage, strOptions, '<i>'+strMessageHead+'</i>');
  else
  {
    //alert(strMessage+' ('+strOptions+')');  
  }  
}



/** 
 * return value in php print_r fprmat 
 * @param mixed mixVar
 * @return string
 */   
function krnPrintR(mixVar, _intPadding)
{
  if(_intPadding == null)
  {
    _intPadding = 0;
  }

  strResult = ''
  
  isHash = false;
  isArray = false;
  
  try {
    mixVar.keys();
    isHash = true;
    if(typeof mixVar == 'string')
    {
      arrMixVar = mixVar;
    }
    else
    {
      return mixVar;
    }
  }
  catch(e) {
  
    try {
      mixVar.inspect();
      arrMixVar = $A(mixVar);
    }
    catch(e)
    {
      arrMixVar = $H(mixVar); 
    }
  }
  
  arrMixVar.each(function(mixItem)
  {  
    strPadding = '';
    for(i=0;i<_intPadding;i++)
    {
      strPadding += ' ';
    }    
    
    if( (typeof mixItem == 'string') || (typeof mixItem == 'number') )
    {
      strResult += strPadding + mixItem + "\n"; 
    }
    else if( (typeof mixItem[1] != 'string') && (typeof mixItem[1] != 'number') )
    {
      strResult += strPadding + '['+mixItem[0]+'] ' + typeof mixItem[1] + "\n\n";
      strResult += krnPrintR(mixItem[1], _intPadding+5);  
      strResult += "\n";  
    }
    else
    {
      strResult += strPadding + '['+mixItem[0]+'] => ' + mixItem[1] + "\n";  
    }
    
  });
  return strResult;
}
}