if(!window.loaded)
{
    window.onload = function(){window.loaded = true;}
}

try {

if(arrJsLoaded == undefined) {

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

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

function $A(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) return iterable.toArray();
  var length = iterable.length, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}
Function.prototype.bind = function() {
    if (arguments.length < 2 && arguments[0] === undefined) return this;
    var __method = this, args = $A(arguments), object = args.shift();
    return function() {
      return __method.apply(object, args.concat($A(arguments)));
    }
};

var init = {

  arrInst: {},
  arrThreadUids: {},
  _time: 500,
  _arrJs: {},
  _intIdCntr: 0,
  _arrWaitCount: {},
  _arrWaitsObj: null,
  _arrWaitsObjTime: {},
  _arrWaitsFunc: [],
  _arrWaitsFuncTime: [],
  _arrWaitsJs: [],
  _arrWaitsCss: [],
  _arrWaitFiles: {},
  _isSkip: false,
  _isWhaiting: false,
  createInstance: function(strObjectName, arrInstVars, arrParams, arrLang)
  {
  
    var className = null;

    if(className = eval(strObjectName))
    {
      if(!this.arrThreadUids[arrInstVars.THREAD_ID])
      {
        this.arrThreadUids[arrInstVars.THREAD_ID] = [arrInstVars.EXEC_UID];
      }
      else
      {
        this.arrThreadUids[arrInstVars.THREAD_ID].push(arrInstVars.EXEC_UID);
      } 
      this.arrInst[arrInstVars.EXEC_UID] = new className(arrInstVars, arrParams, arrLang);
    }
    else
    {
      this.waitForSingleObject(strObjectName, function()
      {
        if(!this.arrThreadUids[arrInstVars.THREAD_ID])
          this.arrThreadUids[arrInstVars.THREAD_ID] = [arrInstVars.EXEC_UID];
        else
          this.arrThreadUids[arrInstVars.THREAD_ID].push(arrInstVars.EXEC_UID);
          
        this.arrInst[arrInstVars.EXEC_UID] = eval('new '+strObjectName+'(arrInstVars, arrParams, arrLang)');
      }.bind(this));
    }  
  },
  getInstance: function(EXEC_UID)
  {
    if(!this.arrInst[EXEC_UID]) trigger_error(new Error('instance with such EXEC_UID['+EXEC_UID+'] does not exist.'), E_JS_ERROR);
    return this.arrInst[EXEC_UID];
  },
  waitForSingleObject: function(strObj, onLoadHandler, _ic)
  {
    var isAddedToWhait = false;
    if(onLoadHandler!=undefined)
    {
      if( this._arrWaitsObj==null )
      {
        isAddedToWhait = true;
        this._arrWaitsObj = {};
      }
      
      if( typeof strObj == 'function' )
      {
        this._arrWaitsFunc.push([strObj, onLoadHandler]);
        this._arrWaitsFuncTime.push(0);
        isAddedToWhait = true;
      }
      else if(!this._arrWaitsObj[strObj])
      {
        this._arrWaitsObj[strObj] = [onLoadHandler];
        this._arrWaitsObjTime[strObj] = 0;
        isAddedToWhait = true;
      }
      else if(this._arrWaitsObj[strObj] && (this._arrWaitsObj[strObj]==true))
      {
        try {
        onLoadHandler();
        }catch(e){trigger_error(e, E_JS_ERROR);}
      }
      else
      {
        this._arrWaitsObj[strObj].push(onLoadHandler);
        isAddedToWhait = true;
      }
    }

    if(isAddedToWhait && !this._isWhaiting)
    {
      this._isWhaiting = true;
      this._checkWaitings();
    }
  },
  
  _checkWaitings: function(_isForce)
  {
    var tt = arrJsLoaded;
    var isGood = true, evl = false, isAnyBad=false, isChange=false;
    
    for (var key in this._arrWaitsObj)
    {
      if(this._arrWaitsObj[key]==true){continue;}
      
      try{  
        evl = eval(key);
      }catch(e) {
        isGood = false;}
       
      if(isGood && evl)
      {
        for(var i=0,length=this._arrWaitsObj[key].length;i<length;i++)
        {
          try {
            this._arrWaitsObj[key][i]();
          }catch(e){trigger_error(e, E_JS_ERROR);}
        }
        this._arrWaitsObj[key] = true;
        delete this._arrWaitsObjTime[key];
        isChange = true;
      }
      else
      {
        if(++this._arrWaitsObjTime[key]>1000)
        {
          trigger_error('Too long waiting for some js objects'+this._arrWaitsObj[key].toString(), E_JS_NOTICE);
          this._arrWaitsObj[key] = true;  
          delete this._arrWaitsObjTime[key];
        }
        isAnyBad = true;
      }
    }
    for(var i=0,length=this._arrWaitsFunc.length;i<length;i++)
    {
      var r = null;
      if(this._arrWaitsFunc[i])
      {
        try {
          r = this._arrWaitsFunc[i][0]();
        }catch(e){trigger_error(e, E_JS_ERROR);}
      }
      if(r)
      {  
        try {
          this._arrWaitsFunc[i][1]();
        }catch(e){trigger_error(e, E_JS_ERROR);}
          
        delete this._arrWaitsFunc[i];
        delete this._arrWaitsFuncTime[i];
        isChange = true;
      }
      else if(++this._arrWaitsFuncTime[i]>1000)
      {
        trigger_error('Too long waiting for some js functions!', E_JS_NOTICE);

        delete this._arrWaitsFunc[i];
        delete this._arrWaitsFuncTime[i];
        isChange = true;
      }
      else
      {
        isAnyBad = true;
      }
    }
    if(!isAnyBad && (isChange == true))
    { 
      if(this._arrWaitsFunc.length>0)
      {
        isAnyBad = true;
      }
      else
      {
        for (var key in this._arrWaitsObj)
        {
          if(this._arrWaitsObj[key]!==true)
          {
            isAnyBad = true;
            break;
          }
        }
      } 
    }    
    if(isAnyBad == true)
    {   
      setTimeout(function() {
      this._checkWaitings(true);}.bind(this), this._time);
    }
    else
    {
      this._isWhaiting = false;
    }
  },
  waitForMultiplyObject: function(arrObjs, onLoadHandler)
  {
    var l = arrObjs.length;
    for(var i=0,length=arrObjs.length;i<length;i++)
    {
      this.waitForSingleObject(arrObjs[i], function()
      {
        if(--l == 0) 
        {
          l = null;
          try {
            onLoadHandler();
          }catch(e){trigger_error(e, E_JS_ERROR);}
        }     
      }, true);
    }
  },
  waitForSingleJsFile: function(file, onL, isBruteLoad)
  {
    if(isBruteLoad && !this._arrJs[file])
    {
      this._arrJs[file] = true;
      this.addJsFile(file);  
    }
    if(this._arrWaitFiles[file]==undefined) this._arrWaitFiles[file]=[onL];
    else if(this._arrWaitFiles[file]==true) { try {onL();}catch(e){trigger_error(e, E_JS_ERROR);}}
    else this._arrWaitFiles[file].push(onL);
  },
  jsLoaded: function(file)
  {
    if(this._arrWaitFiles[file]==undefined) this._arrWaitFiles[file]=true;
    else if(this._arrWaitFiles[file]==true){/*trigger_error(new Error('double load js file:'+file), E_JS_ERROR);*/}
    else 
    {
      for(var i=0,ln=this._arrWaitFiles[file].length;i<ln;i++)
      {
        try {this._arrWaitFiles[file][i]();}catch(e){trigger_error(e, E_JS_ERROR);}
      }
      this._arrWaitFiles[file] = true;
    }
  },
  genUnicId: function() 
  {
    var id;
    do { id = '_' + this._intIdCntr++ } while (document.getElementById(id));
    return id;
  },  
  
  addJsFile: function(file)
  {
    var arrScripts = document.getElementsByTagName('script');
    var isLoaded = false;
    for(var i=0,length=arrScripts.length; i<length; i++)
    {
      if(!arrScripts[i].src) continue;
      if(arrScripts[i].src == '/'+file.replace('[', '%5B').replace(']', '%5D')){isLoaded = true;break;}
    }
    if(!isLoaded)
    { 
      if(document.body == undefined)
      {
        if(!!(window.attachEvent && !window.opera))/* if IE set timeout, i dont understend why, but it work witout crash supid ie, TODO: fix this problem correctly */
        {
          setTimeout(function(){
          this.waitForSingleObject('document.body', function(){loadScript(arguments[0]);}.bind(this, file));
          }.bind(this, file), 3000);
        }
        else {this.waitForSingleObject('document.body', function(){loadScript(arguments[0]);}.bind(this, file));}
      }
      else
      {
        loadScript(file);
      }   
    } 
  },
  
  addCssFile: function(file)
  {
  
    var arrStyles = document.getElementsByTagName('link');
    var isLoaded = false;
    
    for(var i=0,length=arrStyles.length; i<length; i++)
    {
      if(arrStyles[i].href==undefined) continue;
      if(arrStyles[i].href.indexOf(file)!=-1){isLoaded=true;break;}
    }  
    if(!isLoaded)
    {
    if(document.body == undefined)
    {
      this.waitForSingleObject('document.body', function(){loadCss(this, arguments[0])}.bind(this, file));
    }
    else
    {
      loadCss(file);
    } 
    }
  },    
  
  /* OBSOLETE METHODS */
  
  elementObject: function(strElementObjectName, strTreadId, strExecUid, mixPlus) /* OBSOLETE! */
  {
    var elementObject;
    if((strElementObjectName.indexOf('.')==-1) && (elementObject = eval(strElementObjectName)))/* obsolete */
    {
      this.arrInst[strElementObjectName] = new elementObject(strTreadId, strExecUid, mixPlus);
    }
    else
    {
      this.waitForSingleObject(strElementObjectName, function()
      {
        this.arrInst[strElementObjectName] = eval('new '+strElementObjectName+'(strTreadId, strExecUid, mixPlus)');
      }.bind(this));
    }
  } ,
  elementStaticObject: function(strElementObjectName, strTreadId, strExecUid, mixPlus)
  {
    var elementObject;
    if((strElementObjectName.indexOf('.')==-1) && (elementObject = eval('element.'+strElementObjectName)))
    {
      elementObject.initialize(strTreadId, strExecUid, mixPlus);
    }
    else if(elementObject = eval(strElementObjectName))
    {
      elementObject.initialize(strTreadId, strExecUid, mixPlus);
    }
    else
    {
      this.waitForSingleObject(strElementObjectName, function()
      {
        eval('new '+strElementObjectName+'(strTreadId, strExecUid, mixPlus)');
      });      
    }    
  }

}

var $I = init.getInstance.bind(init);

/*
 * 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>');
}


/** 
 * 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;
}

var arrLoadedJs = [];
function loadScript(file)
{ 
 if(!!(window.attachEvent && !window.opera))/* if IE */
  {
    for(var i=0, length=arrLoadedJs.length;i<length;i++)
    {
      if(arrLoadedJs[i] == '/'+file){return;}
    }  
  }
  if((!!(window.attachEvent && !window.opera)) && document.getElementById('loadScript') && (document.getElementById('loadScript').readyState!='complete') && (document.getElementById('loadScript').readyState!='loaded'))
  {
    init._arrWaitsJs.push(file);
    return false;
  }
  
  var head = document.getElementsByTagName('head').item(0)
  var script = document.createElement('script');
  script.src = '/'+file.replace('[', '%5B').replace(']', '%5D');
  script.type = 'text/javascript';
  script.setAttribute('sys', 1);
  
  if(!!(window.attachEvent && !window.opera))/*if IE*/
  {
      var scriptTag = document.getElementById('loadScript');
      if(scriptTag) {arrLoadedJs.push(scriptTag.src);head.removeChild(scriptTag);}
    
      script.id = 'loadScript';
      script.onreadystatechange = function() 
      {
        var el = arguments[0];
        if (el.readyState && el.readyState != "loaded" && el.readyState != "complete")
          return;
        el.onreadystatechange = null;
        if(init._arrWaitsJs.length)
        {
          setTimeout(function(){loadScript(init._arrWaitsJs.pop())}, 500);
        }  
      }.bind(file, script);  
      head.appendChild(script); 
      return false;      
  }
  head.appendChild(script);
  return true;
}
var strLastCss = '';
function loadCss(file)
{
  if(document.createStyleSheet) 
  {
    try {
      document.createStyleSheet('/'+file);
    }catch(e){
      for(var i=document.styleSheets.length-1;i>=0;i--)
      {
        if(document.styleSheets[i].href!='')
        {
          strLastCss = document.styleSheets[i].href+','+file;
          try {
          /* add to import because code like this not work: document.styleSheets[i].href = document.styleSheets[i].href+','+file;  TODO: fix this problem correctly */
            document.styleSheets[i].addImport('/'+file);
          } catch(e){continue;}
          break;
        }
      }
    };
    return;
  }
  var head = document.getElementsByTagName('head').item(0)
  var link = document.createElement('link');
  link.rel  = 'stylesheet';
  link.type = 'text/css';
  link.href = '/'+file;
  link.setAttribute('sys', 1);
  head.appendChild(link);
  return true;
}
}  
}catch(e){alert(e)};