Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Firefox/js/src/octane/   (Browser von der Mozilla Stiftung Version 136.0.1©)  Datei vom 10.2.2025 mit Größe 4 MB image not shown  

Quelle  mandreel.js   Sprache: JAVA

 
// Portions copyright 2012 Google, Inc.
// Copyright 2012 Onan Games. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
//       copyright notice, this list of conditions and the following
//       disclaimer in the documentation and/or other materials provided
//       with the distribution.
//     * Neither the name of Google Inc. nor the names of its
//       contributors may be used to endorse or promote products derived
//       from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

var MandreelBenchmark = new BenchmarkSuite('Mandreel', [16831872, 49852],
                                            [new Benchmark('Mandreel',
                                                           false,
                                                           false,
                                                           15,
                                                           runMandreel,
                                                           setupMandreel,
                                                           tearDownMandreel,
                                                           RMSMandreel,
                                                           4)]);

var mandreelSumSquaredPauses = 0;
var mandreelSamples = 0;
var mandreelSampleTimeStart = 0.0;

function setupMandreel() {
  // Check for Typed Arrays support, throw error if not.
  if (!(typeof Uint8Array != "undefined" &&
    typeof Float64Array != "undefined" &&
    typeof (new Uint8Array(0)).subarray != "undefined")) {
      throw "TypedArrayUnsupported";
  }

  my_old_constructors = mandreel_call_constructors;
  mandreel_call_constructors = my_mandreel_call_constructors;
  startMandreelTimer();
  startApp();
  _mandreelAppAudioReady();
}

function runMandreel() {
  Mandreel_currentTime = 0;
  var sp = g_stack_pointer+800*1024;
  for (var i=0;i<mandreel_total_memory/4;i++) {
    heap32[i] = my_heap32[i];
  }
  tlsf_ptr = 0;
  heapNewPos = my_heapNewPos;
  my_old_constructors(llvm_2E_global_ctors,5,sp);
  heapU32[sp>>2] = 640;
  heapU32[(sp+4)>>2] = 480;
  __mandreel_internal_SetResolution(sp);
  __mandreel_internal_init(g_stack_pointer+800*1024);
  __init(g_stack_pointer+800*1024);
  for (var i = 0; i < 20; i++) {
    render();
    Mandreel_flushTimeouts();
    updateMandreelStats(performance.now());
  }
  Mandreel_checkState();
}

function updateMandreelStats(time) {
  var pause = time - mandreelSampleTimeStart;
  mandreelSampleTimeStart = time;
  mandreelSumSquaredPauses += (pause * pause);
  mandreelSamples++;
}

function startMandreelTimer() {
  mandreelSampleTimeStart = performance.now();
}

function RMSMandreel() {
  return Math.round(Math.sqrt(mandreelSumSquaredPauses / mandreelSamples) * 100);
}

function tearDownMandreel() {
  my_old_constructors = null;
  my_heap = null;
  my_heap8 = null;
  my_heap32 = null;

  heap = null;
  heap8 = null;
  heapU8 = null;
  heap16 = null;
  heapU16 = null;
  heap32 = null;
  heapU32 = null;
  heapFloat = null;
  heapDouble = null;
  mandreelAppUsePackAsyncTexture = null;
  mandreelSumSquaredPauses = 0;
  mandreelSamples = 0;
}

// Mocks for browser functions.

function Mandreel_setTimeout(cmd, delay) {
  timeouts.push(cmd);
}

function Mandreel_flushTimeouts() {
  while (Mandreel_timeouts.length != 0) {
    var next = Mandreel_timeouts.pop();
    eval(next);
  }
}

Mandreel_timeouts = new Array();

Mandreel_XMLHttpRequest = function() {
  this.open = function(type, url, some_bool) {
    this.url = url;
  }
  this.overrideMimeType = function() {
  }
  this.send = function() {
    this.response = null;
    this.readyState = 4;
    this.status = 0;
    this.onreadystatechange();
  }
};

function Mandreel_Element(type) {
  this.element_type = type;
  this.insertBefore = function() {
  }
}


function Mandreel_Context() {
}

function Mandreel_Canvas() {
}

function Mandreel_CanvasDiv() {
}

Mandreel_document = {
  createElement : function(element_type) {
    var element = new Mandreel_Element(element_type);
    element.parentNode = new Mandreel_Element("dummy_parent");
    return element;
  },
  getElementById : function(name) {
    if (name === "canvas") {
      return new Mandreel_Canvas();
    } else if (name === "canvasDiv") {
      return new Mandreel_CanvasDiv();
    } else {
      return undefined;
    }
  },
  getElementsByTagName : function(element) {
    if (element === "script") {
      return new Array(new this.createElement(element));
    }
  }

};

Mandreel_window = {
  WebGLRenderingContext: {},
  Float64Array: Float64Array,
  Float32Array: Float32Array,
  Int32Array: Int32Array,
  Uint32Array: Uint32Array,
  Int16Array: Int16Array,
  Uint16Array: Uint16Array,
  Int8Array: Int8Array,
  Uint8Array: Uint8Array,
  setTimeout: Mandreel_setTimeout,
  addEventListener : function () {},
  document: Mandreel_document
};

function dump(x) { }

alert = typeof alert != "undefined" ? alert : function(x) {
  print(x);
}

var my_old_constructors;
var my_heap;
var my_heap8;
var my_heap32;
var my_heapNewPos;

function my_mandreel_call_constructors(_ptr, size,stackPos) {
  my_heapNewPos = heapNewPos;
  my_heap = new ArrayBuffer(mandreel_total_memory);
  my_heap8 = new Int8Array(my_heap);
  my_heap32 = new Int32Array(my_heap);
  for (var i=0;i<mandreel_total_memory/4;i++) {
    my_heap32[i] = heap32[i];
  }
  my_old_constructors(_ptr,size,stackPos);
}


var Mandreel_currentTime = 0;

function Date_now() {
   Mandreel_currentTime += 16;
   return Mandreel_currentTime;
}

function Mandreel_checkState() {
  var sum = 0;
  for (var i = 0; i < heap32.length; i += 100) {
    sum = (sum * 3 + heap32[i]) & 0xFFFFFF;
  }
  if (sum != 8001026) {
    alert("Check sum mismatch: expected ???, actual " + sum);
  }
}

// Original Mandreel code follows.
// Modifications for benchmarking are marked in comments.

// Start of js/main.js file:

////////////////////////////////////////////
function startApp(_platform)
{
 // Start mandreel
 var params =
 {
  platform : _platform,
  width : 1024,
  height : 768,
  webglCanvas : "canvas",
  flashCanvas : "FlashDiv",
  workingFolderFlash : "data/as3/",
  workingFolderWebgl : "data/js/",
  swfFlash : "mandreel.swf",
  log : true
 };
 mandreelAppStart(appStartState,params);
}

////////////////////////////////////////////
function appStartState(state,param)
{
 // mandreel.js program is been loaded
 if ( state == "loadingScript" )
 {
 }

 // mandreel.js program has been loaded
 if ( state == "scriptLoaded" )
 {
 }

 // loading pack data file
 if (state == "loadingData")
 {
  // param bytes loaded
 }

 // Audio system is been started
 if ( state == "loadingAudio" )
 {
 }

 // Audio system is ready and the default audio preloading has been done
 if ( state == "audioLoaded" )
 {
 }



 // Mandreel has been started, render will start automatically
 if ( state == "ready" )
 {
  // Hide loading image
  var canvasElement = Mandreel_document.getElementById('loading');
  if ( canvasElement != null )
   canvasElement.style.visibility = "hidden";
 }

 // An error has been produced during the start process and the app must quit
 if ( state == "error" )
 {
  if ( param == "webgl_not_found" )
  {
   window.location = "http://get.webgl.org";
   return;
  }
  alert(param);
 }
}

// End of js/main.js file.

// Start of js/mandreelapp.js file.

var mandreelAppMandreelJs = "mandreel.js";
var mandreelAppMandreelJsCompressed = false;
var mandreelAppWorkingFolder = "data/js/";
var mandreelAppLog = false;
var mandreelAppLocalHost = "http://localhost";
var mandreelAppReadDataFromLocalHost = false;
var mandreelAppReadMandreelJsFromLocalHost = false;
var mandreelAppHostedAudioServer = null;
var mandreelAppHostedAudioUrl = null;
var mandrelCurrentFatVersion = "1.4";
var mandreelAppPlatform = "webgl";
var mandreelAppCanvasWidth = 1024;
var mandreelAppCanvasHeight = 768;
var mandreelAppWidthSrc = 1024;
var mandreelAppHeightSrc = 768;
var mandreelAppCanvasName = "canvas";
var mandreelAppCanvasDiv = "canvasDiv";
var mandreelAppUseFlashSockets = false;
var mandreelAppUsePackAsyncTexture = new Array();
//var mandreelBufferPackAsyncTexture = null;
var mandreelAppForceFocus = true;
var _imandreel_pause_game = false;

/* The following code was removed for benchmarking:
navigator.pointer = navigator.pointer || navigator.webkitPointer || navigator.mozPointer || null;*/


