/** * @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; } };