/* This file contains proprietary software owned by Motorola Mobility, Inc.
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
*/ /** @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; } }}, });