/* <copyright>
This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
(c) Copyright 2011 Motorola Mobility, Inc.  All Rights Reserved.
</copyright> */

////////////////////////////////////////////////////////////////////////
//
var Montage = 			require("montage/core/core").Montage,
	Component = 		require("montage/ui/component").Component,
    MaterialsModel = 	require("js/models/materials-model").MaterialsModel,
    NJUtils = 			require("js/lib/NJUtils").NJUtils,
	GLWorld =			require("js/lib/drawing/world").World;
////////////////////////////////////////////////////////////////////////
//	
exports.webGlDocumentHelper = Montage.create(Component, {
	////////////////////////////////////////////////////////////////////
	//
	hasTemplate: {
        value: false
    },
    ////////////////////////////////////////////////////////////////////
	//This is set when the design view is ready, for local reference
	iframe: {
        value: null
    },
    ////////////////////////////////////////////////////////////////////
	//
    _glData: {
    	value: null
    },
    ////////////////////////////////////////////////////////////////////
	//
    glData: {
    	//
    	get: function() {
    		//
			var elt = this.iframe.contentWindow.document.body;
			//
			if (elt) {
				var matLib = MaterialsModel.exportMaterials();
				this._glData = [matLib];
				this.collectGLData(this.iframe.contentWindow.document, this._glData );
			} else {
				this._glData = null
			}
			//	
			return this._glData;
		},
		//
        set: function(value) {
        	//
        	var elt = this.iframe.contentWindow.document.body;
			//
			if (elt) {
				/*
				// Use this code to test the runtime version of WebGL
				var cdm = new NinjaCvsRt.CanvasDataManager();
				cdm.loadGLData(elt,  value,  null );
				*/

				//
				var i, nWorlds= value.length;
				//
				for (i = 0;  i < nWorlds;  i++) {
					// get the data for the next canvas
					var importStr = value[i], id, jObj, index = importStr.indexOf(';'), matLibStr, matLibObj, startIndex, endIndex, canvas, useWebGL, world;
					// determine if it is the new (JSON) or old style format
					if ((importStr[0] === 'v') && (index < 24)) {
						// JSON format.  pull off the
						importStr = importStr.substr(index+1);
						jObj = JSON.parse(importStr);
						id = jObj.id;
					} else {
                        // at this point the data could be either the materials library or
                        // an old style world.  We can determine which by converting the string
                        // to an object via JSON.parse.  That operation will fail if the string
                        // is an old style world.
                        matLibStr = 'materialLibrary;';
                        index = importStr.indexOf(matLibStr);
                        if (index == 0) {
                            importStr = importStr.substr(matLibStr.length);
                            matLibObj = JSON.parse(importStr);
                            MaterialsModel.importMaterials(matLibObj);
                        } else {
						    startIndex = importStr.indexOf("id: ");
						    if (startIndex >= 0) {
							    endIndex = importStr.indexOf("\n", startIndex);
							    if (endIndex > 0) id = importStr.substring(startIndex+4, endIndex);
						    }
                        }
					}
					//
					if (id != null) {
						//
						canvas = this.findCanvasWithID(id, elt);
						//
						if (canvas) {
							//
							if (canvas.elementModel) {
								if (canvas.elementModel.shapeModel.GLWorld) {
									canvas.elementModel.shapeModel.GLWorld.clearTree();
								}
								//
								if (jObj) {
									useWebGL = jObj.webGL;
									world = new GLWorld(canvas, useWebGL);
									world.importJSON(jObj);
								}
								//
								this.buildShapeModel(canvas.elementModel, world);
							}
						}
					}
				}
			}
		}
    },
    ////////////////////////////////////////////////////////////////////
	//
    findCanvasWithID:  {
		value: function(id, elt)  {
			//
			var i, child, nKids, foundElt, cid = elt.getAttribute("data-RDGE-id");
			//
			if (cid == id)  return elt;
			//
			if (elt.children) {
				nKids = elt.children.length;
				for (i=0;  i<nKids;  i++) {
					child = elt.children[i];
					foundElt = this.findCanvasWithID( id, child );
					if (foundElt)  return foundElt;
				}
			}
		}
	},
    ////////////////////////////////////////////////////////////////////
	//
    buildShapeModel: {
    	value: function(elementModel, world) {
    		//
            var shapeModel = elementModel.shapeModel, root;
			shapeModel.shapeCount	= 1;	// for now...
			shapeModel.useWebGl		= world._useWebGL;
			shapeModel.GLWorld		= world;
			//
			root = world.getGeomRoot();
			//
			if (root) {
				shapeModel.GLGeomObj			= root;
				shapeModel.strokeSize			= root._strokeWidth;
				shapeModel.strokeStyle			= "solid";
				//shapeModel.strokeStyleIndex
				switch (root.geomType()) {
					case root.GEOM_TYPE_RECTANGLE:
                        elementModel.selection = "Rectangle";
                        elementModel.pi = "RectanglePi";
						shapeModel.tlRadius = root._tlRadius;
						shapeModel.trRadius = root._trRadius;
						shapeModel.blRadius = root._blRadius;
						shapeModel.brRadius = root._brRadius;
						break;
					case root.GEOM_TYPE_CIRCLE:
                        elementModel.selection = "Oval";
                        elementModel.pi = "OvalPi";
						shapeModel.innerRadius = root._innerRadius;
						break;
					case root.GEOM_TYPE_LINE:
                        elementModel.selection = "Line";
                        elementModel.pi = "LinePi";
						shapeModel.slope = root._slope;
						break;
                    case root.GEOM_TYPE_BRUSH_STROKE:
                        elementModel.selection = "BrushStroke";
                        elementModel.pi = "BrushStrokePi";
						break;
                    case root.GEOM_TYPE_CUBIC_BEZIER:
                        elementModel.selection = "Subpath";
                        elementModel.pi = "SubpathPi";
                        break;
					default:
						console.log("geometry type not supported for file I/O, " + root.geomType());
						break;
				}
			}
		}
	},
	////////////////////////////////////////////////////////////////////
	//
	collectGLData: {
		value: function( elt,  dataArray ) {
            Array.prototype.slice.call(elt.querySelectorAll('[data-RDGE-id]'),0).forEach(function(glCanvas) {
                dataArray.push(glCanvas.elementModel.shapeModel.GLWorld.exportJSON());
            });

            // Removing the old loop that went through all the elements.
            // TODO: Remove the following code once QE has tested it.
/*
			//
			var i, data, nKids, child;
			//
			if (elt.elementModel && elt.elementModel.shapeModel && elt.elementModel.shapeModel.GLWorld) {
				data = elt.elementModel.shapeModel.GLWorld.exportJSON();
				dataArray.push(data);
			}
			//
			if (elt.children) {
				nKids = elt.children.length;
				for (i=0;  i<nKids;  i++) {
					child = elt.children[i];
					this.collectGLData( child, dataArray );
				}
			}
			*/
		}
	}
	////////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////////
});
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////