loleaflet/dist/loleaflet.html.m4 | 6 loleaflet/dist/toolbar/w2ui-1.5.rc1.js |18953 +++++++++++++++++++++++++++++ loleaflet/dist/toolbar/w2ui-1.5.rc1.min.js | 14 loleaflet/dist/w2ui-1.5.rc1.css | 3247 ++++ loleaflet/main.css.m4 | 2 5 files changed, 22218 insertions(+), 4 deletions(-)
New commits: commit 65b2116459ade43d55ecb8342d864358448c5e2c Author: Henry Castro <hcas...@collabora.com> Date: Wed Mar 21 09:46:33 2018 -0400 loleaflet: update w2ui-1.5.rc1 toolbar idba382395cbb23babe0052d4b20bbf4e580a5c94 Added toolbar scrolling for overlapped buttons Change-Id: If13788e4044fa22468e923efb37d565561a48bb3 Reviewed-on: https://gerrit.libreoffice.org/51705 Reviewed-by: Henry Castro <hcas...@collabora.com> Tested-by: Henry Castro <hcas...@collabora.com> diff --git a/loleaflet/dist/loleaflet.html.m4 b/loleaflet/dist/loleaflet.html.m4 index b53a20deb..be6ac26ff 100644 --- a/loleaflet/dist/loleaflet.html.m4 +++ b/loleaflet/dist/loleaflet.html.m4 @@ -20,7 +20,7 @@ changequote([,])dnl window.addEventListener('message', PostMessageReadyListener, false); </script> <link rel="stylesheet" href="/loleaflet/%VERSION%/branding.css"> <!-- add your logo here --> -ifelse(debug,[true],[<link rel="stylesheet" href="/loleaflet/%VERSION%/toolbar/w2ui-1.4.3.css">],[dnl]) +ifelse(debug,[true],[<link rel="stylesheet" href="/loleaflet/%VERSION%/w2ui-1.5.rc1.css">],[dnl]) <link rel="localizations" href="/loleaflet/%VERSION%/l10n/localizations.json" type="application/vnd.oftn.l10n+json"/> <link rel="localizations" href="/loleaflet/%VERSION%/l10n/locore-localizations.json" type="application/vnd.oftn.l10n+json" /> <link rel="localizations" href="/loleaflet/%VERSION%/l10n/uno-localizations.json" type="application/vnd.oftn.l10n+json" /> @@ -101,7 +101,7 @@ ifelse(debug,[true],[<link rel="stylesheet" href="/loleaflet/%VERSION%/toolbar/w <script src="/loleaflet/%VERSION%/branding.js"></script> <!-- logo onclick handler --> <script src="/loleaflet/%VERSION%/bundle.js"></script> ifelse(debug,[true], -[ <script src="/loleaflet/%VERSION%/toolbar/w2ui-1.4.3.js"></script>], -[ <script src="/loleaflet/%VERSION%/toolbar/w2ui-1.4.3.min.js"></script>]) +[ <script src="/loleaflet/%VERSION%/toolbar/w2ui-1.5.rc1.js"></script>], +[ <script src="/loleaflet/%VERSION%/toolbar/w2ui-1.5.rc1.min.js"></script>]) <script src="/loleaflet/%VERSION%/toolbar/toolbar.js"></script> </body></html> diff --git a/loleaflet/dist/toolbar/w2ui-1.5.rc1.js b/loleaflet/dist/toolbar/w2ui-1.5.rc1.js new file mode 100644 index 000000000..89f54de62 --- /dev/null +++ b/loleaflet/dist/toolbar/w2ui-1.5.rc1.js @@ -0,0 +1,18953 @@ +/* w2ui 1.5.rc1 (nightly) (c) http://w2ui.com, vitmal...@gmail.com */ +var w2ui = w2ui || {}; +var w2obj = w2obj || {}; // expose object to be able to overwrite default functions + +/************************************************ +* Library: Web 2.0 UI for jQuery +* - Following objects are defines +* - w2ui - object that will contain all widgets +* - w2obj - object with widget prototypes +* - w2utils - basic utilities +* - $().w2render - common render +* - $().w2destroy - common destroy +* - $().w2marker - marker plugin +* - $().w2tag - tag plugin +* - $().w2overlay - overlay plugin +* - $().w2menu - menu plugin +* - w2utils.event - generic event object +* - Dependencies: jQuery +* +* == NICE TO HAVE == +* - overlay should be displayed where more space (on top or on bottom) +* - write and article how to replace certain framework functions +* - add maxHeight for the w2menu +* - add time zone +* - TEST On IOS +* - $().w2marker() -- only unmarks first instance +* - subitems for w2menus() +* - add w2utils.lang wrap for all captions in all buttons. +* - $().w2date(), $().w2dateTime() +* +************************************************/ + +var w2utils = (function ($) { + var tmp = {}; // for some temp variables + var obj = { + version : '1.5.RC1', + settings : { + "locale" : "en-us", + "dateFormat" : "m/d/yyyy", + "timeFormat" : "hh:mi pm", + "datetimeFormat" : "m/d/yyyy|hh:mi pm", + "currencyPrefix" : "$", + "currencySuffix" : "", + "currencyPrecision" : 2, + "groupSymbol" : ",", + "decimalSymbol" : ".", + "shortmonths" : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + "fullmonths" : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + "shortdays" : ["M", "T", "W", "T", "F", "S", "S"], + "fulldays" : ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], + "weekStarts" : "M", // can be "M" for Monday or "S" for Sunday + "dataType" : 'HTTPJSON', // can be HTTP, HTTPJSON, RESTFULL, RESTFULLJSON, JSON (case sensitive) + "phrases" : {}, // empty object for english phrases + "dateStartYear" : 1950, // start year for date-picker + "dateEndYear" : 2020 // end year for date picker + }, + isBin : isBin, + isInt : isInt, + isFloat : isFloat, + isMoney : isMoney, + isHex : isHex, + isAlphaNumeric : isAlphaNumeric, + isEmail : isEmail, + isDate : isDate, + isTime : isTime, + isDateTime : isDateTime, + age : age, + interval : interval, + date : date, + formatSize : formatSize, + formatNumber : formatNumber, + formatDate : formatDate, + formatTime : formatTime, + formatDateTime : formatDateTime, + stripTags : stripTags, + encodeTags : encodeTags, + decodeTags : decodeTags, + escapeId : escapeId, + base64encode : base64encode, + base64decode : base64decode, + md5 : md5, + transition : transition, + lock : lock, + unlock : unlock, + message : message, + lang : lang, + locale : locale, + getSize : getSize, + getStrWidth : getStrWidth, + scrollBarSize : scrollBarSize, + checkName : checkName, + checkUniqueId : checkUniqueId, + parseRoute : parseRoute, + cssPrefix : cssPrefix, + getCursorPosition : getCursorPosition, + setCursorPosition : setCursorPosition, + testLocalStorage : testLocalStorage, + hasLocalStorage : testLocalStorage(), + // some internal variables + isIOS : ((navigator.userAgent.toLowerCase().indexOf('iphone') != -1 || + navigator.userAgent.toLowerCase().indexOf('ipod') != -1 || + navigator.userAgent.toLowerCase().indexOf('ipad') != -1) + ? true : false), + isIE : ((navigator.userAgent.toLowerCase().indexOf('msie') != -1 || + navigator.userAgent.toLowerCase().indexOf('trident') != -1 ) + ? true : false) + }; + return obj; + + function isBin (val) { + var re = /^[0-1]+$/; + return re.test(val); + } + + function isInt (val) { + var re = /^[-+]?[0-9]+$/; + return re.test(val); + } + + function isFloat (val) { + if (typeof val == 'string') val = val.replace(/\s+/g, '').replace(w2utils.settings.groupSymbol, '').replace(w2utils.settings.decimalSymbol, '.'); + return (typeof val === 'number' || (typeof val === 'string' && val !== '')) && !isNaN(Number(val)); + } + + function isMoney (val) { + var se = w2utils.settings; + var re = new RegExp('^'+ (se.currencyPrefix ? '\\' + se.currencyPrefix + '?' : '') + + '[-+]?'+ (se.currencyPrefix ? '\\' + se.currencyPrefix + '?' : '') + + '[0-9]*[\\'+ se.decimalSymbol +']?[0-9]+'+ (se.currencySuffix ? '\\' + se.currencySuffix + '?' : '') +'$', 'i'); + if (typeof val === 'string') { + val = val.replace(new RegExp(se.groupSymbol, 'g'), ''); + } + if (typeof val === 'object' || val === '') return false; + return re.test(val); + } + + function isHex (val) { + var re = /^[a-fA-F0-9]+$/; + return re.test(val); + } + + function isAlphaNumeric (val) { + var re = /^[a-zA-Z0-9_-]+$/; + return re.test(val); + } + + function isEmail (val) { + var email = /^[a-zA-Z0-9._%-+]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; + return email.test(val); + } + + function isDate (val, format, retDate) { + if (!val) return false; + + var dt = 'Invalid Date'; + var month, day, year; + + if (format == null) format = w2utils.settings.dateFormat; + + if (typeof val.getUTCFullYear === 'function') { // date object + year = val.getUTCFullYear(); + month = val.getUTCMonth() + 1; + day = val.getUTCDate(); + } else if (parseInt(val) == val && parseInt(val) > 0) { + val = new Date(parseInt(val)); + year = val.getUTCFullYear(); + month = val.getUTCMonth() + 1; + day = val.getUTCDate(); + } else { + val = String(val); + // convert month formats + if (new RegExp('mon', 'ig').test(format)) { + format = format.replace(/month/ig, 'm').replace(/mon/ig, 'm').replace(/dd/ig, 'd').replace(/[, ]/ig, '/').replace(/\/\//g, '/').toLowerCase(); + val = val.replace(/[, ]/ig, '/').replace(/\/\//g, '/').toLowerCase(); + for (var m = 0, len = w2utils.settings.fullmonths.length; m < len; m++) { + var t = w2utils.settings.fullmonths[m]; + val = val.replace(new RegExp(t, 'ig'), (parseInt(m) + 1)).replace(new RegExp(t.substr(0, 3), 'ig'), (parseInt(m) + 1)); + } + } + // format date + var tmp = val.replace(/-/g, '/').replace(/\./g, '/').toLowerCase().split('/'); + var tmp2 = format.replace(/-/g, '/').replace(/\./g, '/').toLowerCase(); + if (tmp2 === 'mm/dd/yyyy') { month = tmp[0]; day = tmp[1]; year = tmp[2]; } + if (tmp2 === 'm/d/yyyy') { month = tmp[0]; day = tmp[1]; year = tmp[2]; } + if (tmp2 === 'dd/mm/yyyy') { month = tmp[1]; day = tmp[0]; year = tmp[2]; } + if (tmp2 === 'd/m/yyyy') { month = tmp[1]; day = tmp[0]; year = tmp[2]; } + if (tmp2 === 'yyyy/dd/mm') { month = tmp[2]; day = tmp[1]; year = tmp[0]; } + if (tmp2 === 'yyyy/d/m') { month = tmp[2]; day = tmp[1]; year = tmp[0]; } + if (tmp2 === 'yyyy/mm/dd') { month = tmp[1]; day = tmp[2]; year = tmp[0]; } + if (tmp2 === 'yyyy/m/d') { month = tmp[1]; day = tmp[2]; year = tmp[0]; } + if (tmp2 === 'mm/dd/yy') { month = tmp[0]; day = tmp[1]; year = tmp[2]; } + if (tmp2 === 'm/d/yy') { month = tmp[0]; day = tmp[1]; year = parseInt(tmp[2]) + 1900; } + if (tmp2 === 'dd/mm/yy') { month = tmp[1]; day = tmp[0]; year = parseInt(tmp[2]) + 1900; } + if (tmp2 === 'd/m/yy') { month = tmp[1]; day = tmp[0]; year = parseInt(tmp[2]) + 1900; } + if (tmp2 === 'yy/dd/mm') { month = tmp[2]; day = tmp[1]; year = parseInt(tmp[0]) + 1900; } + if (tmp2 === 'yy/d/m') { month = tmp[2]; day = tmp[1]; year = parseInt(tmp[0]) + 1900; } + if (tmp2 === 'yy/mm/dd') { month = tmp[1]; day = tmp[2]; year = parseInt(tmp[0]) + 1900; } + if (tmp2 === 'yy/m/d') { month = tmp[1]; day = tmp[2]; year = parseInt(tmp[0]) + 1900; } + } + if (!isInt(year)) return false; + if (!isInt(month)) return false; + if (!isInt(day)) return false; + year = +year; + month = +month; + day = +day; + dt = new Date(year, month - 1, day); + // do checks + if (month == null) return false; + if (String(dt) == 'Invalid Date') return false; + if ((dt.getMonth() + 1 !== month) || (dt.getDate() !== day) || (dt.getFullYear() !== year)) return false; + if (retDate === true) return dt; else return true; + } + + function isTime (val, retTime) { + // Both formats 10:20pm and 22:20 + if (val == null) return false; + var max, am, pm; + // -- process american format + val = String(val); + val = val.toUpperCase(); + am = val.indexOf('AM') >= 0; + pm = val.indexOf('PM') >= 0; + var ampm = (pm || am); + if (ampm) max = 12; else max = 24; + val = val.replace('AM', '').replace('PM', ''); + val = $.trim(val); + // --- + var tmp = val.split(':'); + var h = parseInt(tmp[0] || 0), m = parseInt(tmp[1] || 0), s = parseInt(tmp[2] || 0); + // accept edge case: 3PM is a good timestamp, but 3 (without AM or PM) is NOT: + if ((!ampm || tmp.length !== 1) && tmp.length !== 2 && tmp.length !== 3) { return false; } + if (tmp[0] === '' || h < 0 || h > max || !this.isInt(tmp[0]) || tmp[0].length > 2) { return false; } + if (tmp.length > 1 && (tmp[1] === '' || m < 0 || m > 59 || !this.isInt(tmp[1]) || tmp[1].length !== 2)) { return false; } + if (tmp.length > 2 && (tmp[2] === '' || s < 0 || s > 59 || !this.isInt(tmp[2]) || tmp[2].length !== 2)) { return false; } + // check the edge cases: 12:01AM is ok, as is 12:01PM, but 24:01 is NOT ok while 24:00 is (midnight; equivalent to 00:00). + // meanwhile, there is 00:00 which is ok, but 0AM nor 0PM are okay, while 0:01AM and 0:00AM are. + if (!ampm && max === h && (m !== 0 || s !== 0)) { return false; } + if (ampm && tmp.length === 1 && h === 0) { return false; } + + if (retTime === true) { + if (pm && h !== 12) h += 12; // 12:00pm - is noon + if (am && h === 12) h += 12; // 12:00am - is midnight + return { + hours: h, + minutes: m, + seconds: s + }; + } + return true; + } + + function isDateTime (val, format, retDate) { + if (format == null) format = w2utils.settings.datetimeFormat; + var formats = format.split('|'); + if (typeof val.getUTCFullYear === 'function') { // date object + if (retDate !== true) return true; + return val; + } else if (parseInt(val) == val && parseInt(val) > 0) { + val = new Date(parseInt(val)); + if (retDate !== true) return true; + return val; + } else { + var tmp = String(val).indexOf(' '); + var values = [val.substr(0, tmp), val.substr(tmp).trim()]; + formats[0] = formats[0].trim(); + if (formats[1]) formats[1] = formats[1].trim(); + // check + var tmp1 = w2utils.isDate(values[0], formats[0], true); + var tmp2 = w2utils.isTime(values[1], true); + if (tmp1 !== false && tmp2 !== false) { + if (retDate !== true) return true; + tmp1.setHours(tmp2.hours); + tmp1.setMinutes(tmp2.minutes); + tmp1.setSeconds(tmp2.seconds); + return tmp1; + } else { + return false; + } + } + } + + function age(dateStr) { + var d1; + if (dateStr === '' || dateStr == null) return ''; + if (typeof dateStr.getUTCFullYear === 'function') { // date object + d1 = dateStr; + } else if (parseInt(dateStr) == dateStr && parseInt(dateStr) > 0) { + d1 = new Date(parseInt(dateStr)); + } else { + d1 = new Date(dateStr); + } + if (String(d1) == 'Invalid Date') return ''; + + var d2 = new Date(); + var sec = (d2.getTime() - d1.getTime()) / 1000; + var amount = ''; + var type = ''; + if (sec < 0) { + amount = 0; + type = 'sec'; + } else if (sec < 60) { + amount = Math.floor(sec); + type = 'sec'; + if (sec < 0) { amount = 0; type = 'sec'; } + } else if (sec < 60*60) { + amount = Math.floor(sec/60); + type = 'min'; + } else if (sec < 24*60*60) { + amount = Math.floor(sec/60/60); + type = 'hour'; + } else if (sec < 30*24*60*60) { + amount = Math.floor(sec/24/60/60); + type = 'day'; + } else if (sec < 365*24*60*60) { + amount = Math.floor(sec/30/24/60/60*10)/10; + type = 'month'; + } else if (sec < 365*4*24*60*60) { + amount = Math.floor(sec/365/24/60/60*10)/10; + type = 'year'; + } else if (sec >= 365*4*24*60*60) { + // factor in leap year shift (only older then 4 years) + amount = Math.floor(sec/365.25/24/60/60*10)/10; + type = 'year'; + } + return amount + ' ' + type + (amount > 1 ? 's' : ''); + } + + function interval (value) { + var ret = ''; + if (value < 1000) { + ret = "< 1 sec"; + } else if (value < 60000) { + ret = Math.floor(value / 1000) + " secs"; + } else if (value < 3600000) { + ret = Math.floor(value / 60000) + " mins"; + } else if (value < 86400000) { + ret = Math.floor(value / 3600000 * 10) / 10 + " hours"; + } else if (value < 2628000000) { + ret = Math.floor(value / 86400000 * 10) / 10 + " days"; + } else if (value < 3.1536e+10) { + ret = Math.floor(value / 2628000000 * 10) / 10 + " months"; + } else { + ret = Math.floor(value / 3.1536e+9) / 10 + " years"; + } + return ret; + } + + function date (dateStr) { + if (dateStr === '' || dateStr == null || (typeof dateStr == 'object' && !dateStr.getMonth)) return ''; + var d1 = new Date(dateStr); + if (w2utils.isInt(dateStr)) d1 = new Date(Number(dateStr)); // for unix timestamps + if (String(d1) == 'Invalid Date') return ''; + + var months = w2utils.settings.shortmonths; + var d2 = new Date(); // today + var d3 = new Date(); + d3.setTime(d3.getTime() - 86400000); // yesterday + + var dd1 = months[d1.getMonth()] + ' ' + d1.getDate() + ', ' + d1.getFullYear(); + var dd2 = months[d2.getMonth()] + ' ' + d2.getDate() + ', ' + d2.getFullYear(); + var dd3 = months[d3.getMonth()] + ' ' + d3.getDate() + ', ' + d3.getFullYear(); + + var time = (d1.getHours() - (d1.getHours() > 12 ? 12 :0)) + ':' + (d1.getMinutes() < 10 ? '0' : '') + d1.getMinutes() + ' ' + (d1.getHours() >= 12 ? 'pm' : 'am'); + var time2= (d1.getHours() - (d1.getHours() > 12 ? 12 :0)) + ':' + (d1.getMinutes() < 10 ? '0' : '') + d1.getMinutes() + ':' + (d1.getSeconds() < 10 ? '0' : '') + d1.getSeconds() + ' ' + (d1.getHours() >= 12 ? 'pm' : 'am'); + var dsp = dd1; + if (dd1 === dd2) dsp = time; + if (dd1 === dd3) dsp = w2utils.lang('Yesterday'); + + return '<span title="'+ dd1 +' ' + time2 +'">'+ dsp +'</span>'; + } + + function formatSize (sizeStr) { + if (!w2utils.isFloat(sizeStr) || sizeStr === '') return ''; + sizeStr = parseFloat(sizeStr); + if (sizeStr === 0) return 0; + var sizes = ['Bt', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB']; + var i = parseInt( Math.floor( Math.log(sizeStr) / Math.log(1024) ) ); + return (Math.floor(sizeStr / Math.pow(1024, i) * 10) / 10).toFixed(i === 0 ? 0 : 1) + ' ' + (sizes[i] || '??'); + } + + function formatNumber (val, fraction, useGrouping) { + if (val == null || val === '' || typeof val == 'object') return ''; + var options = { + minimumFractionDigits : fraction, + maximumFractionDigits : fraction, + useGrouping : useGrouping + }; + if (fraction == null || fraction < 0) { + options.minimumFractionDigits = 0; + options.maximumFractionDigits = 20; + } + return parseFloat(val).toLocaleString(w2utils.settings.locale, options); + } + + function formatDate (dateStr, format) { // IMPORTANT dateStr HAS TO BE valid JavaScript Date String + if (!format) format = this.settings.dateFormat; + if (dateStr === '' || dateStr == null || (typeof dateStr == 'object' && !dateStr.getMonth)) return ''; + + var dt = new Date(dateStr); + if (w2utils.isInt(dateStr)) dt = new Date(Number(dateStr)); // for unix timestamps + if (String(dt) == 'Invalid Date') return ''; + + var year = dt.getFullYear(); + var month = dt.getMonth(); + var date = dt.getDate(); + return format.toLowerCase() + .replace('month', w2utils.settings.fullmonths[month]) + .replace('mon', w2utils.settings.shortmonths[month]) + .replace(/yyyy/g, year) + .replace(/yyy/g, year) + .replace(/yy/g, year > 2000 ? 100 + parseInt(String(year).substr(2)) : String(year).substr(2)) + .replace(/(^|[^a-z$])y/g, '$1' + year) // only y's that are not preceded by a letter + .replace(/mm/g, (month + 1 < 10 ? '0' : '') + (month + 1)) + .replace(/dd/g, (date < 10 ? '0' : '') + date) + .replace(/th/g, (date == 1 ? 'st' : 'th')) + .replace(/th/g, (date == 2 ? 'nd' : 'th')) + .replace(/th/g, (date == 3 ? 'rd' : 'th')) + .replace(/(^|[^a-z$])m/g, '$1' + (month + 1)) // only y's that are not preceded by a letter + .replace(/(^|[^a-z$])d/g, '$1' + date); // only y's that are not preceded by a letter + } + + function formatTime (dateStr, format) { // IMPORTANT dateStr HAS TO BE valid JavaScript Date String + var months = w2utils.settings.shortmonths; + var fullMonths = w2utils.settings.fullmonths; + if (!format) format = this.settings.timeFormat; + if (dateStr === '' || dateStr == null || (typeof dateStr == 'object' && !dateStr.getMonth)) return ''; + + var dt = new Date(dateStr); + if (w2utils.isInt(dateStr)) dt = new Date(Number(dateStr)); // for unix timestamps + if (w2utils.isTime(dateStr)) { + var tmp = w2utils.isTime(dateStr, true); + dt = new Date(); + dt.setHours(tmp.hours); + dt.setMinutes(tmp.minutes); + } + if (String(dt) == 'Invalid Date') return ''; + + var type = 'am'; + var hour = dt.getHours(); + var h24 = dt.getHours(); + var min = dt.getMinutes(); + var sec = dt.getSeconds(); + if (min < 10) min = '0' + min; + if (sec < 10) sec = '0' + sec; + if (format.indexOf('am') !== -1 || format.indexOf('pm') !== -1) { + if (hour >= 12) type = 'pm'; + if (hour > 12) hour = hour - 12; + } + return format.toLowerCase() + .replace('am', type) + .replace('pm', type) + .replace('hhh', (hour < 10 ? '0' + hour : hour)) + .replace('hh24', (h24 < 10 ? '0' + h24 : h24)) + .replace('h24', h24) + .replace('hh', hour) + .replace('mm', min) + .replace('mi', min) + .replace('ss', sec) + .replace(/(^|[^a-z$])h/g, '$1' + hour) // only y's that are not preceded by a letter + .replace(/(^|[^a-z$])m/g, '$1' + min) // only y's that are not preceded by a letter + .replace(/(^|[^a-z$])s/g, '$1' + sec); // only y's that are not preceded by a letter + } + + function formatDateTime(dateStr, format) { + var fmt; + if (dateStr === '' || dateStr == null || (typeof dateStr == 'object' && !dateStr.getMonth)) return ''; + if (typeof format !== 'string') { + fmt = [this.settings.dateFormat, this.settings.timeFormat]; + } else { + fmt = format.split('|'); + fmt[0] = fmt[0].trim(); + fmt[1] = fmt[1].trim(); + } + // older formats support + if (fmt[1] == 'h12') fmt[1] = 'h:m pm'; + if (fmt[1] == 'h24') fmt[1] = 'h24:m'; + return this.formatDate(dateStr, fmt[0]) + ' ' + this.formatTime(dateStr, fmt[1]); + } + + function stripTags (html) { + if (html == null) return html; + switch (typeof html) { + case 'number': + break; + case 'string': + html = String(html).replace(/(<([^>]+)>)/ig, ""); + break; + case 'object': + // does not modify original object, but creates a copy + if (Array.isArray(html)) { + html = $.extend(true, [], html); + for (var i = 0; i < html.length; i++) html[i] = this.stripTags(html[i]); + } else { + html = $.extend(true, {}, html); + for (var i in html) html[i] = this.stripTags(html[i]); + } + break; + } + return html; + } + + function encodeTags (html) { + if (html == null) return html; + switch (typeof html) { + case 'number': + break; + case 'string': + html = String(html).replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, """); + break; + case 'object': + // does not modify original object, but creates a copy + if (Array.isArray(html)) { + html = $.extend(true, [], html); + for (var i = 0; i < html.length; i++) html[i] = this.encodeTags(html[i]); + } else { + html = $.extend(true, {}, html); + for (var i in html) html[i] = this.encodeTags(html[i]); + } + break; + } + return html; + } + + function decodeTags (html) { + if (html == null) return html; + switch (typeof html) { + case 'number': + break; + case 'string': + html = String(html).replace(/>/g, ">").replace(/</g, "<").replace(/"/g, '"').replace(/&/g, "&"); + break; + case 'object': + // does not modify original object, but creates a copy + if (Array.isArray(html)) { + html = $.extend(true, [], html); + for (var i = 0; i < html.length; i++) html[i] = this.decodeTags(html[i]); + } else { + html = $.extend(true, {}, html); + for (var i in html) html[i] = this.decodeTags(html[i]); + } + break; + } + return html; + } + + function escapeId (id) { + if (id === '' || id == null) return ''; + return String(id).replace(/([;&,\.\+\*\~'`:"\!\^#$%@\[\]\(\)=<>\|\/? {}\\])/g, '\\$1'); + } + + function base64encode (input) { + var output = ""; + var chr1, chr2, chr3, enc1, enc2, enc3, enc4; + var i = 0; + var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + input = utf8_encode(input); + + while (i < input.length) { + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); + } + + function utf8_encode (string) { + string = String(string).replace(/\r\n/g,"\n"); + var utftext = ""; + + for (var n = 0; n < string.length; n++) { + var c = string.charCodeAt(n); + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + } + return utftext; + } + + return output; + } + + function base64decode (input) { + var output = ""; + var chr1, chr2, chr3; + var enc1, enc2, enc3, enc4; + var i = 0; + var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + + while (i < input.length) { + enc1 = keyStr.indexOf(input.charAt(i++)); + enc2 = keyStr.indexOf(input.charAt(i++)); + enc3 = keyStr.indexOf(input.charAt(i++)); + enc4 = keyStr.indexOf(input.charAt(i++)); + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + output = output + String.fromCharCode(chr1); + if (enc3 !== 64) { + output = output + String.fromCharCode(chr2); + } + if (enc4 !== 64) { + output = output + String.fromCharCode(chr3); + } + } + output = utf8_decode(output); + + function utf8_decode (utftext) { + var string = ""; + var i = 0; + var c = 0, c2, c3; + + while ( i < utftext.length ) { + c = utftext.charCodeAt(i); + if (c < 128) { + string += String.fromCharCode(c); + i++; + } + else if((c > 191) && (c < 224)) { + c2 = utftext.charCodeAt(i+1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } + else { + c2 = utftext.charCodeAt(i+1); + c3 = utftext.charCodeAt(i+2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + } + + return string; + } + + return output; + } + + function md5(input) { + /* + * Based on http://pajhome.org.uk/crypt/md5 + */ + + var hexcase = 0; + var b64pad = ""; + + function __pj_crypt_hex_md5(s) { + return __pj_crypt_rstr2hex(__pj_crypt_rstr_md5(__pj_crypt_str2rstr_utf8(s))); + } + function __pj_crypt_b64_md5(s) { + return __pj_crypt_rstr2b64(__pj_crypt_rstr_md5(__pj_crypt_str2rstr_utf8(s))); + } + function __pj_crypt_any_md5(s, e) { + return __pj_crypt_rstr2any(__pj_crypt_rstr_md5(__pj_crypt_str2rstr_utf8(s)), e); + } + function __pj_crypt_hex_hmac_md5(k, d) + { + return __pj_crypt_rstr2hex(__pj_crypt_rstr_hmac_md5(__pj_crypt_str2rstr_utf8(k), __pj_crypt_str2rstr_utf8(d))); + } + function __pj_crypt_b64_hmac_md5(k, d) + { + return __pj_crypt_rstr2b64(__pj_crypt_rstr_hmac_md5(__pj_crypt_str2rstr_utf8(k), __pj_crypt_str2rstr_utf8(d))); + } + function __pj_crypt_any_hmac_md5(k, d, e) + { + return __pj_crypt_rstr2any(__pj_crypt_rstr_hmac_md5(__pj_crypt_str2rstr_utf8(k), __pj_crypt_str2rstr_utf8(d)), e); + } + + /* + * Calculate the MD5 of a raw string + */ + function __pj_crypt_rstr_md5(s) + { + return __pj_crypt_binl2rstr(__pj_crypt_binl_md5(__pj_crypt_rstr2binl(s), s.length * 8)); + } + + /* + * Calculate the HMAC-MD5, of a key and some data (raw strings) + */ + function __pj_crypt_rstr_hmac_md5(key, data) + { + var bkey = __pj_crypt_rstr2binl(key); + if (bkey.length > 16) + bkey = __pj_crypt_binl_md5(bkey, key.length * 8); + + var ipad = Array(16), opad = Array(16); + for (var i = 0; i < 16; i++) + { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + var hash = __pj_crypt_binl_md5(ipad.concat(__pj_crypt_rstr2binl(data)), 512 + data.length * 8); + return __pj_crypt_binl2rstr(__pj_crypt_binl_md5(opad.concat(hash), 512 + 128)); + } + + /* + * Convert a raw string to a hex string + */ + function __pj_crypt_rstr2hex(input) + { + try { + hexcase + } catch (e) { + hexcase = 0; + } + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var output = ""; + var x; + for (var i = 0; i < input.length; i++) + { + x = input.charCodeAt(i); + output += hex_tab.charAt((x >>> 4) & 0x0F) + + hex_tab.charAt(x & 0x0F); + } + return output; + } + + /* + * Convert a raw string to a base-64 string + */ + function __pj_crypt_rstr2b64(input) + { + try { + b64pad + } catch (e) { + b64pad = ''; + } + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var output = ""; + var len = input.length; + for (var i = 0; i < len; i += 3) + { + var triplet = (input.charCodeAt(i) << 16) + | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) + | (i + 2 < len ? input.charCodeAt(i + 2) : 0); + for (var j = 0; j < 4; j++) + { + if (i * 8 + j * 6 > input.length * 8) + output += b64pad; + else + output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F); + } + } + return output; + } + + /* + * Convert a raw string to an arbitrary string encoding + */ + function __pj_crypt_rstr2any(input, encoding) + { + var divisor = encoding.length; + var i, j, q, x, quotient; + + /* Convert to an array of 16-bit big-endian values, forming the dividend */ + var dividend = Array(Math.ceil(input.length / 2)); + for (i = 0; i < dividend.length; i++) + { + dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1); + } + + /* + * Repeatedly perform a long division. The binary array forms the dividend, + * the length of the encoding is the divisor. Once computed, the quotient + * forms the dividend for the next step. All remainders are stored for later + * use. + */ + var full_length = Math.ceil(input.length * 8 / + (Math.log(encoding.length) / Math.log(2))); + var remainders = Array(full_length); + for (j = 0; j < full_length; j++) + { + quotient = Array(); + x = 0; + for (i = 0; i < dividend.length; i++) + { + x = (x << 16) + dividend[i]; + q = Math.floor(x / divisor); + x -= q * divisor; + if (quotient.length > 0 || q > 0) + quotient[quotient.length] = q; + } + remainders[j] = x; + dividend = quotient; + } + + /* Convert the remainders to the output string */ + var output = ""; + for (i = remainders.length - 1; i >= 0; i--) + output += encoding.charAt(remainders[i]); + + return output; + } + + /* + * Encode a string as utf-8. + * For efficiency, this assumes the input is valid utf-16. + */ + function __pj_crypt_str2rstr_utf8(input) + { + var output = ""; + var i = -1; + var x, y; + + while (++i < input.length) + { + /* Decode utf-16 surrogate pairs */ + x = input.charCodeAt(i); + y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0; + if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) + { + x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); + i++; + } + + /* Encode output as utf-8 */ + if (x <= 0x7F) + output += String.fromCharCode(x); + else if (x <= 0x7FF) + output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F), + 0x80 | (x & 0x3F)); + else if (x <= 0xFFFF) + output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), + 0x80 | ((x >>> 6) & 0x3F), + 0x80 | (x & 0x3F)); + else if (x <= 0x1FFFFF) + output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), + 0x80 | ((x >>> 12) & 0x3F), + 0x80 | ((x >>> 6) & 0x3F), + 0x80 | (x & 0x3F)); + } + return output; + } + + /* + * Encode a string as utf-16 + */ + function __pj_crypt_str2rstr_utf16le(input) + { + var output = ""; + for (var i = 0; i < input.length; i++) + output += String.fromCharCode(input.charCodeAt(i) & 0xFF, + (input.charCodeAt(i) >>> 8) & 0xFF); + return output; + } + + function __pj_crypt_str2rstr_utf16be(input) + { + var output = ""; + for (var i = 0; i < input.length; i++) + output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, + input.charCodeAt(i) & 0xFF); + return output; + } + + /* + * Convert a raw string to an array of little-endian words + * Characters >255 have their high-byte silently ignored. + */ + function __pj_crypt_rstr2binl(input) + { + var output = Array(input.length >> 2); + for (var i = 0; i < output.length; i++) + output[i] = 0; + for (var i = 0; i < input.length * 8; i += 8) + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32); + return output; + } + + /* + * Convert an array of little-endian words to a string + */ + function __pj_crypt_binl2rstr(input) + { + var output = ""; + for (var i = 0; i < input.length * 32; i += 8) + output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF); + return output; + } + + /* + * Calculate the MD5 of an array of little-endian words, and a bit length. + */ + function __pj_crypt_binl_md5(x, len) + { + /* append padding */ + x[len >> 5] |= 0x80 << ((len) % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for (var i = 0; i < x.length; i += 16) + { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + + a = __pj_crypt_md5_ff(a, b, c, d, x[i + 0], 7, -680876936); + d = __pj_crypt_md5_ff(d, a, b, c, x[i + 1], 12, -389564586); + c = __pj_crypt_md5_ff(c, d, a, b, x[i + 2], 17, 606105819); + b = __pj_crypt_md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = __pj_crypt_md5_ff(a, b, c, d, x[i + 4], 7, -176418897); + d = __pj_crypt_md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = __pj_crypt_md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = __pj_crypt_md5_ff(b, c, d, a, x[i + 7], 22, -45705983); + a = __pj_crypt_md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = __pj_crypt_md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = __pj_crypt_md5_ff(c, d, a, b, x[i + 10], 17, -42063); + b = __pj_crypt_md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = __pj_crypt_md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = __pj_crypt_md5_ff(d, a, b, c, x[i + 13], 12, -40341101); + c = __pj_crypt_md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = __pj_crypt_md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); + + a = __pj_crypt_md5_gg(a, b, c, d, x[i + 1], 5, -165796510); + d = __pj_crypt_md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = __pj_crypt_md5_gg(c, d, a, b, x[i + 11], 14, 643717713); + b = __pj_crypt_md5_gg(b, c, d, a, x[i + 0], 20, -373897302); + a = __pj_crypt_md5_gg(a, b, c, d, x[i + 5], 5, -701558691); + d = __pj_crypt_md5_gg(d, a, b, c, x[i + 10], 9, 38016083); + c = __pj_crypt_md5_gg(c, d, a, b, x[i + 15], 14, -660478335); + b = __pj_crypt_md5_gg(b, c, d, a, x[i + 4], 20, -405537848); + a = __pj_crypt_md5_gg(a, b, c, d, x[i + 9], 5, 568446438); + d = __pj_crypt_md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = __pj_crypt_md5_gg(c, d, a, b, x[i + 3], 14, -187363961); + b = __pj_crypt_md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = __pj_crypt_md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = __pj_crypt_md5_gg(d, a, b, c, x[i + 2], 9, -51403784); + c = __pj_crypt_md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = __pj_crypt_md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); + + a = __pj_crypt_md5_hh(a, b, c, d, x[i + 5], 4, -378558); + d = __pj_crypt_md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = __pj_crypt_md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = __pj_crypt_md5_hh(b, c, d, a, x[i + 14], 23, -35309556); + a = __pj_crypt_md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = __pj_crypt_md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = __pj_crypt_md5_hh(c, d, a, b, x[i + 7], 16, -155497632); + b = __pj_crypt_md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = __pj_crypt_md5_hh(a, b, c, d, x[i + 13], 4, 681279174); + d = __pj_crypt_md5_hh(d, a, b, c, x[i + 0], 11, -358537222); + c = __pj_crypt_md5_hh(c, d, a, b, x[i + 3], 16, -722521979); + b = __pj_crypt_md5_hh(b, c, d, a, x[i + 6], 23, 76029189); + a = __pj_crypt_md5_hh(a, b, c, d, x[i + 9], 4, -640364487); + d = __pj_crypt_md5_hh(d, a, b, c, x[i + 12], 11, -421815835); + c = __pj_crypt_md5_hh(c, d, a, b, x[i + 15], 16, 530742520); + b = __pj_crypt_md5_hh(b, c, d, a, x[i + 2], 23, -995338651); + + a = __pj_crypt_md5_ii(a, b, c, d, x[i + 0], 6, -198630844); + d = __pj_crypt_md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = __pj_crypt_md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = __pj_crypt_md5_ii(b, c, d, a, x[i + 5], 21, -57434055); + a = __pj_crypt_md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = __pj_crypt_md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = __pj_crypt_md5_ii(c, d, a, b, x[i + 10], 15, -1051523); + b = __pj_crypt_md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = __pj_crypt_md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = __pj_crypt_md5_ii(d, a, b, c, x[i + 15], 10, -30611744); + c = __pj_crypt_md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = __pj_crypt_md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = __pj_crypt_md5_ii(a, b, c, d, x[i + 4], 6, -145523070); + d = __pj_crypt_md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = __pj_crypt_md5_ii(c, d, a, b, x[i + 2], 15, 718787259); + b = __pj_crypt_md5_ii(b, c, d, a, x[i + 9], 21, -343485551); + + a = __pj_crypt_safe_add(a, olda); + b = __pj_crypt_safe_add(b, oldb); + c = __pj_crypt_safe_add(c, oldc); + d = __pj_crypt_safe_add(d, oldd); + } + return Array(a, b, c, d); + } + + /* + * These functions implement the four basic operations the algorithm uses. + */ + function __pj_crypt_md5_cmn(q, a, b, x, s, t) + { + return __pj_crypt_safe_add(__pj_crypt_bit_rol(__pj_crypt_safe_add(__pj_crypt_safe_add(a, q), __pj_crypt_safe_add(x, t)), s), b); + } + function __pj_crypt_md5_ff(a, b, c, d, x, s, t) + { + return __pj_crypt_md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); + } + function __pj_crypt_md5_gg(a, b, c, d, x, s, t) + { + return __pj_crypt_md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); + } + function __pj_crypt_md5_hh(a, b, c, d, x, s, t) + { + return __pj_crypt_md5_cmn(b ^ c ^ d, a, b, x, s, t); + } + function __pj_crypt_md5_ii(a, b, c, d, x, s, t) + { + return __pj_crypt_md5_cmn(c ^ (b | (~d)), a, b, x, s, t); + } + + /* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ + function __pj_crypt_safe_add(x, y) + { + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); + } + + /* + * Bitwise rotate a 32-bit number to the left. + */ + function __pj_crypt_bit_rol(num, cnt) + { + return (num << cnt) | (num >>> (32 - cnt)); + } + + return __pj_crypt_hex_md5(input); + + } + + function transition (div_old, div_new, type, callBack) { + var width = $(div_old).width(); + var height = $(div_old).height(); + var time = 0.5; + + if (!div_old || !div_new) { + console.log('ERROR: Cannot do transition when one of the divs is null'); + return; + } + + div_old.parentNode.style.cssText += 'perspective: 900px; overflow: hidden;'; + div_old.style.cssText += '; position: absolute; z-index: 1019; backface-visibility: hidden'; + div_new.style.cssText += '; position: absolute; z-index: 1020; backface-visibility: hidden'; + + switch (type) { + case 'slide-left': + // init divs + div_old.style.cssText += 'overflow: hidden; transform: translate3d(0, 0, 0)'; + div_new.style.cssText += 'overflow: hidden; transform: translate3d('+ width + 'px, 0, 0)'; + $(div_new).show(); + // -- need a timing function because otherwise not working + window.setTimeout(function() { + div_new.style.cssText += 'transition: '+ time +'s; transform: translate3d(0, 0, 0)'; + div_old.style.cssText += 'transition: '+ time +'s; transform: translate3d(-'+ width +'px, 0, 0)'; + }, 1); + break; + + case 'slide-right': + // init divs + div_old.style.cssText += 'overflow: hidden; transform: translate3d(0, 0, 0)'; + div_new.style.cssText += 'overflow: hidden; transform: translate3d(-'+ width +'px, 0, 0)'; + $(div_new).show(); + // -- need a timing function because otherwise not working + window.setTimeout(function() { + div_new.style.cssText += 'transition: '+ time +'s; transform: translate3d(0px, 0, 0)'; + div_old.style.cssText += 'transition: '+ time +'s; transform: translate3d('+ width +'px, 0, 0)'; + }, 1); + break; + + case 'slide-down': + // init divs + div_old.style.cssText += 'overflow: hidden; z-index: 1; transform: translate3d(0, 0, 0)'; + div_new.style.cssText += 'overflow: hidden; z-index: 0; transform: translate3d(0, 0, 0)'; + $(div_new).show(); + // -- need a timing function because otherwise not working + window.setTimeout(function() { + div_new.style.cssText += 'transition: '+ time +'s; transform: translate3d(0, 0, 0)'; + div_old.style.cssText += 'transition: '+ time +'s; transform: translate3d(0, '+ height +'px, 0)'; + }, 1); + break; + + case 'slide-up': + // init divs + div_old.style.cssText += 'overflow: hidden; transform: translate3d(0, 0, 0)'; + div_new.style.cssText += 'overflow: hidden; transform: translate3d(0, '+ height +'px, 0)'; + $(div_new).show(); + // -- need a timing function because otherwise not working + window.setTimeout(function() { + div_new.style.cssText += 'transition: '+ time +'s; transform: translate3d(0, 0, 0)'; + div_old.style.cssText += 'transition: '+ time +'s; transform: translate3d(0, 0, 0)'; + }, 1); + break; + + case 'flip-left': + // init divs + div_old.style.cssText += 'overflow: hidden; transform: rotateY(0deg)'; + div_new.style.cssText += 'overflow: hidden; transform: rotateY(-180deg)'; + $(div_new).show(); + // -- need a timing function because otherwise not working + window.setTimeout(function() { + div_new.style.cssText += 'transition: '+ time +'s; transform: rotateY(0deg)'; + div_old.style.cssText += 'transition: '+ time +'s; transform: rotateY(180deg)'; + }, 1); + break; + + case 'flip-right': + // init divs + div_old.style.cssText += 'overflow: hidden; transform: rotateY(0deg)'; + div_new.style.cssText += 'overflow: hidden; transform: rotateY(180deg)'; + $(div_new).show(); + // -- need a timing function because otherwise not working + window.setTimeout(function() { + div_new.style.cssText += 'transition: '+ time +'s; transform: rotateY(0deg)'; + div_old.style.cssText += 'transition: '+ time +'s; transform: rotateY(-180deg)'; + }, 1); + break; + + case 'flip-down': + // init divs + div_old.style.cssText += 'overflow: hidden; transform: rotateX(0deg)'; + div_new.style.cssText += 'overflow: hidden; transform: rotateX(180deg)'; + $(div_new).show(); + // -- need a timing function because otherwise not working + window.setTimeout(function() { + div_new.style.cssText += 'transition: '+ time +'s; transform: rotateX(0deg)'; + div_old.style.cssText += 'transition: '+ time +'s; transform: rotateX(-180deg)'; + }, 1); + break; + + case 'flip-up': + // init divs + div_old.style.cssText += 'overflow: hidden; transform: rotateX(0deg)'; + div_new.style.cssText += 'overflow: hidden; transform: rotateX(-180deg)'; + $(div_new).show(); + // -- need a timing function because otherwise not working + window.setTimeout(function() { + div_new.style.cssText += 'transition: '+ time +'s; transform: rotateX(0deg)'; + div_old.style.cssText += 'transition: '+ time +'s; transform: rotateX(180deg)'; + }, 1); + break; + + case 'pop-in': + // init divs + div_old.style.cssText += 'overflow: hidden; transform: translate3d(0, 0, 0)'; + div_new.style.cssText += 'overflow: hidden; transform: translate3d(0, 0, 0); transform: scale(.8); opacity: 0;'; + $(div_new).show(); + // -- need a timing function because otherwise not working + window.setTimeout(function() { + div_new.style.cssText += 'transition: '+ time +'s; transform: scale(1); opacity: 1;'; + div_old.style.cssText += 'transition: '+ time +'s;'; + }, 1); + break; + + case 'pop-out': + // init divs + div_old.style.cssText += 'overflow: hidden; transform: translate3d(0, 0, 0); transform: scale(1); opacity: 1;'; + div_new.style.cssText += 'overflow: hidden; transform: translate3d(0, 0, 0); opacity: 0;'; + $(div_new).show(); + // -- need a timing function because otherwise not working + window.setTimeout(function() { + div_new.style.cssText += 'transition: '+ time +'s; opacity: 1;'; + div_old.style.cssText += 'transition: '+ time +'s; transform: scale(1.7); opacity: 0;'; + }, 1); + break; + + default: + // init divs + div_old.style.cssText += 'overflow: hidden; transform: translate3d(0, 0, 0)'; + div_new.style.cssText += 'overflow: hidden; translate3d(0, 0, 0); opacity: 0;'; + $(div_new).show(); + // -- need a timing function because otherwise not working + window.setTimeout(function() { + div_new.style.cssText += 'transition: '+ time +'s; opacity: 1;'; + div_old.style.cssText += 'transition: '+ time +'s'; + }, 1); + break; + } + + setTimeout(function () { + if (type === 'slide-down') { + $(div_old).css('z-index', '1019'); + $(div_new).css('z-index', '1020'); + } + if (div_new) { + $(div_new).css({ 'opacity': '1' }).css(w2utils.cssPrefix({ + 'transition': '', + 'transform' : '' + })); + } + if (div_old) { + $(div_old).css({ 'opacity': '1' }).css(w2utils.cssPrefix({ + 'transition': '', + 'transform' : '' + })); + } + if (typeof callBack === 'function') callBack(); + }, time * 1000); + } + + function lock (box, msg, spinner) { + var options = {}; + if (typeof msg === 'object') { + options = msg; + } else { + options.msg = msg; + options.spinner = spinner; + } + if (!options.msg && options.msg !== 0) options.msg = ''; + w2utils.unlock(box); + $(box).prepend( + '<div class="w2ui-lock"></div>'+ + '<div class="w2ui-lock-msg"></div>' + ); + var $lock = $(box).find('.w2ui-lock'); + var mess = $(box).find('.w2ui-lock-msg'); + if (!options.msg) mess.css({ 'background-color': 'transparent', 'border': '0px' }); + if (options.spinner === true) options.msg = '<div class="w2ui-spinner" '+ (!options.msg ? 'style="width: 35px; height: 35px"' : '') +'></div>' + options.msg; + if (options.opacity != null) $lock.css('opacity', options.opacity); + if (typeof $lock.fadeIn == 'function') { + $lock.fadeIn(200); + mess.html(options.msg).fadeIn(200); + } else { + $lock.show(); + mess.html(options.msg).show(0); + } + } + + function unlock (box, speed) { + if (isInt(speed)) { + $(box).find('.w2ui-lock').fadeOut(speed); + setTimeout(function () { + $(box).find('.w2ui-lock').remove(); + $(box).find('.w2ui-lock-msg').remove(); + }, speed); + } else { + $(box).find('.w2ui-lock').remove(); + $(box).find('.w2ui-lock-msg').remove(); + } + } + + /** + * Used in w2popup, w2grid, w2form, w2layout + * should be called with .call(...) method + */ + + function message(where, options) { + var obj = this, closeTimer, edata; + // var where.path = 'w2popup'; + // var where.title = '.w2ui-popup-title'; + // var where.body = '.w2ui-box'; + $().w2tag(); // hide all tags + if (!options) options = { width: 200, height: 100 }; + if (options.on == null) $.extend(options, w2utils.event); + if (options.width == null) options.width = 200; + if (options.height == null) options.height = 100; + var pWidth = parseInt($(where.box).width()); + var pHeight = parseInt($(where.box).height()); + var titleHeight = parseInt($(where.box).find(where.title).css('height') || 0); + if (options.width > pWidth) options.width = pWidth - 10; + if (options.height > pHeight - titleHeight) options.height = pHeight - 10 - titleHeight; + options.originalWidth = options.width; + options.originalHeight = options.height; + if (parseInt(options.width) < 0) options.width = pWidth + options.width; + if (parseInt(options.width) < 10) options.width = 10; + if (parseInt(options.height) < 0) options.height = pHeight + options.height - titleHeight; + if (parseInt(options.height) < 10) options.height = 10; + if (options.hideOnClick == null) options.hideOnClick = false; + var poptions = $(where.box).data('options') || {}; + if (options.width == null || options.width > poptions.width - 10) { + options.width = poptions.width - 10; + } + if (options.height == null || options.height > poptions.height - titleHeight - 5) { + options.height = poptions.height - titleHeight - 5; // need margin from bottom only + } + // negative value means margin + if (options.originalHeight < 0) options.height = pHeight + options.originalHeight - titleHeight; + if (options.originalWidth < 0) options.width = pWidth + options.originalWidth * 2; // x 2 because there is left and right margin + var head = $(where.box).find(where.title); + + // if some messages are closing, insta close them + var $tmp = $(where.box).find('.w2ui-message.w2ui-closing'); + if ($(where.box).find('.w2ui-message.w2ui-closing').length > 0) { + clearTimeout(closeTimer); + closeCB($tmp, $tmp.data('options') || {}); + } + var msgCount = $(where.box).find('.w2ui-message').length; + // remove message + if ($.trim(options.html) === '' && $.trim(options.body) === '' && $.trim(options.buttons) === '') { + if (msgCount === 0) return; // no messages at all + var $msg = $(where.box).find('#w2ui-message'+ (msgCount-1)); + var options = $msg.data('options') || {}; + // before event + edata = options.trigger({ phase: 'before', type: 'close', target: 'self' }); + if (edata.isCancelled === true) return; + // default behavior + $msg.css(w2utils.cssPrefix({ + 'transition': '0.15s', + 'transform': 'translateY(-' + options.height + 'px)' + })).addClass('w2ui-closing'); + if (msgCount == 1) { + if (this.unlock) { + if (where.param) this.unlock(where.param, 150); else this.unlock(150); + } + } else { + $(where.box).find('#w2ui-message'+ (msgCount-2)).css('z-index', 1500); + } + closeTimer = setTimeout(function () { closeCB($msg, options) }, 150); + + } else { + + if ($.trim(options.body) !== '' || $.trim(options.buttons) !== '') { + options.html = '<div class="w2ui-message-body">'+ (options.body || '') +'</div>'+ + '<div class="w2ui-message-buttons">'+ (options.buttons || '') +'</div>'; + } + // hide previous messages + $(where.box).find('.w2ui-message').css('z-index', 1390); + head.data('old-z-index', head.css('z-index')); + head.css('z-index', 1501); + // add message + $(where.box).find(where.body) + .before('<div id="w2ui-message' + msgCount + '" onmousedown="event.stopPropagation();" '+ + ' class="w2ui-message" style="display: none; z-index: 1500; ' + + (head.length === 0 ? 'top: 0px;' : 'top: ' + w2utils.getSize(head, 'height') + 'px;') + + (options.width != null ? 'width: ' + options.width + 'px; left: ' + ((pWidth - options.width) / 2) + 'px;' : 'left: 10px; right: 10px;') + + (options.height != null ? 'height: ' + options.height + 'px;' : 'bottom: 6px;') + + w2utils.cssPrefix('transition', '.3s', true) + '"' + + (options.hideOnClick === true + ? where.param + ? 'onclick="'+ where.path +'.message(\''+ where.param +'\');"' + : 'onclick="'+ where.path +'.message();"' + : '') + '>' + + '</div>'); + $(where.box).find('#w2ui-message'+ msgCount) + .data('options', options) + .data('prev_focus', $(':focus')); + var display = $(where.box).find('#w2ui-message'+ msgCount).css('display'); + $(where.box).find('#w2ui-message'+ msgCount).css(w2utils.cssPrefix({ + 'transform': (display == 'none' ? 'translateY(-' + options.height + 'px)' : 'translateY(0px)') + })); + if (display == 'none') { + $(where.box).find('#w2ui-message'+ msgCount).show().html(options.html); + options.box = $(where.box).find('#w2ui-message'+ msgCount); + // before event + edata = options.trigger({ phase: 'before', type: 'open', target: 'self' }); + if (edata.isCancelled === true) { + head.css('z-index', head.data('old-z-index')); + $(where.box).find('#w2ui-message'+ msgCount).remove(); + return; + } + // timer needs to animation + setTimeout(function () { + $(where.box).find('#w2ui-message'+ msgCount).css(w2utils.cssPrefix({ + 'transform': (display == 'none' ? 'translateY(0px)' : 'translateY(-' + options.height + 'px)') + })); + }, 1); + // timer for lock + if (msgCount === 0 && this.lock) { + if (where.param) this.lock(where.param); else this.lock(); + } + setTimeout(function() { + // has to be on top of lock + $(where.box).find('#w2ui-message'+ msgCount).css(w2utils.cssPrefix({ 'transition': '0s' })); + // event after + options.trigger($.extend(edata, { phase: 'after' })); + }, 350); + } + } + + function closeCB($msg, options) { + if (edata == null) { + // before event + edata = options.trigger({ phase: 'before', type: 'open', target: 'self' }); + if (edata.isCancelled === true) { + head.css('z-index', head.data('old-z-index')); + $(where.box).find('#w2ui-message'+ msgCount).remove(); + return; + } + } + var $focus = $msg.data('prev_focus'); + $msg.remove(); + if ($focus && $focus.length > 0) { + $focus.focus(); + } else { + if (obj && obj.focus) obj.focus(); + } + head.css('z-index', head.data('old-z-index')); + // event after + options.trigger($.extend(edata, { phase: 'after' })); + } + } + + function getSize (el, type) { + var $el = $(el); + var bwidth = { + left : parseInt($el.css('border-left-width')) || 0, + right : parseInt($el.css('border-right-width')) || 0, + top : parseInt($el.css('border-top-width')) || 0, + bottom : parseInt($el.css('border-bottom-width')) || 0 + }; + var mwidth = { + left : parseInt($el.css('margin-left')) || 0, + right : parseInt($el.css('margin-right')) || 0, + top : parseInt($el.css('margin-top')) || 0, + bottom : parseInt($el.css('margin-bottom')) || 0 + }; + var pwidth = { + left : parseInt($el.css('padding-left')) || 0, + right : parseInt($el.css('padding-right')) || 0, + top : parseInt($el.css('padding-top')) || 0, + bottom : parseInt($el.css('padding-bottom')) || 0 + }; + switch (type) { + case 'top' : return bwidth.top + mwidth.top + pwidth.top; + case 'bottom' : return bwidth.bottom + mwidth.bottom + pwidth.bottom; + case 'left' : return bwidth.left + mwidth.left + pwidth.left; + case 'right' : return bwidth.right + mwidth.right + pwidth.right; + case 'width' : return bwidth.left + bwidth.right + mwidth.left + mwidth.right + pwidth.left + pwidth.right + parseInt($el.width()); + case 'height' : return bwidth.top + bwidth.bottom + mwidth.top + mwidth.bottom + pwidth.top + pwidth.bottom + parseInt($el.height()); + case '+width' : return bwidth.left + bwidth.right + mwidth.left + mwidth.right + pwidth.left + pwidth.right; + case '+height' : return bwidth.top + bwidth.bottom + mwidth.top + mwidth.bottom + pwidth.top + pwidth.bottom; + } + return 0; + } + + function getStrWidth (str, styles) { + var w, html = '<div id="_tmp_width" style="position: absolute; top: -900px;'+ (styles || '') +'">'+ + encodeTags(str) + + '</div>'; + $('body').append(html); + w = $('#_tmp_width').width(); + $('#_tmp_width').remove(); + return w; + } + + function lang (phrase) { + var translation = this.settings.phrases[phrase]; + if (translation == null) return phrase; else return translation; + } + + function locale (locale) { + if (!locale) locale = 'en-us'; + + // if the locale is an object, not a string, than we assume it's a + if(typeof locale !== "string" ) { + w2utils.settings = $.extend(true, w2utils.settings, locale); + return; + } + + if (locale.length === 5) locale = 'locale/'+ locale +'.json'; + + // clear phrases from language before + w2utils.settings.phrases = {}; + + // load from the file + $.ajax({ + url : locale, + type : "GET", + dataType : "JSON", + async : false, + success : function (data, status, xhr) { + w2utils.settings = $.extend(true, w2utils.settings, data); + }, + error : function (xhr, status, msg) { + console.log('ERROR: Cannot load locale '+ locale); + } + }); + } + + function scrollBarSize () { + if (tmp.scrollBarSize) return tmp.scrollBarSize; + var html = + '<div id="_scrollbar_width" style="position: absolute; top: -300px; width: 100px; height: 100px; overflow-y: scroll;">'+ + ' <div style="height: 120px">1</div>'+ + '</div>'; + $('body').append(html); + tmp.scrollBarSize = 100 - $('#_scrollbar_width > div').width(); + $('#_scrollbar_width').remove(); + if (String(navigator.userAgent).indexOf('MSIE') >= 0) tmp.scrollBarSize = tmp.scrollBarSize / 2; // need this for IE9+ + return tmp.scrollBarSize; + } + + function checkName (params, component) { // was w2checkNameParam + if (!params || params.name == null) { + console.log('ERROR: The parameter "name" is required but not supplied in $().'+ component +'().'); + return false; + } + if (w2ui[params.name] != null) { + console.log('ERROR: The parameter "name" is not unique. There are other objects already created with the same name (obj: '+ params.name +').'); + return false; + } + if (!w2utils.isAlphaNumeric(params.name)) { + console.log('ERROR: The parameter "name" has to be alpha-numeric (a-z, 0-9, dash and underscore). '); + return false; + } + return true; + } + + function checkUniqueId (id, items, itemsDecription, objName) { // was w2checkUniqueId + if (!$.isArray(items)) items = [items]; + for (var i = 0; i < items.length; i++) { + if (items[i].id === id) { + console.log('ERROR: The parameter "id='+ id +'" is not unique within the current '+ itemsDecription +'. (obj: '+ objName +')'); + return false; + } + } + return true; + } + + function parseRoute(route) { + var keys = []; + var path = route + .replace(/\/\(/g, '(?:/') + .replace(/\+/g, '__plus__') + .replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?/g, function(_, slash, format, key, capture, optional) { + keys.push({ name: key, optional: !! optional }); + slash = slash || ''; + return '' + (optional ? '' : slash) + '(?:' + (optional ? slash : '') + (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')' + (optional || ''); + }) + .replace(/([\/.])/g, '\\$1') + .replace(/__plus__/g, '(.+)') + .replace(/\*/g, '(.*)'); + return { + path : new RegExp('^' + path + '$', 'i'), + keys : keys + }; + } + + function cssPrefix(field, value, returnString) { + var css = {}; + var newCSS = {}; + var ret = ''; + if (!$.isPlainObject(field)) { + css[field] = value; + } else { + css = field; + if (value === true) returnString = true; + } + for (var c in css) { + newCSS[c] = css[c]; + newCSS['-webkit-'+c] = css[c]; + newCSS['-moz-'+c] = css[c].replace('-webkit-', '-moz-'); + newCSS['-ms-'+c] = css[c].replace('-webkit-', '-ms-'); + newCSS['-o-'+c] = css[c].replace('-webkit-', '-o-'); + } + if (returnString === true) { + for (var c in newCSS) { + ret += c + ': ' + newCSS[c] + '; '; + } + } else { + ret = newCSS; + } + return ret; + } + + function getCursorPosition(input) { + if (input == null) return null; + var caretOffset = 0; + var doc = input.ownerDocument || input.document; + var win = doc.defaultView || doc.parentWindow; + var sel; + if (input.tagName && input.tagName.toUpperCase() == 'INPUT' && input.selectionStart) { + // standards browser + caretOffset = input.selectionStart; + } else { + if (win.getSelection) { + sel = win.getSelection(); + if (sel.rangeCount > 0) { + var range = sel.getRangeAt(0); + var preCaretRange = range.cloneRange(); + preCaretRange.selectNodeContents(input); + preCaretRange.setEnd(range.endContainer, range.endOffset); + caretOffset = preCaretRange.toString().length; + } + } else if ( (sel = doc.selection) && sel.type != "Control") { + var textRange = sel.createRange(); + var preCaretTextRange = doc.body.createTextRange(); + preCaretTextRange.moveToElementText(input); + preCaretTextRange.setEndPoint("EndToEnd", textRange); + caretOffset = preCaretTextRange.text.length; + } + } + return caretOffset; + } + + function setCursorPosition(input, pos, posEnd) { + var range = document.createRange(); + var el, sel = window.getSelection(); + if (input == null) return; + for (var i = 0; i < input.childNodes.length; i++) { + var tmp = $(input.childNodes[i]).text(); + if (input.childNodes[i].tagName) { + tmp = $(input.childNodes[i]).html(); + tmp = tmp.replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/ /g, ' '); + } + if (pos <= tmp.length) { + el = input.childNodes[i]; + if (el.childNodes && el.childNodes.length > 0) el = el.childNodes[0]; + if (el.childNodes && el.childNodes.length > 0) el = el.childNodes[0]; + break; + } else { + pos -= tmp.length; + } + } + if (el == null) return; + if (pos > el.length) pos = el.length; + range.setStart(el, pos); + if (posEnd) { + range.setEnd(el, posEnd); + } else { + range.collapse(true); + } + sel.removeAllRanges(); + sel.addRange(range); + } + + function testLocalStorage() { + // test if localStorage is available, see issue #1282 + // original code: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js + var str = 'w2ui_test'; + try { + localStorage.setItem(str, str); + localStorage.removeItem(str); + return true; + } catch (e) { + return false; + } + } + +})(jQuery); + +/*********************************************************** +* Formatters object +* --- Primariy used in grid +* +*********************************************************/ + +w2utils.formatters = { + + 'number': function (value, params) { + if (parseInt(params) > 20) params = 20; + if (parseInt(params) < 0) params = 0; + if (value == null || value === '') return ''; + return w2utils.formatNumber(parseFloat(value), params, true); + }, + + 'float': function (value, params) { + return w2utils.formatters['number'](value, params); + }, + + 'int': function (value, params) { + return w2utils.formatters['number'](value, 0); + }, + + 'money': function (value, params) { + if (value == null || value === '') return ''; + var data = w2utils.formatNumber(Number(value), w2utils.settings.currencyPrecision || 2); + return (w2utils.settings.currencyPrefix || '') + data + (w2utils.settings.currencySuffix || ''); + }, + + 'currency': function (value, params) { + return w2utils.formatters['money'](value, params); + }, + + 'percent': function (value, params) { + if (value == null || value === '') return ''; + return w2utils.formatNumber(value, params || 1) + '%'; + }, + + 'size': function (value, params) { + if (value == null || value === '') return ''; + return w2utils.formatSize(parseInt(value)); + }, + + 'date': function (value, params) { + if (params === '') params = w2utils.settings.dateFormat; + if (value == null || value === 0 || value === '') return ''; + var dt = w2utils.isDateTime(value, params, true); + if (dt === false) dt = w2utils.isDate(value, params, true); + return '<span title="'+ dt +'">' + w2utils.formatDate(dt, params) + '</span>'; + }, + + 'datetime': function (value, params) { + if (params === '') params = w2utils.settings.datetimeFormat; + if (value == null || value === 0 || value === '') return ''; + var dt = w2utils.isDateTime(value, params, true); + if (dt === false) dt = w2utils.isDate(value, params, true); + return '<span title="'+ dt +'">' + w2utils.formatDateTime(dt, params) + '</span>'; + }, + + 'time': function (value, params) { + if (params === '') params = w2utils.settings.timeFormat; + if (params === 'h12') params = 'hh:mi pm'; + if (params === 'h24') params = 'h24:mi'; + if (value == null || value === 0 || value === '') return ''; + var dt = w2utils.isDateTime(value, params, true); + if (dt === false) dt = w2utils.isDate(value, params, true); + return '<span title="'+ dt +'">' + w2utils.formatTime(value, params) + '</span>'; + }, + + 'timestamp': function (value, params) { + if (params === '') params = w2utils.settings.datetimeFormat; + if (value == null || value === 0 || value === '') return ''; + var dt = w2utils.isDateTime(value, params, true); + if (dt === false) dt = w2utils.isDate(value, params, true); + return dt.toString ? dt.toString() : ''; + }, + + 'gmt': function (value, params) { + if (params === '') params = w2utils.settings.datetimeFormat; + if (value == null || value === 0 || value === '') return ''; + var dt = w2utils.isDateTime(value, params, true); + if (dt === false) dt = w2utils.isDate(value, params, true); + return dt.toUTCString ? dt.toUTCString() : ''; + }, + + 'age': function (value, params) { + if (value == null || value === 0 || value === '') return ''; + var dt = w2utils.isDateTime(value, null, true); + if (dt === false) dt = w2utils.isDate(value, null, true); + return '<span title="'+ dt +'">' + w2utils.age(value) + (params ? (' ' + params) : '') + '</span>'; + }, + + 'interval': function (value, params) { + if (value == null || value === 0 || value === '') return ''; + return w2utils.interval(value) + (params ? (' ' + params) : ''); + }, + + 'toggle': function (value, params) { + return (value ? 'Yes' : ''); + }, + + 'password': function (value, params) { + var ret = ""; + for (var i=0; i < value.length; i++) { + ret += "*"; + } + return ret; + } +}; + +/*********************************************************** +* Generic Event Object +* --- This object is reused across all other +* --- widgets in w2ui. +* +*********************************************************/ + +w2utils.event = { + + on: function (edata, handler) { + var $ = jQuery; + var scope; + // allow 'eventName.scope' syntax + if (typeof edata == 'string' && edata.indexOf('.') != -1) { + var tmp = edata.split('.'); + edata = tmp[0]; + scope = tmp[1]; + } + // allow 'eventName:after' syntax + if (typeof edata == 'string' && edata.indexOf(':') != -1) { + var tmp = edata.split(':'); + if (['complete', 'done'].indexOf(edata[1]) != -1) edata[1] = 'after'; + edata = { + type : tmp[0], + execute : tmp[1] + }; + } + if (!$.isPlainObject(edata)) edata = { type: edata, scope: scope }; + edata = $.extend({ type: null, execute: 'before', target: null, onComplete: null }, edata); + // errors + if (!edata.type) { console.log('ERROR: You must specify event type when calling .on() method of '+ this.name); return; } + if (!handler) { console.log('ERROR: You must specify event handler function when calling .on() method of '+ this.name); return; } + if (!$.isArray(this.handlers)) this.handlers = []; + console.log('add', edata); + this.handlers.push({ edata: edata, handler: handler }); + }, + + off: function (edata, handler) { + var $ = jQuery; + var scope; + // allow 'eventName.scope' syntax + if (typeof edata == 'string' && edata.indexOf('.') != -1) { + var tmp = edata.split('.'); + edata = tmp[0]; + scope = tmp[1]; + } + // allow 'eventName:after' syntax + if (typeof edata == 'string' && edata.indexOf(':') != -1) { + var tmp = edata.split(':'); + if (['complete', 'done'].indexOf(edata[1]) != -1) edata[1] = 'after'; + edata = { + type : tmp[0], + execute : tmp[1] + } + } + if (!$.isPlainObject(edata)) edata = { type: edata }; + edata = $.extend({}, { type: null, execute: 'before', target: null, onComplete: null }, edata); + // errors + if (!edata.type && !scope) { console.log('ERROR: You must specify event type when calling .off() method of '+ this.name); return; } + if (!handler) { handler = null; } + // remove handlers + var newHandlers = []; + for (var h = 0, len = this.handlers.length; h < len; h++) { + var t = this.handlers[h]; + if ((t.edata.type === edata.type || edata.type === '*' || (t.edata.scope != null && edata.type == '')) && + (t.edata.target === edata.target || edata.target == null) && + (t.edata.execute === edata.execute || edata.execute == null) && + (t.handler === handler || handler == null || (scope != null && t.edata.scope == scope))) + { + // match + } else { + newHandlers.push(t); + } + } + this.handlers = newHandlers; + }, + + trigger: function (edata) { + var $ = jQuery; + var edata = $.extend({ type: null, phase: 'before', target: null, doneHandlers: [] }, edata, { + isStopped : false, + isCancelled : false, + done : function (handler) { this.doneHandlers.push(handler); }, + preventDefault : function () { this.isCancelled = true; }, + stopPropagation : function () { this.isStopped = true; } + }); + if (edata.phase === 'before') edata.onComplete = null; + var args, fun, tmp; + if (edata.target == null) edata.target = null; + if (!$.isArray(this.handlers)) this.handlers = []; + // process events in REVERSE order + for (var h = this.handlers.length-1; h >= 0; h--) { + var item = this.handlers[h]; + if ((item.edata.type === edata.type || item.edata.type === '*') && + (item.edata.target === edata.target || item.edata.target == null) && + (item.edata.execute === edata.phase || item.edata.execute === '*' || item.edata.phase === '*')) + { + edata = $.extend({}, item.edata, edata); + // check handler arguments + args = []; + tmp = new RegExp(/\((.*?)\)/).exec(item.handler); + if (tmp) args = tmp[1].split(/\s*,\s*/); + if (args.length === 2) { + item.handler.call(this, edata.target, edata); // old way for back compatibility + } else { + item.handler.call(this, edata); // new way + } + if (edata.isStopped === true || edata.stop === true) return edata; // back compatibility edata.stop === true + } + } + // main object events + var funName = 'on' + edata.type.substr(0,1).toUpperCase() + edata.type.substr(1); + if (edata.phase === 'before' && typeof this[funName] === 'function') { + fun = this[funName]; + // check handler arguments + args = []; + tmp = new RegExp(/\((.*?)\)/).exec(fun); + if (tmp) args = tmp[1].split(/\s*,\s*/); + if (args.length === 2) { + fun.call(this, edata.target, edata); // old way for back compatibility + } else { + fun.call(this, edata); // new way + } + if (edata.isStopped === true || edata.stop === true) return edata; // back compatibility edata.stop === true + } + // item object events + if (edata.object != null && edata.phase === 'before' && + typeof edata.object[funName] === 'function') + { + fun = edata.object[funName]; + // check handler arguments + args = []; + tmp = new RegExp(/\((.*?)\)/).exec(fun); + if (tmp) args = tmp[1].split(/\s*,\s*/); + if (args.length === 2) { + fun.call(this, edata.target, edata); // old way for back compatibility + } else { + fun.call(this, edata); // new way + } + if (edata.isStopped === true || edata.stop === true) return edata; + } + // execute onComplete + if (edata.phase === 'after') { + if (typeof edata.onComplete === 'function') edata.onComplete.call(this, edata); + for (var i = 0; i < edata.doneHandlers.length; i++) { + if (typeof edata.doneHandlers[i] == 'function') { + edata.doneHandlers[i].call(this, edata); + } + } + } + return edata; + } +}; + +/*********************************************************** +* Commonly used plugins +* --- used primarily in grid and form +* +*********************************************************/ + +(function ($) { + + $.fn.w2render = function (name) { + if ($(this).length > 0) { + if (typeof name === 'string' && w2ui[name]) w2ui[name].render($(this)[0]); + if (typeof name === 'object') name.render($(this)[0]); + } + }; + + $.fn.w2destroy = function (name) { + if (!name && this.length > 0) name = this.attr('name'); + if (typeof name === 'string' && w2ui[name]) w2ui[name].destroy(); + if (typeof name === 'object') name.destroy(); + }; + + $.fn.w2marker = function () { + var str = Array.prototype.slice.call(arguments, 0); + if (Array.isArray(str[0])) str = str[0]; + if (str.length === 0 || !str[0]) { // remove marker + return $(this).each(clearMarkedText); + } else { // add marker + return $(this).each(function (index, el) { + clearMarkedText(index, el); + for (var s = 0; s < str.length; s++) { + var tmp = str[s]; + if (typeof tmp !== 'string') tmp = String(tmp); + // escape regex special chars + tmp = tmp.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&").replace(/&/g, '&').replace(/</g, '>').replace(/>/g, '<'); + var regex = new RegExp(tmp + '(?!([^<]+)?>)', "gi"); // only outside tags + el.innerHTML = el.innerHTML.replace(regex, replaceValue); + } + function replaceValue(matched) { // mark new + return '<span class="w2ui-marker">' + matched + '</span>'; + } + }); + } + + function clearMarkedText(index, el) { + while (el.innerHTML.indexOf('<span class="w2ui-marker">') != -1) { + el.innerHTML = el.innerHTML.replace(/\<span class=\"w2ui\-marker\"\>((.|\n|\r)*)\<\/span\>/ig, '$1'); // unmark + } + } + }; + + // -- w2tag - there can be multiple on screen at a time + + $.fn.w2tag = function (text, options) { + // only one argument + if (arguments.length == 1 && typeof text == 'object') { + options = text; + if (options.html != null) text = options.html; + } + // default options + options = $.extend({ + id : null, // id for the tag, otherwise input id is used + html : text, // or html + position : 'right|top', // can be left, right, top, bottom + align : 'none', // can be none, left, right (only works for potision: top | bottom) + left : 0, // delta for left coordinate + top : 0, // delta for top coordinate + style : '', // adition style for the tag + css : {}, // add css for input when tag is shown + className : '', // add class bubble + inputClass : '', // add class for input when tag is shown + onShow : null, // callBack when shown + onHide : null, // callBack when hidden + hideOnKeyPress : true, // hide tag if key pressed + hideOnBlur : false, // hide tag on blur + hideOnClick : false // hide tag on document click + }, options); + if (options.name != null && options.id == null) options.id = options.name; + + // for backward compatibility + if (options['class'] !== '' && options.inputClass === '') options.inputClass = options['class']; + + // remove all tags + if ($(this).length === 0) { + $('.w2ui-tag').each(function (index, el) { + var opt = $(el).data('options'); + if (opt == null) opt = {}; + $($(el).data('taged-el')) + .removeClass(opt.inputClass) + .removeData('w2tag') + .removeData('checkIfMoved'); + clearInterval($(el).data('timer')); + $(el).remove(); + }); + return; + } + return $(this).each(function (index, el) { + // show or hide tag + var origID = (options.id ? options.id : el.id); + var tagID = w2utils.escapeId(origID); + var $tags = $('#w2ui-tag-'+tagID); + if (text === '' || text == null) { + // remmove element + $tags.css('opacity', 0); + clearInterval($tags.data('timer')); + $tags.remove(); + return; + } else if ($tags.length !== 0) { + // if already present + options = $.extend($tags.data('options'), options); + $tags.data('options', options); + $tags.find('.w2ui-tag-body') + .attr('style', options.style) + .addClass(options.className) + .html(options.html); + checkIfMoved(true); + } else { + var originalCSS = ''; + if ($(el).length > 0) originalCSS = $(el)[0].style.cssText; + // insert + $('body').append( + '<div onclick="event.stopPropagation()" style="display:none;" id="w2ui-tag-'+ origID +'" '+ + ' class="w2ui-tag '+ ($(el).parents('.w2ui-popup, .w2ui-overlay-popup, .w2ui-message').length > 0 ? 'w2ui-tag-popup' : '') + '">'+ + ' <div style="margin: -2px 0px 0px -2px; white-space: nowrap;">'+ + ' <div class="w2ui-tag-body '+ options.className +'" style="'+ (options.style || '') +'">'+ text +'</div>'+ + ' </div>' + + '</div>'); + $tags = $('#w2ui-tag-'+tagID); + $(el).data('w2tag', $tags.get(0)).data('checkIfMoved', checkIfMoved); + } + + // need time out to allow tag to be rendered + setTimeout(function () { + $tags.css('display', 'block'); + if (!$(el).offset()) return; + var pos = checkIfMoved(true); + if (pos == null) return; + $tags.css({ + opacity : '1', + left : pos.left + 'px', + top : pos.top + 'px' + }) + .data('options', options) + .data('taged-el', el) + .data('position', pos.left + 'x' + pos.top) + .data('timer', setTimeout(checkIfMoved, 100)) + .find('.w2ui-tag-body').addClass(pos['posClass']); + + $(el).css(options.css) + .off('.w2tag') + .addClass(options.inputClass); + + if (options.hideOnKeyPress) { + $(el).on('keypress.w2tag', hideTag); + } + if (options.hideOnBlur) { + $(el).on('blur.w2tag', hideTag); + } + if (options.hideOnClick) { + $(document).on('click.w2tag', hideTag) + } + if (typeof options.onShow === 'function') options.onShow(); + }, 1); + + // bind event to hide it + function hideTag() { + $tags = $('#w2ui-tag-'+tagID); + if ($tags.length <= 0) return; + clearInterval($tags.data('timer')); + $tags.remove(); + $(document).off('.w2tag'); + $(el).off('.w2tag', hideTag) + .removeClass(options.inputClass) + .removeData('w2tag') + .removeData('checkIfMoved'); + if ($(el).length > 0) $(el)[0].style.cssText = originalCSS; + if (typeof options.onHide === 'function') options.onHide(); + } + + function checkIfMoved(checkOnly, instant) { + // monitor if destroyed + var offset = $(el).offset(); + if ($(el).length === 0 || (offset.left === 0 && offset.top === 0) || $tags.find('.w2ui-tag-body').length === 0) { + clearInterval($tags.data('timer')); + hideTag(); + return; + } + if (!instant) setTimeout(checkIfMoved, 100); + // monitor if moved + var posClass = 'w2ui-tag-right'; + var posLeft = parseInt(offset.left + el.offsetWidth + (options.left ? options.left : 0)); + var posTop = parseInt(offset.top + (options.top ? options.top : 0)); + var tagBody = $tags.find('.w2ui-tag-body'); + var width = tagBody[0].offsetWidth; + var height = tagBody[0].offsetHeight; + if (typeof options.position == 'string' && options.position.indexOf('|') != -1) { + options.position = options.position.split('|'); + } + if (options.position == 'top') { + posClass = 'w2ui-tag-top'; + posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - 14; + posTop = parseInt(offset.top + (options.top ? options.top : 0)) - height - 10; + } + else if (options.position == 'bottom') { + posClass = 'w2ui-tag-bottom'; + posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - 14; + posTop = parseInt(offset.top + el.offsetHeight + (options.top ? options.top : 0)) + 10; + } + else if (options.position == 'left') { + posClass = 'w2ui-tag-left'; + posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - width - 20; + posTop = parseInt(offset.top + (options.top ? options.top : 0)); + } + else if (Array.isArray(options.position)) { + // try to fit the tag on screen in the order defined in the array + var maxWidth = window.innerWidth; + var maxHeight = window.innerHeight + for (var i=0; i<options.position.length; i++) { + var pos = options.position[i]; + if (pos == 'right') { + posClass = 'w2ui-tag-right'; + posLeft = parseInt(offset.left + el.offsetWidth + (options.left ? options.left : 0)); + posTop = parseInt(offset.top + (options.top ? options.top : 0)); + if (posLeft+width <= maxWidth) break; + } + else if (pos == 'left') { + posClass = 'w2ui-tag-left'; + posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - width - 20; + posTop = parseInt(offset.top + (options.top ? options.top : 0)); + if (posLeft >= 0) break; + } + else if (pos == 'top') { + posClass = 'w2ui-tag-top'; + posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - 14; + posTop = parseInt(offset.top + (options.top ? options.top : 0)) - height - 10; + if(posLeft+width <= maxWidth && posTop >= 0) break; + } + else if (pos == 'bottom') { + posClass = 'w2ui-tag-bottom'; + posLeft = parseInt(offset.left + (options.left ? options.left : 0)) - 14; + posTop = parseInt(offset.top + el.offsetHeight + (options.top ? options.top : 0)) + 10; + if (posLeft+width <= maxWidth && posTop+height <= maxHeight) break; + } + } + if (tagBody.data('posClass') !== posClass) { ... etc. - the rest is truncated _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits