text: ImporterViewer = function ()
  {
  	this.viewer = null;
  	this.jsonData = null;
  };
  
  ImporterViewer.prototype.Init = function (canvasName)
  {
  	var viewerSettings = {
  		cameraEyePosition : [8.0, -6.0, 4.0],
  		cameraCenterPosition : [0.0, 0.0, 0.0],
  		cameraUpVector : [0, 0, 1]
  	};
  
  	this.viewer = new JSM.ThreeViewer ();
  	var canvas = document.getElementById (canvasName);
  	if (!this.viewer.Start (canvas, viewerSettings)) {
  		return false;
  	}
  	this.viewer.navigation.SetNearDistanceLimit (0.1);
  	this.viewer.navigation.SetFarDistanceLimit (100000.0);
  	this.viewer.SetClearColor (0xdddddd);
  	this.viewer.Draw ();
  	
  	return true;
  };
  
  ImporterViewer.prototype.GetJsonData = function ()
  {
  	return this.jsonData;
  };
  
  ImporterViewer.prototype.SetJsonData = function (jsonData)
  {
  	this.jsonData = jsonData;
  };
  
  ImporterViewer.prototype.RemoveMeshes = function ()
  {
  	this.viewer.RemoveMeshes ();
  };
  
  ImporterViewer.prototype.ShowAllMeshes = function (inEnvironment)
  {
  	this.RemoveMeshes ();
  	
  	var myThis = this;
  	var currentMeshIndex = 0;
  	var environment = {
  		onStart : function (taskCount/*, meshes*/) {
  			inEnvironment.onStart (taskCount);
  			myThis.viewer.EnableDraw (false);
  		},
  		onProgress : function (currentTask, meshes) {
  			while (currentMeshIndex < meshes.length) {
  				myThis.viewer.AddMesh (meshes[currentMeshIndex]);
  				currentMeshIndex = currentMeshIndex + 1;
  			}
  			inEnvironment.onProgress (currentTask);
  		},
  		onFinish : function (meshes) {
  			myThis.AdjustClippingPlanes (50.0);
  			myThis.FitInWindow ();
  			myThis.viewer.EnableDraw (true);
  			myThis.viewer.Draw ();
  			inEnvironment.onFinish (meshes);
  		}
  	};
  	
  	JSM.ConvertJSONDataToThreeMeshes (this.jsonData, this.Draw.bind (this), environment);
  };
  
  ImporterViewer.prototype.ShowMesh = function (index)
  {
  	var myThis = this;
  	this.viewer.scene.traverse (function (current) {
  		if (current instanceof THREE.Mesh) {
  			if (current.originalJsonIndex == index) {
  				myThis.viewer.ShowMesh (current);
  			}
  		}
  	});
  	this.viewer.Draw ();
  };
  
  ImporterViewer.prototype.HideMesh = function (index)
  {
  	var myThis = this;
  	this.viewer.scene.traverse (function (current) {
  		if (current instanceof THREE.Mesh) {
  			if (current.originalJsonIndex == index) {
  				myThis.viewer.HideMesh (current);
  			}
  		}
  	});
  	this.viewer.Draw ();
  };
  
  ImporterViewer.prototype.FitInWindow = function ()
  {
  	this.viewer.FitInWindow ();
  };
  
  ImporterViewer.prototype.FitMeshInWindow = function (index)
  {
  	var meshes = [];
  	this.viewer.scene.traverse (function (current) {
  		if (current instanceof THREE.Mesh) {
  			if (current.originalJsonIndex == index) {
  				meshes.push (current);
  			}
  		}
  	});
  	this.viewer.FitMeshesInWindow (meshes);
  };
  
  ImporterViewer.prototype.AdjustClippingPlanes = function ()
  {
  	if (this.viewer.MeshCount () > 0) {
  		this.viewer.AdjustClippingPlanes (50.0);
  	}
  };
  
  ImporterViewer.prototype.SetFixUp = function ()
  {
  	this.viewer.navigation.EnableFixUp (!this.viewer.navigation.cameraFixUp);
  };
  
  ImporterViewer.prototype.SetNamedView = function (viewName)
  {
  	var eye, center, up;
  	if (viewName == 'z') {
  		eye = new JSM.Coord (1.0, 0.0, 0.0);
  		center = new JSM.Coord (0.0, 0.0, 0.0);
  		up = new JSM.Coord (0.0, 0.0, 1.0);
  	} else if (viewName == '-z') {
  		eye = new JSM.Coord (-1.0, 0.0, 0.0);
  		center = new JSM.Coord (0.0, 0.0, 0.0);
  		up = new JSM.Coord (0.0, 0.0, -1.0);
  	} else if (viewName == 'y') {
  		eye = new JSM.Coord (1.0, 0.0, 0.0);
  		center = new JSM.Coord (0.0, 0.0, 0.0);
  		up = new JSM.Coord (0.0, 1.0, 0.0);
  	} else if (viewName == '-y') {
  		eye = new JSM.Coord (-1.0, 0.0, 0.0);
  		center = new JSM.Coord (0.0, 0.0, 0.0);
  		up = new JSM.Coord (0.0, -1.0, 0.0);
  	} else if (viewName == 'x') {
  		eye = new JSM.Coord (0.0, 1.0, 0.0);
  		center = new JSM.Coord (0.0, 0.0, 0.0);
  		up = new JSM.Coord (1.0, 0.0, 0.0);
  	} else if (viewName == '-x') {
  		eye = new JSM.Coord (0.0, -1.0, 0.0);
  		center = new JSM.Coord (0.0, 0.0, 0.0);
  		up = new JSM.Coord (-1.0, 0.0, 0.0);
  	} else {
  		return;
  	}
  
  	this.viewer.cameraMove.Set (eye, center, up);
  	this.viewer.FitInWindow ();
  };
  
  ImporterViewer.prototype.Draw = function ()
  {
  	this.viewer.Draw ();
  };
  