/* The following code was removed for benchmarking:
 if (!Date_now) {
   Date_now = function() {
     return +new Date();
   };
 };*/


////////////////////////////////////////////

if (Mandreel_window["console"])
{
 if (!Mandreel_window["dump"]) Mandreel_window["dump"] = function dump(str){ if ( mandreelAppLog ) console.log(str) };
}
else
{
 if (!Mandreel_window["dump"]) Mandreel_window["dump"] = function dump(str){ };
}

/* The following code is removed for benchmarking:
var mandreel_BrowserDetect = {
init: function () {
this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
this.version = this.searchVersion(navigator.userAgent)
|| this.searchVersion(navigator.appVersion)
|| "an unknown version";
this.OS = this.searchString(this.dataOS) || "an unknown OS";
},
searchString: function (data) {
for (var i=0;i<data.length;i++) {
var dataString = data[i].string;
var dataProp = data[i].prop;
this.versionSearchString = data[i].versionSearch || data[i].identity;
if (dataString) {
if (dataString.indexOf(data[i].subString) != -1)
return data[i].identity;
}
else if (dataProp)
return data[i].identity;
}
},
searchVersion: function (dataString) {
var index = dataString.indexOf(this.versionSearchString);
if (index == -1) return;
return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
},
dataBrowser: [
{
string: navigator.userAgent,
subString: "Chrome",
identity: "Chrome"
},
{  string: navigator.userAgent,
subString: "OmniWeb",
versionSearch: "OmniWeb/",
identity: "OmniWeb"
},
{
string: navigator.vendor,
subString: "Apple",
identity: "Safari",
versionSearch: "Version"
},
{
prop: window.opera,
identity: "Opera",
versionSearch: "Version"
},
{
string: navigator.vendor,
subString: "iCab",
identity: "iCab"
},
{
string: navigator.vendor,
subString: "KDE",
identity: "Konqueror"
},
{
string: navigator.userAgent,
subString: "Firefox",
identity: "Firefox"
},
{
string: navigator.vendor,
subString: "Camino",
identity: "Camino"
},
{ // for newer Netscapes (6+)
string: navigator.userAgent,
subString: "Netscape",
identity: "Netscape"
},
{
string: navigator.userAgent,
subString: "MSIE",
identity: "Explorer",
versionSearch: "MSIE"
},
{
string: navigator.userAgent,
subString: "Gecko",
identity: "Mozilla",
versionSearch: "rv"
},
{  // for older Netscapes (4-)
string: navigator.userAgent,
subString: "Mozilla",
identity: "Netscape",
versionSearch: "Mozilla"
}
],
dataOS : [
{
string: navigator.platform,
subString: "Win",
identity: "Windows"
},
{
string: navigator.platform,
subString: "Mac",
identity: "Mac"
},
{
   string: navigator.userAgent,
   subString: "iPhone",
   identity: "iPhone/iPod"
    },
{
string: navigator.platform,
subString: "Linux",
identity: "Linux"
}
]

};
mandreel_BrowserDetect.init(); */


////////////////////////////////////////////
var mandreel_packfiledata_name = null;
var mandreel_packfiledata_compressed = false;
var mandreel_packfiledata_size = 0;
var mandreel_total_packtexture_size = 0;
var mandreel_total_pogfile_size = 0;
var mandreel_loaded_packtexture_size = 0;
var mandreel_jslzma_size = 0;
var mandreel_swf_size = 0;

var mandreelJsScriptLoaded_loaded = false;

var mandreel_swf_last_total_size = 0;
function mandreel_swf_size_updated(str)
{
 var params = str.split(',');
 if ( mandreel_swf_size == 0 )
 {
  mandreel_swf_last_loaded_size = 0;
 }
 mandreel_swf_size = parseInt(params[0]);
 var loaded = parseInt(params[1]);
 var delta_size = loaded - mandreel_swf_last_loaded_size;
 mandreel_swf_last_loaded_size = loaded;

 var percentage = ((100*loaded)/mandreel_swf_size)|0;
 if (percentage>100)
  percentage = 100;

 if ( mandreelAppStartStateFunc )
  mandreelAppStartStateFunc("loadingScriptUpdate",percentage);

 imandreel_update_load(delta_size,0);
}

function mandreel_swf_size_loaded(str)
{
 if ( mandreelAppStartStateFunc )
  mandreelAppStartStateFunc("scriptLoaded","");
}

function mandreelNextDecompress(mandreel_result_lzma)
{

 if ( mandreelAppStartStateFunc )
 {
  var totalBytesLeft = mandreel_result_lzma.totalSize - mandreel_result_lzma.remainingBytes;

  var percentage;

  if (totalBytesLeft == 0)
   percentage = 0;
  else
   percentage = ((100*totalBytesLeft)/mandreel_result_lzma.totalSize)|0;

  mandreelAppStartStateFunc("uncompressingDataUpdate",percentage);
 }

 var old_result = mandreel_result_lzma;
 mandreel_result_lzma = LZMA.decompress2(mandreel_result_lzma.inStream,mandreel_result_lzma.inStream,mandreel_result_lzma.outStream,mandreel_result_lzma);

 if (mandreel_result_lzma == null)
 {
  //setTimeout(mandreelLoadScript,10,old_result.my_outStream.data);

  //mandreel_fs_saveFile('data.bin', old_result.my_outStream.arrayBuffer);
  //callback(old_result.my_outStream.arrayBuffer);
  //alert('done');
  mandreelLoadPackData(old_result.my_outStream.arrayBuffer,true);
 }
 else
 {
  Mandreel_setTimeout(mandreelNextDecompress,10,mandreel_result_lzma);
 }


}

function mandreel_load_packfile(array_buffer)
{
 if (array_buffer)
 {
  mandreelLoadPackData(array_buffer,false);
  return;
 }

 var working_folder = mandreelAppWorkingFolder;
 if ( mandreelAppReadDataFromLocalHost )
  working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
 var packdata_request = new XMLHttpRequest();
 var url = working_folder+mandreel_packfiledata_name;

 packdata_request.open("GET", url, true);

 if("responseType" in packdata_request)
  packdata_request.responseType="arraybuffer";
 else
  packdata_request.overrideMimeType('text/plain; charset=x-user-defined');

 var last_loaded_size = 0;

 packdata_request.onreadystatechange = function()
 {
  if (packdata_request.readyState != 4) return;

  if (packdata_request.status == 200)
  {
   var buffer;
   if (packdata_request.responseType=="arraybuffer")
    buffer=packdata_request.response;
   else if (packdata_request.mozResponseArrayBuffer != null)
    buffer = packdata_request.mozResponseArrayBuffer;
   else
    buffer=packdata_request.response;

   if (mandreel_packfiledata_compressed)
   {
    var inStream = {
      data: new Uint8Array(buffer),
      offset: 0,
      readByte: function(){
     return this.data[this.offset ++];
      }
    };

    var outStream = {
      data: null,
      offset: 0,
      binary_mode : true,
      writeByte: function(value){
     this.data[this.offset ++] = value;
      }
    };


    var result = LZMA.decompress2(inStream,inStream,outStream,null);

    if (result == null)
     mandreelLoadPackData(outStream.arrayBuffer,true);
    else
     Mandreel_setTimeout(mandreelNextDecompress,10,result);
   }
   else
    mandreelLoadPackData(buffer,true);
  }
  else
  {
   if ( mandreelAppStartStateFunc )
    mandreelAppStartStateFunc("error","can't load packfile data");
  }
 }
 packdata_request.onprogress = function(e)
 {
  var delta_size = e.loaded - last_loaded_size;
  last_loaded_size = e.loaded;
  var percentage = ((100*e.loaded)/mandreel_packfiledata_size)|0;


  imandreel_update_load(delta_size,0);

  if (percentage>100)
   percentage = 100;

  if ( mandreelAppStartStateFunc )
   mandreelAppStartStateFunc("loadingData",percentage);
 }

 packdata_request.send();
}

function mandreelJsScriptLoaded()
{
 if (mandreelJsScriptLoaded_loaded)
  return;

 if (typeof(mandreel_cache_files)=="undefined")
 {
  Mandreel_setTimeout(mandreelJsScriptLoaded,10);
  return;
 }

 mandreelJsScriptLoaded_loaded = true;

 if ( mandreelAppStartStateFunc )
  mandreelAppStartStateFunc("scriptLoaded","");

 if (mandreel_packfiledata_name)
 {

  mandreel_fs_load_binary(mandreel_packfiledata_name, mandreel_load_packfile);


 }
 else
 {
  mandreelCacheMandreelFat();
  imandreelJsScriptLoaded();
 }
}

function imandreelLoadAudio()
{
 g_mandreel_working_folder = mandreelAppWorkingFolder;
 if ( mandreelAppReadDataFromLocalHost )
  g_mandreel_working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;

 // load audio
 if ( mandreelAppStartStateFunc )
  mandreelAppStartStateFunc("loadingAudio","");
 mandreel_start_audio(mandreelAppHostedAudioServer,mandreelAppHostedAudioUrl,_mandreelAppAudioReady);
}

var _mandreel_currentPackTexture = '';

