/*jshint -W004 */ // duplicate variables
(function($) {
var Alpaca = $.alpaca;
Alpaca.RuntimeView = Base.extend(
/**
* @lends Alpaca.RuntimeView.prototype
*/
{
/**
* Runtime implementation of a view as applied to a field.
*
* This provides accessors into the nested behaviors of views and also takes into account field-level attributes
* of the currently rendering dom element.
*
* @constructs
*
* @class Class for managing view components such as layout, template, message etc.
*
* @param {String} the view id
* @param {Object} field the field control
*/
constructor: function(viewId, field) {
this.field = field;
this.setView(viewId);
},
/**
* Sets the view that this runtime view adapters should consult during render.
*
* @param {String} the view id
*/
setView: function (viewId)
{
// TODO: should field classes ever really be instantiated directly?
// TODO: this is left in to support Alpaca docs generation (need to clean this up)s
// if a view is not set at this point it probably means they instantiated a field directly
// in which case, we'll just pick the default view
if (!viewId)
{
viewId = "web-edit";
}
// the normalized view
var normalizedView = Alpaca.getNormalizedView(viewId);
if (!normalizedView)
{
// this should never be the case
throw new Error("Runtime view for view id: " + viewId + " could not find a normalized view");
}
// copy compiled properties into this object
for (var k in normalizedView)
{
if (normalizedView.hasOwnProperty(k)) {
this[k] = normalizedView[k];
}
}
},
/**
* Gets view wizard settings.
*
* @returns {Object} View wizard settings.
*/
getWizard : function () {
return this.getViewParam("wizard");
},
/**
* Gets the global layout template.
*
* @returns {Object|String} Global layout template setting of the view.
*/
getGlobalTemplateDescriptor : function ()
{
return this.getTemplateDescriptor("globalTemplate");
},
/**
* Gets layout template and bindings.
*
* @returns {Object} Layout template and bindings setting of the view.
*/
getLayout: function ()
{
var self = this;
return {
"templateDescriptor": this.getTemplateDescriptor("layoutTemplate", self),
"bindings": this.getViewParam(["layout","bindings"], true)
};
},
/**
* Hands back the compiled template id for a given template.
*
* @param templateId
* @param field (optional)
*/
getTemplateDescriptor: function(templateId, field)
{
return Alpaca.getTemplateDescriptor(this, templateId, field);
},
/**
* Gets message for the given id
*
* @param {String} messageId Message id
* @param {String} locale locale
*
* @returns {String} Message mapped to the given id.
*/
getMessage : function (messageId, locale)
{
if (!locale) {
locale = Alpaca.defaultLocale;
}
var messageForLocale = this.getViewParam(["messages", locale, messageId]);
if (Alpaca.isEmpty(messageForLocale)) {
messageForLocale = this.getViewParam(["messages", messageId]);
}
return messageForLocale;
},
/**
* Retrieves view parameter based on configuration Id or Id array.
*
* @param {String|Array} configId Configuration id or array.
*
* @returns {Any} View parameter mapped to configuration Id or Id array.
*/
getViewParam: function (configId, topLevelOnly) {
var self = this;
// look for exact match
var fieldPath = this.field.path;
if (this.fields && this.fields[fieldPath]) {
var configVal = this._getConfigVal(this.fields[fieldPath], configId);
if (!Alpaca.isEmpty(configVal)) {
return configVal;
}
}
// array related field path (using [*] syntax) i.e. /a/b[*]/c/d[*]/e
if (fieldPath && fieldPath.indexOf('[') !== -1 && fieldPath.indexOf(']') !== -1) {
var newFieldPath = fieldPath.replace(/\[\d+\]/g,"[*]");
if (this.fields && this.fields[newFieldPath]) {
var configVal = this._getConfigVal(this.fields[newFieldPath], configId);
if (!Alpaca.isEmpty(configVal)) {
return configVal;
}
}
}
// array related field path (using pure path syntax) i.e. /a/b/c/d/e
if (fieldPath && fieldPath.indexOf('[') !== -1 && fieldPath.indexOf(']') !== -1) {
var newFieldPath = fieldPath.replace(/\[\d+\]/g,"");
if (this.fields && this.fields[newFieldPath]) {
var configVal = this._getConfigVal(this.fields[newFieldPath], configId);
if (!Alpaca.isEmpty(configVal)) {
return configVal;
}
}
}
if (!Alpaca.isEmpty(topLevelOnly) && topLevelOnly && this.field.path !== "/") {
return null;
}
return this._getConfigVal(this, configId);
},
/**
* Internal method for getting configuration.
*
* @private
*
* @param {Any} configVal configuration value.
* @param {String} configId configuration id.
*
* @returns {Any} configuration mapping to the given id
*/
_getConfigVal : function (configVal, configId) {
if (Alpaca.isArray(configId)) {
for (var i = 0; i < configId.length && !Alpaca.isEmpty(configVal); i++) {
configVal = configVal[configId[i]];
}
} else {
if (!Alpaca.isEmpty(configVal)) {
configVal = configVal[configId];
}
}
return configVal;
},
fireCallback: function(field, id, arg1, arg2, arg3, arg4, arg5)
{
var self = this;
if (this.callbacks && this.callbacks[id])
{
this.callbacks[id].call(field, arg1, arg2, arg3, arg4, arg5);
}
},
applyStyle: function(id, fieldOrEl)
{
var el = fieldOrEl;
if (el && el.getFieldEl) {
el = el.getFieldEl();
}
if (el)
{
if (this.styles && this.styles[id])
{
$(el).addClass(this.styles[id]);
}
}
},
getStyle: function(id)
{
return this.styles[id] ? this.styles[id] : "";
}
});
})(jQuery);