szurubooru/public_html/media/js/core.js

448 lines
8.9 KiB
JavaScript
Raw Normal View History

function setCookie(name, value, exdays)
{
var exdate = new Date();
exdate.setDate(exdate.getDate() + exdays);
value = escape(value) + '; path=/' + ((exdays == null) ? '' : '; expires=' + exdate.toUTCString());
document.cookie = name + '=' + value;
}
function getCookie(name)
{
var value = document.cookie;
var start = value.indexOf(' ' + name + '=');
if (start == -1)
start = value.indexOf(name + '=');
if (start == -1)
return null;
start = value.indexOf('=', start) + 1;
var end = value.indexOf(';', start);
if (end == -1)
end = value.length;
return unescape(value.substring(start, end));
}
function rememberLastSearchQuery()
{
//lastSearchQuery variable is obtained from layout
setCookie('last-search-query', lastSearchQuery);
}
//core functionalities, prototypes
2014-05-15 23:11:53 +02:00
function getJSON(data)
{
if (typeof(data.headers) === 'undefined')
data.headers = {};
data.headers['X-Ajax'] = '1';
data.type = 'GET';
return $.ajax(data);
};
function postJSON(data)
{
if (typeof(data.headers) === 'undefined')
data.headers = {};
data.headers['X-Ajax'] = '1';
data.type = 'POST';
return $.ajax(data);
};
2013-10-21 14:24:34 +02:00
$.fn.hasAttr = function(name)
{
return this.attr(name) !== undefined;
};
$.fn.bindOnce = function(name, eventName, callback)
{
$.each(this, function(i, item)
{
if ($(item).data(name) == name)
return;
$(item).data(name, name);
$(item).on(eventName, callback);
});
};
//basic event listeners
$(function()
{
$('body').bind('dom-update', function()
{
//event confirmations
function confirmEvent(e)
{
if (!confirm($(this).attr('data-confirm-text')))
{
e.preventDefault();
e.stopPropagation();
2014-05-23 08:45:45 +02:00
e.stopImmediatePropagation();
}
}
$('form.confirmable').bindOnce('confirmation', 'submit', confirmEvent);
$('a.confirmable').bindOnce('confirmation', 'click', confirmEvent);
//simple action buttons
$('a.simple-action').bindOnce('simple-action', 'click', function(e)
{
if (e.isPropagationStopped())
return;
e.preventDefault();
rememberLastSearchQuery();
var aDom = $(this);
if (aDom.hasClass('inactive'))
return;
aDom.addClass('inactive');
2014-05-15 23:11:53 +02:00
var url = $(this).attr('href');
postJSON({ url: url }).success(function(data)
{
if (aDom.hasAttr('data-redirect-url'))
window.location.href = aDom.attr('data-redirect-url');
else if (aDom.data('callback'))
aDom.data('callback')();
else
window.location.reload();
}).error(function(xhr)
{
alert(xhr.responseJSON
? xhr.responseJSON.message
: 'Fatal error');
aDom.removeClass('inactive');
});
});
2014-05-20 20:54:31 +02:00
//simple action forms
$('form.simple-action').bindOnce('simple-action', 'submit', function(e)
{
e.preventDefault();
rememberLastSearchQuery();
var formDom = $(this);
if (formDom.hasClass('inactive'))
return;
formDom.addClass('inactive');
formDom.find(':input').attr('readonly', true);
var url = formDom.attr('action');
var fd = new FormData(formDom[0]);
var ajaxData =
{
url: url,
data: fd,
processData: false,
contentType: false,
};
postJSON(ajaxData)
.success(function(data)
{
if (data.message)
alert(data.message);
console.log(data);
disableExitConfirmation();
formDom.find(':input').attr('readonly', false);
formDom.removeClass('inactive');
if (data.redirectUrl)
window.location.href = data.redirectUrl;
else
window.location.reload();
})
.error(function(xhr)
{
alert(xhr.responseJSON
? xhr.responseJSON.message
: 'Fatal error');
formDom.find(':input').attr('readonly', false);
formDom.removeClass('inactive');
});
});
//attach data from submit buttons to forms before .submit() gets called
$('.submit').each(function()
{
$(this).bindOnce('submit-faux-input', 'click', function()
{
var form = $(this).closest('form');
form.find('.faux-submit').remove();
var input = $('<input class="faux-submit" type="hidden"/>').attr({
name: $(this).attr('name'),
value: $(this).val()
});
form.append(input);
});
});
});
//try to remember last search query
window.onbeforeunload = rememberLastSearchQuery;
2013-10-19 22:56:56 +02:00
});
//modify DOM on small viewports
function processSidebar()
2013-10-19 22:56:56 +02:00
{
2014-01-06 19:25:27 +01:00
if ($('#small-screen').is(':visible'))
2013-10-19 22:56:56 +02:00
$('#sidebar').insertAfter($('#inner-content'));
else
$('#sidebar').insertBefore($('#inner-content'));
}
2013-10-21 14:24:34 +02:00
$(function()
{
$(window).resize(function()
{
2013-11-19 20:20:16 +01:00
$('body').trigger('dom-update');
});
$('body').bind('dom-update', processSidebar);
2013-10-21 14:24:34 +02:00
});
2013-10-21 14:24:34 +02:00
//autocomplete
function split(val)
{
return val.split(/\s+/);
}
function retrieveTags(searchTerm, cb)
{
2014-05-15 23:11:53 +02:00
var options =
{
2014-05-15 23:11:53 +02:00
url: '/tags-autocomplete',
data: { search: searchTerm }
};
getJSON(options)
.success(function(data)
{
2014-05-15 23:11:53 +02:00
var tags = $.map(data.tags.slice(0, 15), function(tag)
{
2014-05-15 23:11:53 +02:00
var ret =
{
label: tag.name + ' (' + tag.count + ')',
value: tag.name,
};
return ret;
});
2014-05-15 23:11:53 +02:00
cb(tags);
});
}
2013-10-21 14:24:34 +02:00
$(function()
{
2013-11-24 23:30:06 +01:00
$('.autocomplete').each(function()
{
var options =
2013-10-21 14:24:34 +02:00
{
2013-10-21 15:07:27 +02:00
minLength: 1,
2013-10-21 14:24:34 +02:00
source: function(request, response)
{
2014-03-10 00:13:10 +01:00
var terms = split(request.term);
var term = terms.pop();
if (term != '')
retrieveTags(term, response);
2013-10-21 14:24:34 +02:00
},
focus: function(e)
2013-10-21 14:24:34 +02:00
{
// prevent value inserted on focus
e.preventDefault();
2013-10-21 14:24:34 +02:00
},
select: function(e, ui)
2013-10-21 14:24:34 +02:00
{
e.preventDefault();
2013-10-21 14:24:34 +02:00
var terms = split(this.value);
terms.pop();
terms.push(ui.item.value);
terms.push('');
this.value = terms.join(' ');
}
};
if ($(this).parents('#top-nav').length != 0)
{
options['position'] =
{
my: 'right top',
at: 'right bottom'
};
}
var searchInput = $(this);
searchInput
// don't navigate away from the field on tab when selecting an item
.bind('keydown', function(e)
{
if (e.keyCode === $.ui.keyCode.TAB && $(this).data('autocomplete').menu.active)
e.preventDefault();
}).autocomplete(options);
});
2013-10-21 14:24:34 +02:00
});
2013-10-21 14:48:28 +02:00
function attachTagIt(target)
2013-10-21 14:48:28 +02:00
{
var tagItOptions =
{
2013-10-21 14:48:28 +02:00
caseSensitive: false,
onTagClicked: function(e, ui)
{
var targetTagit = ui.tag.parents('.tagit');
var context = target.tagit('assignedTags');
2014-05-15 23:11:53 +02:00
var options =
{
url: '/tags-related',
data:
{
context: context,
tag: ui.tagLabel
}
};
if (targetTagit.siblings('.related-tags:eq(0)').data('for') == options.data.tag)
{
targetTagit.siblings('.related-tags').slideUp(function()
{
$(this).remove();
});
return;
}
2014-05-15 23:11:53 +02:00
getJSON(options).success(function(data)
{
var list = $('<ul>');
$.each(data.tags, function(i, tag)
{
var link = $('<a>');
2014-06-13 11:46:18 +02:00
link.attr('href', tag['search-link']);
link.text('#' + tag.name);
link.click(function(e)
{
e.preventDefault();
target.tagit('createTag', tag.name);
});
list.append(link.wrap('<li/>').parent());
});
targetTagit.siblings('.related-tags').slideUp(function()
{
$(this).remove();
});
var div = $('<div>');
div.data('for', options.tag);
div.addClass('related-tags');
div.append('<p>Related tags:</p>');
div.append(list);
div.append('<div class="clear"></div>');
div.insertAfter(targetTagit).hide().slideDown();
});
},
2013-10-21 14:48:28 +02:00
autocomplete:
{
source:
function(request, response)
{
var tagit = this;
2014-03-10 00:13:10 +01:00
//var context = tagit.element.tagit('assignedTags');
retrieveTags(request.term.toLowerCase(), function(tags)
2013-10-21 14:48:28 +02:00
{
if (!tagit.options.allowDuplicates)
{
tags = $.grep(tags, function(tag)
{
return tagit.assignedTags().indexOf(tag.value) == -1;
});
}
response(tags);
2013-10-21 14:48:28 +02:00
});
},
}
};
tagItOptions.placeholderText = target.attr('placeholder');
target.tagit(tagItOptions);
2013-10-21 14:48:28 +02:00
}
//prevent keybindings from executing when flash posts are focused
var oldMousetrapBind = Mousetrap.bind;
Mousetrap.bind = function(key, func, args)
{
oldMousetrapBind(key, function()
{
if ($(document.activeElement).parents('.post-type-flash').length > 0)
return false;
func();
}, args);
};
//hotkeys
$(function()
{
Mousetrap.bind('q', function()
{
$('#top-nav input').focus();
return false;
}, 'keyup');
Mousetrap.bind('w', function()
{
$('body,html').animate({scrollTop: '-=150px'}, 200);
});
Mousetrap.bind('s', function()
{
$('body,html').animate({scrollTop: '+=150px'}, 200);
});
Mousetrap.bind('a', function()
{
var url = $('.paginator:visible .prev:not(.disabled) a').attr('href');
if (typeof url !== 'undefined')
window.location.href = url;
}, 'keyup');
Mousetrap.bind('d', function()
{
var url = $('.paginator:visible .next:not(.disabled) a').attr('href');
if (typeof url !== 'undefined')
window.location.href = url;
}, 'keyup');
Mousetrap.bind('p', function()
{
$('.post a').eq(0).focus();
return false;
}, 'keyup');
});
2014-02-01 10:10:09 +01:00
function enableExitConfirmation()
{
$(window).bind('beforeunload', function(e)
{
return 'There are unsaved changes.';
2014-02-01 10:10:09 +01:00
});
}
function disableExitConfirmation()
{
$(window).unbind('beforeunload');
}