function imandreel_packasynctexture_loaded(buffer,save_file)
{
 if (save_file)
  mandreel_fs_saveFile(_mandreel_currentPackTexture,buffer);

 //mandreelBufferPackAsyncTexture = buffer;
 Mandreel_TextureAsync_PackBufferData[_mandreel_currentPackTexture] = buffer;

 imandreelLoadNextTexturePack();
}

var mandreel_update_total_size = 0;

function imandreel_update_load(size, total)
{
 if (total == 0)
  total = mandreel_packfiledata_size + mandreel_total_packtexture_size + mandreel_total_pogfile_size + mandreel_jslzma_size + mandreel_swf_size;


 mandreel_update_total_size+=size;

 var percentage = ((100*mandreel_update_total_size)/total)|0;

 if (percentage>100)
  percentage = 100;
 if (mandreelAppStartStateFunc)
  mandreelAppStartStateFunc("loadingProgress",percentage);

}


function imandreel_packasynctexture_load(array_buffer)
{
 if (array_buffer)
 {
  imandreel_packasynctexture_loaded(array_buffer, false);
  return;
 }


 var working_folder = mandreelAppWorkingFolder;
 if ( mandreelAppReadDataFromLocalHost )
  working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
 var packdata_request = new XMLHttpRequest();
 var url = working_folder+_mandreel_currentPackTexture;

 packdata_request.open("GET", url, true);

 if("responseType" in packdata_request)
  packdata_request.responseType="arraybuffer";
 else
  packdata_request.overrideMimeType('text/plain; charset=x-user-defined');

 var last_loaded_size = 0;

 packdata_request.onreadystatechange = function()
 {
  if (packdata_request.readyState != 4) return;

  if (packdata_request.status == 200)
  {
   var buffer;
   if (packdata_request.responseType=="arraybuffer")
    buffer=packdata_request.response;
   else if (packdata_request.mozResponseArrayBuffer != null)
    buffer = packdata_request.mozResponseArrayBuffer;
   else
    buffer=packdata_request.response;

   imandreel_packasynctexture_loaded(buffer, true);
  }
  else
  {
   if ( mandreelAppStartStateFunc )
    mandreelAppStartStateFunc("error","can't load textureasync pack data");
  }
 }
 packdata_request.onprogress = function(e)
 {
  var delta_size = e.loaded - last_loaded_size;
  last_loaded_size = e.loaded;
  mandreel_loaded_packtexture_size+=delta_size;

  imandreel_update_load(delta_size,0);

  var percentage = ((100*mandreel_loaded_packtexture_size)/mandreel_total_packtexture_size)|0;

  if (percentage>100)
   percentage = 100;

  if ( mandreelAppStartStateFunc )
   mandreelAppStartStateFunc("loadingTextureAsyncPack",percentage);
 }

 packdata_request.send();

}

function imandreelLoadNextTexturePack()
{
 if (mandreelAppUsePackAsyncTexture.length)
 {
  _mandreel_currentPackTexture = mandreelAppUsePackAsyncTexture.pop();
  mandreel_fs_load_binary(_mandreel_currentPackTexture, imandreel_packasynctexture_load);
 }
 else
  imandreelLoadAudio();
}

function imandreelJsScriptLoaded()
{
 imandreelLoadNextTexturePack();
}

////////////////////////////////////////////

function mandreelDecompressJSReady(code, save_file)
{
 if (save_file)
  mandreel_fs_saveFile(mandreelAppMandreelJs + ".lzma", code);

 var ga = Mandreel_document.createElement('script');
 ga.type = "text/javascript";
 ga.text = code;
 var s = Mandreel_document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
 s.parentNode.removeChild(ga);
 mandreelJsScriptLoaded();
}

function mandreelNextDecompressJS(mandreel_result_lzma)
{

 if ( mandreelAppStartStateFunc )
 {
  var totalBytesLeft = mandreel_result_lzma.totalSize - mandreel_result_lzma.remainingBytes;

  var percentage;

  if (totalBytesLeft == 0)
   percentage = 0;
  else
   percentage = ((100*totalBytesLeft)/mandreel_result_lzma.totalSize)|0;

  mandreelAppStartStateFunc("uncompressingScriptUpdate",percentage);
 }

 var old_result = mandreel_result_lzma;
 mandreel_result_lzma = LZMA.decompress2(mandreel_result_lzma.inStream,mandreel_result_lzma.inStream,mandreel_result_lzma.outStream,mandreel_result_lzma);

 if (mandreel_result_lzma == null)
 {
  mandreelDecompressJSReady(old_result.my_outStream.data,true);
 }
 else
 {
  Mandreel_setTimeout(mandreelNextDecompressJS,10,mandreel_result_lzma);
 }


}

function mandreel_load_compressed_js(code_js)
{
 if (code_js)
 {
  mandreelDecompressJSReady(code_js,false);
  return;
 }
  var xmlhttp_get = new XMLHttpRequest();

  var url = mandreelAppMandreelJs + ".lzma";
  if ( mandreelAppReadMandreelJsFromLocalHost )
  url = mandreelAppLocalHost+"/"+url;

  xmlhttp_get.open('GET',url);


 if("responseType" in xmlhttp_get)
  xmlhttp_get.responseType="arraybuffer";
 else
  xmlhttp_get.overrideMimeType('text/plain; charset=x-user-defined');

 var last_loaded_size = 0;

 xmlhttp_get.onreadystatechange = function()
 {
  if (xmlhttp_get.readyState==4)
  {
   if (xmlhttp_get.status==200 || xmlhttp_get.status==0)
   {

    var inStream = {
      data: new Uint8Array(xmlhttp_get.response),
      offset: 0,
      readByte: function(){
     return this.data[this.offset ++];
      }
    };

    var outStream = {
      data: new String(""),
      offset: 0,
      binary_mode : false,
      writeByte: function(value){
     this.data+=String.fromCharCode(value);
      }
    };


    var result = LZMA.decompress2(inStream,inStream,outStream,null);
    if (result == null)
     mandreelDecompressJSReady(outStream.data,true);
    else
     Mandreel_setTimeout(mandreelNextDecompressJS,10,result);
   }
   else
   {
    alert('error ' + xmlhttp_get.status);
   }
  }

 }

 xmlhttp_get.onprogress = function(e)
 {
  var delta_size = e.loaded - last_loaded_size;
  last_loaded_size = e.loaded;

  var percentage = ((100*e.loaded)/e.total)|0;

  mandreel_jslzma_size = e.total;

  imandreel_update_load(delta_size,0);

  if (percentage>100)
   percentage = 100;

  if ( mandreelAppStartStateFunc )
   mandreelAppStartStateFunc("loadingScriptUpdate",percentage);
 }

 xmlhttp_get.send();

}

function mandreelLoadMandreelJsScript()
{
 if (mandreelAppMandreelJsCompressed)
 {
  mandreel_fs_load_text(mandreelAppMandreelJs + ".lzma", mandreel_load_compressed_js);

 }
 else
 {
  var ga = Mandreel_document.createElement('script');
  ga.type = 'text/javascript';
  ga.async = true;
  ga.onload = ga.onreadystatechange = mandreelJsScriptLoaded;
  var url = mandreelAppMandreelJs;
  if ( mandreelAppReadMandreelJsFromLocalHost )
   ga.src = mandreelAppLocalHost+"/"+url;
  else
   ga.src = url;
  var s = Mandreel_document.getElementsByTagName('script')[0];
  if ( mandreelAppStartStateFunc )
   mandreelAppStartStateFunc("loadingScript","");
  s.parentNode.insertBefore(ga, s);
 }
}

////////////////////////////////////////////
function mandreelFatLoaded()
{
 if ( mandreelAppPlatform == "nacl" )
 {
  g_mandreel_working_folder = mandreelAppWorkingFolder;
  if ( mandreelAppReadDataFromLocalHost )
   g_mandreel_working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;

  // load audio
  if ( mandreelAppStartStateFunc )
   mandreelAppStartStateFunc("loadingAudio","");
  _mandreelAppAudioReady();
 }
 else
  mandreelLoadMandreelJsScript();
}

var mandreelFatData = "";
var mandreelFatPreloadRequest = 0;
////////////////////////////////////////////

function mandreel_chanka_fixfile(fileName)
{
 var fileNameNoExt = fileName.toLowerCase();
 fileNameNoExt = fileNameNoExt.replace(/\\/g,"/");

 fileNameNoExt =  fileNameNoExt.substr(1);

 var new_fileName = '';

 for(var j = 0; j < fileNameNoExt.length; j++)
 {
  var data = fileNameNoExt.charCodeAt(j);

  if (data != 13)
  {
    var t = String.fromCharCode(data);
    new_fileName+=t;
  }
 }

 return  new_fileName;
}

function mandreel_removecr(my_string)
{
 var new_string = '';
 for(var j = 0; j < my_string.length; j++)
 {
  var data = my_string.charCodeAt(j);

  if (data != 13)
  {
    var t = String.fromCharCode(data);
    new_string+=t;
  }
 }

 return  new_string;
}

