bremen_short_url/BackEnd/assets/javascript/jquery.textareamaxrows.js

116 lines
3.6 KiB
JavaScript

(function($) {
$.fn.textareamaxrows = function(options) {
var defaults = {
alert: false,
alertmessage : 'too many rows and chars',
maxrows : 20,
maxcharsinrow : 32,
usecounter : false,
counterelem : '',
errorclass : 'error'
}
var down = {};
var opts = $.extend(defaults, options);
// prevent right click paste
$(this).on("paste contextmenu",function(e) { e.preventDefault(); });
return this.each(function(event) {
$(this).keyup(onKeyup);
$(this).keydown(onKeyDown);
});
// prevent holding enter key
function onKeyDown(event) {
var keycode = (event.keyCode ? event.keyCode : event.which);
if (keycode == '13') {
if (down['13'] == null) { // first press
down['13'] = true; // record that the key's down
}
else {
// Cut down the string
var current_length = $(this).val().length;
var new_length = current_length - 1;
$(this).val($(this).val().substr(0, new_length));
}
}
}
function onKeyup() {
var number_breaks = $(this).val().split('\n').length;
// first break does not count
number_breaks--;
var number_fake_breaks = 0;
var text_paragraphs = $(this).val().split('\n');
for (var i in text_paragraphs) {
var number_fake_breaks_paragraph = parseInt(getNumberOfChunks(opts.maxcharsinrow, text_paragraphs[i]));
if (number_fake_breaks_paragraph > 1) {
number_fake_breaks = number_fake_breaks + number_fake_breaks_paragraph;
}
}
var total_breaks = parseInt(number_breaks + number_fake_breaks);
if (total_breaks >= opts.maxrows) {
if (opts.alert) {
alert(opts.alertmessage);
}
// add error class to textarea
$(this).addClass(opts.errorclass);
// Cut down the string
var current_length = $(this).val().length;
var new_length = current_length - 1;
$(this).val($(this).val().substr(0, new_length));
}
else {
// remove error class textarea
$(this).removeClass(opts.errorclass);
}
// set counter if option usecounter and counterelem and is set
if ((opts.usecounter) && opts.counterelem != '') {
if ((opts.maxrows - total_breaks) < 0) {
$(opts.counterelem).html('0');
}
else {
$(opts.counterelem).html(opts.maxrows - total_breaks);
}
}
return false;
}
function getNumberOfChunks(chunkSize, checkString) {
var chunks = [];
while (checkString) {
if (checkString.length < chunkSize) {
chunks.push(checkString);
break;
}
else {
chunks.push(checkString.substr(0, chunkSize));
checkString = checkString.substr(chunkSize);
}
}
return chunks.length;
}
}
})(jQuery);