Files
cydia/js/json-data-loader-engine.js
2016-05-09 17:29:18 +08:00

108 lines
2.9 KiB
JavaScript
Executable File

var JSONContentLoader = function(contentInfo,onDataSourceFail) {
this.verbose = false;
this.contentInfo = contentInfo;
if (onDataSourceFail) {
this.onDataSourceFail = onDataSourceFail;
}
}
JSONContentLoader.prototype.log = function(msg) {
if (this.verbose) {
console.log(msg);
}
}
JSONContentLoader.prototype.runEngine = function(elements, data)
{
var self = this;
$.each(elements, function (element, sourceDef) {
self.log('Rendering '+element);
self.log(' .type='+sourceDef.type);
self.log(' .source='+sourceDef.source);
// go out if key element does not exits
if (!($(element).length)) {return}
var content;
if (sourceDef.source != '') {
content = data[sourceDef.source];
}
if (sourceDef.select) {
self.log(' .has select filter = '+sourceDef.select);
switch (sourceDef.select) {
case 'firstKey' :
content = Object.keys(content)[0];
self.log(' newcontent = '+content);
break;
case 'firstValue' :
content = $(content)[0];
self.log(' newcontent = '+content);
break;
default :
}
} //if (sourceDef.select)
switch (sourceDef.type) {
case 'text' :
self.log(' Setting text of '+element+' to '+content);
$(element).html(content);
break;
case 'list' :
if ($(content).size()==0) {
if (sourceDef.ifEmpty) {
sourceDef.ifEmpty($(element));
}
} else {
// not empty
if (!!sourceDef.reverse) {
content = $(content).get().reverse();
}
$.each(content, function(index,value){
if (!!sourceDef.reverse) {
$(element).prepend( $(sourceDef.listElement).html("<p>"+value+"</p>") )
} else {
$(element).append( $(sourceDef.listElement).html("<p>"+value+"</p>") )
}
});
}
break;
case 'custom' :
self.log(' Calling render("'+element+'",('+content+'))');
sourceDef.render( element, content);
default:
} // switch
if(sourceDef.afterRender) {
self.log(' Running afterRender');
sourceDef.afterRender(element, content);
}
});
}
JSONContentLoader.prototype.onDataSourceFail = function(src) {
self.log("onDataSourceFail triggered for "+src);
return this
}
JSONContentLoader.prototype.render = function()
{
var self = this;
$.each(self.contentInfo, function(idx, webpart) {
self.log(webpart);
if (webpart['data-source'] != '') {
$.getJSON(webpart['data-source'], function(data) {
self.runEngine(webpart['elements'], data);
})
.fail(function() {
self.log( "getJSON failed for "+webpart['data-source'] );
if (self.onDataSourceFail) {
self.onDataSourceFail(webpart['data-source']);
}
});
} else {
self.runEngine(webpart['elements'], null);
}
});
}