You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
7.2 KiB
242 lines
7.2 KiB
6 months ago
|
function Music() {
|
||
|
this.init();
|
||
|
}
|
||
|
(function () {
|
||
|
var pages = [],
|
||
|
panels = [],
|
||
|
selectedItem = null;
|
||
|
Music.prototype = {
|
||
|
total: 70,
|
||
|
pageSize: 10,
|
||
|
dataUrl: 'http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common',
|
||
|
playerUrl: 'http://box.baidu.com/widget/flash/bdspacesong.swf',
|
||
|
|
||
|
init: function () {
|
||
|
var me = this;
|
||
|
domUtils.on($G('J_searchName'), 'keyup', function (event) {
|
||
|
var e = window.event || event;
|
||
|
if (e.keyCode == 13) {
|
||
|
me.dosearch();
|
||
|
}
|
||
|
});
|
||
|
domUtils.on($G('J_searchBtn'), 'click', function () {
|
||
|
me.dosearch();
|
||
|
});
|
||
|
},
|
||
|
callback: function (data) {
|
||
|
var me = this;
|
||
|
me.data = data.song_list;
|
||
|
setTimeout(function () {
|
||
|
$G('J_resultBar').innerHTML = me._renderTemplate(data.song_list);
|
||
|
}, 300);
|
||
|
},
|
||
|
dosearch: function () {
|
||
|
var me = this;
|
||
|
selectedItem = null;
|
||
|
var key = $G('J_searchName').value;
|
||
|
if (utils.trim(key) == '') return false;
|
||
|
key = encodeURIComponent(key);
|
||
|
me._sent(key);
|
||
|
},
|
||
|
doselect: function (i) {
|
||
|
var me = this;
|
||
|
if (typeof i == 'object') {
|
||
|
selectedItem = i;
|
||
|
} else if (typeof i == 'number') {
|
||
|
selectedItem = me.data[i];
|
||
|
}
|
||
|
},
|
||
|
onpageclick: function (id) {
|
||
|
var me = this;
|
||
|
for (var i = 0; i < pages.length; i++) {
|
||
|
$G(pages[i]).className = 'pageoff';
|
||
|
$G(panels[i]).className = 'paneloff';
|
||
|
}
|
||
|
$G('page' + id).className = 'pageon';
|
||
|
$G('panel' + id).className = 'panelon';
|
||
|
},
|
||
|
listenTest: function (elem) {
|
||
|
var me = this,
|
||
|
view = $G('J_preview'),
|
||
|
is_play_action = elem.className == 'm-try',
|
||
|
old_trying = me._getTryingElem();
|
||
|
|
||
|
if (old_trying) {
|
||
|
old_trying.className = 'm-try';
|
||
|
view.innerHTML = '';
|
||
|
}
|
||
|
if (is_play_action) {
|
||
|
elem.className = 'm-trying';
|
||
|
view.innerHTML = me._buildMusicHtml(me._getUrl(true));
|
||
|
}
|
||
|
},
|
||
|
_sent: function (param) {
|
||
|
var me = this;
|
||
|
$G('J_resultBar').innerHTML = '<div class="loading"></div>';
|
||
|
|
||
|
utils.loadFile(document, {
|
||
|
src:
|
||
|
me.dataUrl +
|
||
|
'&query=' +
|
||
|
param +
|
||
|
'&page_size=' +
|
||
|
me.total +
|
||
|
'&callback=music.callback&.r=' +
|
||
|
Math.random(),
|
||
|
tag: 'script',
|
||
|
type: 'text/javascript',
|
||
|
defer: 'defer',
|
||
|
});
|
||
|
},
|
||
|
_removeHtml: function (str) {
|
||
|
var reg = /<\s*\/?\s*[^>]*\s*>/gi;
|
||
|
return str.replace(reg, '');
|
||
|
},
|
||
|
_getUrl: function (isTryListen) {
|
||
|
var me = this;
|
||
|
var param =
|
||
|
'from=tiebasongwidget&url=&name=' +
|
||
|
encodeURIComponent(me._removeHtml(selectedItem.title)) +
|
||
|
'&artist=' +
|
||
|
encodeURIComponent(me._removeHtml(selectedItem.author)) +
|
||
|
'&extra=' +
|
||
|
encodeURIComponent(me._removeHtml(selectedItem.album_title)) +
|
||
|
'&autoPlay=' +
|
||
|
isTryListen +
|
||
|
'' +
|
||
|
'&loop=true';
|
||
|
return me.playerUrl + '?' + param;
|
||
|
},
|
||
|
_getTryingElem: function () {
|
||
|
var s = $G('J_listPanel').getElementsByTagName('span');
|
||
|
|
||
|
for (var i = 0; i < s.length; i++) {
|
||
|
if (s[i].className == 'm-trying') return s[i];
|
||
|
}
|
||
|
return null;
|
||
|
},
|
||
|
_buildMusicHtml: function (playerUrl) {
|
||
|
var html =
|
||
|
'<embed class="BDE_try_Music" allowfullscreen="false" pluginspage="http://www.macromedia.com/go/getflashplayer"';
|
||
|
html += ' src="' + playerUrl + '"';
|
||
|
html += ' width="1" height="1" style="position:absolute;left:-2000px;"';
|
||
|
html += ' type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false"';
|
||
|
html += ' menu="false" allowscriptaccess="never" scale="noborder">';
|
||
|
return html;
|
||
|
},
|
||
|
_byteLength: function (str) {
|
||
|
return str.replace(/[^\u0000-\u007f]/g, '\u0061\u0061').length;
|
||
|
},
|
||
|
_getMaxText: function (s) {
|
||
|
var me = this;
|
||
|
s = me._removeHtml(s);
|
||
|
if (me._byteLength(s) > 12) return s.substring(0, 5) + '...';
|
||
|
if (!s) s = ' ';
|
||
|
return s;
|
||
|
},
|
||
|
_rebuildData: function (data) {
|
||
|
var me = this,
|
||
|
newData = [],
|
||
|
d = me.pageSize,
|
||
|
itembox;
|
||
|
for (var i = 0; i < data.length; i++) {
|
||
|
if ((i + d) % d == 0) {
|
||
|
itembox = [];
|
||
|
newData.push(itembox);
|
||
|
}
|
||
|
itembox.push(data[i]);
|
||
|
}
|
||
|
return newData;
|
||
|
},
|
||
|
_renderTemplate: function (data) {
|
||
|
var me = this;
|
||
|
if (data.length == 0) return '<div class="empty">' + lang.emptyTxt + '</div>';
|
||
|
data = me._rebuildData(data);
|
||
|
var s = [],
|
||
|
p = [],
|
||
|
t = [];
|
||
|
s.push('<div id="J_listPanel" class="listPanel">');
|
||
|
p.push('<div class="page">');
|
||
|
for (var i = 0, tmpList; (tmpList = data[i++]); ) {
|
||
|
panels.push('panel' + i);
|
||
|
pages.push('page' + i);
|
||
|
if (i == 1) {
|
||
|
s.push('<div id="panel' + i + '" class="panelon">');
|
||
|
if (data.length != 1) {
|
||
|
t.push(
|
||
|
'<div id="page' +
|
||
|
i +
|
||
|
'" onclick="music.onpageclick(' +
|
||
|
i +
|
||
|
')" class="pageon">' +
|
||
|
i +
|
||
|
'</div>',
|
||
|
);
|
||
|
}
|
||
|
} else {
|
||
|
s.push('<div id="panel' + i + '" class="paneloff">');
|
||
|
t.push(
|
||
|
'<div id="page' +
|
||
|
i +
|
||
|
'" onclick="music.onpageclick(' +
|
||
|
i +
|
||
|
')" class="pageoff">' +
|
||
|
i +
|
||
|
'</div>',
|
||
|
);
|
||
|
}
|
||
|
s.push('<div class="m-box">');
|
||
|
s.push(
|
||
|
'<div class="m-h"><span class="m-t">' +
|
||
|
lang.chapter +
|
||
|
'</span><span class="m-s">' +
|
||
|
lang.singer +
|
||
|
'</span><span class="m-z">' +
|
||
|
lang.special +
|
||
|
'</span><span class="m-try-t">' +
|
||
|
lang.listenTest +
|
||
|
'</span></div>',
|
||
|
);
|
||
|
for (var j = 0, tmpObj; (tmpObj = tmpList[j++]); ) {
|
||
|
s.push('<label for="radio-' + i + '-' + j + '" class="m-m">');
|
||
|
s.push(
|
||
|
'<input type="radio" id="radio-' +
|
||
|
i +
|
||
|
'-' +
|
||
|
j +
|
||
|
'" name="musicId" class="m-l" onclick="music.doselect(' +
|
||
|
(me.pageSize * (i - 1) + (j - 1)) +
|
||
|
')"/>',
|
||
|
);
|
||
|
s.push('<span class="m-t">' + me._getMaxText(tmpObj.title) + '</span>');
|
||
|
s.push('<span class="m-s">' + me._getMaxText(tmpObj.author) + '</span>');
|
||
|
s.push('<span class="m-z">' + me._getMaxText(tmpObj.album_title) + '</span>');
|
||
|
s.push(
|
||
|
'<span class="m-try" onclick="music.doselect(' +
|
||
|
(me.pageSize * (i - 1) + (j - 1)) +
|
||
|
');music.listenTest(this)"></span>',
|
||
|
);
|
||
|
s.push('</label>');
|
||
|
}
|
||
|
s.push('</div>');
|
||
|
s.push('</div>');
|
||
|
}
|
||
|
t.reverse();
|
||
|
p.push(t.join(''));
|
||
|
s.push('</div>');
|
||
|
p.push('</div>');
|
||
|
return s.join('') + p.join('');
|
||
|
},
|
||
|
exec: function () {
|
||
|
var me = this;
|
||
|
if (selectedItem == null) return;
|
||
|
$G('J_preview').innerHTML = '';
|
||
|
editor.execCommand('music', {
|
||
|
url: me._getUrl(false),
|
||
|
width: 400,
|
||
|
height: 95,
|
||
|
});
|
||
|
},
|
||
|
};
|
||
|
})();
|