/**
* @author Roy Arisse roy@ewingsict.nl
* @param {object} oOptions Should look like: {sIdContainer: 'id', sResultsUrl: '/results.json'}
* @param {object} oLang Optional, should look like: {sNoResults: 'text', sInvalidJson: 'text', sUnknownError: 'text'}
* All parameters or parameter siblings are optional, if not set, JS will try to use defaults
* jslint browser: true, sloppy: true, maxerr: 50, indent: 4
*/
function LoadTwitters(oOptions, oLang) {
if (oOptions === undefined) {
oOptions = {};
}
if (oLang === undefined) {
oLang = {};
}
this.options = {
container_id: oOptions.hasOwnProperty('sIdContainer') ? oOptions.sIdContainer : null,
results_url: oOptions.hasOwnProperty('sResultsUrl') ? oOptions.sResultsUrl : '/twittersearch.json'
};
this.lang = {
no_results: oLang.hasOwnProperty('sNoResults') ? oLang.sNoResults : 'Geen tweets weer te geven',
invalid_json: oLang.hasOwnProperty('sInvalidJson') ? oLang.sInvalidJson : 'De server retourneerde een ongeldig antwoord',
unknown_error: oLang.hasOwnProperty('sUnknownError') ? oLang.sUnknownError : 'Er heeft zich een onbekende fout voorgedaan.'
};
if (!this.options.container_id.length) {
return false;
}
return this.construct();
}
LoadTwitters.prototype = {
construct: function () {
var oSelf = this;
this.container = document.getElementById(this.options.container_id);
if (this.container === null) {
return false;
}
// Add results list to the body
this.feedList = document.createElement('ul');
this.container.appendChild(this.feedList);
this.toggleLoading(this.container, true);
return new Ajax.Request(this.options.results_url, {
method: 'get',
evalJSON: 'force',
timeout: 30000,
onSuccess: function (transport) {
var items = transport.responseJSON,
tweet = 0;
if (!items.length) {
return this.onError('no_results');
}
for (tweet = 0; tweet < items.length; tweet += 1) {
oSelf.addTweet(items[tweet]);
}
return true;
},
onComplete: function () {
oSelf.toggleLoading(oSelf.container, false);
},
onFailure: function () {
oSelf.toggleLoading(oSelf.container, false);
oSelf.onError('invalid_json');
}
});
},
addTweet: function (oTweet) {
var oLi = document.createElement('li'),
oImageA = document.createElement('a'),
oImage = document.createElement('img'),
oH4 = document.createElement('h4'),
oP = document.createElement('p');
this.feedList.appendChild(oLi);
// Add image
oImageA.setAttribute('href', oTweet.user_url);
oImage.setAttribute('src', oTweet.profile_image);
oImageA.appendChild(oImage);
oLi.appendChild(oImageA);
// Add title
oH4.innerHTML = '' + oTweet.from_user + '';
oH4.setAttribute('class', 'title');
oLi.appendChild(oH4);
// Add tweetcontent
oP.innerHTML = oTweet.content + '
' + oTweet.date + '';
oLi.appendChild(oP);
},
toggleLoading: function (oContainer, bIsLoading) {
oContainer.className = bIsLoading ? 'loading' : '';
return true;
},
onError: function (sErrorIdentifier) {
var oErrorElement = document.createElement('p'),
oErrorText = null;
if (!this.lang.hasOwnProperty(sErrorIdentifier)) {
sErrorIdentifier = 'unknown_error';
}
oErrorElement.className = 'error';
oErrorText = document.createTextNode(this.lang[sErrorIdentifier]);
oErrorElement.appendChild(oErrorText);
this.container.innerHTML = null;
this.container.appendChild(oErrorElement);
return true;
}
};