function mandreelCacheMandreelFat()
{
 var array_mandreel_fat = new ArrayBuffer(mandreelFatData.length+1);


 {
  var j;
  var len = mandreelFatData.length;
  var data_char;

  var my_bytes = new Uint8Array(array_mandreel_fat);

  for(j = 0; j < len; j++)
  {
   data_char = mandreelFatData.charCodeAt(j);

   my_bytes[j] = data_char;
  }
  my_bytes[j] = 0;
 }


 mandreel_cache_files['mandreel.fat'] = array_mandreel_fat;
}

function mandreelLoadPackData(data, save_pack)
{
 var files = mandreelFatData.split('\n');

 var current_dir = '';
 var current_offset = 0;

 if (save_pack)
  mandreel_fs_saveFile(mandreel_packfiledata_name,data);


 for (var i=0;i<files.length;++i)
 {
  var file_data = files[i].split(',');

  if (file_data[0] == 'dir')
  {
   current_dir = file_data[1];
   //current_dir = current_dir.substr(0,current_dir.lengh-1);
  }
  else if (file_data[0] == 'file')
  {
   var file_name = current_dir + file_data[1];
   file_name = mandreel_chanka_fixfile(file_name) ;
   //dump('new file ' + file_name + ' ' + current_offset);
   //dump(file_name);
   var file_size = parseInt(file_data[2]);

   var my_array = new ArrayBuffer(file_size);

   var my_bytes = new Uint8Array(my_array);

   var data_bytes = new Uint8Array(data,current_offset,file_size);

   my_bytes.set(data_bytes);

   mandreel_cache_files[file_name] = my_array;


   current_offset+=file_size;


  }
 }



 g_mandreel_datafiles_sufix = '';
 mandreelCacheMandreelFat();

 imandreelJsScriptLoaded();
}

var preCreatedWebAudioContext = null;

