/* $Revision$ $Id$ File: FcltJquery.js Description: Generieke functies die bij jquery wordt gebruikt. Parameters: Context: Bestand wordt gelijktijdig geinclude met jquery.js in Shared/header.inc (Requires plugin) Note: */ // Let op: afterAction wordt alleen uitgevoerd als json.success gezet function FcltCallbackAndThen(afterAction) { return function (json, textStatus) { if (json.message) alert(json.message); if (json.warning) alert(json.warning); if (json.toaster) FcltMgr.topmanager().window.$.toast({ text: json.toaster, icon: "success", position : 'top-center'}); json.message = null; json.warning = null; json.toaster = null; if (json.success) { if (afterAction) afterAction(json); } } }; function FcltCallbackAndThenAlways(afterAction) { return function (json, textStatus) { if (json.message) alert(json.message); if (json.warning) alert(json.warning); if (json.toaster) FcltMgr.topmanager().window.$.toast({ text: json.toaster, icon: "success", position : 'top-center'}); json.message = null; json.warning = null; json.toaster = null; if (afterAction) afterAction(json); } }; var FcltCallback = FcltCallbackAndThen(null); var FcltCallbackRefresh = FcltCallbackAndThen(function () { FcltMgr.reload(); }); var FcltCallbackClose = FcltCallbackAndThen(function (json) { json.close = true; FcltMgr.closeDetail(window, json); }); var FcltCallbackDirtyLine = FcltCallbackAndThen(function (json) { // Bestaat json.key uit 1 of meerdere keys? if (json.key.indexOf(",") >= 0) { var key = json.key.split(","); for (var i = 0; i < key.length; i++) { $("#row" + key[i]).addClass('dirty'); } } else $("#row" + json.key).addClass('dirty'); }); // Roep met Ajax syncroon(!) een asp bestand aan en lever de JSON data op. function FcltSyncgetJSON(url, data) { var globalData; jQuery.ajax({ type: "GET", url: url, async: false, data: data, dataType: "json", success: function (data, textStatus) { globalData = data; globalData.textStatus = textStatus; } }); if (globalData && globalData.warning) alert(globalData.warning); if (globalData && globalData.error) alert(globalData.error); if (globalData && globalData.toaster) FcltMgr.topmanager().window.$.toast({ text: globalData.toaster, icon: "success", position : 'top-center'});; return globalData; } // Handig, komt heel veel voor function gen_cancel() { FcltMgr.closeDetail(window, { cancel: true } ); } // TODO Alleen als Logging aan? $.ajaxSetup( {"error":function(XMLHttpRequest,textStatus, errorThrown) { if (XMLHttpRequest.responseText.match(/^FCLTFriendly:/)) // Friendly tekst uit shared/500_error.asp { alert(XMLHttpRequest.responseText.substring(13)); } else if (XMLHttpRequest.responseText.match(/^FCLTExpired:/)) // Expired tekst uit common.inc { if (FcltMgr.getData('expired')) FcltMgr.getData('expired')(); else alert(XMLHttpRequest.responseText.substring(12)); } else { alert("JQuery Ajax Error: " + textStatus + "\n" + XMLHttpRequest.status + ": " + XMLHttpRequest.statusText + (errorThrown && errorThrown != XMLHttpRequest.statusText? "\n" + errorThrown:"") + "\n\n" + this.type + " " + this.url + "\n\n" + new Date().toLocaleString()); } } }); // Experiment: // Ctrl+W sluit onze eigen tabjes ipv browser tabjes? // TODO: eigenlijk via FcltMgr._pageManager._closeTab(this)? Of juist niet? // Je kunt nu ook je portal tabje sluiten. Is niet de bedoeling //$(window).keydown(function(event) //{ // if (FcltMgr && event.ctrlKey && event.keyCode == 87) // ctrl+W // { // FcltMgr.closeDetail(); // event.preventDefault(); // Niet de *browser* tab // } // }); // FIX FSN#22060 charset encoding probleem met $.getJSON en Ajax // Mochten we ooit op utf8 overstappen dan kan dit er waarschijnlijk uit. // http://forum.jquery.com/topic/serialize-problem-with-latin-1-iso-8859-1-and-solution var myEncode = function (s) { return unescape(encodeURIComponent(escape(s))).replace(/\+/g, "%2B"); } jQuery.extend({ param: function( a ) { var s = []; // If an array was passed in, assume that it is an array // of form elements if ( a.constructor == Array || a.jquery ){ // Serialize the form elements jQuery.each( a, function(){ s.push(myEncode(this.name) + "=" + myEncode(this.value)); }); } // Otherwise, assume that it's an object of key/value pairs else{ // Serialize the key/values for ( var j in a ) // If the value is an array then the key names need to be repeated if ( a[j] && a[j].constructor == Array ) jQuery.each( a[j], function(){ s.push(myEncode(j) + "=" + myEncode(this)); }); else s.push(myEncode(j) + "=" + myEncode(a[j])); } // Return the resulting serialization return s.join("&").replace(/ /g, "+"); }, serialize: function() { return this.param(this.serializeArray()); } }); // Voormalig jquery.autogrow-textarea.js (function($) { /* * Auto-growing textareas; technique ripped from Facebook * JGL: modified shadow width ook goed doen als textarea (nog) invisible * JGL: modified with delayedUpdate */ $.fn.autogrow = function(options) { this.filter('textarea').each(function() { var $this = $(this), minHeight = $this.height(), self = this; var shadow = $('
').css({ position: 'absolute', top: -10000, left: -10000, width: Math.max(0,$(this).width() - parseInt($this.css('paddingLeft')) - parseInt($this.css('paddingRight'))), fontSize: $this.css('fontSize'), fontFamily: $this.css('fontFamily'), lineHeight: $this.css('lineHeight'), resize: 'none' }).appendTo(document.body); var delayedUpdate = function() { if (self.timerID) clearTimeout(self.timerID); self.timerID = setTimeout( function () { update.apply(self) }, 250); } var update = function() { if (self.timerID) clearTimeout(self.timerID); var times = function(string, number) { for (var i = 0, r = ''; i < number; i ++) { r += string; } return r; }; var val = this.value.replace(//g, '>') .replace(/&/g, '&') .replace(/\n$/, '
 ') .replace(/\n/g, '
') .replace(/ {2,}/g, function(space) { return times(' ', space.length -1) + ' ' }); shadow.html(val); shadow.css("width", Math.max(0,$(this).width() - parseInt($this.css('paddingLeft')) - parseInt($this.css('paddingRight')))); var oldheight = parseInt($(this).css('height')); var newheight = Math.max(shadow.height() + 20, minHeight); if (oldheight != newheight) { $(this).css('height', newheight); FcltMgr.resized(window); } /* Experimentele max-lengte indicatie onder label var len = this.value.length; var maxlen = parseInt(this.getAttribute("maxlength"), 10)||4000; var $lbl = $("label[for="+ this.name +"]"); $lbl.find("div").remove(); if ($lbl.length && len > maxlen * (90/100)) { if (len > maxlen) $lbl.append("
Te lang.
Maximum is {0}, huidig is {1}
".format(maxlen, len)); else $lbl.append("
{1}/{0} karakters
".format(maxlen, len)); } */ } $(this).change(delayedUpdate).keyup(delayedUpdate).keydown(delayedUpdate).blur(update); update.apply(this); }); return this; } })(jQuery); jQuery.fn.filterByText = function(textbox, selectSingleMatch) { return this.each(function() { var select = this; var options = []; $(select).find('option').each(function() { options.push(this); }); $(select).data('options', options); $(textbox).bind('change keyup', function() { var options = $(select).empty().scrollTop(0).data('options'); var search = $.trim($(this).val()).toUpperCase(); $.each(options, function(i) { var option = options[i]; if($(option).text().toUpperCase().indexOf(search) > -1) { $(select).append(option); } }); if (selectSingleMatch === true && $(select).children().length === 1) { $(select).children().get(0).selected = true; $(select).children().trigger("change"); } }); }); }; // Add a clickable sign after a select element that when clicked // toggles the multiple attribute on the select box (function($){ $( document ).on('click', '.multi_select_toggle', function(e){ e.stopPropagation(); var sel_id = $(this).attr("fcltfor"); var selector = $('select#' + sel_id); if (selector.length && selector[0].className.match(/^ui-/)) return; // Afblijven van jQuery calendar jaar listboxje var old = selector.attr('multiple'); selector.attr('multiple', !old); selector.attr('size', old?1:Math.min(selector.find("option").length, 8)); $(e.target).html(old?'»':'«'); FcltMgr.resized(); }) $.fn.extend({ multiSelectToggle : function(options){ //Settings list and the default values var defaults = { label: '»' }; var options = $.extend(defaults, options); return this.each(function() { var lbl = $("").html(options.label); var div = $('
').addClass('multitoggle'); // deze div schuiven we 20px naar links $(this).wrap(div); $(this).before(lbl); }); } }); $(function () { $('select[fcltmulti=1]').multiSelectToggle(); }); })(jQuery); function fcltPrompt(title, defval, fnSuccess, params) { params = params || ""; $('
').appendTo('body') .html('
' + (params.hint||"") + '
' + "") .dialog({ modal: true, title: title, zIndex: 10000, autoOpen: true, width: 'auto', resizable: false, buttons: [ { text: L("lcl_submit"), click: function () { fnSuccess($("#fcltPrompt").val(), params.data); $(this).dialog("close"); } }, { text: L("lcl_cancel"), click: function () { $(this).dialog("close"); } } ], close: function (event, ui) { $(this).remove(); } }); } function do_fcltfilters() { // Filters van opgeslagen tabjes verwerken if (window.fcltfilters && window.iface && window.fcltfilters != "null") { iface.stringToForm(window.fcltfilters, $('form[name=u2]')); var formObject = JSON.parse(window.fcltfilters); if ("columns" in formObject) // Dit is het hidden veld wat normaal meegesubmit wordt { // Werk de interface checkboxjes ook bij var colarr = formObject.columns.split(","); var grparr = formObject.groupby.split(","); $("#scfcolpicker tr").each(function() { if (!this.id) return; var pos = $.inArray(this.id, colarr); if (pos > -1) { $(this).find("input[type=checkbox]").prop("checked", true); var selectgroup = $(this).find("select"); selectgroup.val(grparr[pos]); } else { $(this).find("input[type=checkbox]").prop("checked", false); } }); } if ("scf_pivot" in formObject) // Dit is het hidden veld wat normaal meegesubmit wordt { $("#chk_pivot").prop("checked", formObject.scf_pivot == 1) } } } $(function () { setTimeout( do_fcltfilters, 250); // Heel klein beetje uitstellen zodat eventuele // suggests geinitialiseerd zijn } );