/* <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> */ /** @module montage/tools/template/template-creator @requires montage/ui/template */ exports = typeof exports !== "undefined" ? exports : {}; var Montage = require("montage/core/core").Montage; var Template = require("montage/ui/template").Template; /** @class module:montage/tools/template/template-creator.TemplateCreator @extends module:montage/ui/template.Template */ var TemplateCreator = exports.TemplateCreator = Montage.create(Template, /** @lends module:montage/tools/template/template-creator.TemplateCreator# */ { initWithDocument: { value: function(doc, montageJsPath) { return this.initWithHeadAndBodyElements(doc.head, doc.body, montageJsPath); } }, initWithBodyElement: { value: function(body, montageJsPath) { return this.initWithHeadAndBodyElements(null, body, montageJsPath); } }, initWithHeadAndBodyElements: { value: function(head, body, montageJsPath) { var serializer = this.serializer, objects = {}, components = {}, componentsChildComponents = {}, doc, script, self = this; this._componentNamesIndex = {}; this._objectNamesIndex = {}; doc = this._document = document.implementation.createHTMLDocument(""); function copyNode(sourceNode, targetNode, isRootNode) { var childNodes = sourceNode.childNodes, childNode, targetChildNode, label, script, component = isRootNode ? null : sourceNode.controller; if (component) { label = self._generateLabelForComponent(component, Object.keys(components)); component._element = targetNode; components[label] = component; componentsChildComponents[label] = component.childComponents; component._element.setAttribute('data-ninja-node', 'true'); delete component.childComponents; } else { for (var i = 0; (childNode = childNodes[i]); i++) { targetChildNode = targetNode.appendChild(childNode.cloneNode(false)); copyNode(childNode, targetChildNode); } } } if (head) { doc.head.innerHTML = head.innerHTML; } if (montageJsPath) { script = doc.createElement("script"); script.setAttribute("src", montageJsPath); doc.head.appendChild(script); doc.head.insertBefore(doc.createTextNode("\n "), script); } // try to make things look nice... var html = doc.documentElement; html.insertBefore(doc.createTextNode("\n"), doc.head); html.insertBefore(doc.createTextNode("\n"), doc.body); html.appendChild(doc.createTextNode("\n")); if (!head) { // the first child is the title doc.head.insertBefore(doc.createTextNode("\n "), doc.head.firstChild); } copyNode(body, this._document.body, true); this._ownerSerialization = serializer.serialize(components); for (var label in components) { components[label].childComponents = componentsChildComponents[label]; } components = componentsChildComponents = null; this._externalObjects = serializer.getExternalObjects(); return this; } }, _componentNamesIndex: { value: null }, _generateLabelForComponent: {value: function(component, labels) { var componentInfo = Montage.getInfoForObject(component), componentLabel = componentInfo.label, componentName, index; if (componentLabel) { return componentLabel; } else { componentName = componentInfo.objectName.toLowerCase(); do { index = this._componentNamesIndex[componentName] || 1; this._componentNamesIndex[componentName] = index + 1; } while (labels.indexOf(componentName+index) >= 0); return componentName + index; } }}, });