function mandreelLoadFat()
{
 mandreelFatPreloadRequest = new Mandreel_XMLHttpRequest();
 var working_folder = mandreelAppWorkingFolder;
 if ( mandreelAppReadDataFromLocalHost )
  working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
 var url = working_folder+"mandreel.fat.dat";
 if ( mandreelAppPlatform == "nacl" )
  url = working_folder+"mandreel.fat";
 mandreelFatPreloadRequest.open("GET", url, true);
 mandreelFatPreloadRequest.onreadystatechange = function()
 {
  if (mandreelFatPreloadRequest.readyState != 4) return;
  if ( mandreelFatPreloadRequest.status != 404 && mandreelFatPreloadRequest.response != null )
  {
   mandreelFatData = mandreelFatPreloadRequest.response;
  }
  if ( mandreelFatData == "" )
  {
   dump("error loading mandreel.fat file, Maybe the working folder is not correctly set???");
  }

  var packfiledata = null;
  var compressed = false;
  var packfiledata_size = 0;
  var total_packtexture_size = 0;
  var pogsize = 0;

  // Check version
  var FatLines = mandreelFatData.split('\n');
  for ( var i=0;i<FatLines.length;++i )
  {
   var line = mandreel_removecr(FatLines[i]);
   var params = line.split(',');
   if ( params[0] == "version" )
   {
    if ( params[1] != mandrelCurrentFatVersion )
     dump("warning: mandreel.fat version number is ("+params[1]+") and it should be ("+mandrelCurrentFatVersion+")");

   }
   else if ( params[0] == "platform" && params[1] != "js" && (mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas")  )
    dump("warning: mandreel.fat platform is ("+params[1]+") and it should be (js)");
   else if ( params[0] == "platform" && params[1] != "nacl" && mandreelAppPlatform == "nacl"  )
    dump("warning: mandreel.fat platform is ("+params[1]+") and it should be (nacl)");
   else if (params[0] == 'packdata')
   {
    packfiledata = params[1];
    compressed = params[2].charAt(0) == '1';
    packfiledata_size =  parseInt(params[3], 10);
   }
   else if (params[0] == 'flashsockets')
   {
    mandreelAppUseFlashSockets = true;
   }
   else if (params[0] == 'packtexture')
   {
    var filename = params[1];
    var size_packtexture = parseInt(params[3], 10);
    total_packtexture_size+=size_packtexture;
    mandreelAppUsePackAsyncTexture.push(filename);
   }
   else if (params[0] == 'audiopreloadfile')
   {
    pogsize = parseInt(params[2],10);
   }
   else if (params[0] == 'audiodriver' && params[1] == 'webaudio')
   {
    try { preCreatedWebAudioContext = new webkitAudioContext(); } catch(err) { preCreatedWebAudioContext = null; }
   }
  }

  if ( preCreatedWebAudioContext != null )
   mandreel_total_pogfile_size = pogsize;
  mandreel_packfiledata_name = packfiledata;
  mandreel_packfiledata_compressed = compressed;
  mandreel_packfiledata_size = packfiledata_size;
  mandreel_total_packtexture_size = total_packtexture_size;
  mandreelFatLoaded();
 }
 mandreelFatPreloadRequest.send();
}

var mandreelAppStartStateFunc = 0;
var mandreelDisableSpaceKey = true;
////////////////////////////////////////////
function mandreelAppStart(startStateFunc,params)
{
 mandreelAppStartStateFunc = startStateFunc;




 if ( typeof(params.log) != 'undefined' )
  mandreelAppLog = params.log;

 if ( typeof(params.platform) != 'undefined' )
  mandreelAppPlatform = params.platform;

 if (typeof(params.mandreelJSCompressed) != 'undefined' )
  mandreelAppMandreelJsCompressed = params.mandreelJSCompressed;


/*  The following code is removed for benchmarking:
if ((mandreel_BrowserDetect.browser == 'Chrome' || mandreel_BrowserDetect.browser == 'Safari') && mandreel_BrowserDetect.OS == 'Mac' && mandreelAppPlatform == "flash")
mandreelDisableSpaceKey = false; */


 if ( mandreelAppPlatform != "webgl" && mandreelAppPlatform != "flash" && mandreelAppPlatform != "nacl" && mandreelAppPlatform != "canvas" && mandreelAppPlatform != "plugin")
 {
  mandreelAppStartStateFunc("error",'platform ('+mandreelAppPlatform+') not supported');
  return;
 }

 if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
 {
  mandreelAppWorkingFolder = "data/js/";
  if ( typeof(params.workingFolderWebgl) != 'undefined' )
   mandreelAppWorkingFolder = params.workingFolderWebgl;
  // Check Float64Array availability
  if ( !Mandreel_window["Float64Array"] )
  {
   mandreelAppStartStateFunc("error",'Browser unsupported: Float64Array not available');
   return;
  }

  var flashElement = Mandreel_document.getElementById('FlashWrapper');
  if ( flashElement != null )
  {
   flashElement.style.visibility = "hidden";
   flashElement.style.width = "0px";
   flashElement.style.height = "0px";
  }
  var flashElement = Mandreel_document.getElementById('FlashDiv');
  if ( flashElement != null )
  {
   flashElement.style.visibility = "hidden";
   flashElement.style.width = "0px";
   flashElement.style.height = "0px";
  }

  // Setup WebGL
  if ( typeof(params.webglCanvas) == 'undefined' )
  {
   mandreelAppStartStateFunc("error",'canvas parameter not found');
   return;
  }
  var canvas = Mandreel_document.getElementById(params.webglCanvas);
  if ( canvas == null )
  {
   mandreelAppStartStateFunc("error",'canvas object ('+params.webglCanvas+') not found');
   return;
  }
  if ( params.width != null )
  {
   canvas.width = params.width;
   mandreelAppWidthSrc = params.width;
  }
  if ( params.height != null )
  {
   canvas.height = params.height;
   mandreelAppHeightSrc = params.height;
  }
  if ( mandreelAppPlatform == "webgl" )
  {
   // The following code is removed for benchmarking:
   // imandreel_gl = WebGLUtils.setupWebGL(canvas,{premultipliedAlpha:false,alpha:false});
   // if (imandreel_gl == null)
   // {
   // mandreelAppStartStateFunc("error","webgl_not_found");
   // return;
   // }
  }

  if ( mandreelAppPlatform == "canvas" )
  {
   imandreel_ctx_canvas = canvas.getContext('2d');
   if ( imandreel_ctx_canvas == null )
   {
    mandreelAppStartStateFunc("error","canvas context 2d not found");
    return;
   }
  }

  if (params.cache != null)
  {
   //alert( params.cache.size + params.cache.url);
   mandreel_fs_init(function() { if ( mandreelAppStartStateFunc )
    mandreelAppStartStateFunc("loadingFat","");
   mandreelLoadFat();}, params.cache.size,params.cache.url);
  }
  else
  {
   // load Fat
   if ( mandreelAppStartStateFunc )
    mandreelAppStartStateFunc("loadingFat","");
   mandreelLoadFat();
  }
 }

 if ( mandreelAppPlatform == "flash" )
 {
  mandreelAppWorkingFolder = "data/as3/";
  if ( typeof(params.workingFolderFlash) != 'undefined' )
   mandreelAppWorkingFolder = params.workingFolderFlash;
  if (!swfobject.hasFlashPlayerVersion('11.2.0'))
  {
   mandreelAppStartStateFunc("error","flash 11 not found");
   return;
  }

  if ( typeof(params.flashCanvas) == 'undefined' )
  {
   mandreelAppStartStateFunc("error",'canvas parameter not found');
   return;
  }

  if ( true ) // hide webgl canvas
  {
   var canvas = Mandreel_document.getElementById(mandreelAppCanvasDiv);
   if ( canvas != null )
   {
    canvas.style.visibility = "hidden";
    canvas.style.width = "0px";
    canvas.style.height = "0px";
   }
  }

  if ( params.width != null )
  {
   mandreelAppCanvasWidth = params.width;
  }
  if ( params.height != null )
  {
   mandreelAppCanvasHeight = params.height;
  }

  mandreelAppCanvasDiv = params.flashCanvas;

  try
  {
   var mandreelSocketsSwf = "mandreel.swf";
   if ( typeof(params.swfFlash) != 'undefined' )
    mandreelSocketsSwf = params.swfFlash;

   var my_flashvars = "workingFolder=" + encodeURIComponent(mandreelAppWorkingFolder);
   if ( typeof(params.log) != 'undefined' && params.log == true)
     my_flashvars += "&log=true"
   my_flashvars += "&width=" + params.width;
   my_flashvars += "&height=" + params.height;
   my_flashvars += "&swfloader=" + mandreelSocketsSwf;

   if (typeof(params.restore_context) != 'undefined' && params.restore_context == true)
    my_flashvars += "&restore_context=1";

   if (typeof(params.antialiasing) != 'undefined')
    my_flashvars += "&antialiasing=" + params.antialiasing;

   if (typeof(params.right_click_enable) != 'undefined' && params.right_click_enable == true)
    my_flashvars += "&right_click=1";

   if (typeof(params.disable_depth) != 'undefined' && params.disable_depth == true)
    my_flashvars += "&disable_depth=1";

   var swfname = "mandreelloader.swf";
   if ( typeof(params.swfPreloader) != 'undefined' && params.swfPreloader == false)
    swfname = mandreelSocketsSwf;

   var swf = swfobject.createSWF({ data:swfname, width:"100%", height:"100%" }, { menu:"false",allowScriptAccess:"always",allowFullScreen:"true",wmode:"direct",scale:"noscale",salign :"tl",bgcolor:"#000000",flashvars:my_flashvars}, params.flashCanvas);
   if ( !swf )
   {
    mandreelAppStartStateFunc("error","error loading " + swfname);
    return;
   }
   else
   {
    if ( mandreelAppStartStateFunc )
     mandreelAppStartStateFunc("loadingScript","");
   }
  }
  catch(err)
  {
   mandreelAppStartStateFunc("error","exception " + err + " while loading " + mandreelSocketsSwf);
   return;
  }

  appStartState('loadingScript');
 }

 if ( mandreelAppPlatform == "nacl" )
 {
  mandreelAppWorkingFolder = "data/nacl/";

  // load Fat
  if ( mandreelAppStartStateFunc )
   mandreelAppStartStateFunc("loadingFat","");
  mandreelLoadFat();

 }

 if ( mandreelAppPlatform == "plugin" )
 {
  mandreelInitPluginPlatform(params);
 }
}


////////////////////////////////////////////
function MandreelAudioStartedNacl()
{
 var helloWorldModule = null;
 helloWorldModule = Mandreel_document.getElementById('hello_world');
 helloWorldModule.postMessage('init');
 var flashElement = Mandreel_document.getElementById('FlashWrapper');
 if ( flashElement != null )
  flashElement.style.visibility = "hidden";
 mandreelAppStartStateFunc("ready",mandreelAppCanvasWidth,mandreelAppCanvasHeight);
}

////////////////////////////////////////////
function _mandreelAppStartReady()
{
 if ( mandreelAppPlatform == "nacl" )
 {
  wa_initWebAudio();
  mandreel_webAudio_PreloadAssets();
 }
 else
 {
  if ( mandreelAppStartStateFunc )
  {
   mandreelAppStartRenderWebGL();
   mandreelAppStartStateFunc("ready",mandreelAppCanvasWidth,mandreelAppCanvasHeight);
  }
 }
}
////////////////////////////////////////////
function _mandreelAppAudioReady()
{
 if ( mandreelAppStartStateFunc )
  mandreelAppStartStateFunc("audioLoaded","");

 if ( mandreelAppUseFlashSockets )
  mandreel_flash_sockets_load_flash(_mandreelAppStartReady);
 else
  _mandreelAppStartReady();
}

////////////////////////////////////////////
function mandreelAppInit()
{
 if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
 {
  global_init(g_stack_pointer+800*1024);

  //Mandreel_TextureAsync_PackBufferData[_mandreel_currentPackTexture] = mandreelBufferPackAsyncTexture;
  //mandreelBufferPackAsyncTexture = null;
  var sp = g_stack_pointer+800*1024;
  heapU32[sp>>2] = mandreelAppCanvasWidth;
  heapU32[(sp+4)>>2] = mandreelAppCanvasHeight;
  __mandreel_internal_SetResolution(sp);
  __mandreel_internal_init(g_stack_pointer+800*1024);
  __init(g_stack_pointer+800*1024);
 }
}

////////////////////////////////////////////
function mandreelAppDraw(elapsed)
{
 if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
 {
  if ( mandreelAppPlatform == "canvas" && imandreel_ctx_canvas != null )
  {
   var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
   imandreel_ctx_canvas.clearRect(0,0,canvas.width,canvas.height);
  }
  var sp = g_stack_pointer+800*1024;
  __mandreel_internal_preupdate(sp);
  heapU32[sp>>2] = elapsed;
  __draw(sp);
  __mandreel_internal_update(sp);
  __mandreel_process_async_calls();
 }
}

////////////////////////////////////////////
function mandreelAppMouseWheel(delta)
{
 if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
 {
  var i7 = MandreelLockFrame();
  heap32[(i7+0)>>2] = delta;
  __mouseWheelDelta(i7);
  MandreelUnlockFrame();
 }
}

////////////////////////////////////////////
function mandreelAppMouseMove(x,y)
{
 if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
 {
  var i7 = MandreelLockFrame();
  heap32[(i7+0)>>2] = x;
  heap32[(i7+4)>>2] = y;
  __mouseMove(i7);
  MandreelUnlockFrame();
 }
}

////////////////////////////////////////////
function mandreelAppResize(x,y)
{
 if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
 {
  var i7 = MandreelLockFrame();
  heap32[(i7+0)>>2] = x;
  heap32[(i7+4)>>2] = y;
  __resize(i7);
  heap32[(i7+0)>>2] = x;
  heap32[(i7+4)>>2] = y;
  __mandreel_internal_SetResolution(i7);
  MandreelUnlockFrame();
 }
}

////////////////////////////////////////////
function mandreelAppMouseButton(down,x,y)
{
 if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
 {
  var i7 = MandreelLockFrame();
  heap32[(i7+0)>>2] = down;
  heap32[(i7+4)>>2] = x;
  heap32[(i7+8)>>2] = y;
  __mouseButton(i7);
  MandreelUnlockFrame();
 }
}

////////////////////////////////////////////
function mandreelAppMouseDblClick(x,y)
{
 if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
 {
  var i7 = MandreelLockFrame();
  heap32[(i7+0)>>2] = x;
  heap32[(i7+4)>>2] = y;
  __mouseDoubleClick(i7);
  MandreelUnlockFrame();
 }
}

////////////////////////////////////////////
function mandreelAppKeyEvent(down,keyId)
{
 if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
 {
  var i7 = MandreelLockFrame();
  heap32[(i7+0)>>2] = down;
  heap32[(i7+4)>>2] = keyId;
  __keyEvent(i7);
  MandreelUnlockFrame();
 }
}

////////////////////////////////////////////
function mandreelAppGetPlatform()
{
 return mandreelAppPlatform;
}

////////////////////////////////////////////
function mandreelAppGetElementAbsolutePos(elementName)
{
 var element = Mandreel_document.getElementById(elementName);
 var res = new Object();
 res.x = 0; res.y = 0;
 if (element !== null)
 {
  if (element.getBoundingClientRect)
  {
   var viewportElement = Mandreel_document.documentElement;
   var box = element.getBoundingClientRect();
   var scrollLeft = viewportElement.scrollLeft;
   var scrollTop = viewportElement.scrollTop;
   res.x = box.left + scrollLeft;
   res.y = box.top + scrollTop;
  }
  else
  { //for old browsers
   res.x = element.offsetLeft;
   res.y = element.offsetTop;
   var parentNode = element.parentNode;
   var borderWidth = null;
   while (offsetParent != null)
   {
    res.x += offsetParent.offsetLeft;
    res.y += offsetParent.offsetTop;
    var parentTagName = offsetParent.tagName.toLowerCase();
    if ((__isIEOld && parentTagName != "table") ||
     ((__isFireFoxNew || __isChrome) &&
      parentTagName == "td"))
    {
     borderWidth = kGetBorderWidth(offsetParent);
     res.x += borderWidth.left;
     res.y += borderWidth.top;
    }

    if (offsetParent != Mandreel_document.body &&
    offsetParent != Mandreel_document.documentElement)
    {
     res.x -= offsetParent.scrollLeft;
     res.y -= offsetParent.scrollTop;
    }

    //next lines are necessary to fix the problem
    //with offsetParent
    if (!__isIE && !__isOperaOld || __isIENew)
    {
     while (offsetParent != parentNode &&
      parentNode !== null) {
      res.x -= parentNode.scrollLeft;
      res.y -= parentNode.scrollTop;
      if (__isFireFoxOld || __isWebKit)
      {
          borderWidth =
           kGetBorderWidth(parentNode);
          res.x += borderWidth.left;
          res.y += borderWidth.top;
      }
      parentNode = parentNode.parentNode;
     }
    }

    parentNode = offsetParent.parentNode;
    offsetParent = offsetParent.offsetParent;
   }
  }
 }
 return res;
}
function __getIEVersion()
{
 var rv = -1; // Return value assumes failure.
 if (navigator.appName == 'Microsoft Internet Explorer')
 {
  var ua = navigator.userAgent;
  var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
  if (re.exec(ua) != null)
   rv = parseFloat(RegExp.$1);
 }
 return rv;
}
function __getOperaVersion()
{
 var rv = 0; // Default value
 if (Mandreel_window.opera)
 {
  var sver = Mandreel_window.opera.version();
  rv = parseFloat(sver);
 }
 return rv;
}
/* The following code was removed for benchmarking:
var __userAgent = navigator.userAgent;
var __isIE =  navigator.appVersion.match(/MSIE/) != null;
var __IEVersion = __getIEVersion();
var __isIENew = __isIE && __IEVersion >= 8;
var __isIEOld = __isIE && !__isIENew;
var __isFireFox = __userAgent.match(/firefox/i) != null;
var __isFireFoxOld = __isFireFox && ((__userAgent.match(/firefox\/2./i) != null) || (__userAgent.match(/firefox\/1./i) != null));
var __isFireFoxNew = __isFireFox && !__isFireFoxOld;
var __isWebKit =  navigator.appVersion.match(/WebKit/) != null;
var __isChrome =  navigator.appVersion.match(/Chrome/) != null;
var __isOpera =  Mandreel_window.opera != null;
var __operaVersion = __getOperaVersion();
var __isOperaOld = __isOpera && (__operaVersion < 10); */

function __parseBorderWidth(width)
{
 var res = 0;
 if (typeof(width) == "string" && width != null && width != "" )
 {
  var p = width.indexOf("px");
  if (p >= 0)
  {
   res = parseInt(width.substring(0, p));
  }
  else
  {
   //do not know how to calculate other values (such as 0.5em or 0.1cm) correctly now so just set the width to 1 pixel
   res = 1;
  }
 }
 return res;
}
function __getBorderWidth(element)
{
 var res = new Object();
 res.left = 0; res.top = 0; res.right = 0; res.bottom = 0;
 if (Mandreel_window.getComputedStyle)
 {
  //for Firefox
  var elStyle = Mandreel_window.getComputedStyle(element, null);
  res.left = parseInt(elStyle.borderLeftWidth.slice(0, -2));
  res.top = parseInt(elStyle.borderTopWidth.slice(0, -2));
  res.right = parseInt(elStyle.borderRightWidth.slice(0, -2));
  res.bottom = parseInt(elStyle.borderBottomWidth.slice(0, -2));
 }
 else
 {
  //for other browsers
  res.left = __parseBorderWidth(element.style.borderLeftWidth);
  res.top = __parseBorderWidth(element.style.borderTopWidth);
  res.right = __parseBorderWidth(element.style.borderRightWidth);
  res.bottom = __parseBorderWidth(element.style.borderBottomWidth);
 }
 return res;
}


////////////////////////////////////////////
// WebGL
////////////////////////////////////////////
 var imandreel_gl = null;
 var imandreel_ctx_canvas = null;
 var imandreel_is_ready = 0;
 var imandreel_oldTime = Date_now();

 function mandreel_wheel(event) { imandreel_onMouseWheel(event);event.preventDefault(); event.returnValue=false; }

 ////////////////////////////////////////////
 function mandreelAppStartRenderWebGL()
 {
/* The following code was removed for benchmarking:
var canvas = document.getElementById(mandreelAppCanvasName);

mandreelAppCanvasWidth = canvas.width;
mandreelAppCanvasHeight = canvas.height;

// Register event handlers
if(window.addEventListener){ window.addEventListener('DOMMouseScroll',mandreel_wheel,false); }  window.onmousewheel=document.onmousewheel=mandreel_wheel;

window.addEventListener('mousedown',imandreel_onMouseDown,false);
window.addEventListener('mouseup',imandreel_onMouseUp,false);
window.addEventListener('mousemove',imandreel_onMouseMove,false);
window.addEventListener('dblclick',imandreel_onMouseDblClick,false);

document.body.oncontextmenu = function() { return false;};

var canvasDiv = document.getElementById(mandreelAppCanvasDiv);
canvasDiv.addEventListener('keydown',imandreel_onKeyDown,false);
canvasDiv.addEventListener('keyup',imandreel_onKeyUp,false);
canvasDiv.focus();*/


  // Call mandreel app init funtion (__init())
  mandreelAppInit();

  // Start rendering
  imandreel_is_ready = 1;
  //imandreel_render();
 }

 ////////////////////////////////////////////
 function imandreel_render()
 {
  if( ABORT )
   return;

  var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
  WebGLUtils.requestAnimationFrame(canvas, imandreel_render);


  // Reshape
  if (canvas.clientWidth != mandreelAppCanvasWidth || canvas.clientHeight != mandreelAppCanvasHeight)
  {
   mandreelAppCanvasWidth = canvas.clientWidth;
   mandreelAppCanvasHeight = canvas.clientHeight;
   imandreel_gl.viewport(0, 0, mandreelAppCanvasWidth, mandreelAppCanvasHeight);
  }

  // Set the focus to the canvas div
  if (mandreelAppForceFocus)
  {
   var canvasDiv = Mandreel_document.getElementById(mandreelAppCanvasDiv);
   canvasDiv.focus();
  }

  // Call mandreel app draw funtion (__draw())
  var nowTime = Date_now();
  if (!g_mandreel_frame_locked)
  {
   g_mandreel_frame_inframe = true;
   if (!_imandreel_pause_game)
    mandreelAppDraw(nowTime-imandreel_oldTime);
   g_mandreel_frame_inframe = false;
  }
  imandreel_oldTime = nowTime;
 }

 function render()
 {
  // Call mandreel app draw funtion (__draw())
  var nowTime = Date_now();
  if (!g_mandreel_frame_locked)
  {
   g_mandreel_frame_inframe = true;
   if (!_imandreel_pause_game)
    mandreelAppDraw(nowTime-imandreel_oldTime);
   g_mandreel_frame_inframe = false;
  }
  imandreel_oldTime = nowTime;
 }

 var imandreel_last_movex = 0;
 var imandreel_last_movey = 0;

 ////////////////////////////////////////////
 function imandreel_onMouseMove(e)
 {
  if (!imandreel_is_ready)
   return;

  if (_imandreel_pause_game)
   return;

  var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
  var setX = e.clientX - pos.x;
  var setY = e.clientY - pos.y;

    if(navigator.pointer && navigator.pointer.isLocked) {
            var deltaX = event.movementX || event.webkitMovementX || event.mozMovementX || 0;
            var deltaY = event.movementY || event.webkitMovementY || event.mozMovementX || 0;

   setX = imandreel_last_movex+deltaX;
   setY = imandreel_last_movey+deltaY;
   }


  imandreel_last_movex = setX;
  imandreel_last_movey = setY;
  mandreelAppMouseMove(setX,setY);
 }

 ////////////////////////////////////////////
 function imandreel_onMouseDblClick(e)
 {
  if (!imandreel_is_ready)
   return;

  if (_imandreel_pause_game)
   return;

  var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
  var setX = e.clientX - pos.x;
  var setY = e.clientY - pos.y;
  mandreelAppMouseDblClick(setX,setY);
 }

 ////////////////////////////////////////////
 var mandreel_mouse_down = false;
 var mandreel_rmouse_down = false;
 function imandreel_onMouseDown(e)
 {
  if (!imandreel_is_ready)
   return;

  if (_imandreel_pause_game)
   return;

  var rightclick;
  if (!e) var e = Mandreel_window.event;
  if (e.which) rightclick = (e.which == 3);
  else if (e.button) rightclick = (e.button == 2);

  var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
  var setX = e.clientX - pos.x;
  var setY = e.clientY - pos.y;

  if (!rightclick)
  {
   if (mandreel_mouse_down)
    return;

   mandreel_mouse_down = true;
   mandreelAppMouseButton(1,setX,setY);
  }
  else
  {
   if (mandreel_rmouse_down)
    return;

   mandreel_rmouse_down = true;
   mandreelAppMouseButton(3,setX,setY);
  }
 }

 ////////////////////////////////////////////
 function imandreel_onMouseUp(e)
 {
  if (!imandreel_is_ready)
   return;

  if (_imandreel_pause_game)
   return;

  var rightclick;
  if (!e) var e = Mandreel_window.event;
  if (e.which) rightclick = (e.which == 3);
  else if (e.button) rightclick = (e.button == 2);

  var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
  var setX = e.clientX - pos.x;
  var setY = e.clientY - pos.y;


  if (!rightclick)
  {
   if (mandreel_mouse_down == false)
    return;

   mandreel_mouse_down = false;
   mandreelAppMouseButton(0,setX,setY);
  }
  else
  {
   if (mandreel_rmouse_down == false)
    return;

   mandreel_rmouse_down = false;
   mandreelAppMouseButton(2,setX,setY);
  }
 }

 ////////////////////////////////////////////
 function imandreel_onMouseWheel(e)
 {
  if (!imandreel_is_ready)
   return;

  if (_imandreel_pause_game)
   return;

  mandreelAppMouseWheel(e.wheelDelta);
 }

 ////////////////////////////////////////////
 function imandreel_onKeyUp(e)
 {
  if (!imandreel_is_ready)
   return;

  if (_imandreel_pause_game)
   return;

  var KeyID = e.keyCode;
  mandreelAppKeyEvent(0,KeyID);
 }

 ////////////////////////////////////////////
 Mandreel_window.onkeydown = function(e)
 {
  if (mandreelDisableSpaceKey == false && e.keyCode == 32)
   return;
  return !(e.keyCode == 32 || e.keyCode == 9);
 };

 ////////////////////////////////////////////
 function imandreel_onKeyDown(e)
 {
  if (e.which === 8) // disable back button on browser
        {
         e.preventDefault();
     }
  if (!imandreel_is_ready)
   return;

  if (_imandreel_pause_game)
   return;

  var KeyID = e.keyCode;
  mandreelAppKeyEvent(1,KeyID);
 }


////////////////////////////////////////////
// Flash
////////////////////////////////////////////

(function(){
  try {
   // Disabling SWFObject's Autohide feature
   if (typeof swfobject.switchOffAutoHideShow === "function") {
    swfobject.switchOffAutoHideShow();
   }
  } catch(e) {}
 })();

var imandreel_flash_global_sp = 0;
var imandreel_flash_global_sp2 = 0;
var imandreel_flash_current_sp = 0;

function MandreelInterSwfLoaded2()
{
}
function MandreelInterSwfLoaded()
{
 appStartState('scriptLoaded');
 var flashMovie = swfobject.getObjectById(mandreelAppCanvasDiv)
 dump(flashMovie.width);
 flashMovie.MandreelInit();

 imandreel_flash_global_sp = MandreelInterGetSWF().MandreelInterGetGlobalStack();
 imandreel_flash_global_sp2 = MandreelInterGetSWF().MandreelInterGetGlobalStack2();
 if ( mandreelAppStartStateFunc )
  mandreelAppStartStateFunc("ready",mandreelAppCanvasWidth,mandreelAppCanvasHeight);
}



var g_mandreel_swf = null;

function MandreelInterGetSWF()
{
 if (g_mandreel_swf)
  return g_mandreel_swf;

 g_mandreel_swf = swfobject.getObjectById(mandreelAppCanvasDiv)
 return g_mandreel_swf;
}

function MandreelInterWriteInt(ptr, value)
{
 MandreelInterGetSWF().MandreelInterWriteInt(ptr,value);
}

function MandreelInterWriteFloat(ptr, value)
{
 MandreelInterGetSWF().MandreelInterWriteFloat(ptr,value);
}

function MandreelInterWriteString(ptr, value)
{
 MandreelInterGetSWF().MandreelInterWriteString(ptr,value);
}

function MandreelInterWriteWString(ptr, value)
{
 MandreelInterGetSWF().MandreelInterWriteWString(ptr,value);
}

function MandreelInterCallFunctionRaw(sp, func_name, returnType)
{
 return MandreelInterGetSWF().MandreelInterCallFunctionRaw(sp,func_name,returnType);
}


function assert(condition, _text) {
//console.assert(condition, _text);
    if (!condition) {
      var text = "Assertion failed: " + _text;
      alert(text + ':\n' + (new Error).stack);
      ABORT = true;
      throw "Assertion: " + text;
    }
  }



function MandreelLockFrame()
{
 MandreelInterGetSWF().MandreelLockFrame();

 imandreel_flash_current_sp += 300*1024;

 assert(imandreel_flash_current_sp<1024*1024);

 return imandreel_flash_current_sp;
}

function MandreelPause()
{
 MandreelInterGetSWF().MandreelPause();
}

function MandreelResume()
{
 MandreelInterGetSWF().MandreelResume();
}


function MandreelUnlockFrame()
{
 imandreel_flash_current_sp -= 300*1024;
 MandreelInterGetSWF().MandreelUnlockFrame();
}



function MandreelInterCallFunctionAsync(func_name,param)
{
 return MandreelInterGetSWF().MandreelInterCallFunctionAsync(func_name, param);
}


function MandreelInterCallFunction(returnType,func_name)
{
 var size_params = 0;

 var i;
 var num_params = (arguments.length-2)/2;
 num_params|=0;
 for (i=2;i<num_params*2+2;i+=2)
 {
  var type = arguments[i];

  var size_arg = 0;
  switch(type)
  {
   case 'int':
    size_arg = 4;
    break;
   case 'float':
    size_arg = 4;
    break;
   case 'string':
    size_arg = 4;
    size_arg += ((arguments[i+1].length + 4) & 0xfffffffc);
    break;
   case 'wstring':
    size_arg = 4;
    size_arg += ((arguments[i+1].length*2 + 4) & 0xfffffffc);
    break;
   default:
    assert(false);
  }

  size_params += size_arg;
 }

 // stack always 8 byte aligned
 size_params=((size_params+7)& 0xfffffff8);

 var sp = 0;

 if (i<(arguments.length))
  sp = arguments[i];
 else
 {
  assert(false);
 }


 sp-=size_params;

 MandreelLockFrame();

 var offset = 0;
 var ptr_data = num_params*4+sp;
    for (i=2;i<num_params*2+2;i+=2)
 {
  var type = arguments[i];


  var size_arg = 0;
  switch(type)
  {
   case 'int':
    MandreelInterWriteInt((sp+offset),arguments[i+1]);
    break;
   case 'float':
    MandreelInterWriteFloat((sp+offset),arguments[i+1]);
    break;
   case 'string':
    {
     MandreelInterWriteInt((sp+offset),ptr_data);
     var string = arguments[i+1];
     MandreelInterWriteString(ptr_data,string);

     ptr_data += ((string.length + 4) & 0xfffffffc);
    }
    break;
   case 'wstring':
    {
     MandreelInterWriteInt((sp+offset),ptr_data);
     var string = arguments[i+1];
     MandreelInterWriteWString(ptr_data,string);

     ptr_data += ((string.length*2 + 4) & 0xfffffffc);
    }
    break;
   default:
    assert(false);
  }
  offset+=4;
 }

 return_value = MandreelInterCallFunctionRaw(sp, func_name, returnType);

 MandreelUnlockFrame();

 if (returnType == 'int')
  return parseInt(return_value);
 else if (returnType == 'float')
  return parseFloat(return_value);

 return;
}



// file system

var g_mandreel_timestamp_fs = 0;
var g_mandreel_fs = null;

function onMandreelQuotaOk(fs)
{
 g_mandreel_fs = fs;
 dump('onMandreelQuotaOk');
}


function MandreelFsErrorHandler(e) {
  var msg = '';

  switch (e.code) {
    case FileError.QUOTA_EXCEEDED_ERR:
      msg = 'QUOTA_EXCEEDED_ERR';
      break;
    case FileError.NOT_FOUND_ERR:
      msg = 'NOT_FOUND_ERR';
      break;
    case FileError.SECURITY_ERR:
      msg = 'SECURITY_ERR';
      break;
    case FileError.INVALID_MODIFICATION_ERR:
      msg = 'INVALID_MODIFICATION_ERR';
      break;
    case FileError.INVALID_STATE_ERR:
      msg = 'INVALID_STATE_ERR';
      break;
    default:
      msg = 'Unknown Error';
      break;
  };

  dump('Error: ' + msg);
  dump(e);
}

var indexedDB = Mandreel_window.indexedDB || Mandreel_window.webkitIndexedDB ||
                Mandreel_window.mozIndexedDB;

if ('webkitIndexedDB' in Mandreel_window) {
  Mandreel_window.IDBTransaction = Mandreel_window.webkitIDBTransaction;
  Mandreel_window.IDBKeyRange = Mandreel_window.webkitIDBKeyRange;
}


var mandreel_indexedDB = {};
mandreel_indexedDB.db = null;
mandreel_indexedDB.callback_init = false;

mandreel_indexedDB.onerror = function(e) {
  dump(e);
};

mandreel_indexedDB.init = function(callback)
{
 try {
 var request = indexedDB.open('my_cache', 2);

 request.onerror = function(event) {
  callback(false);
  };
 request.onupgradeneeded = function(event) {
 dump('onupgradeneeded\n');
 mandreel_indexedDB.db = event.target.result;
    var db = mandreel_indexedDB.db;
 var objectStore = db.createObjectStore("cache",{keyPath: "fileName"});
 }

  request.onsuccess = function(event) {
  dump('onsuccess\n');
    mandreel_indexedDB.db = event.target.result;
     callback(true);

  };
  }
  catch(e)
  {
 callback(false);
  }

}

function mandreel_fs_init(callback, size_bytes, url_time)
{

 g_mandreel_timestamp_fs = 99999999999999;




 var aux = null;
 try { aux = webkitStorageInfo; } catch(err) { aux = null; }
 if (aux == null)
 {
  //callback(false);

  var time_request = new XMLHttpRequest();
 time_request.open('GET',url_time);
 time_request.onreadystatechange = function()
 {
  if (time_request.readyState==4)
  {
   if (time_request.status==200 || time_request.status==0)
   {

    if (time_request.responseText)
    {
     g_mandreel_timestamp_fs = parseFloat(time_request.responseText);
     dump('mandreel_init_fs time ' + g_mandreel_timestamp_fs);
    }
   }

   mandreel_indexedDB.init(callback);
  }
 }
 time_request.send();


  return;
 }

 webkitStorageInfo.requestQuota(
  webkitStorageInfo.PERSISTENT ,   // or PERSISTENT
  size_bytes,
  function(bytes) {  dump('request quota succeed');},
  function () { dump('request quota failed');} );


// g_mandreel_timestamp_fs =0;

 var time_request = new XMLHttpRequest();
 time_request.open('GET',url_time);
 time_request.onreadystatechange = function()
 {
  if (time_request.readyState==4)
  {
   if (time_request.status==200 || time_request.status==0)
   {

    if (time_request.responseText)
    {
     g_mandreel_timestamp_fs = parseFloat(time_request.responseText);
     dump('mandreel_init_fs time ' + g_mandreel_timestamp_fs);
    }
   }

   var my_requestFileSystem  = Mandreel_window.requestFileSystem || Mandreel_window.webkitRequestFileSystem;

   my_requestFileSystem(Mandreel_window.PERSISTENT, size_bytes,
    function(result)
    {
     onMandreelQuotaOk(result);


     if (callback)
      Mandreel_setTimeout(callback, 100, true);
    } , function(e) { MandreelFsErrorHandler(e); if (callback) callback(false); } );
  }
 }
 time_request.send();
}


mandreel_indexedDB.load = function(file_name, callback)
{
 var db = mandreel_indexedDB.db;
 var trans = db.transaction(["cache"]);
 var store = trans.objectStore("cache");

 var key = file_name;

  var getReq = store.get(key);
    getReq.onsuccess = function (ev) {
   if (getReq.result)
 {
 dump('chanka ' + g_mandreel_timestamp_fs + ' ' + getReq.result.timeStamp + '\n');
    if (getReq.result.timeStamp>=g_mandreel_timestamp_fs)
     callback(getReq.result.data);
    else
     callback(null);
   }
   else
    callback(null);
    }
    getReq.onerror = function (ev) {
     console.log("index.get failed. Error: " + ev.message);
    }
}

function mandreel_fs_get_url(file_name, callback)
{
 if (mandreel_indexedDB.db)
 {
  callback(null);
  return;
 }


 if (g_mandreel_fs == null)
 {
  callback(null);
  return;
 }

 g_mandreel_fs.root.getFile(file_name, {}, function(fileEntry) {

 fileEntry.getMetadata(function(metaData){
 var my_seconds = metaData.modificationTime.getTime()/1000;

 if (g_mandreel_timestamp_fs>my_seconds)
 {
  callback(null);
 }
 else
 {
  //alert('mandreel_fscachefile2');


  if (Mandreel_window.localStorage.getItem(mandreel_fs_get_key(file_name)) != null)
   callback(fileEntry.toURL());
  else
   callback(null);

 }


  }, MandreelFsErrorHandler);


  }, function(error) {callback(null);});

  return;

}

function mandreel_fs_load_binary(file_name, callback)
 {
 if (mandreel_indexedDB.db)
 {
  mandreel_indexedDB.load(file_name,callback);
  return;
 }


 if (g_mandreel_fs == null)
 {
  callback(null);
  return;
 }


 g_mandreel_fs.root.getFile(file_name, {}, function(fileEntry) {

 fileEntry.getMetadata(function(metaData){
 var my_seconds = metaData.modificationTime.getTime()/1000;

 if (g_mandreel_timestamp_fs>my_seconds)
 {
  dump('mandreel_fscachefile1');
  Mandreel_window.localStorage.removeItem(mandreel_fs_get_key(file_name));
  fileEntry.remove(function() {
    callback(null);
   }, MandreelFsErrorHandler);

 }
 else
 {
  //alert('mandreel_fscachefile2');
  dump('mandreel_fscachefile2 ' + my_seconds);

  fileEntry.file(function(file) {

    var reader = new FileReader();


      reader.onloadend = function(e) {

       if (this.result.byteLength && Mandreel_window.localStorage.getItem(mandreel_fs_get_key(file_name)) != null)
       {
      dump('mandreel_fs_loadFile ' + file_name);
      callback(this.result);
     }
     else
      callback(null);

      };


     reader.readAsArrayBuffer(file);


   }, MandreelFsErrorHandler);

 }


  }, MandreelFsErrorHandler);


  }, function(error) {dump('mandreel_fscachefile3'); callback(null);});

  return;
 }


 mandreel_indexedDB.save = function(file_name, data)
{
 var db = mandreel_indexedDB.db;


  var trans = db.transaction(["cache"], IDBTransaction.READ_WRITE);
  var store = trans.objectStore("cache");
  var request = store.put({
    "data": data,
 "timeStamp" : Date_now()/1000,
    "fileName" : file_name
  });

  request.onsuccess = function(e) {
    // Re-render all the todo's
   // html5rocks.indexedDB.getAllTodoItems();
   dump('mandreel_indexedDB.save ok ');
  };

  request.onerror = function(e) {
    dump('mandreel_indexedDB.save onerror ' + file_name);
 dump(e);
  };
}

function mandreel_fs_get_key(name)
{
 return 'mandreel_fs_' + name;
}

function mandreel_is_filesystem()
{
 if (mandreel_indexedDB.db)
  return false;

 if (!g_mandreel_fs)
  return false;

 return true;
}

function mandreel_is_indexeddb()
{
 if (mandreel_indexedDB.db)
  return true;

 return false;
}

 function mandreel_fs_saveFile(name, my_arrayBuffer)
{
 if (mandreel_indexedDB.db)
 {
  mandreel_indexedDB.save(name,my_arrayBuffer);
  return;
 }

 if (!g_mandreel_fs)
  return;

 Mandreel_window.localStorage.removeItem(mandreel_fs_get_key(name));
 g_mandreel_fs.root.getFile(name, {create: true}, function(fileEntry) {

    // Create a FileWriter object for our FileEntry (log.txt).
    fileEntry.createWriter(function(fileWriter) {

      fileWriter.onwriteend = function(e) {
  Mandreel_window.localStorage.setItem(mandreel_fs_get_key(name),'valid');
        dump('Write completed.');
      };

      fileWriter.onerror = function(e) {
        dump('Write failed: ' + e.toString());
      };

   var my_BlobBuilder = Mandreel_window.MozBlobBuilder || Mandreel_window.WebKitBlobBuilder || Mandreel_window.BlobBuilder;

   var bb = new my_BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12.
      bb.append(my_arrayBuffer);
      fileWriter.write(bb.getBlob('text/plain'));



    }, MandreelFsErrorHandler);

  }, MandreelFsErrorHandler);
}


function mandreel_fs_load_text(file_name, callback)
 {

 if (mandreel_indexedDB.db)
 {
  mandreel_indexedDB.load(file_name,callback);
  return;
 }

 if (g_mandreel_fs == null)
 {
  callback(null);
  return;
 }


 g_mandreel_fs.root.getFile(file_name, {}, function(fileEntry) {

 fileEntry.getMetadata(function(metaData){
 var my_seconds = metaData.modificationTime.getTime()/1000;

 if (g_mandreel_timestamp_fs>my_seconds)
 {
  dump('mandreel_fscachefile1');
  Mandreel_window.localStorage.removeItem(mandreel_fs_get_key(file_name));
  fileEntry.remove(function() {
    callback(null);
   }, MandreelFsErrorHandler);

 }
 else
 {
  //alert('mandreel_fscachefile2');
  dump('mandreel_fscachefile2 ' + my_seconds);

  fileEntry.file(function(file) {

    var reader = new FileReader();


      reader.onloadend = function(e) {


       if (this.result.length && Mandreel_window.localStorage.getItem(mandreel_fs_get_key(file_name)) != null)
       {
      dump('mandreel_fs_loadFile ' + file_name);
      callback(this.result);
     }
     else
      callback(null);

      };


     reader.readAsText(file);


   }, MandreelFsErrorHandler);

 }


  }, MandreelFsErrorHandler);


--> --------------------

--> maximum size reached

--> --------------------

Messung V0.5
C=94 H=94 G=93

¤ Dauer der Verarbeitung: 0.15 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.