Current File : /home/lightco1/public_html/kichler.com.au/plugins/system/jsnpoweradmin/assets/js/mootools/mooml.js
/*
---
script: mooml.js
version: 1.3.0
description: Mooml is a javasctript templating engine for HTML generation, powered by Mootools.
license: MIT-style
download: http://mootools.net/forge/p/mooml
source: http://github.com/eneko/mooml
htmltags: http://www.w3schools.com/html5/html5_reference.asp
authors:
- Eneko Alonso: (http://enekoalonso.com)
credits:
- Ed Spencer: Mooml is based on Ed Spencer's Jaml (http://edspencer.github.com/jaml)
- Tim Schmidt: contributed with function and number argument types
- Josh Cohen: helped with node stacks for nested templates
- Vasili Sviridov: for the mixin idea
provides:
- Mooml
- Mooml.Template
- Mooml.Templates
requires:
- core/1.3.0:Class
- core/1.3.0:Elements
- core/1.3.0:Array
...
*/
var Mooml = {
version: '1.2.4',
templates: {},
engine: { callstack: [], tags: {} },
htmlTags: [
"a", "abbr", "address", "area", "article", "aside", "audio",
"b", "base", "bdo", "blockquote", "body", "br", "button",
"canvas", "caption", "cite", "col", "colgroup", "command",
"datalist", "dd", "del", "details", "dialog", "dfn", "div", "dl", "dt",
"em", "embed",
"fieldset", "figure",
"footer", "form",
"h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html",
"i", "iframe", "img", "input", "ins",
"keygen", "kbd",
"label", "legend", "li", "link",
"map", "mark", "menu", "meta", "meter",
"nav", "noscript",
"object", "ol", "optgroup", "option", "output",
"p", "param", "pre", "progress",
"q",
"rp", "rt", "ruby",
"samp", "script", "section", "select", "small", "source", "span", "strong", "style", "sub", "sup",
"table", "tbody", "td", "textarea", "tfoot", "th", "thead", "time", "title", "tr",
"ul",
"var", "video",
// Deprecated in HTML 5
"acronym", "applet", "basefont", "big", "center", "dir", "font", "frame", "frameset", "noframes", "s", "strike", "tt", "u", "xmp"
// Not supported tags
// "code"
],
/**
* Evaluates a Mooml template supporting nested templates
* @param {Mooml.Template} template The template function
* @param {Object|Array} data Optional data object or array of objects
*/
evaluate: function(template, data) {
var elements = [];
this.engine.callstack.push(template);
if (template.prepared == false) {
template.code = this.prepare(template.code);
template.prepared = true;
}
Array.from([data, {}].pick()).each(function(params, index) {
template.code(params, index);
elements.append(template.nodes.filter(function(node) {
return node.getParent() === null;
}));
template.nodes.empty();
});
this.engine.callstack.pop();
if (this.engine.callstack.length) {
if (template.elementRefs) {
Array.extend(this.engine.callstack.getLast().elementRefs, template.elementRefs);
}
}
return (elements.length > 1) ? elements : elements.shift();
},
/**
* Initializes the engine generating a javascript function for every html
* tag that can be used on the template.
* Template tag functions can receive options for the element, child
* elements and html code as parameters.
* initialize can be called by the user in case of adding additional tags.
*/
initEngine: function() {
this.htmlTags.each(function(tag) {
Mooml.engine.tags[tag] = function() {
var template = Mooml.engine.callstack.getLast();
var el = new Element(tag);
for (var i=0, l=arguments.length; i<l; i++) {
var argument = arguments[i];
if (typeOf(argument) === "function") argument = argument();
switch (typeOf(argument)) {
case "array":
case "element":
case "collection": {
el.adopt(argument);
break;
}
case "string": {
if (template) {
el.getChildren().each(function(child) {
template.nodes.erase(child);
});
}
el.set('html', el.get('html') + argument);
break;
}
case "number": {
el.appendText(argument.toString());
break;
}
case "object": {
if (i === 0) {
if (template && template.elementRefs && argument.id) {
template.elementRefs[argument.id] = el;
}
el.set(argument);
} else if (typeOf(argument.toElement) == "function") {
el.adopt(argument.toElement());
}
break;
}
}
}
if (template) template.nodes.push(el);
return el;
}
});
window.addEvent('domready', function() {
document.getElements('script[type=text/mooml]').each(function(template) {
Mooml.register(template.get('name'), new Function(['data', 'index'], template.get('text')));
});
});
},
/**
* Prepares a template function so it can be called directly without using eval
* @param {Function} code The template function to prepare
*/
prepare: function(code) {
var codeStr = code.toString();
var args = codeStr.match(/\(([a-zA-Z0-9,\s]*)\)/)[1].replace(/\s/g, '').split(',');
var body = codeStr.match(/\{([\s\S]*)\}/m)[1];
for (var i=this.htmlTags.length; --i >= 0; ) {
body = body.replace(new RegExp('(^|[^\\w.])(' + this.htmlTags[i] + ')([\\s]*(?=\\())', 'g'), '$1Mooml.engine.tags.$2$3')
}
return new Function(args, body);
}
};
/**
* Template class for Mooml templates
*/
Mooml.Template = new Class({
nodes: [],
initialize: function(name, code, options) {
if (options && options.elementRefs && typeof(options.elementRefs) === "object") {
this.elementRefs = options.elementRefs;
}
this.name = name;
this.code = code;
this.prepared = false;
},
render: function(data) {
return Mooml.evaluate(this, data);
}
});
/**
* Mixin for implemenation in Mootools classes: Implements: [Mooml.Templates, Options, ...]
*/
Mooml.Templates = new Class({
templates: {},
/**
* Registers a new template for later use or returns an existing template with that name
* @param {String} name The name of the template
* @param {Function} code The code function of the template
*/
registerTemplate: function(name, code, options) {
var template = this.templates[name];
return (template)? template : this.templates[name] = new Mooml.Template(name, code, options);
},
/**
* Evaluates a registered template or returns null if template not registered
* @param {String} name The name of the template to evaluate
* @param {Object|Array} data Optional data object or array of objects
*/
renderTemplate: function(name, data) {
var template = this.templates[name];
return (template)? template.render(data) : null;
}
});
/**
* Implement Mooml.Templates into Mooml and alias for backwards compatibility
*/
Object.append(Mooml, new Mooml.Templates());
Mooml.register = Mooml.registerTemplate;
Mooml.render = Mooml.renderTemplate;
Mooml.initEngine();