44 |
45 |
46 | English
47 | |
48 | Türkçe
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 | GRAVESTONE
59 |
60 |
61 |
62 | TWO-DOOR INN
63 |
64 |
65 |
66 | TOMB
67 |
68 |
69 |
70 |
71 | ABOUT
72 |
73 |
Shared Death is a web-based artwork which filters shared thoughts containing keywords like "death", "dying" from the Twitter in real time. Its purpose is to help people better understand how other people thinks and feels about the shared destiny of all living things in the planet. You can participate in this experiment by sending tweet with #death keyword.
74 | Read More
75 |
76 | Mustafa İlhan - @mustilica
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
--------------------------------------------------------------------------------
/textualizer.min.js:
--------------------------------------------------------------------------------
1 | /*! https://github.com/krisk/textualizer */
2 | (function(b,j){function x(a){var b,d,f,n={};if(j.getComputedStyle)if(a=j.getComputedStyle(a,null),a.length){d=0;for(f=a.length;d").text(i),l.append(r.domNode),h.push(r));var s=d.centered?(z-l.height())/2:0;b.each(h,function(a,b){b.pos=b.domNode.position();b.domNode=b.domNode.clone();b.pos.top+=s;b.domNode.css({left:b.pos.left,top:b.pos.top,position:"absolute"});g.characterList.push(b)});l.html("");o=g}if(v){var h=v,x=o,B=[],C=[],D=b.Deferred(),E,p;k=[function(a){p=b.Deferred();a.fadeOut(1E3,
6 | p.resolve);return p.promise()}];E=k[Math.floor(Math.random()*k.length)];var w;b.each(h.characterList,function(a,d){if(w=x.use(d.character))w.domNode=d.domNode,w.inserted=!0,B.push(w);else{var c=b.Deferred();C.push(c);E(d.domNode.delay(Math.random()*L)).done(function(){d.domNode.remove();c.resolve()})}});b.when.apply(null,C).done(function(){return D.resolve(B)});D.promise().done(function(a){var c=o,g=b.Deferred(),h=[];j.setTimeout(function(){b.each(a,function(a,c){var e=b.Deferred();c.domNode.animate({left:c.pos.left,
7 | top:c.pos.top},d.rearrangeDuration,e.resolve);h.push(e.promise())});b.when.apply(null,h).done(function(){j.setTimeout(function(){f(c).done(function(){g.resolve()})},J)})},I);g.promise().done(function(){e.resolve()})})}else f(o).done(function(){e.resolve()});v=o;e.promise().done(function(){a.trigger(M,{index:c});j.setTimeout(n,d.duration)})}}var G=this,t=[],u,e,v,s=null,i=!1,y=!1,z,F,m,h,l;"random"!==d.effect&&b.each(b.fn.textualizer.effects,function(){if(this[0]===d.effect)return s=this[1],!1});m=
8 | a.clone().removeAttr("id").appendTo(j.document.body);m.css(x(a[0]));m.css({position:"absolute",top:"-1000px"});l=b("").css({position:"relative",visibility:"hidden"}).appendTo(m);a.css("overflow","hidden");h=b("").css("position","relative").appendTo(a);z=a.height();F={bottom:z};this.data=function(a){this.stop();t=a;u=[]};this.stop=function(){this.pause();i=!1;v=null;e=0;h.empty();l.empty()};this.pause=function(){y=!0;i=!1};this.start=function(){0===t.length||i||(e=e||0,i=!0,y=!1,q(e))};
9 | this.destroy=function(){h.parent().removeData("textualizer").end().remove();l.remove()};c&&c instanceof Array&&this.data(c)};b.fn.textualizer=function(){var a=arguments,c,d,f;f=this.data("textualizer");f||(c=[],1===a.length&&a[0]instanceof Array?c=a[0]:1===a.length&&"object"===typeof a[0]?d=a[0]:2===a.length&&(c=a[0],d=a[1]),0===c.length&&this.find("p").each(function(){c.push(b(this).text())}),this.html(""),f=new q(this,c,b.extend({},b.fn.textualizer.defaults,d)),this.data("textualizer",f));d=f;"string"===
10 | typeof a[0]&&d[a[0]]&&d[a[0]].apply(d,Array.prototype.slice.call(a,1));return this};b.fn.textualizer.defaults={effect:"random",duration:2E3,rearrangeDuration:1E3,centered:!1,loop:!0};b.fn.textualizer.effects=[["none",function(a){a.container.append(a.item.domNode.show())}],["fadeIn",function(a){a.container.append(a.item.domNode.fadeIn(2E3,a.dfd.resolve));return a.dfd.promise()}],["slideLeft",function(a){a.item.domNode.appendTo(a.container).css({left:-1E3}).show().animate({left:a.item.pos.left},2E3,
11 | a.dfd.resolve);return a.dfd.promise()}],["slideTop",function(a){a.item.domNode.appendTo(a.container).css({top:-1E3}).show().animate({top:a.item.pos.top},2E3,a.dfd.resolve);return a.dfd.promise()}]]})(jQuery,window);
--------------------------------------------------------------------------------
/bg.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Copyright (c) 2013 Mustafa İlhan released under the MIT license
3 | * based on https://github.com/wagerfield/flat-surface-shader
4 | */
5 |
6 | (function(){
7 |
8 | //------------------------------
9 | // Mesh Properties
10 | //------------------------------
11 | var MESH = {
12 | width: 1.2,
13 | height: 1.2,
14 | depth: 10,
15 | segments: 16,
16 | slices: 8,
17 | xRange: 0.8,
18 | yRange: 0.1,
19 | zRange: 1.0,
20 | ambient: '#555555',
21 | diffuse: '#FFFFFF',
22 | speed: 0.002
23 | };
24 |
25 | //------------------------------
26 | // Light Properties
27 | //------------------------------
28 | var LIGHT = {
29 | count: 2,
30 | xyScalar: 1,
31 | zOffset: 100,
32 | ambient: '#0f0600',
33 | diffuse: '#1b1103',
34 | speed: 0.001,
35 | gravity: 1200,
36 | dampening: 0.95,
37 | minLimit: 10,
38 | maxLimit: null,
39 | minDistance: 20,
40 | maxDistance: 400,
41 | autopilot: false,
42 | draw: false,
43 | bounds: FSS.Vector3.create(),
44 | step: FSS.Vector3.create(
45 | Math.randomInRange(0.2, 1.0),
46 | Math.randomInRange(0.2, 1.0),
47 | Math.randomInRange(0.2, 1.0)
48 | )
49 | };
50 |
51 | //------------------------------
52 | // Render Properties
53 | //------------------------------
54 | var WEBGL = 'webgl';
55 | var CANVAS = 'canvas';
56 | var SVG = 'svg';
57 | var RENDER = {
58 | renderer: CANVAS
59 | };
60 |
61 | //------------------------------
62 | // Export Properties
63 | //------------------------------
64 | var EXPORT = {
65 | width: 2000,
66 | height: 1000,
67 | drawLights: false,
68 | minLightX: 0.4,
69 | maxLightX: 0.6,
70 | minLightY: 0.2,
71 | maxLightY: 0.4,
72 | export: function() {
73 | var l, x, y, light,
74 | depth = MESH.depth,
75 | zOffset = LIGHT.zOffset,
76 | autopilot = LIGHT.autopilot,
77 | scalar = this.width / renderer.width;
78 |
79 | LIGHT.autopilot = true;
80 | LIGHT.draw = this.drawLights;
81 | LIGHT.zOffset *= scalar;
82 | MESH.depth *= scalar;
83 |
84 | resize(this.width, this.height);
85 |
86 | for (l = scene.lights.length - 1; l >= 0; l--) {
87 | light = scene.lights[l];
88 | x = Math.randomInRange(this.width*this.minLightX, this.width*this.maxLightX);
89 | y = Math.randomInRange(this.height*this.minLightY, this.height*this.maxLightY);
90 | FSS.Vector3.set(light.position, x, this.height-y, this.lightZ);
91 | FSS.Vector3.subtract(light.position, center);
92 | }
93 |
94 | update();
95 | render();
96 |
97 | switch(RENDER.renderer) {
98 | case WEBGL:
99 | window.open(webglRenderer.element.toDataURL(), '_blank');
100 | break;
101 | case CANVAS:
102 | window.open(canvasRenderer.element.toDataURL(), '_blank');
103 | break;
104 | case SVG:
105 | var data = encodeURIComponent(output.innerHTML);
106 | var url = "data:image/svg+xml," + data;
107 | window.open(url, '_blank');
108 | break;
109 | }
110 |
111 | LIGHT.draw = true;
112 | LIGHT.autopilot = autopilot;
113 | LIGHT.zOffset = zOffset;
114 | MESH.depth = depth;
115 |
116 | resize(container.offsetWidth, container.offsetHeight);
117 | }
118 | };
119 |
120 | //------------------------------
121 | // Global Properties
122 | //------------------------------
123 | var now, start = Date.now();
124 | var center = FSS.Vector3.create();
125 | var attractor = FSS.Vector3.create();
126 | var container = document.getElementById('container');
127 | var output = document.getElementById('output');
128 | var renderer, scene, mesh, geometry, material;
129 | var webglRenderer, canvasRenderer, svgRenderer;
130 | var gui, autopilotController;
131 |
132 | //------------------------------
133 | // Methods
134 | //------------------------------
135 | function initialise() {
136 | createRenderer();
137 | createScene();
138 | createMesh();
139 | createLights();
140 | addEventListeners();
141 | resize(container.offsetWidth, container.offsetHeight);
142 | animate();
143 | }
144 |
145 | function createRenderer() {
146 | webglRenderer = new FSS.WebGLRenderer();
147 | canvasRenderer = new FSS.CanvasRenderer();
148 | svgRenderer = new FSS.SVGRenderer();
149 | setRenderer(RENDER.renderer);
150 | }
151 |
152 | function setRenderer(index) {
153 | if (renderer) {
154 | output.removeChild(renderer.element);
155 | }
156 | switch(index) {
157 | case WEBGL:
158 | renderer = webglRenderer;
159 | break;
160 | case CANVAS:
161 | renderer = canvasRenderer;
162 | break;
163 | case SVG:
164 | renderer = svgRenderer;
165 | break;
166 | }
167 | renderer.setSize(container.offsetWidth, container.offsetHeight);
168 | output.appendChild(renderer.element);
169 | }
170 |
171 | function createScene() {
172 | scene = new FSS.Scene();
173 | }
174 |
175 | function createMesh() {
176 | scene.remove(mesh);
177 | renderer.clear();
178 | geometry = new FSS.Plane(MESH.width * renderer.width, MESH.height * renderer.height, MESH.segments, MESH.slices);
179 | material = new FSS.Material(MESH.ambient, MESH.diffuse);
180 | mesh = new FSS.Mesh(geometry, material);
181 | scene.add(mesh);
182 |
183 | // Augment vertices for animation
184 | var v, vertex;
185 | for (v = geometry.vertices.length - 1; v >= 0; v--) {
186 | vertex = geometry.vertices[v];
187 | vertex.anchor = FSS.Vector3.clone(vertex.position);
188 | vertex.step = FSS.Vector3.create(
189 | Math.randomInRange(0.2, 1.0),
190 | Math.randomInRange(0.2, 1.0),
191 | Math.randomInRange(0.2, 1.0)
192 | );
193 | vertex.time = Math.randomInRange(0, Math.PIM2);
194 | }
195 | }
196 |
197 | function createLights() {
198 | var l, light;
199 | for (l = scene.lights.length - 1; l >= 0; l--) {
200 | light = scene.lights[l];
201 | scene.remove(light);
202 | }
203 | renderer.clear();
204 | for (l = 0; l < LIGHT.count; l++) {
205 | light = new FSS.Light(LIGHT.ambient, LIGHT.diffuse);
206 | light.ambientHex = light.ambient.format();
207 | light.diffuseHex = light.diffuse.format();
208 | scene.add(light);
209 |
210 | // Augment light for animation
211 | light.mass = Math.randomInRange(0.5, 1);
212 | light.velocity = FSS.Vector3.create();
213 | light.acceleration = FSS.Vector3.create();
214 | light.force = FSS.Vector3.create();
215 | }
216 | }
217 |
218 | function resize(width, height) {
219 | renderer.setSize(width, height);
220 | FSS.Vector3.set(center, renderer.halfWidth, renderer.halfHeight);
221 | createMesh();
222 | }
223 |
224 | var paused = false;
225 |
226 | function animate() {
227 | now = Date.now() - start;
228 | update();
229 | render();
230 | if (!paused)
231 | requestAnimationFrame(animate);
232 | }
233 |
234 | function pause() {
235 | paused = true;
236 | }
237 |
238 | function resume() {
239 | paused = false;
240 | animate();
241 | }
242 |
243 | function update() {
244 | var ox, oy, oz, l, light, v, vertex, offset = MESH.depth/2;
245 |
246 | // Update Bounds
247 | FSS.Vector3.copy(LIGHT.bounds, center);
248 | FSS.Vector3.multiplyScalar(LIGHT.bounds, LIGHT.xyScalar);
249 |
250 | // Update Attractor
251 | FSS.Vector3.setZ(attractor, LIGHT.zOffset);
252 |
253 | // Overwrite the Attractor position
254 | if (LIGHT.autopilot) {
255 | ox = Math.sin(LIGHT.step[0] * now * LIGHT.speed);
256 | oy = Math.cos(LIGHT.step[1] * now * LIGHT.speed);
257 | FSS.Vector3.set(attractor,
258 | LIGHT.bounds[0]*ox,
259 | LIGHT.bounds[1]*oy,
260 | LIGHT.zOffset);
261 | }
262 |
263 | // Animate Lights
264 | for (l = scene.lights.length - 1; l >= 0; l--) {
265 | light = scene.lights[l];
266 |
267 | // Reset the z position of the light
268 | FSS.Vector3.setZ(light.position, LIGHT.zOffset);
269 |
270 | // Calculate the force Luke!
271 | var D = Math.clamp(FSS.Vector3.distanceSquared(light.position, attractor), LIGHT.minDistance, LIGHT.maxDistance);
272 | var F = LIGHT.gravity * light.mass / D;
273 | FSS.Vector3.subtractVectors(light.force, attractor, light.position);
274 | FSS.Vector3.normalise(light.force);
275 | FSS.Vector3.multiplyScalar(light.force, F);
276 |
277 | // Update the light position
278 | FSS.Vector3.set(light.acceleration);
279 | FSS.Vector3.add(light.acceleration, light.force);
280 | FSS.Vector3.add(light.velocity, light.acceleration);
281 | FSS.Vector3.multiplyScalar(light.velocity, LIGHT.dampening);
282 | FSS.Vector3.limit(light.velocity, LIGHT.minLimit, LIGHT.maxLimit);
283 | FSS.Vector3.add(light.position, light.velocity);
284 | }
285 |
286 | // Animate Vertices
287 | for (v = geometry.vertices.length - 1; v >= 0; v--) {
288 | vertex = geometry.vertices[v];
289 | ox = Math.sin(vertex.time + vertex.step[0] * now * MESH.speed);
290 | oy = Math.cos(vertex.time + vertex.step[1] * now * MESH.speed);
291 | oz = Math.sin(vertex.time + vertex.step[2] * now * MESH.speed);
292 | FSS.Vector3.set(vertex.position,
293 | MESH.xRange*geometry.segmentWidth*ox,
294 | MESH.yRange*geometry.sliceHeight*oy,
295 | MESH.zRange*offset*oz - offset);
296 | FSS.Vector3.add(vertex.position, vertex.anchor);
297 | }
298 |
299 | // Set the Geometry to dirty
300 | geometry.dirty = true;
301 | }
302 |
303 | function render() {
304 | renderer.render(scene);
305 | }
306 |
307 | function addEventListeners() {
308 | window.addEventListener('resize', onWindowResize);
309 | container.addEventListener('mousemove', onMouseMove);
310 | }
311 |
312 | //------------------------------
313 | // Callbacks
314 | //------------------------------
315 | function onMouseMove(event) {
316 | FSS.Vector3.set(attractor, event.x, renderer.height - event.y);
317 | FSS.Vector3.subtract(attractor, center);
318 | }
319 |
320 | function onWindowResize(event) {
321 | resize(container.offsetWidth, container.offsetHeight);
322 | render();
323 | }
324 |
325 | window.bgAnimation = {
326 | pause: pause,
327 | resume: resume
328 | }
329 |
330 | // Let there be light!
331 | initialise();
332 |
333 | })();
334 |
--------------------------------------------------------------------------------
/css/fontello-embedded.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'fontello';
3 | src: url('../font/fontello.eot?31072048');
4 | src: url('../font/fontello.eot?31072048#iefix') format('embedded-opentype'),
5 | url('../font/fontello.svg?31072048#fontello') format('svg');
6 | font-weight: normal;
7 | font-style: normal;
8 | }
9 | @font-face {
10 | font-family: 'fontello';
11 | src: url('data:application/octet-stream;base64,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') format('woff'),
12 | url('data:application/octet-stream;base64,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') format('truetype');
13 | }
14 | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
15 | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
16 | /*
17 | @media screen and (-webkit-min-device-pixel-ratio:0) {
18 | @font-face {
19 | font-family: 'fontello';
20 | src: url('../font/fontello.svg?31072048#fontello') format('svg');
21 | }
22 | }
23 | */
24 |
25 | [class^="icon-"]:before, [class*=" icon-"]:before {
26 | font-family: "fontello";
27 | font-style: normal;
28 | font-weight: normal;
29 | speak: none;
30 |
31 | display: inline-block;
32 | text-decoration: inherit;
33 | width: 1em;
34 | margin-right: .2em;
35 | text-align: center;
36 | /* opacity: .8; */
37 |
38 | /* For safety - reset parent styles, that can break glyph codes*/
39 | font-variant: normal;
40 | text-transform: none;
41 |
42 | /* fix buttons height, for twitter bootstrap */
43 | line-height: 1em;
44 |
45 | /* Animation center compensation - margins should be symmetric */
46 | /* remove if not needed */
47 | margin-left: .2em;
48 |
49 | /* you can be more comfortable with increased icons size */
50 | /* font-size: 120%; */
51 |
52 | /* Uncomment for 3D effect */
53 | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
54 | }
55 | .icon-level-up:before { content: '\e801'; } /* '' */
56 | .icon-cw-1:before { content: '\e802'; } /* '' */
57 | .icon-language:before { content: '\e803'; } /* '' */
--------------------------------------------------------------------------------
/client.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Copyright (c) 2013 Mustafa İlhan released under the MIT license
3 | */
4 |
5 | (function(){
6 |
7 | //------------------------------
8 | // Shared
9 | //------------------------------
10 | var SERVER_URL = "http://shareddeath.nodejitsu.com"
11 | , LANGUAGE = "en"
12 | , SOCKET_TYPE = "tweet_en";
13 |
14 | window.exitApp = function() {};
15 | window.refreshApp = function() {};
16 | //window.bgAnimation = { pause, resume };
17 |
18 | // Hides mobile browser's address bar when page is done loading.
19 | window.addEventListener('load', function(e) {
20 | setTimeout(function() { window.scrollTo(0, 1); }, 1);
21 | }, false);
22 |
23 | // Check for touch device behaviour and events for touch device
24 | if (!!('ontouchstart' in window)) {
25 | $(".right-icons .icon").css({ display: "none" });
26 | $(".language-selection").css({ "margin-right": 0, opacity: 1 });
27 | }
28 |
29 | function _(id) {
30 | return document.getElementById(id);
31 | }
32 |
33 | function changeLanguage(lang) {
34 | if (lang != LANGUAGE) {
35 | LANGUAGE = lang;
36 | if (LANGUAGE == "en") {
37 | SOCKET_TYPE = "tweet_en";
38 | _('langEN').className = 'language active';
39 | _('langTR').className = 'language';
40 |
41 | _('app1Title').innerHTML = "GRAVESTONE";
42 | _('app2Title').innerHTML = "TWO-DOOR INN";
43 | _('app3Title').innerHTML = "TOMB";
44 | _('aboutTitle').innerHTML = "ABOUT";
45 | _('aboutBody').innerHTML = 'Shared Death is a web-based artwork which filters shared thoughts containing keywords like "death", "dying" from the Twitter in real time. It is purpose is to help people better understand how other people thinks and feels about the shared destiny of all living things in the planet. You can participate in this experiment by sending tweet with #death keyword. Read More Mustafa İlhan - @mustilica';
46 |
47 | } else {
48 | SOCKET_TYPE = "tweet_tr";
49 | _('langTR').className = 'language active';
50 | _('langEN').className = 'language';
51 |
52 | _('app1Title').innerHTML = "MEZAR TAŞI";
53 | _('app2Title').innerHTML = "İKİ KAPILI HAN";
54 | _('app3Title').innerHTML = "MAKBER";
55 | _('aboutTitle').innerHTML = "HAKKINDA";
56 | _('aboutBody').innerHTML = 'Paylaşılan Ölüm gerçek zamanlı olarak Twitter\'da içinde "ölüm", "ölüyorum" gibi anahtar kelimeleri içeren düşüncelerin filtrelenerek gösterildiği web tabanlı bir sanat uygulamasıdır. Amacı kullanıcıya diğer insanların gezegende yaşayan tüm canlıların ortak kaderi -ölüm- hakkında ne düşündüklerini ve nasıl hissettiklerini anlatmaya yardımcı olmaktır. Siz de #ölüm anahtar kelimesini içeren bir tweet atarak bu deneye katılabilirsiniz. Devamı Mustafa İlhan - @mustilica';
57 | }
58 | }
59 | }
60 |
61 | //------------------------------
62 | // Home
63 | //------------------------------
64 | function openApp(app) {
65 | $("#home").fadeOut("easing-out", function() {
66 | $("#container").fadeOut("easing-out", function() {
67 | window.bgAnimation.pause();
68 | window.exitApp = app();
69 | });
70 | });
71 | }
72 |
73 | function goBackToHome() {
74 | window.bgAnimation.resume();
75 |
76 | $("#backIcon, #refreshIcon").css("display", "none");
77 | $("#rightIcons").css("display", "inline");
78 |
79 | $("#container").fadeIn("easing-out", function() {
80 | $("#home").fadeIn("easing-out", function() {
81 |
82 | });
83 | });
84 | }
85 |
86 | //------------------------------
87 | // App1
88 | //------------------------------
89 | function mezarTasi() {
90 | // Display scren
91 | $("#app1").css("display", "block");
92 | $("#backIcon").css("display", "inline");
93 | $("#refreshIcon").css("display", "none");
94 | $("#rightIcons").css("display", "none");
95 |
96 | var queue = []
97 | , waiting = true // isWaiting to display a tweet.
98 | , waitTextTimeout
99 | , writeTextTimeout
100 | , textTime = 64 // msec.
101 | , animationTime = 400 // msec.
102 | , tweetList = $('ul')
103 | , listElementHeight = 0
104 | , socket = io.connect(SERVER_URL, {'force new connection':true})
105 | , maxIndexCount = Math.floor(tweetList.width() / (parseInt($("li").css("font-size").substring(0,2), 10)/2) ) - 1; // TODO Window resizeda tekrar kontrol et.
106 |
107 | /**
108 | * Display first tweet of queue.
109 | */
110 | function displayTwit() {
111 | if (queue.length) {
112 | var data = queue.shift();
113 | if (typeof data != 'undefined') {
114 | writeText(data, 1);
115 | waiting = false;
116 | } else {
117 | console.warn("data is undefined.");
118 | }
119 | } else {
120 | // if queue is empty then wait for new tweets.
121 | waiting = true;
122 | }
123 | }
124 |
125 | /**
126 | * Writes tweets to the page.
127 | */
128 | function writeText(data, index) {
129 | // Stop waitText animation
130 | clearTimeout(waitTextTimeout);
131 | // Get current list element
132 | var current = $("#current");
133 |
134 | if (typeof current[0] == 'undefined') {
135 | console.warn("current is undefined");
136 | return;
137 | }
138 |
139 | // Write text
140 | current.text(data.text.substring(0, index));
141 |
142 | if (index <= data.text.length - 1) {
143 |
144 | // Animtion check for multiple line tweets
145 | if (index % maxIndexCount == 0) {
146 |
147 | if (!listElementHeight) {
148 | // Calculate list element height
149 | listElementHeight = current.outerHeight();
150 | }
151 |
152 | // If tweet is multiple line animate it.
153 | current.animate({height: current.height() + listElementHeight}, animationTime, function() {
154 | writeTextTimeout = setTimeout(writeText, textTime, data, index+1);
155 | });
156 | return;
157 | }
158 |
159 | // Call for the next index.
160 | writeTextTimeout = setTimeout(writeText, textTime, data, index+1);
161 |
162 | } else {
163 | // Writing tweet finished.
164 | // Change style and animate list element.
165 | current.removeAttr('id');
166 | current.delay(animationTime).animate({opacity: .6}, animationTime, function () {
167 | // Insert new one
168 | tweetList.prepend('