From 7433f0bfbc3a7ea44320550ed2c1d90dc5e6f170 Mon Sep 17 00:00:00 2001 From: John Mayhew Date: Tue, 3 Apr 2012 16:27:01 -0700 Subject: Removed the dependence on an "assets" directory for the RDGE runtime. Now Ninja does not need to create duplicate files when it sets up the users Ninja Projects directory for RDGE support. --- assets/canvas-runtime.js | 38 +- assets/rdge-compiled.js | 12 +- js/document/html-document.js | 6 +- js/helper-classes/RDGE/rdge-compiled.js | 12 +- js/helper-classes/RDGE/src/core/script/engine.js | 174 ++-- js/helper-classes/RDGE/src/core/script/jshader.js | 6 +- js/io/system/ninjalibrary.json | 2 +- js/mediators/io-mediator.js | 1094 ++++++++++----------- 8 files changed, 659 insertions(+), 685 deletions(-) diff --git a/assets/canvas-runtime.js b/assets/canvas-runtime.js index 6278fdac..a35f473d 100644 --- a/assets/canvas-runtime.js +++ b/assets/canvas-runtime.js @@ -104,6 +104,7 @@ NinjaCvsRt.GLRuntime = function ( canvas, jObj, assetPath ) this._initialized = false; this._useWebGL = false; + this._assetPath = undefined; // view parameters this._fov = 45.0; @@ -120,13 +121,17 @@ NinjaCvsRt.GLRuntime = function ( canvas, jObj, assetPath ) // all "live" materials this._materials = []; - // provide the mapping for the asset directory - if (assetPath) - { - this._assetPath = assetPath.slice(); - if (this._assetPath[this._assetPath.length-1] != '/') - this._assetPath += '/'; - } + // provide the mapping for the asset directory + if (assetPath) + { + this._assetPath = assetPath.slice(); + if (this._assetPath[this._assetPath.length-1] != '/') + this._assetPath += '/'; + } + + if(this._assetPath !== undefined) { + RDGE.globals.engine.setAssetPath(this._assetPath); + } /////////////////////////////////////////////////////////////////////// // accessors @@ -366,21 +371,6 @@ NinjaCvsRt.GLRuntime = function ( canvas, jObj, assetPath ) } }; - this.remapAssetFolder = function( url ) - { -// var searchStr = "assets/"; -// var index = url.indexOf( searchStr ); -// var rtnPath = url; -// if (index >= 0) -// { -// rtnPath = url.substr( index + searchStr.length ); -// rtnPath = this._assetPath + rtnPath; -// } -// return rtnPath; - - return url; - }; - this.findMaterialNode = function( nodeName, node ) { if (node.transformNode) @@ -1257,7 +1247,6 @@ NinjaCvsRt.RuntimePulseMaterial = function () technique.u_resolution.set( res ); var wrap = 'REPEAT', mips = true; - this._texMap = world.remapAssetFolder( this._texMap ); var tex = renderer.getTextureByName(this._texMap, wrap, mips ); if (tex) technique.u_tex0.set( tex ); @@ -1399,19 +1388,16 @@ NinjaCvsRt.RuntimeBumpMetalMaterial = function () var wrap = 'REPEAT', mips = true; if (this._diffuseTexture) { - this._diffuseTexture = world.remapAssetFolder( this._diffuseTexture ); tex = renderer.getTextureByName(this._diffuseTexture, wrap, mips ); if (tex) technique.u_colMap.set( tex ); } if (this._normalTexture) { - this._normalTexture = world.remapAssetFolder( this._normalTexture ); tex = renderer.getTextureByName(this._normalTexture, wrap, mips ); if (tex) technique.u_normalMap.set( tex ); } if (this._specularTexture) { - this._specularTexture = world.remapAssetFolder( this._specularTexture ); tex = renderer.getTextureByName(this._specularTexture, wrap, mips ); technique.u_glowMap.set( tex ); } diff --git a/assets/rdge-compiled.js b/assets/rdge-compiled.js index 66bf5a42..0bbcb05b 100755 --- a/assets/rdge-compiled.js +++ b/assets/rdge-compiled.js @@ -107,11 +107,11 @@ t);this.def[t]=null;break}for(var n in RDGE.rdgeGlobalParameters){l=new globalPa 0,o;for(o in RDGE.globals.engine.lightManager.lightUniforms[m]){loc=this.ctx.getUniformLocation(h,o);if(loc!=null){this[t].passes[g].lightParams[m]||(this[t].passes[g].lightParams[m]=[]);this[t].passes[g].lightParams[m].push({loc:loc,name:o,dataIndex:p})}p++}}for(n in d[g].params)if(typeof d[g].params[n]!="string"){l=new paramType(this.ctx,n,d[g].params,h,t);this[t].passes[g].params[n]=l;this[t][n]=l}for(n in d[g].params)typeof d[g].params[n]=="string"&&(this[t][n]=this[t].passes[g].params[n]);g++}}for(t in a){f= this[t].passes.length;for(g=0;g");var c=this.def.shaders[a.vshader],d=this.def.shaders[a.fshader];this.ctx.useProgram(null);var f=null,g=null;if(c.indexOf("{")!=-1)g=c;else{g=new XMLHttpRequest;g.open("GET",c,false);g.send(null);g=g.responseText}f=this.buildShader(this.ctx.VERTEX_SHADER,g);g=null;if(c.indexOf("{")!=-1)g=d;else{g=new XMLHttpRequest;g.open("GET",d,false);g.send(null);g=g.responseText}g=this.buildShader(this.ctx.FRAGMENT_SHADER, -g);if(!f||!g)return null;this.compiledShaders[a.vshader]=f;this.compiledShaders[a.fshader]=g;c=this.ctx.createProgram();if(!c)return null;this.ctx.attachShader(c,f);this.ctx.attachShader(c,g);d=0;a.attribPairs=[];for(var h in a.attributes){a.attribPairs.push({loc:d,name:h});this.ctx.bindAttribLocation(c,d++,h)}this.ctx.linkProgram(c);if(!this.ctx.getProgramParameter(c,this.ctx.LINK_STATUS)){a=this.ctx.getProgramInfoLog(c);window.console.log("Error in program linking:"+a);this.ctx.deleteProgram(c); -this.ctx.deleteProgram(g);this.ctx.deleteProgram(f);return null}return c};this.setLightContext=function(a){for(t in this.technique)for(var c=this.technique.passes.length,d=0;d");var c=RDGE.globals.engine.remapAssetFolder(this.def.shaders[a.vshader]),d=RDGE.globals.engine.remapAssetFolder(this.def.shaders[a.fshader]);this.ctx.useProgram(null);var f=null,g=null;if(c.indexOf("{")!=-1)g=c;else{g=new XMLHttpRequest;g.open("GET",c,false);g.send(null);g=g.responseText}f=this.buildShader(this.ctx.VERTEX_SHADER,g);g=null;if(c.indexOf("{")!=-1)g=d;else{g=new XMLHttpRequest;g.open("GET", +d,false);g.send(null);g=g.responseText}g=this.buildShader(this.ctx.FRAGMENT_SHADER,g);if(!f||!g)return null;this.compiledShaders[a.vshader]=f;this.compiledShaders[a.fshader]=g;c=this.ctx.createProgram();if(!c)return null;this.ctx.attachShader(c,f);this.ctx.attachShader(c,g);d=0;a.attribPairs=[];for(var h in a.attributes){a.attribPairs.push({loc:d,name:h});this.ctx.bindAttribLocation(c,d++,h)}this.ctx.linkProgram(c);if(!this.ctx.getProgramParameter(c,this.ctx.LINK_STATUS)){a=this.ctx.getProgramInfoLog(c); +window.console.log("Error in program linking:"+a);this.ctx.deleteProgram(c);this.ctx.deleteProgram(g);this.ctx.deleteProgram(f);return null}return c};this.setLightContext=function(a){for(t in this.technique)for(var c=this.technique.passes.length,d=0;d 1) {//TODO: Should be 0, temp hack fix - setTimeout(function () {window.open(this.application.ninja.coreIoApi.rootUrl+this.application.ninja.documentController._activeDocument.uri.split(this.application.ninja.coreIoApi.cloudData.root)[1]);}.bind(this), 3500); - } else { - window.open(this.application.ninja.coreIoApi.rootUrl+this.application.ninja.documentController._activeDocument.uri.split(this.application.ninja.coreIoApi.cloudData.root)[1]); - } + window.open(this.application.ninja.coreIoApi.rootUrl + this.application.ninja.documentController._activeDocument.uri.split(this.application.ninja.coreIoApi.cloudData.root)[1]); //chrome.tabs.create({url: this.application.ninja.coreIoApi.rootUrl+this.application.ninja.documentController._activeDocument.uri.split(this.application.ninja.coreIoApi.cloudData.root)[1]}); } }, diff --git a/js/helper-classes/RDGE/rdge-compiled.js b/js/helper-classes/RDGE/rdge-compiled.js index 66bf5a42..0bbcb05b 100755 --- a/js/helper-classes/RDGE/rdge-compiled.js +++ b/js/helper-classes/RDGE/rdge-compiled.js @@ -107,11 +107,11 @@ t);this.def[t]=null;break}for(var n in RDGE.rdgeGlobalParameters){l=new globalPa 0,o;for(o in RDGE.globals.engine.lightManager.lightUniforms[m]){loc=this.ctx.getUniformLocation(h,o);if(loc!=null){this[t].passes[g].lightParams[m]||(this[t].passes[g].lightParams[m]=[]);this[t].passes[g].lightParams[m].push({loc:loc,name:o,dataIndex:p})}p++}}for(n in d[g].params)if(typeof d[g].params[n]!="string"){l=new paramType(this.ctx,n,d[g].params,h,t);this[t].passes[g].params[n]=l;this[t][n]=l}for(n in d[g].params)typeof d[g].params[n]=="string"&&(this[t][n]=this[t].passes[g].params[n]);g++}}for(t in a){f= this[t].passes.length;for(g=0;g");var c=this.def.shaders[a.vshader],d=this.def.shaders[a.fshader];this.ctx.useProgram(null);var f=null,g=null;if(c.indexOf("{")!=-1)g=c;else{g=new XMLHttpRequest;g.open("GET",c,false);g.send(null);g=g.responseText}f=this.buildShader(this.ctx.VERTEX_SHADER,g);g=null;if(c.indexOf("{")!=-1)g=d;else{g=new XMLHttpRequest;g.open("GET",d,false);g.send(null);g=g.responseText}g=this.buildShader(this.ctx.FRAGMENT_SHADER, -g);if(!f||!g)return null;this.compiledShaders[a.vshader]=f;this.compiledShaders[a.fshader]=g;c=this.ctx.createProgram();if(!c)return null;this.ctx.attachShader(c,f);this.ctx.attachShader(c,g);d=0;a.attribPairs=[];for(var h in a.attributes){a.attribPairs.push({loc:d,name:h});this.ctx.bindAttribLocation(c,d++,h)}this.ctx.linkProgram(c);if(!this.ctx.getProgramParameter(c,this.ctx.LINK_STATUS)){a=this.ctx.getProgramInfoLog(c);window.console.log("Error in program linking:"+a);this.ctx.deleteProgram(c); -this.ctx.deleteProgram(g);this.ctx.deleteProgram(f);return null}return c};this.setLightContext=function(a){for(t in this.technique)for(var c=this.technique.passes.length,d=0;d");var c=RDGE.globals.engine.remapAssetFolder(this.def.shaders[a.vshader]),d=RDGE.globals.engine.remapAssetFolder(this.def.shaders[a.fshader]);this.ctx.useProgram(null);var f=null,g=null;if(c.indexOf("{")!=-1)g=c;else{g=new XMLHttpRequest;g.open("GET",c,false);g.send(null);g=g.responseText}f=this.buildShader(this.ctx.VERTEX_SHADER,g);g=null;if(c.indexOf("{")!=-1)g=d;else{g=new XMLHttpRequest;g.open("GET", +d,false);g.send(null);g=g.responseText}g=this.buildShader(this.ctx.FRAGMENT_SHADER,g);if(!f||!g)return null;this.compiledShaders[a.vshader]=f;this.compiledShaders[a.fshader]=g;c=this.ctx.createProgram();if(!c)return null;this.ctx.attachShader(c,f);this.ctx.attachShader(c,g);d=0;a.attribPairs=[];for(var h in a.attributes){a.attribPairs.push({loc:d,name:h});this.ctx.bindAttribLocation(c,d++,h)}this.ctx.linkProgram(c);if(!this.ctx.getProgramParameter(c,this.ctx.LINK_STATUS)){a=this.ctx.getProgramInfoLog(c); +window.console.log("Error in program linking:"+a);this.ctx.deleteProgram(c);this.ctx.deleteProgram(g);this.ctx.deleteProgram(f);return null}return c};this.setLightContext=function(a){for(t in this.technique)for(var c=this.technique.passes.length,d=0;d= 0) - { - rtnPath = url.substr( index + searchStr.length ); - rtnPath = this._assetPath + rtnPath; - } - return rtnPath; - }; + this.setAssetPath = function (path) { + this._assetPath = path.slice(); + }; + + this.remapAssetFolder = function (url) { + var searchStr = "assets/"; + var index = url.indexOf(searchStr); + var rtnPath = url; + if (index >= 0) { + rtnPath = url.substr(index + searchStr.length); + rtnPath = this._assetPath + rtnPath; + } + return rtnPath; + }; }; /* diff --git a/js/helper-classes/RDGE/src/core/script/jshader.js b/js/helper-classes/RDGE/src/core/script/jshader.js index 2bccaa80..22180344 100755 --- a/js/helper-classes/RDGE/src/core/script/jshader.js +++ b/js/helper-classes/RDGE/src/core/script/jshader.js @@ -482,8 +482,8 @@ RDGE.jshader = function (addr) { this.buildProgram = function (t) { window.console.log("building shader pair: <" + t.vshader + ", " + t.fshader + ">"); - var vShaderDef = this.def.shaders[t.vshader]; - var fShaderDef = this.def.shaders[t.fshader]; + var vShaderDef = RDGE.globals.engine.remapAssetFolder(this.def.shaders[t.vshader]); + var fShaderDef = RDGE.globals.engine.remapAssetFolder(this.def.shaders[t.fshader]); this.ctx.useProgram(null); @@ -494,7 +494,7 @@ RDGE.jshader = function (addr) { source = vShaderDef; } else { var vshaderRequest = new XMLHttpRequest(); - var urlVertShader = vShaderDef; + var urlVertShader = vShaderDef; vshaderRequest.open("GET", urlVertShader, false); vshaderRequest.send(null); source = vshaderRequest.responseText; diff --git a/js/io/system/ninjalibrary.json b/js/io/system/ninjalibrary.json index a2448665..285444b5 100644 --- a/js/io/system/ninjalibrary.json +++ b/js/io/system/ninjalibrary.json @@ -1,6 +1,6 @@ { "libraries": [ {"name": "Montage", "path": "/node_modules/descriptor.json", "version": "0.7.0.0"}, - {"name": "RDGE", "path": "/assets/descriptor.json", "version": "0.5.3.0"} + {"name": "RDGE", "path": "/assets/descriptor.json", "version": "0.5.4.0"} ] } \ No newline at end of file diff --git a/js/mediators/io-mediator.js b/js/mediators/io-mediator.js index 82bb31c4..057a849d 100644 --- a/js/mediators/io-mediator.js +++ b/js/mediators/io-mediator.js @@ -14,427 +14,419 @@ var Montage = require("montage/core/core").Montage, //////////////////////////////////////////////////////////////////////// // exports.IoMediator = Montage.create(Component, { - //////////////////////////////////////////////////////////////////// - // - hasTemplate: { - enumerable: false, + //////////////////////////////////////////////////////////////////// + // + hasTemplate: { + enumerable: false, value: false }, - //////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////// // - deserializedFromTemplate: { - enumerable: false, - value: function () { - // - } - }, - //////////////////////////////////////////////////////////////////// + deserializedFromTemplate: { + enumerable: false, + value: function () { + // + } + }, + //////////////////////////////////////////////////////////////////// // fio: { - enumerable: false, - value: FileIo + enumerable: false, + value: FileIo }, //////////////////////////////////////////////////////////////////// // pio: { - enumerable: false, - value: ProjectIo + enumerable: false, + value: ProjectIo }, //////////////////////////////////////////////////////////////////// // getAppTemplatesUrlRegEx: { - enumerable: false, - value: function () { - var regex = new RegExp(chrome.extension.getURL('js/document/templates/montage-html').replace(/\//gi, '\\\/'), 'gi'); - return regex; - } + enumerable: false, + value: function () { + var regex = new RegExp(chrome.extension.getURL('js/document/templates/montage-html').replace(/\//gi, '\\\/'), 'gi'); + return regex; + } }, - //////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////// // fileNew: { - enumerable: false, - value: function (file, template, callback) { - //Loading template from template URL - var xhr = new XMLHttpRequest(), result; - xhr.open("GET", template, false); + enumerable: false, + value: function (file, template, callback) { + //Loading template from template URL + var xhr = new XMLHttpRequest(), result; + xhr.open("GET", template, false); xhr.send(); - if (xhr.readyState === 4) { - //Making call to create file, checking for return code - switch (this.fio.newFile({uri: file, contents: xhr.response})) { - case 201: - result = {status: 201, success: true, uri: file}; - break; - case 204: - result = {status: 204, success: false, uri: file}; - break; - case 400: - result = {status: 400, success: false, uri: file}; - break; - default: - result = {status: 500, success: false, uri: file}; - break; - } - } else { - result = {status: 500, success: false, uri: file}; - } - //Sending result to callback if requested for handling - if (callback) callback(result); - //Codes - // 204: File exists | 400: File exists - // 201: File succesfully created | 500: Unknown (Probably cloud API not running) - } + if (xhr.readyState === 4) { + //Making call to create file, checking for return code + switch (this.fio.newFile({ uri: file, contents: xhr.response })) { + case 201: + result = { status: 201, success: true, uri: file }; + break; + case 204: + result = { status: 204, success: false, uri: file }; + break; + case 400: + result = { status: 400, success: false, uri: file }; + break; + default: + result = { status: 500, success: false, uri: file }; + break; + } + } else { + result = { status: 500, success: false, uri: file }; + } + //Sending result to callback if requested for handling + if (callback) callback(result); + //Codes + // 204: File exists | 400: File exists + // 201: File succesfully created | 500: Unknown (Probably cloud API not running) + } }, //////////////////////////////////////////////////////////////////// // fileOpen: { - enumerable: false, - value: function (file, callback) { - //Reading file (Ninja doesn't really open a file, all in browser memory) - var read = this.fio.readFile({uri: file}), result; - //Checking for status - switch(read.status) { - case 204: - //Creating and formatting result object for callbak - result = read.file.details; - result.root = read.file.details.uri.replace(read.file.details.name, ""); - //Checking for type of content to returns - if (result.extension !== 'html' && result.extension !== 'htm') { - //Simple string - result.content = read.file.content; - } else { - //Object to be used by Ninja Template - result.content = this.parseHtmlToNinjaTemplate(read.file.content); - } - //Status of call - result.status = read.status; - //Calling back with result - if (callback) callback(result); - break; - case 404: - //File does not exists - if (callback) callback({status: read.status}); - break; - default: - //Unknown - if (callback) callback({status: 500}); - break; - } - /* - //////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////// - //Return Object Description - Object.status (Always presents for handling) - 204: File exists (Success) - 404: File does not exists (Failure) - 500: Unknown (Probably cloud API not running) + enumerable: false, + value: function (file, callback) { + //Reading file (Ninja doesn't really open a file, all in browser memory) + var read = this.fio.readFile({ uri: file }), result; + //Checking for status + switch (read.status) { + case 204: + //Creating and formatting result object for callbak + result = read.file.details; + result.root = read.file.details.uri.replace(read.file.details.name, ""); + //Checking for type of content to returns + if (result.extension !== 'html' && result.extension !== 'htm') { + //Simple string + result.content = read.file.content; + } else { + //Object to be used by Ninja Template + result.content = this.parseHtmlToNinjaTemplate(read.file.content); + } + //Status of call + result.status = read.status; + //Calling back with result + if (callback) callback(result); + break; + case 404: + //File does not exists + if (callback) callback({ status: read.status }); + break; + default: + //Unknown + if (callback) callback({ status: 500 }); + break; + } + /* + //////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////// + //Return Object Description + Object.status (Always presents for handling) + 204: File exists (Success) + 404: File does not exists (Failure) + 500: Unknown (Probably cloud API not running) - (Below only present if succesfull 204) + (Below only present if succesfull 204) - Object.content - Object.extension - Object.name - Object.uri - Object.creationDate - Object.modifiedDate - Object.readOnly - Object.size - //////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////// - */ - } + Object.content + Object.extension + Object.name + Object.uri + Object.creationDate + Object.modifiedDate + Object.readOnly + Object.size + //////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////// + */ + } }, //////////////////////////////////////////////////////////////////// // fileSave: { - enumerable: false, - value: function (file, callback) { - // - var contents, save; - // - switch (file.mode) { - case 'html': - - - //TODO: Add check for Monatage library to copy - - //Getting content from function to properly handle saving assets (as in external if flagged) - contents = this.parseNinjaTemplateToHtml(file); - break; - default: - contents = file.content; - break; - } - //Making call to save file - save = this.fio.saveFile({uri: file.document.uri, contents: contents}); + enumerable: false, + value: function (file, callback) { + // + var contents, save; + // + switch (file.mode) { + case 'html': + + + //TODO: Add check for Monatage library to copy + + //Getting content from function to properly handle saving assets (as in external if flagged) + contents = this.parseNinjaTemplateToHtml(file); + break; + default: + contents = file.content; + break; + } + //Making call to save file + save = this.fio.saveFile({ uri: file.document.uri, contents: contents }); //Checking for callback if (callback) callback(save); - } + } }, //////////////////////////////////////////////////////////////////// // fileSaveAs: { - enumerable: false, - value: function (copyTo, copyFrom, callback) { - //TODO: Implement Save As functionality - } + enumerable: false, + value: function (copyTo, copyFrom, callback) { + //TODO: Implement Save As functionality + } }, //////////////////////////////////////////////////////////////////// // fileDelete: { - enumerable: false, - value: function (file, callback) { - //TODO: Implement Delete functionality - } + enumerable: false, + value: function (file, callback) { + //TODO: Implement Delete functionality + } }, //////////////////////////////////////////////////////////////////// // parseHtmlToNinjaTemplate: { - enumerable: false, - value: function (html) { - //Creating temp object to mimic HTML - var doc = window.document.implementation.createHTMLDocument(), template; - //Setting content to temp - doc.getElementsByTagName('html')[0].innerHTML = html; - //Creating return object - return {head: doc.head.innerHTML, body: doc.body.innerHTML, document: doc}; - } + enumerable: false, + value: function (html) { + //Creating temp object to mimic HTML + var doc = window.document.implementation.createHTMLDocument(), template; + //Setting content to temp + doc.getElementsByTagName('html')[0].innerHTML = html; + //Creating return object + return { head: doc.head.innerHTML, body: doc.body.innerHTML, document: doc }; + } }, //////////////////////////////////////////////////////////////////// //TODO: Expand to allow more templates, clean up variables parseNinjaTemplateToHtml: { - enumerable: false, - value: function (template) { - var regexRootUrl, rootUrl = this.application.ninja.coreIoApi.rootUrl+escape((this.application.ninja.documentController.documentHackReference.root.split(this.application.ninja.coreIoApi.cloudData.root)[1])); - regexRootUrl = new RegExp(rootUrl.replace(/\//gi, '\\\/'), 'gi'); - //Injecting head and body into old document - template.document.content.document.head.innerHTML = template.head.replace(regexRootUrl, ''); - template.document.content.document.body.innerHTML = template.body.replace(regexRootUrl, ''); - //Getting all CSS (style or link) tags - var styletags = template.document.content.document.getElementsByTagName('style'), + enumerable: false, + value: function (template) { + var regexRootUrl, rootUrl = this.application.ninja.coreIoApi.rootUrl + escape((this.application.ninja.documentController.documentHackReference.root.split(this.application.ninja.coreIoApi.cloudData.root)[1])); + regexRootUrl = new RegExp(rootUrl.replace(/\//gi, '\\\/'), 'gi'); + //Injecting head and body into old document + template.document.content.document.head.innerHTML = template.head.replace(regexRootUrl, ''); + template.document.content.document.body.innerHTML = template.body.replace(regexRootUrl, ''); + //Getting all CSS (style or link) tags + var styletags = template.document.content.document.getElementsByTagName('style'), linktags = template.document.content.document.getElementsByTagName('link'), toremovetags = []; - //Getting styles tags to be removed from document - if (styletags.length) { - for (var j=0; j only | css =