var LyricsSearch = null;if (document.addEventListener && Event.prototype.__defineSetter__) {function patchEvents(eventNames){for (var i=0; i<eventNames.length; ++i) {document.addEventListener(eventNames[i],function (e){window.event = e},true)}};patchEvents(['click', 'dblclick', 'mouseover', 'mouseout', 'mousedown', 'mouseup', 'mousemove', 'keydown', 'keypress', 'keyup'])};function truncate(s, len){len = len || 15;if (s.length > len) {s = s.substr(0, len) + '\u2026'};return s};var Engine = {};Engine.Observer = {observers : [],observe : function(event, method){if ('undefined' == typeof this.observers[event]) {this.observers[event] = []};this.observers[event].push(method)},stopObserving : function(event, method){this.observers[event] = this.observers[event].without(mehod)},notify : function(event){console.info('Event: %s', event, $A(arguments).slice(1));if (this.observers[event]) {var len = this.observers[event].length;for (var i=0; i<len; ++i) {var observer = this.observers[event][i];if (null != observer) {try {observer.apply(observer, $A(arguments).slice(1))}catch (e) {if (e != $break) {throw e};return false}}}}}};Engine.ResultRenderer = Class.create();Engine.ResultRenderer.prototype = {initialize : function(ls, container){this.container = $(container);this.columns = ls.columns;this.finished = true;this.mrs = ls.load_count;var ul = document.createElement('ul');var li = document.createElement('li');li.style.display = 'none';ul.appendChild(li);for (var i=1; i<=this.columns; ++i) {var list = ul.cloneNode(true);list.setAttribute('id', 'res_col' + i);this.container.appendChild(list)};ls.observe('onrender', this.render.bind(this));ls.observe('onclear', this.erase.bind(this))},erase : function(dir){if (0 != dir) {this.finished = false;new Effect.Move(this.container,{x : -dir * 350,y : 0,mode : 'absolute',duration : 1,queue : {position : 'front',scope : 'render'},afterFinish : function(e){$(e.element).style.left = (dir * 350) + 'px';this.finished = true}.bind(this)})};this.erase_dir = dir},render : function(json, onclick, rsr){console.group('render');console.log('json: %o', json);if (false == this.finished) {setTimeout(function(){this.render(json, onclick, rsr)}.bind(this),100);return};var s = '<li style="display: none"></li>';var tpl = new Template('<li><a href="#" onclick="#{onclick}()" title="#{full}"#{id}>#{short}</a></li>');var tpl2 = new Template('<li><a href="#" onclick="LyricsSearch.click_artist()" title="#{artist}">#{artist_sh}</a> &gt; ' +'<a href="#" onclick="LyricsSearch.click_album()" rel="#{artist}" title="#{album}">#{album_sh}</a> &gt; ' +'<a href="#" onclick="LyricsSearch.click_song()" title="#{full}" #{id}>#{short}</a></li>');var cols = (null == rsr) ? this.columns : 1;var list = json.data;var len = list.size();var cnt = Math.ceil(len/this.columns);if (null == rsr) {$('res_col1').removeClassName('search_results')}else {$('res_col1').addClassName('search_results');cnt = this.mrs/this.columns;for (var i=2; i<=this.columns; ++i) {$('res_col' + i).innerHTML = ''}};for (var i=0; i<cols; ++i) {var from = i*cnt;var to = (len < cnt*(i+1)) ? len : cnt*(i+1);var html = s;for (j=from; j<to; ++j) {var data = {'short' : list[j]['short'],'full' : list[j]['full']};var template = tpl;if (null != list[j]['id']) {data.id = ' id="l' + list[j]['id'] + '"';data.onclick = ('string' == typeof onclick) ? onclick : onclick[1];if (null != list[j]['album']) {data['short'] = truncate(list[j]['short']);data['artist_sh'] = truncate(list[j].artist);data['album_sh'] = truncate(list[j].album);data['artist'] = list[j].artist;data['album'] = list[j].album;template = tpl2}}else {data.onclick = ('string' == typeof onclick) ? onclick : onclick[0]};html += template.evaluate(data)}$('res_col' + (i+1)).innerHTML = html;html = ''};if (0 != this.erase_dir) {new Effect.Move(this.container,{x : 0,y : 0,mode : 'absolute',duration : 1,queue : {position : 'end',scope : 'render'}})};setTimeout("$('indicator').style.display = 'none'", 100);console.groupEnd()}};Engine.Response = Class.create();Engine.Response.prototype = {initialize : function(what){this.what = what},get : function(){return this.what}};Engine.ResponseCache = Class.create();Engine.ResponseCache.prototype = {artists_cache : {},albums_cache : {},songs_cache : {},search_cache : {},clear : function(){this.artists_cache = {};this.albums_cache = {};this.songs_cache = {};this.search_cache = {}},initialize : function(ls){ls.observe('onartistsloaded',function(json){this.artists_cache[json.text][json.from] = json}.bind(this));ls.observe('onsearchloaded',function(json){this.search_cache[json.what][json.from] = json}.bind(this));ls.observe('onalbumsloaded',function(json){this.albums_cache[json.artist][json.from] = json}.bind(this));ls.observe('onsongsloaded',function(json){this.songs_cache[json.artist][json.album][json.from] = json}.bind(this));ls.observe('onbeforeloadartists',function(params){if (null == this.artists_cache[params.letter]) {console.info('Creating the cache for ', params.letter);this.artists_cache[params.letter] = {}};if (null != this.artists_cache[params.letter][params.from]) {console.info('Returning cached data: %o', this.artists_cache[params.letter][params.from]);throw new Engine.Response(this.artists_cache[params.letter][params.from])}}.bind(this));ls.observe('onbeforeloadsearch',function(params){if (null == this.search_cache[params.what]) {console.info('Creating the cache for ', params.what);this.search_cache[params.what] = {}};if (null != this.search_cache[params.what][params.from]) {console.info('Returning cached data: %o', this.search_cache[params.what][params.from]);throw new Engine.Response(this.search_cache[params.what][params.from])}}.bind(this));ls.observe('onbeforeloadalbums',function(params){if (null == this.albums_cache[params.artist]) {console.info('Creating the cache for ', params.artist);this.albums_cache[params.artist] = {}};if (null != this.albums_cache[params.artist][params.from]) {console.info('Returning cached data: %o', this.albums_cache[params.artist][params.from]);throw new Engine.Response(this.albums_cache[params.artist][params.from])}}.bind(this));ls.observe('onbeforeloadsongs',function(params){if (null == this.songs_cache[params.artist]) {console.info('Creating the cache for ', params.artist);this.songs_cache[params.artist] = {}};if (null == this.songs_cache[params.artist][params.album]) {console.info('Creating the cache for ', params.artist, '::', params.album);this.songs_cache[params.artist][params.album] = {}};if (null != this.songs_cache[params.artist][params.album][params.from]) {console.info('Returning cached data: %o', this.songs_cache[params.artist][params.album][params.from]);throw new Engine.Response(this.songs_cache[params.artist][params.album][params.from])}}.bind(this))}};Engine.Scroller = Class.create();Engine.Scroller.prototype = {initialize : function(ls, prev, next, images){this.prev = $(prev);this.next = $(next);this.step = ls.load_count;this.ls = ls;this.images = Object.extend({'prev_a' : this.prev.src,'prev_d' : this.prev.src,'next_a' : this.next.src,'next_d' : this.next.src},images);this.disablePrev();this.disableNext();ls.observe('onbeforeloadartists_0', this.disableHandlers.bind(this));ls.observe('onbeforeloadsearch_0', this.disableHandlers.bind(this));ls.observe('onbeforeloadalbums_0', this.disableHandlers.bind(this));ls.observe('onbeforeloadsongs_0', this.disableHandlers.bind(this));ls.observe('onbeforedefsearch_0', this.disableHandlers.bind(this));ls.observe('onartistsloaded', this.onArtistsLoaded.bind(this));ls.observe('onartistsloaded_nc', this.onArtistsLoaded.bind(this));ls.observe('onsearchloaded', this.onSearchLoaded.bind(this));ls.observe('onsearchloaded_nc', this.onSearchLoaded.bind(this));ls.observe('onalbumsloaded', this.onAlbumsLoaded.bind(this));ls.observe('onalbumsloaded_nc', this.onAlbumsLoaded.bind(this));ls.observe('onsongsloaded', this.onSongsLoaded.bind(this));ls.observe('onsongsloaded_nc', this.onSongsLoaded.bind(this));ls.observe('ondefresloaded', this.onDefResLoaded.bind(this));ls.observe('ondefresloaded_nc', this.onDefResLoaded.bind(this))},disable : function(){this.disablePrev();this.disableNext()},disableHandlers : function(){this.prev.onclick = Prototype.emptyFunction;this.next.onclick = Prototype.emptyFunction},disablePrev : function(){this.prev.onclick = Prototype.emptyFunction;this.prev.src = this.images.prev_d},disableNext : function(){this.next.onclick = Prototype.emptyFunction;this.next.src = this.images.next_d},enablePrev : function(){this.prev.src = this.images.prev_a},enableNext : function(){this.next.src = this.images.next_a},onArtistsLoaded : function(json){if (0 != json.from) {this.enablePrev();this.prev.onclick = function(){this.ls.loadArtists({'letter' : json.text,'from' : json.from - this.step,'dir' : -1})}.bind(this)}else {this.disablePrev()};if (json.from + json.count < json.total) {this.enableNext();this.next.onclick = function(){this.ls.loadArtists({'letter' : json.text,'from' : json.from + this.step,'dir' : 1})}.bind(this)}else {this.disableNext()}},onSearchLoaded : function(json){if (0 != json.from) {this.enablePrev();this.prev.onclick = function(){this.ls.searchArtistOrSong({'what' : json.what,'from' : json.from - this.step,'dir' : -1})}.bind(this)}else {this.disablePrev()};if (json.from + json.count < json.total) {this.enableNext();this.next.onclick = function(){this.ls.searchArtistOrSong({'what' : json.text,'from' : json.from + this.step,'dir' : 1})}.bind(this)}else {this.disableNext()}},onAlbumsLoaded : function(json){if (0 != json.from) {this.enablePrev();this.prev.onclick = function(){this.ls.loadAlbums({'artist' : json.artist,'from' : json.from - this.step,'dir' : -1})}.bind(this)}else {this.disablePrev()};if (json.from + json.count < json.total) {this.enableNext();this.next.onclick = function(){this.ls.loadAlbums({'artist' : json.artist,'from' : json.from + this.step,'dir' : 1})}.bind(this)}else {this.disableNext()}},onSongsLoaded : function(json){if (0 != json.from) {this.enablePrev();this.prev.onclick = function(){this.ls.loadSongs({'album' : json.album,'from' : json.from - this.step,'dir' : -1})}.bind(this)}else {this.disablePrev()};if (json.from + json.count < json.total) {this.enableNext();this.next.onclick = function(){this.ls.loadSongs({'album' : json.album,'from' : json.from + this.step,'dir' : 1})}.bind(this)}else {this.disableNext()}},onDefResLoaded : function(json){if (0 != json.from) {this.enablePrev();this.prev.onclick = function(){this.ls.defaultSearch({ 'from' : json.from - this.step, 'dir' : -1 })}.bind(this)}else {this.disablePrev()};if (json.from + json.count < json.total) {this.enableNext();this.next.onclick = function(){this.ls.defaultSearch({ 'from' : json.from + this.step, 'dir' : 1 })}.bind(this)}else {this.disableNext()}}};Engine.Breadcrumb = Class.create();Engine.Breadcrumb.prototype = {initialize : function(ls, container, lb){this.container = $(container);this.ls = ls;this.lb = lb;var li = document.createElement('li');var a = document.createElement('a');a.setAttribute('href', '#');a.style.display = 'none';li.appendChild(a);$A(['bc_default', 'bc_letter', 'bc_artist', 'bc_album', 'bc_song']).each(function(id){var item = li.cloneNode(true);item.firstChild.setAttribute('id', id);this.container.appendChild(item)}.bind(this));$('bc_default').appendChild(document.createTextNode('Artist'));$('bc_default').style.display = '';Event.observe($('bc_default'),'click',function(e){Event.stop(e);$('bc_letter').hide();$('bc_artist').hide();$('bc_album').hide();$('bc_song').hide();this.ls.defaultSearch({ from : 0 })}.bindAsEventListener(this));lb.observe('onletterclicked', this.showArtist.bind(this));ls.observe('onsearch', this.showSearch.bind(this));ls.observe('onartistclicked',function(params){$('bc_artist').title = params.artist;$('bc_artist').innerHTML = truncate(params.artist);$('bc_artist').show();$('bc_album').hide();$('bc_song').hide();$('bc_artist').onclick = function(){$('bc_album').hide();$('bc_song').hide();this.ls.loadAlbums(params);return false}.bind(this)}.bind(this));ls.observe('onalbumclicked',function(params){$('bc_album').title = params.album;$('bc_album').innerHTML = truncate(params.album);$('bc_album').show();$('bc_song').hide();$('bc_album').onclick = function(){$('bc_song').hide();this.ls.loadSongs(params);return false}.bind(this)}.bind(this))},showArtist : function(params){$('bc_letter').title = params.letter;$('bc_letter').innerHTML = truncate(params.letter);$('bc_letter').show();$('bc_artist').hide();$('bc_album').hide();$('bc_song').hide();$('bc_letter').onclick = function(){$('bc_artist').hide();$('bc_album').hide();$('bc_song').hide();this.ls.loadArtists(params);return false}.bind(this)},showSearch : function(params){$('bc_letter').title = params.what;$('bc_letter').innerHTML = truncate(params.what);$('bc_letter').show();$('bc_artist').hide();$('bc_album').hide();$('bc_song').hide();$('bc_letter').onclick = function(){$('bc_artist').hide();$('bc_album').hide();$('bc_song').hide();this.ls.searchArtistOrSong(params);return false}.bind(this)}};Engine.LetterBar = Class.create();Engine.LetterBar.prototype = {initialize : function(ls, container){this.container = $(container);this.ls = ls;var a = document.createElement('a');var space = document.createTextNode(' ');a.setAttribute('href', '#');$A(['0-9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']).each(function(letter){var link = a.cloneNode(true);link.appendChild(document.createTextNode(letter));this.container.appendChild(space.cloneNode(true));this.container.appendChild(link);Event.observe(link, 'click', this.click_letter.bindAsEventListener(this, letter))}.bind(this))},deactivate : function(){$A(this.container.getElementsByTagName('a')).each(function(node){Element.removeClassName(node, 'active')})},activate : function(el){this.deactivate();Element.addClassName($(el), 'active')},click_letter : function(e){Event.stop(e);this.activate(Event.element(e));var data = $A(arguments);data.shift();var params = {'letter' : data[0],'from' : 0};this.notify('onletterclicked', params);this.ls.loadArtists(params)}};Object.extend(Engine.LetterBar.prototype, Engine.Observer);Engine.LyricsSearch = Class.create();Engine.LyricsSearch.prototype = {initialize : function(count, columns){this.load_count = count;this.columns = columns},makeRequest : function(method, param, callback){if ('string' == typeof(param)) {param = { 'param' : param }};if (!param) {param = {}};param.method = method;var options = {asynchronous : true,method : 'post',evalScripts : true,parameters : Hash.toQueryString(param),onLoading : function(request){$('indicator').show()},onException : function(t, e){$('indicator').style.display = 'none'},onComplete : function(response, json){$('indicator').style.display = 'none'},onSuccess : function(transport, json){$('indicator').style.display = 'none';if (options['internal_onComplete']) {try {options['internal_onComplete'](transport, json)}catch(e) {alert(e.toSource())}}},onFailure : function(request){$('indicator').style.display = 'none';alert('error', 'There was an error communicating with the server')}};if (callback) {options['internal_onComplete'] = callback};console.log('makeRequest: %o', options);new Ajax.Request(base_url + '/ajax.php', options)},artists_loaded : function(transport, json){if (null != transport) {this.notify('onartistsloaded', json)}else {this.notify('onartistsloaded_nc', json)};this.notify('onrender', json, 'LyricsSearch.click_artist')},search_loaded : function(transport, json){console.group('search_loaded');console.log('json: %o', json);if (null != transport) {this.notify('onsearchloaded', json)}else {this.notify('onsearchloaded_nc', json)};this.notify('onrender', json, ['LyricsSearch.click_artist', 'LyricsSearch.click_song'], 1);console.groupEnd()},albums_loaded : function(transport, json){if (null != transport) {this.notify('onalbumsloaded', json)}else {this.notify('onalbumsloaded_nc', json)};this.notify('onrender', json, 'LyricsSearch.click_album')},songs_loaded : function(transport, json){if (null != transport) {this.notify('onsongsloaded', json)}else {this.notify('onsongsloaded_nc', json)};this.notify('onrender', json, 'LyricsSearch.click_song')},defres_loaded : function(transport, json){if (null != transport) {this.notify('ondefresloaded', json)}else {this.notify('ondefresloaded_nc', json)};this.notify('onrender', json, 'LyricsSearch.click_artist')},lyrics_loaded : function(transport, json){$('test').innerHTML = transport.responseText},click_artist : function(){var e = window.event;Event.stop(e);var artist = Event.element(e).title;var params = {'artist' : artist,'from' : 0};this.notify('onartistclicked', params);this.artist = artist;this.loadAlbums(params)},click_album : function(){var e = window.event;Event.stop(e);var album = Event.element(e).title;if ('' != Event.element(e).rel) {this.artist = Event.element(e).rel};var params = {'album' : album,'from' : 0};this.notify('onalbumclicked', params);this.album = album;this.loadSongs(params)},click_song : function(){console.group('click_song');var e = window.event;Event.stop(e);var song = Event.element(e).title;var id = Event.element(e).id.substr(1);var params = {'song' : song,'from' : 0,'id' : id};this.notify('onsongclicked', params);this.loadLyrics(params);console.groupEnd()},loadArtists : function(params){if (!params) {params = {}};params['count'] = this.load_count;if (!params.dir) {params.dir = 0};this.notify('onclear', params.dir);this.notify('onbeforeloadartists_0', params);try {this.notify('onbeforeloadartists', params);throw ""}catch (e) {if (e instanceof Engine.Response) {this.artists_loaded(null, e.get())}else {this.makeRequest('loadArtists', params, this.artists_loaded.bind(this))}}},searchArtistOrSong : function(what){console.group('searchArtistOrSong');var params;if ('string' == typeof what) {params = {'from' : 0,'count' : parseInt(this.load_count/this.columns, 10),'what' : what,'dir' : 0}}else {params = {'from' : what.from || 0,'count' : parseInt(this.load_count/this.columns, 10),'what' : what.what || '','dir' : what.dir || 0}};this.notify('onclear', params.dir);this.notify('onbeforeloadsearch_0', params);try {this.notify('onbeforeloadsearch', params);throw ""}catch (e) {this.notify('onsearch', params);if (e instanceof Engine.Response) {this.search_loaded(null, e.get())}else {this.makeRequest('search', params, this.search_loaded.bind(this))}};console.groupEnd()},loadAlbums : function(params){if (!params) {params = {}};params['count'] = this.load_count;if (!params.dir) {params.dir = 0};this.notify('onclear', params.dir);this.notify('onbeforeloadalbums_0', params);try {this.notify('onbeforeloadalbums', params);throw ""}catch (e) {if (e instanceof Engine.Response) {this.albums_loaded(null, e.get())}else {this.makeRequest('loadAlbums', params, this.albums_loaded.bind(this))}}},loadSongs : function(params){if (!params) {params = {}};params['count'] = this.load_count;params['artist'] = this.artist;if (!params.dir) {params.dir = 0};this.notify('onclear', params.dir);this.notify('onbeforeloadsongs_0', params);try {this.notify('onbeforeloadsongs', params);throw ""}catch (e) {if (e instanceof Engine.Response) {this.songs_loaded(null, e.get())}else {this.makeRequest('loadSongs', params, this.songs_loaded.bind(this))}}},loadLyrics : function(params){console.group('loadLyrics: %o', params);if (!params) {params = { id : 0 }};this.makeRequest('loadLyrics', { id : parseInt(params.id, 10) });console.groupEnd()},defaultSearch : function(params){if (!params) {params = {}};params['count'] = this.load_count;if (!params.dir) {params.dir = 0};this.notify('onclear', params.dir);this.notify('onbeforedefsearch_0', params);try {this.notify('onbeforedefsearch', params);throw ""}catch (e) {if (e instanceof Engine.Response) {this.defres_loaded(null, e.get())}else {this.makeRequest('defaultSearch', params, this.defres_loaded.bind(this))}}}};Object.extend(Engine.LyricsSearch.prototype, Engine.Observer);function onLoad(){LyricsSearch = new Engine.LyricsSearch(12, 2);var lb = new Engine.LetterBar(LyricsSearch, 'letters');var bc = new Engine.Breadcrumb(LyricsSearch, 'breadcrumb', lb);var rc = new Engine.ResponseCache(LyricsSearch);var s = new Engine.Scroller(LyricsSearch, 'prev', 'next', { prev_d : 'images/arrow-prev-.gif', next_d : 'images/arrow-next-.gif' });var rr = new Engine.ResultRenderer(LyricsSearch, 'result');setTimeout("LyricsSearch.defaultSearch({ from : 0 })", 150)};Event.observe(window, 'load', onLoad);
