Merge branch 'master' into smartblock-overflow

This commit is contained in:
frecuencialibre 2018-12-11 14:17:18 -06:00 committed by GitHub
commit c7b55f60e4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
72 changed files with 3804 additions and 3949 deletions

View file

@ -7,6 +7,11 @@
font-size: 12px;
/*width: 25%;*/
width: 310px;
max-height: calc(100vh - 144px);
overflow-y: scroll;
}
.usability_hint:not(.hidden) + .wrapper #schedule-add-show{
max-height: calc(100vh - 172px);
}
#schedule-add-show textarea {
@ -85,6 +90,9 @@ label.wrapp-label input[type="checkbox"] {
#schedule-add-show fieldset dd input[type="checkbox"] {
margin-top: 6px;
}
#schedule-show-auto input[type="checkbox"] {
margin-left: 6px;
}
#add_show_day_check-element.block-display {
margin-bottom: 15px;

View file

@ -314,7 +314,8 @@ a.fc-event {
.fc-event-time,
.fc-event-title {
padding: 0 1px;
}
height: 12px;
}
.fc .ui-resizable-handle { /*** TODO: don't use ui-resizable anymore, change class ***/
display: block;

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g data-name="Layer 2"><g data-name="clock"><rect width="24" height="24" transform="rotate(180 12 12)" opacity="0"/><path d="M12 2a10 10 0 1 0 10 10A10 10 0 0 0 12 2zm4 11h-4a1 1 0 0 1-1-1V8a1 1 0 0 1 2 0v3h3a1 1 0 0 1 0 2z" fill="#fff"/></g></g></svg>

After

Width:  |  Height:  |  Size: 313 B

View file

@ -204,14 +204,18 @@ img.logo
.airtime_auth_help_icon, .custom_auth_help_icon, .stream_username_help_icon,
.playlist_type_help_icon, .repeat_tracks_help_icon, .show_linking_help_icon,
.admin_username_help_icon, .stream_type_help_icon, .overflow_tracks_help_icon,
.show_timezone_help_icon{
.show_timezone_help_icon, .show_autoplaylist_help_icon {
cursor: help;
position: relative;
display:inline-block; zoom:1;
width:14px; height:14px;
background:url(images/icon_info.png) 0 0 no-repeat;
top:2px; right:7px; left: 3px;
left: 3px;
line-height:16px !important;
vertical-align: text-top;
}
.qtip a {
color: white;
}
/* Clearfix */
@ -2040,7 +2044,7 @@ span.errors.sp-errors{
margin: 0 0 8px 0;
}
#schedule-add-show .button-bar.bottom {
margin: 16px 0 0;
margin: 16px 0 8px;
}
.schedule {
text-align:left;
@ -2268,14 +2272,15 @@ span.errors.sp-errors{
height:10px;
float:right;
margin-left:3px;
margin-top:2px;
}
.small-icon.linked {
background:url(images/icon_link.png) no-repeat 0 0;
margin-top: 0px !important;
}
.small-icon.autoplaylist {
background:url(images/icon_alert_cal_autoplaylist.png) no-repeat 0 0;
background: url(images/icon-clock.svg) black no-repeat center center;
border-radius: 2px;
background-size: contain;
}
.small-icon.recording {
@ -2888,7 +2893,6 @@ dt.block-display.info-block {
text-align:center;
letter-spacing:-.3px;
text-shadow: rgba(248,248,248,.3) 0 1px 0, rgba(0,0,0,.8) 0 -1px 0;
rgba(51,51,51,.9)
}
.error-content p {
color: #acacac;

View file

@ -310,17 +310,6 @@ function setAddShowEvents(form) {
$(this).blur();
form.find("#add_show_playlist_dropdown").toggle();
form.find("#add_show_autoplaylist_repeat").toggle();
var checkBoxSelected = false;
//must switch rebroadcast displays
if(form.find("#add_show_has_autoplaylist").attr('checked')) {
form.find("#add_show_playlist_dropdown").show();
form.find("#add_show_autoplaylist_repeat").show();
}
else {
form.find("#add_show_playlist_downdown").hide();
}
});
form.find("#add_show_repeats").click(function(){
@ -491,6 +480,27 @@ function setAddShowEvents(form) {
at: "right center"
}
});
form.find(".show_autoplaylist_help_icon").qtip({
content: {
text: $.i18n._("Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>")
},
hide: {
delay: 500,
fixed: true
},
style: {
border: {
width: 0,
radius: 4
},
classes: "ui-tooltip-dark ui-tooltip-rounded"
},
position: {
my: "left bottom",
at: "right center"
}
});
form.find(".airtime_auth_help_icon").qtip({
content: {

View file

@ -5,10 +5,10 @@
*/
function scheduleRefetchEvents(json) {
if(json.show_error == true){
if (json.show_error == true) {
alert($.i18n._("The show instance doesn't exist anymore!"));
}
if(json.show_id) {
if (json.show_id) {
var dialog_id = parseInt($("#add_show_id").val(), 10);
//if you've deleted the show you are currently editing, close the add show dialog.
@ -16,10 +16,10 @@ function scheduleRefetchEvents(json) {
$("#add-show-close").click();
}
}
$("#schedule_calendar").fullCalendar( 'refetchEvents' );
$("#schedule_calendar").fullCalendar('refetchEvents');
}
function makeTimeStamp(date){
function makeTimeStamp(date) {
var sy, sm, sd, h, m, s, timestamp;
sy = date.getFullYear();
sm = date.getMonth() + 1;
@ -28,19 +28,19 @@ function makeTimeStamp(date){
m = date.getMinutes();
s = date.getSeconds();
timestamp = sy+"-"+ pad(sm, 2) +"-"+ pad(sd, 2) +" "+ pad(h, 2) +":"+ pad(m, 2) +":"+ pad(s, 2);
timestamp = sy + "-" + pad(sm, 2) + "-" + pad(sd, 2) + " " + pad(h, 2) + ":" + pad(m, 2) + ":" + pad(s, 2);
return timestamp;
}
function dayClick(date, allDay, jsEvent, view){
function dayClick(date, allDay, jsEvent, view) {
// The show from will be preloaded if the user is admin or program manager.
// Hence, if the user if DJ then it won't open anything.
if(userType == "S" || userType == "A" || userType == "P"){
if (userType == "S" || userType == "A" || userType == "P") {
var now, today, selected, chosenDate, chosenTime;
now = adjustDateToServerDate(new Date(), serverTimezoneOffset);
if(view.name === "month") {
if (view.name === "month") {
today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
selected = new Date(date.getFullYear(), date.getMonth(), date.getDate());
}
@ -49,12 +49,12 @@ function dayClick(date, allDay, jsEvent, view){
selected = new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes());
}
if(selected >= today) {
if (selected >= today) {
var addShow = $('.add-button');
//remove the +show button if it exists.
if(addShow.length == 1){
var span = $(addShow).parent();
if (addShow.length == 1) {
var span = $(addShow).parent();
$(span).next().remove();
$(span).remove();
@ -65,10 +65,10 @@ function dayClick(date, allDay, jsEvent, view){
var duration_info = duration_string.split(" ");
var duration_h = 0;
var duration_m = 0;
if(duration_info[0] != null){
if (duration_info[0] != null) {
duration_h = parseInt(duration_info[0], 10);
}
if(duration_info[1] != null){
if (duration_info[1] != null) {
duration_m = parseInt(duration_info[1], 10);
}
// duration in milisec
@ -77,28 +77,28 @@ function dayClick(date, allDay, jsEvent, view){
var startTime_string;
var startTime = 0;
// get start time value on the form
if(view.name === "month") {
if (view.name === "month") {
startTime_string = $("#add_show_start_time").val();
var startTime_info = startTime_string.split(':');
if (startTime_info.length == 2) {
var start_time_temp = (parseInt(startTime_info[0],10) * 60 * 60 * 1000)
var start_time_temp = (parseInt(startTime_info[0], 10) * 60 * 60 * 1000)
+ (parseInt(startTime_info[1], 10) * 60 * 1000);
if (!isNaN(start_time_temp)) {
startTime = start_time_temp;
}
}
}else{
} else {
// if in day or week view, selected has all the time info as well
// so we don't ahve to calculate it explicitly
startTime_string = pad(selected.getHours(),2)+":"+pad(selected.getMinutes(),2)
startTime_string = pad(selected.getHours(), 2) + ":" + pad(selected.getMinutes(), 2)
startTime = 0
}
// calculate endDateTime
var endDateTime = new Date(selected.getTime() + startTime + duration);
chosenDate = selected.getFullYear() + '-' + pad(selected.getMonth()+1,2) + '-' + pad(selected.getDate(),2);
var endDateFormat = endDateTime.getFullYear() + '-' + pad(endDateTime.getMonth()+1,2) + '-' + pad(endDateTime.getDate(),2);
chosenDate = selected.getFullYear() + '-' + pad(selected.getMonth() + 1, 2) + '-' + pad(selected.getDate(), 2);
var endDateFormat = endDateTime.getFullYear() + '-' + pad(endDateTime.getMonth() + 1, 2) + '-' + pad(endDateTime.getDate(), 2);
//TODO: This should all be refactored into a proper initialize() function for the show form.
@ -108,8 +108,8 @@ function dayClick(date, allDay, jsEvent, view){
$("#add_show_start_date").val(chosenDate);
$("#add_show_end_date_no_repeat").val(endDateFormat);
$("#add_show_end_date").val(endDateFormat);
if(view.name !== "month") {
var endTimeString = pad(endDateTime.getHours(),2)+":"+pad(endDateTime.getMinutes(),2);
if (view.name !== "month") {
var endTimeString = pad(endDateTime.getHours(), 2) + ":" + pad(endDateTime.getMinutes(), 2);
$("#add_show_start_time").val(startTime_string)
$("#add_show_end_time").val(endTimeString)
}
@ -123,21 +123,21 @@ function dayClick(date, allDay, jsEvent, view){
}
}
function viewDisplay( view ) {
function viewDisplay(view) {
view_name = view.name;
if(view.name === 'agendaDay' || view.name === 'agendaWeek') {
if (view.name === 'agendaDay' || view.name === 'agendaWeek') {
var calendarEl = this;
var select = $('<select class="schedule_change_slots input_select"/>')
.append('<option value="1">'+$.i18n._("1m")+'</option>')
.append('<option value="5">'+$.i18n._("5m")+'</option>')
.append('<option value="10">'+$.i18n._("10m")+'</option>')
.append('<option value="15">'+$.i18n._("15m")+'</option>')
.append('<option value="30">'+$.i18n._("30m")+'</option>')
.append('<option value="60">'+$.i18n._("60m")+'</option>')
.change(function(){
.append('<option value="1">' + $.i18n._("1m") + '</option>')
.append('<option value="5">' + $.i18n._("5m") + '</option>')
.append('<option value="10">' + $.i18n._("10m") + '</option>')
.append('<option value="15">' + $.i18n._("15m") + '</option>')
.append('<option value="30">' + $.i18n._("30m") + '</option>')
.append('<option value="60">' + $.i18n._("60m") + '</option>')
.change(function () {
var slotMin = $(this).val();
var opt = view.calendar.options;
var date = $(calendarEl).fullCalendar('getDate');
@ -150,11 +150,11 @@ function viewDisplay( view ) {
$(calendarEl)
.fullCalendar('destroy')
.fullCalendar(opt)
.fullCalendar( 'gotoDate', date );
.fullCalendar('gotoDate', date);
//save slotMin value to db
var url = baseUrl+'Schedule/set-time-interval/format/json';
$.post(url, {timeInterval: slotMin});
var url = baseUrl + 'Schedule/set-time-interval/format/json';
$.post(url, { timeInterval: slotMin });
});
var topLeft = $(view.element).find("table.fc-agenda-days > thead th:first");
@ -166,33 +166,33 @@ function viewDisplay( view ) {
.append(select);
var slotMin = view.calendar.options.slotMinutes;
$('.schedule_change_slots option[value="'+slotMin+'"]').attr('selected', 'selected');
$('.schedule_change_slots option[value="' + slotMin + '"]').attr('selected', 'selected');
}
if(($("#add-show-form").length == 1) && ($("#add-show-form").css('display')=='none') && ($('.fc-header-left > span').length == 5)) {
if (($("#add-show-form").length == 1) && ($("#add-show-form").css('display') == 'none') && ($('.fc-header-left > span').length == 5)) {
//userType is defined in bootstrap.php, and is derived from the currently logged in user.
if(userType == "S" || userType == "A" || userType == "P"){
if (userType == "S" || userType == "A" || userType == "P") {
makeAddShowButton();
}
}
//save view name to db if it was changed
if (calendarPref.timeScale !== view.name) {
var url = baseUrl+'Schedule/set-time-scale/format/json';
$.post(url, {timeScale: view.name});
var url = baseUrl + 'Schedule/set-time-scale/format/json';
$.post(url, { timeScale: view.name });
calendarPref.timeScale = view.name;
}
}
function eventRender(event, element, view) {
$(element).addClass("fc-show-instance-"+event.id);
$(element).addClass("fc-show-instance-" + event.id);
$(element).attr("data-show-id", event.showId);
$(element).attr("data-show-linked", event.linked);
$(element).data("event", event);
//only put progress bar on shows that aren't being recorded.
if((view.name === 'agendaDay' || view.name === 'agendaWeek') && event.record === 0) {
if ((view.name === 'agendaDay' || view.name === 'agendaWeek') && event.record === 0) {
var div = $('<div/>');
div
.height('5px')
@ -212,15 +212,15 @@ function eventRender(event, element, view) {
if (event.show_empty === 1) {
if (event.linked) {
$(element)
.find(".fc-event-time")
.before('<span class="small-icon linked"></span><span class="small-icon show-empty"></span>');
// in theory a linked show shouldn't have an automatic playlist so adding this here
.find(".fc-event-time")
.before('<span class="small-icon linked"></span><span class="small-icon show-empty"></span>');
// in theory a linked show shouldn't have an automatic playlist so adding this here
} else if (event.show_has_auto_playlist === true) {
$(element)
.find(".fc-event-time")
.before('<span class="small-icon autoplaylist"></span><span class="small-icon show-empty"></span>');
.before('<span class="small-icon autoplaylist"></span>');
}
else {
else {
$(element)
.find(".fc-event-time")
.before('<span class="small-icon show-empty"></span>');
@ -231,10 +231,10 @@ function eventRender(event, element, view) {
.find(".fc-event-time")
.before('<span class="small-icon linked"></span><span class="small-icon show-partial-filled"></span>');
} else if (event.show_has_auto_playlist === true) {
$(element)
.find(".fc-event-time")
.before('<span class="small-icon autoplaylist"></span><span class="small-icon show-partial-filled"></span>');
} else {
$(element)
.find(".fc-event-time")
.before('<span class="small-icon autoplaylist"></span>');
} else {
$(element)
.find(".fc-event-time")
.before('<span class="small-icon show-partial-filled"></span>');
@ -245,25 +245,25 @@ function eventRender(event, element, view) {
.find(".fc-event-time")
.before('<span class="small-icon linked"></span>');
} else if (event.show_has_auto_playlist === true) {
$(element)
.find(".fc-event-time")
.before('<span class="small-icon autoplaylist"></span>');
$(element)
.find(".fc-event-time")
.before('<span class="small-icon autoplaylist"></span>');
}
}
} else if (view.name === 'month') {
if (event.show_empty === 1) {
if (event.linked) {
$(element)
$(element)
.find(".fc-event-title")
.after('<span class="small-icon linked"></span><span title="'+$.i18n._("Show is empty")+'" class="small-icon show-empty"></span>');
.after('<span class="small-icon linked"></span><span title="' + $.i18n._("Show is empty") + '" class="small-icon show-empty"></span>');
} else if (event.show_has_auto_playlist === true) {
$(element)
$(element)
.find(".fc-event-title")
.after('<span title="'+$.i18n._("Show has an automatic playlist")+'"class="small-icon autoplaylist"></span><span title="'+$.i18n._("Show is empty")+'" class="small-icon show-empty"></span>');
.after('<span title="' + $.i18n._("Show has an automatic playlist") + '"class="small-icon autoplaylist"></span>');
} else {
$(element)
$(element)
.find(".fc-event-title")
.after('<span title="'+$.i18n._("Show is empty")+'" class="small-icon show-empty"></span>');
.after('<span title="' + $.i18n._("Show is empty") + '" class="small-icon show-empty"></span>');
}
} else if (event.show_partial_filled === true) {
if (event.linked) {
@ -271,13 +271,13 @@ function eventRender(event, element, view) {
.find(".fc-event-title")
.after('<span class="small-icon linked"></span><span title="' + $.i18n._("Show is partially filled") + '" class="small-icon show-partial-filled"></span>');
} else if (event.show_has_auto_playlist === true) {
$(element)
$(element)
.find(".fc-event-title")
.after('<span title="'+$.i18n._("Show has an automatic playlist")+'"class="small-icon autoplaylist"></span><span title="'+$.i18n._("Show is partially filled")+'" class="small-icon show-partial-filled"></span>');
.after('<span title="' + $.i18n._("Show has an automatic playlist") + '"class="small-icon autoplaylist"></span>');
} else {
$(element)
$(element)
.find(".fc-event-title")
.after('<span title="'+$.i18n._("Show is partially filled")+'" class="small-icon show-partial-filled"></span>');
.after('<span title="' + $.i18n._("Show is partially filled") + '" class="small-icon show-partial-filled"></span>');
}
} else {
if (event.linked) {
@ -301,44 +301,44 @@ function eventRender(event, element, view) {
$(element).find(".fc-event-title").after('<span class="small-icon rebroadcast"></span>');
}
}
//now playing icon.
var span = '<span class="small-icon now-playing"></span>';
if (event.nowPlaying === true) {
if (view_name === 'agendaDay' || view_name === 'agendaWeek') {
$(element).find(".fc-event-time").before(span);
}
else if (view_name === 'month') {
$(element).find(".fc-event-title").after(span);
}
}
if (event.nowPlaying === true) {
if (view_name === 'agendaDay' || view_name === 'agendaWeek') {
$(element).find(".fc-event-time").before(span);
}
else if (view_name === 'month') {
$(element).find(".fc-event-title").after(span);
}
}
}
function eventAfterRender( event, element, view ) {
function eventAfterRender(event, element, view) {
$(element).find(".small-icon").live('mouseover',function(){
$(element).find(".small-icon").live('mouseover', function () {
addQtipsToIcons($(this), event.id);
});
}
function eventDrop(event, dayDelta, minuteDelta, allDay, revertFunc, jsEvent, ui, view) {
var url = baseUrl+'Schedule/move-show/format/json';
var url = baseUrl + 'Schedule/move-show/format/json';
$.post(url,
{day: dayDelta, min: minuteDelta, showInstanceId: event.id},
function(json){
if(json.show_error == true){
{ day: dayDelta, min: minuteDelta, showInstanceId: event.id },
function (json) {
if (json.show_error == true) {
alertShowErrorAndReload();
}
if(json.error) {
if (json.error) {
alert(json.error);
revertFunc();
}
//Workaround for cases where FullCalendar handles events over DST
//time changes in a different way than Airtime does.
//(Airtime preserves show duration, FullCalendar doesn't.)
@ -347,16 +347,16 @@ function eventDrop(event, dayDelta, minuteDelta, allDay, revertFunc, jsEvent, ui
});
}
function eventResize( event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view ) {
var url = baseUrl+'Schedule/resize-show/format/json';
function eventResize(event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view) {
var url = baseUrl + 'Schedule/resize-show/format/json';
$.post(url,
{day: dayDelta, min: minuteDelta, showId: event.showId, instanceId: event.id},
function(json){
if(json.show_error == true){
{ day: dayDelta, min: minuteDelta, showId: event.showId, instanceId: event.id },
function (json) {
if (json.show_error == true) {
alertShowErrorAndReload();
}
if(json.error) {
if (json.error) {
alert(json.error);
revertFunc();
}
@ -365,20 +365,20 @@ function eventResize( event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, vie
});
}
function windowResize() {
// 200 px for top dashboard and 50 for padding on main content
// this calculation was copied from schedule.js line 326
var mainHeight = $(window).height() - 200 - 24;
$('#schedule_calendar').fullCalendar('option', 'contentHeight', mainHeight);
function windowResize() {
// 200 px for top dashboard and 50 for padding on main content
// this calculation was copied from schedule.js line 326
var mainHeight = $(window).height() - 200 - 24;
$('#schedule_calendar').fullCalendar('option', 'contentHeight', mainHeight);
}
function preloadEventFeed () {
createFullCalendar({calendarInit: calendarPref});
function preloadEventFeed() {
createFullCalendar({ calendarInit: calendarPref });
}
var initialLoad = true;
function getFullCalendarEvents(start, end, callback) {
if (initialLoad) {
initialLoad = false;
callback(calendarEvents);
@ -387,39 +387,39 @@ function getFullCalendarEvents(start, end, callback) {
start_date = makeTimeStamp(start);
end_date = makeTimeStamp(end);
url = baseUrl+'Schedule/event-feed';
url = baseUrl + 'Schedule/event-feed';
var d = new Date();
$.post(url, {format: "json", start: start_date, end: end_date, cachep: d.getTime()}, function(json){
callback(json.events);
getUsabilityHint();
});
$.post(url, { format: "json", start: start_date, end: end_date, cachep: d.getTime() }, function (json) {
callback(json.events);
getUsabilityHint();
});
}
$(".fc-button").addClass("btn").addClass("btn-small");
//$("span.fc-button > :button").addClass("btn btn-small");
}
function checkSCUploadStatus(){
var url = baseUrl+'Library/get-upload-to-soundcloud-status/format/json',
id;
$("span[class*=progress]").each(function(){
function checkSCUploadStatus() {
var url = baseUrl + 'Library/get-upload-to-soundcloud-status/format/json',
id;
$("span[class*=progress]").each(function () {
id = $(this).parents("div.fc-event").data("event").id;
$.post(url, {format: "json", id: id, type:"show"}, function(json){
if (json.sc_id > 0){
$(".fc-show-instance-"+id)
.find(".progress")
.removeClass("progress")
.addClass("soundcloud");
$.post(url, { format: "json", id: id, type: "show" }, function (json) {
if (json.sc_id > 0) {
$(".fc-show-instance-" + id)
.find(".progress")
.removeClass("progress")
.addClass("soundcloud");
}
else if (json.sc_id == "-3"){
$(".fc-show-instance-"+id)
.find(".progress")
.removeClass("progress")
.addClass("sc-error");
else if (json.sc_id == "-3") {
$(".fc-show-instance-" + id)
.find(".progress")
.removeClass("progress")
.addClass("sc-error");
}
setTimeout(checkSCUploadStatus, 5000);
});
});
@ -429,47 +429,47 @@ function checkSCUploadStatus(){
* show icon
*/
function getCurrentShow() {
var url = baseUrl+'Schedule/get-current-show/format/json';
var url = baseUrl + 'Schedule/get-current-show/format/json';
function addNowPlaying(json) {
var $el,
span = '<span class="small-icon now-playing"></span>';
$(".now-playing").remove();
var $el,
span = '<span class="small-icon now-playing"></span>';
$(".now-playing").remove();
if (json.current_show === true) {
$el = $(".fc-show-instance-"+json.si_id);
if (view_name === 'agendaDay' || view_name === 'agendaWeek') {
$el.find(".fc-event-time").before(span);
}
else if (view_name === 'month') {
$el.find(".fc-event-title").after(span);
}
$el = $(".fc-show-instance-" + json.si_id);
if (view_name === 'agendaDay' || view_name === 'agendaWeek') {
$el.find(".fc-event-time").before(span);
}
else if (view_name === 'month') {
$el.find(".fc-event-title").after(span);
}
}
setTimeout(getCurrentShow, 5000);
}
$.post(url, {format: "json"}, addNowPlaying);
$.post(url, { format: "json" }, addNowPlaying);
}
function addQtipsToIcons(ele, id){
if ($(ele).hasClass("progress")){
function addQtipsToIcons(ele, id) {
if ($(ele).hasClass("progress")) {
$(ele).qtip({
content: {
text: $.i18n._("Uploading in progress...")
},
position:{
position: {
adjust: {
resize: true,
method: "flip flip"
resize: true,
method: "flip flip"
},
at: "right center",
my: "left top",
@ -482,23 +482,23 @@ function addQtipsToIcons(ele, id){
ready: true // Needed to make it show on first mouseover event
}
});
}else if($(ele).hasClass("soundcloud")){
} else if ($(ele).hasClass("soundcloud")) {
$(ele).qtip({
content: {
text: $.i18n._("Retreiving data from the server..."),
ajax: {
url: baseUrl+"Library/get-upload-to-soundcloud-status",
url: baseUrl + "Library/get-upload-to-soundcloud-status",
type: "post",
data: ({format: "json", id : id, type: "show"}),
success: function(json, status){
this.set('content.text', $.i18n._("The soundcloud id for this file is: ")+json.sc_id);
data: ({ format: "json", id: id, type: "show" }),
success: function (json, status) {
this.set('content.text', $.i18n._("The soundcloud id for this file is: ") + json.sc_id);
}
}
},
position:{
position: {
adjust: {
resize: true,
method: "flip flip"
resize: true,
method: "flip flip"
},
at: "right center",
my: "left top",
@ -511,24 +511,24 @@ function addQtipsToIcons(ele, id){
ready: true // Needed to make it show on first mouseover event
}
});
}else if($(ele).hasClass("sc-error")){
} else if ($(ele).hasClass("sc-error")) {
$(ele).qtip({
content: {
text: $.i18n._("Retreiving data from the server..."),
ajax: {
url: baseUrl+"Library/get-upload-to-soundcloud-status",
url: baseUrl + "Library/get-upload-to-soundcloud-status",
type: "post",
data: ({format: "json", id : id, type: "show"}),
success: function(json, status){
this.set('content.text', $.i18n._("There was error while uploading to soundcloud.")+"<br>"+$.i18n._("Error code: ")+json.error_code+
"<br>"+$.i18n._("Error msg: ")+json.error_msg+"<br>");
data: ({ format: "json", id: id, type: "show" }),
success: function (json, status) {
this.set('content.text', $.i18n._("There was error while uploading to soundcloud.") + "<br>" + $.i18n._("Error code: ") + json.error_code +
"<br>" + $.i18n._("Error msg: ") + json.error_msg + "<br>");
}
}
},
position:{
position: {
adjust: {
resize: true,
method: "flip flip"
resize: true,
method: "flip flip"
},
at: "right center",
my: "left top",
@ -541,15 +541,15 @@ function addQtipsToIcons(ele, id){
ready: true // Needed to make it show on first mouseover event
}
});
}else if ($(ele).hasClass("show-empty")){
} else if ($(ele).hasClass("show-empty")) {
$(ele).qtip({
content: {
text: $.i18n._("This show has no scheduled content.")
},
position:{
position: {
adjust: {
resize: true,
method: "flip flip"
resize: true,
method: "flip flip"
},
at: "right center",
my: "left top",
@ -562,15 +562,15 @@ function addQtipsToIcons(ele, id){
ready: true // Needed to make it show on first mouseover event
}
});
} else if ($(ele).hasClass("show-partial-filled")){
} else if ($(ele).hasClass("show-partial-filled")) {
$(ele).qtip({
content: {
text: $.i18n._("This show is not completely filled with content.")
},
position:{
position: {
adjust: {
resize: true,
method: "flip flip"
resize: true,
method: "flip flip"
},
at: "right center",
my: "left top",
@ -587,12 +587,12 @@ function addQtipsToIcons(ele, id){
}
//Alert the error and reload the page
//this function is used to resolve concurrency issue
function alertShowErrorAndReload(){
alert($.i18n._("The show instance doesn't exist anymore!"));
window.location.reload();
function alertShowErrorAndReload() {
alert($.i18n._("The show instance doesn't exist anymore!"));
window.location.reload();
}
$(document).ready(function(){
$(document).ready(function () {
preloadEventFeed();
checkSCUploadStatus();
getCurrentShow();

File diff suppressed because it is too large Load diff

View file

@ -1,19 +1,19 @@
//Serbian Latin
{
"sProcessing": "Obrada...",
"sLengthMenu": "_MENU_ Rezultati po stranici",
"sZeroRecords": "Ništa nije pronađeno",
"sInfo": "Rezultati: _START_ - _END_ Ukupno: _TOTAL_",
"sInfoEmpty": "Nula Rezultat",
"sInfoFiltered": "(filtrirano iz _MAX_ ukupnih rezultata)",
"sInfoPostFix": "",
"sSearch": "Filter",
"sUrl": "",
"oPaginate": {
"sFirst": "Prva",
"sPrevious": "Nazad",
"sNext": "Napred",
"sLast": "Zadnja"
}
//Serbian Latin
{
"sProcessing": "Obrada...",
"sLengthMenu": "_MENU_ Rezultati po stranici",
"sZeroRecords": "Ništa nije pronađeno",
"sInfo": "Rezultati: _START_ - _END_ Ukupno: _TOTAL_",
"sInfoEmpty": "Nula Rezultat",
"sInfoFiltered": "(filtrirano iz _MAX_ ukupnih rezultata)",
"sInfoPostFix": "",
"sSearch": "Filter",
"sUrl": "",
"oPaginate": {
"sFirst": "Prva",
"sPrevious": "Nazad",
"sNext": "Napred",
"sLast": "Zadnja"
}
}

View file

@ -1,111 +1,111 @@
/*
* jQuery.stickyPanel
* ----------------------
* version: 1.4.1
* date: 7/21/11
*
* Copyright (c) 2011 Donny Velazquez
* http://donnyvblog.blogspot.com/
* http://code.google.com/p/sticky-panel/
*
* Licensed under the Apache License 2.0
*
*/
(function ($) {
$.fn.stickyPanel = function (options) {
var options = $.extend({}, $.fn.stickyPanel.defaults, options);
return this.each(function () {
$(window).bind("scroll.stickyPanel", { selected: $(this), options: options }, Scroll);
});
};
function Scroll(event) {
var node = event.data.selected;
var o = event.data.options;
var isMobile = navigator.userAgent.toLowerCase().indexOf('mobile') > 0;
var windowHeight = $(window).height();
var nodeHeight = node.outerHeight(true);
var scrollTop = $(document).scrollTop();
// when top of window reaches the top of the panel detach
if (!isMobile &&
scrollTop <= $(document).height() - windowHeight && // Fix for rubberband scrolling in Safari on Lion
scrollTop > node.offset().top - o.topPadding) {
// topPadding
var newNodeTop = 0;
if (o.topPadding != "undefined") {
newNodeTop = newNodeTop + o.topPadding;
}
// get left before adding spacer
var nodeLeft = node.offset().left;
// save panels top
node.data("PanelsTop", node.offset().top - newNodeTop);
// MOVED: savePanelSpace before afterDetachCSSClass to handle afterDetachCSSClass changing size of node
// savePanelSpace
if (o.savePanelSpace == true) {
var nodeWidth = node.outerWidth(true);
var nodeCssfloat = node.css("float");
var nodeCssdisplay = node.css("display");
var randomNum = Math.ceil(Math.random() * 9999); /* Pick random number between 1 and 9999 */
node.data("PanelSpaceID", "stickyPanelSpace" + randomNum);
node.before("<div id='" + node.data("PanelSpaceID") + "' style='width:" + nodeWidth + "px;height:" + nodeHeight + "px;float:" + nodeCssfloat + ";display:" + nodeCssdisplay + ";'>&nbsp;</div>");
}
// afterDetachCSSClass
if (o.afterDetachCSSClass != "") {
node.addClass(o.afterDetachCSSClass);
}
// save inline css
node.data("Original_Inline_CSS", (!node.attr("style") ? "" : node.attr("style")));
// detach panel
node.css({
"margin": 0,
"left": nodeLeft,
"top": newNodeTop,
"position": "fixed"
});
}
// ADDED: css top check to avoid continuous reattachment
if (scrollTop <= node.data("PanelsTop") && node.css("top") != "auto") {
if (o.savePanelSpace == true) {
$("#" + node.data("PanelSpaceID")).remove();
}
// attach panel
node.attr("style", node.data("Original_Inline_CSS"));
if (o.afterDetachCSSClass != "") {
node.removeClass(o.afterDetachCSSClass);
}
}
};
$.fn.stickyPanel.defaults = {
topPadding: 0,
// Use this to set the top margin of the detached panel.
afterDetachCSSClass: "",
// This class is applied when the panel detaches.
savePanelSpace: false
// When set to true the space where the panel was is kept open.
};
/*
* jQuery.stickyPanel
* ----------------------
* version: 1.4.1
* date: 7/21/11
*
* Copyright (c) 2011 Donny Velazquez
* http://donnyvblog.blogspot.com/
* http://code.google.com/p/sticky-panel/
*
* Licensed under the Apache License 2.0
*
*/
(function ($) {
$.fn.stickyPanel = function (options) {
var options = $.extend({}, $.fn.stickyPanel.defaults, options);
return this.each(function () {
$(window).bind("scroll.stickyPanel", { selected: $(this), options: options }, Scroll);
});
};
function Scroll(event) {
var node = event.data.selected;
var o = event.data.options;
var isMobile = navigator.userAgent.toLowerCase().indexOf('mobile') > 0;
var windowHeight = $(window).height();
var nodeHeight = node.outerHeight(true);
var scrollTop = $(document).scrollTop();
// when top of window reaches the top of the panel detach
if (!isMobile &&
scrollTop <= $(document).height() - windowHeight && // Fix for rubberband scrolling in Safari on Lion
scrollTop > node.offset().top - o.topPadding) {
// topPadding
var newNodeTop = 0;
if (o.topPadding != "undefined") {
newNodeTop = newNodeTop + o.topPadding;
}
// get left before adding spacer
var nodeLeft = node.offset().left;
// save panels top
node.data("PanelsTop", node.offset().top - newNodeTop);
// MOVED: savePanelSpace before afterDetachCSSClass to handle afterDetachCSSClass changing size of node
// savePanelSpace
if (o.savePanelSpace == true) {
var nodeWidth = node.outerWidth(true);
var nodeCssfloat = node.css("float");
var nodeCssdisplay = node.css("display");
var randomNum = Math.ceil(Math.random() * 9999); /* Pick random number between 1 and 9999 */
node.data("PanelSpaceID", "stickyPanelSpace" + randomNum);
node.before("<div id='" + node.data("PanelSpaceID") + "' style='width:" + nodeWidth + "px;height:" + nodeHeight + "px;float:" + nodeCssfloat + ";display:" + nodeCssdisplay + ";'>&nbsp;</div>");
}
// afterDetachCSSClass
if (o.afterDetachCSSClass != "") {
node.addClass(o.afterDetachCSSClass);
}
// save inline css
node.data("Original_Inline_CSS", (!node.attr("style") ? "" : node.attr("style")));
// detach panel
node.css({
"margin": 0,
"left": nodeLeft,
"top": newNodeTop,
"position": "fixed"
});
}
// ADDED: css top check to avoid continuous reattachment
if (scrollTop <= node.data("PanelsTop") && node.css("top") != "auto") {
if (o.savePanelSpace == true) {
$("#" + node.data("PanelSpaceID")).remove();
}
// attach panel
node.attr("style", node.data("Original_Inline_CSS"));
if (o.afterDetachCSSClass != "") {
node.removeClass(o.afterDetachCSSClass);
}
}
};
$.fn.stickyPanel.defaults = {
topPadding: 0,
// Use this to set the top margin of the detached panel.
afterDetachCSSClass: "",
// This class is applied when the panel detaches.
savePanelSpace: false
// When set to true the space where the panel was is kept open.
};
})(jQuery);

View file

@ -1,25 +1,25 @@
// Croatian
plupload.addI18n({
'Select files': 'Izaberite datoteke:',
'Add files to the upload queue and click the start button.': 'Dodajte datoteke u listu i kliknite Upload.',
'Filename': 'Ime datoteke',
'Status': 'Status',
'Size': 'Veličina',
'Add files': 'Dodajte datoteke',
'Stop current upload': 'Zaustavi trenutan upload',
'Start uploading queue': 'Pokreni Upload',
'Uploaded %d/%d files': 'Uploadano %d/%d datoteka',
'N/A': 'N/A',
'Drag files here.': 'Dovucite datoteke ovdje',
'File extension error.': 'Greška ekstenzije datoteke.',
'File size error.': 'Greška veličine datoteke.',
'Init error.': 'Greška inicijalizacije.',
'HTTP Error.': 'HTTP greška.',
'Security error.': 'Sigurnosna greška.',
'Generic error.': 'Generička greška.',
'IO error.': 'I/O greška.',
'Stop Upload': 'Zaustavi upload.',
'Add Files': 'Dodaj datoteke',
'Start Upload': 'Pokreni upload.',
'%d files queued': '%d datoteka na čekanju.'
// Croatian
plupload.addI18n({
'Select files': 'Izaberite datoteke:',
'Add files to the upload queue and click the start button.': 'Dodajte datoteke u listu i kliknite Upload.',
'Filename': 'Ime datoteke',
'Status': 'Status',
'Size': 'Veličina',
'Add files': 'Dodajte datoteke',
'Stop current upload': 'Zaustavi trenutan upload',
'Start uploading queue': 'Pokreni Upload',
'Uploaded %d/%d files': 'Uploadano %d/%d datoteka',
'N/A': 'N/A',
'Drag files here.': 'Dovucite datoteke ovdje',
'File extension error.': 'Greška ekstenzije datoteke.',
'File size error.': 'Greška veličine datoteke.',
'Init error.': 'Greška inicijalizacije.',
'HTTP Error.': 'HTTP greška.',
'Security error.': 'Sigurnosna greška.',
'Generic error.': 'Generička greška.',
'IO error.': 'I/O greška.',
'Stop Upload': 'Zaustavi upload.',
'Add Files': 'Dodaj datoteke',
'Start Upload': 'Pokreni upload.',
'%d files queued': '%d datoteka na čekanju.'
});

View file

@ -1,14 +1,14 @@
// Serbian Cyrillic
plupload.addI18n({
'Select files' : 'Изаберите фајлове',
'Add files to the upload queue and click the start button.' : 'Додајте фајлове у листу и кликните на дугме Старт.',
'Filename' : 'Назив фајла',
'Status' : 'Status',
'Size' : 'Величина',
'Add Files' : 'Додај фајлове',
'Stop current upload' : 'Заустави upload',
'Start uploading queue' : 'Почни upload',
'Drag files here.' : 'Превуци фајлове овде.',
'Start Upload': 'Почни upload',
'Uploaded %d/%d files': 'Снимљено %d/%d фајлова'
});
// Serbian Cyrillic
plupload.addI18n({
'Select files' : 'Изаберите фајлове',
'Add files to the upload queue and click the start button.' : 'Додајте фајлове у листу и кликните на дугме Старт.',
'Filename' : 'Назив фајла',
'Status' : 'Status',
'Size' : 'Величина',
'Add Files' : 'Додај фајлове',
'Stop current upload' : 'Заустави upload',
'Start uploading queue' : 'Почни upload',
'Drag files here.' : 'Превуци фајлове овде.',
'Start Upload': 'Почни upload',
'Uploaded %d/%d files': 'Снимљено %d/%d фајлова'
});

View file

@ -1,14 +1,14 @@
// Serbian Latin
plupload.addI18n({
'Select files' : 'Izaberite fajlove',
'Add files to the upload queue and click the start button.' : 'Dodajte fajlove u listu i kliknite na dugme Start.',
'Filename' : 'Naziv fajla',
'Status' : 'Status',
'Size' : 'Veličina',
'Add Files' : 'Dodaj fajlove',
'Stop current upload' : 'Zaustavi upload',
'Start uploading queue' : 'Počni upload',
'Drag files here.' : 'Prevucite fajlove ovde.',
'Start Upload': 'Počni upload',
'Uploaded %d/%d files': 'Snimljeno %d/%d fajlova'
});
// Serbian Latin
plupload.addI18n({
'Select files' : 'Izaberite fajlove',
'Add files to the upload queue and click the start button.' : 'Dodajte fajlove u listu i kliknite na dugme Start.',
'Filename' : 'Naziv fajla',
'Status' : 'Status',
'Size' : 'Veličina',
'Add Files' : 'Dodaj fajlove',
'Stop current upload' : 'Zaustavi upload',
'Start uploading queue' : 'Počni upload',
'Drag files here.' : 'Prevucite fajlove ovde.',
'Start Upload': 'Počni upload',
'Uploaded %d/%d files': 'Snimljeno %d/%d fajlova'
});

View file

@ -1,183 +1,183 @@
/**
sprintf() for JavaScript 0.7-beta1
http://www.diveintojavascript.com/projects/javascript-sprintf
Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of sprintf() for JavaScript nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Changelog:
2010.09.06 - 0.7-beta1
- features: vsprintf, support for named placeholders
- enhancements: format cache, reduced global namespace pollution
2010.05.22 - 0.6:
- reverted to 0.4 and fixed the bug regarding the sign of the number 0
Note:
Thanks to Raphael Pigulla <raph (at] n3rd [dot) org> (http://www.n3rd.org/)
who warned me about a bug in 0.5, I discovered that the last update was
a regress. I appologize for that.
2010.05.09 - 0.5:
- bug fix: 0 is now preceeded with a + sign
- bug fix: the sign was not at the right position on padded results (Kamal Abdali)
- switched from GPL to BSD license
2007.10.21 - 0.4:
- unit test and patch (David Baird)
2007.09.17 - 0.3:
- bug fix: no longer throws exception on empty paramenters (Hans Pufal)
2007.09.11 - 0.2:
- feature: added argument swapping
2007.04.03 - 0.1:
- initial release
**/
var sprintf = (function() {
function get_type(variable) {
return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
}
function str_repeat(input, multiplier) {
for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
return output.join('');
}
var str_format = function() {
if (!str_format.cache.hasOwnProperty(arguments[0])) {
str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
}
return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
};
str_format.format = function(parse_tree, argv) {
var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
for (i = 0; i < tree_length; i++) {
node_type = get_type(parse_tree[i]);
if (node_type === 'string') {
output.push(parse_tree[i]);
}
else if (node_type === 'array') {
match = parse_tree[i]; // convenience purposes only
if (match[2]) { // keyword argument
arg = argv[cursor];
for (k = 0; k < match[2].length; k++) {
if (!arg.hasOwnProperty(match[2][k])) {
throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
}
arg = arg[match[2][k]];
}
}
else if (match[1]) { // positional argument (explicit)
arg = argv[match[1]];
}
else { // positional argument (implicit)
arg = argv[cursor++];
}
if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
}
switch (match[8]) {
case 'b': arg = arg.toString(2); break;
case 'c': arg = String.fromCharCode(arg); break;
case 'd': arg = parseInt(arg, 10); break;
case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
case 'o': arg = arg.toString(8); break;
case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
case 'u': arg = Math.abs(arg); break;
case 'x': arg = arg.toString(16); break;
case 'X': arg = arg.toString(16).toUpperCase(); break;
}
arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
pad_length = match[6] - String(arg).length;
pad = match[6] ? str_repeat(pad_character, pad_length) : '';
output.push(match[5] ? arg + pad : pad + arg);
}
}
return output.join('');
};
str_format.cache = {};
str_format.parse = function(fmt) {
var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
while (_fmt) {
if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
parse_tree.push(match[0]);
}
else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
parse_tree.push('%');
}
else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
if (match[2]) {
arg_names |= 1;
var field_list = [], replacement_field = match[2], field_match = [];
if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
field_list.push(field_match[1]);
while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
field_list.push(field_match[1]);
}
else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
field_list.push(field_match[1]);
}
else {
throw('[sprintf] huh?');
}
}
}
else {
throw('[sprintf] huh?');
}
match[2] = field_list;
}
else {
arg_names |= 2;
}
if (arg_names === 3) {
throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
}
parse_tree.push(match);
}
else {
throw('[sprintf] huh?');
}
_fmt = _fmt.substring(match[0].length);
}
return parse_tree;
};
return str_format;
})();
var vsprintf = function(fmt, argv) {
argv.unshift(fmt);
return sprintf.apply(null, argv);
};
/**
sprintf() for JavaScript 0.7-beta1
http://www.diveintojavascript.com/projects/javascript-sprintf
Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of sprintf() for JavaScript nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Changelog:
2010.09.06 - 0.7-beta1
- features: vsprintf, support for named placeholders
- enhancements: format cache, reduced global namespace pollution
2010.05.22 - 0.6:
- reverted to 0.4 and fixed the bug regarding the sign of the number 0
Note:
Thanks to Raphael Pigulla <raph (at] n3rd [dot) org> (http://www.n3rd.org/)
who warned me about a bug in 0.5, I discovered that the last update was
a regress. I appologize for that.
2010.05.09 - 0.5:
- bug fix: 0 is now preceeded with a + sign
- bug fix: the sign was not at the right position on padded results (Kamal Abdali)
- switched from GPL to BSD license
2007.10.21 - 0.4:
- unit test and patch (David Baird)
2007.09.17 - 0.3:
- bug fix: no longer throws exception on empty paramenters (Hans Pufal)
2007.09.11 - 0.2:
- feature: added argument swapping
2007.04.03 - 0.1:
- initial release
**/
var sprintf = (function() {
function get_type(variable) {
return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
}
function str_repeat(input, multiplier) {
for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
return output.join('');
}
var str_format = function() {
if (!str_format.cache.hasOwnProperty(arguments[0])) {
str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
}
return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
};
str_format.format = function(parse_tree, argv) {
var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
for (i = 0; i < tree_length; i++) {
node_type = get_type(parse_tree[i]);
if (node_type === 'string') {
output.push(parse_tree[i]);
}
else if (node_type === 'array') {
match = parse_tree[i]; // convenience purposes only
if (match[2]) { // keyword argument
arg = argv[cursor];
for (k = 0; k < match[2].length; k++) {
if (!arg.hasOwnProperty(match[2][k])) {
throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
}
arg = arg[match[2][k]];
}
}
else if (match[1]) { // positional argument (explicit)
arg = argv[match[1]];
}
else { // positional argument (implicit)
arg = argv[cursor++];
}
if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
}
switch (match[8]) {
case 'b': arg = arg.toString(2); break;
case 'c': arg = String.fromCharCode(arg); break;
case 'd': arg = parseInt(arg, 10); break;
case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
case 'o': arg = arg.toString(8); break;
case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
case 'u': arg = Math.abs(arg); break;
case 'x': arg = arg.toString(16); break;
case 'X': arg = arg.toString(16).toUpperCase(); break;
}
arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
pad_length = match[6] - String(arg).length;
pad = match[6] ? str_repeat(pad_character, pad_length) : '';
output.push(match[5] ? arg + pad : pad + arg);
}
}
return output.join('');
};
str_format.cache = {};
str_format.parse = function(fmt) {
var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
while (_fmt) {
if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
parse_tree.push(match[0]);
}
else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
parse_tree.push('%');
}
else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
if (match[2]) {
arg_names |= 1;
var field_list = [], replacement_field = match[2], field_match = [];
if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
field_list.push(field_match[1]);
while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
field_list.push(field_match[1]);
}
else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
field_list.push(field_match[1]);
}
else {
throw('[sprintf] huh?');
}
}
}
else {
throw('[sprintf] huh?');
}
match[2] = field_list;
}
else {
arg_names |= 2;
}
if (arg_names === 3) {
throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
}
parse_tree.push(match);
}
else {
throw('[sprintf] huh?');
}
_fmt = _fmt.substring(match[0].length);
}
return parse_tree;
};
return str_format;
})();
var vsprintf = function(fmt, argv) {
argv.unshift(fmt);
return sprintf.apply(null, argv);
};

File diff suppressed because it is too large Load diff

View file

@ -1,57 +0,0 @@
/*
Code taken from http://www.jspatterns.com/book/7/observer-game.html
Pub/Sub
*/
var publisher = {
subscribers: {
any: []
},
on: function (type, fn, context) {
type = type || 'any';
fn = typeof fn === "function" ? fn : context[fn];
if (typeof this.subscribers[type] === "undefined") {
this.subscribers[type] = [];
}
this.subscribers[type].push({fn: fn, context: context || this});
},
remove: function (type, fn, context) {
this.visitSubscribers('unsubscribe', type, fn, context);
},
fire: function (type, publication) {
this.visitSubscribers('publish', type, publication);
},
reset: function (type) {
},
visitSubscribers: function (action, type, arg, context) {
var pubtype = type || 'any',
subscribers = this.subscribers[pubtype],
i,
max = subscribers ? subscribers.length : 0;
for (i = 0; i < max; i += 1) {
if (action === 'publish') {
subscribers[i].fn.call(subscribers[i].context, arg);
}
else {
if (subscribers[i].fn === arg && subscribers[i].context === context) {
subscribers.splice(i, 1);
}
}
}
}
};
function makePublisher(o) {
var i;
for (i in publisher) {
if (publisher.hasOwnProperty(i) && typeof publisher[i] === "function") {
o[i] = publisher[i];
}
}
o.subscribers = {any: []};
}

View file

@ -1,25 +0,0 @@
<form class="form-inline">
<select id="time_format">
<option value="seconds">seconds</option>
<option value="thousandths">thousandths</option>
<option value="hh:mm:ss">hh:mm:ss</option>
<option value="hh:mm:ss.uu">hh:mm:ss + hundredths</option>
<option value="hh:mm:ss.uuu">hh:mm:ss + milliseconds</option>
</select>
<input id="audio_start" type="text" class="input-small">
<input id="audio_end" type="text" class="input-small">
<input id="audio_pos" type="text" class="input-small">
<select id="audio_resolution">
<option>4000</option>
<option>5000</option>
<option>6000</option>
<option>7000</option>
<option>8000</option>
<option>9000</option>
<option>10000</option>
<option>11000</option>
<option>12000</option>
<option>15000</option>
<option>20000</option>
</select>
</form>