id:null,// Choose a unique id, otherwise jBox will set one for you (jBoxID1, jBoxID2, ...)
// Dimensions
width:'auto',// Width of content area (e.g. 'auto', 100)
height:'auto',// Height of content area
minWidth:null,// Minimum width
maxHeight:null,// Minimum height
minWidth:null,// Maximum width
maxHeight:null,// Minimum height
// Attach
attach:null,// Attach jBox to elements (if no target element is provided, jBox will use the attached element as target)
trigger:'click',// The event to open or close your jBoxes, use 'click' or 'mouseenter'
preventDefault:false,// Prevent default event when opening jBox (e.g. don't follow the href in a link when clicking on it)
// Content
title:null,// Adds a title to your jBox
content:null,// You can use a string to set text or HTML as content, or an element selector (e.g. jQuery('#jBox-content')) to append one or several elements (elements appended will get style display: 'block', so hide them with CSS style display: 'none' beforehand)
getTitle:null,// Get the title from an attribute when jBox opens
getContent:null,// Get the content from an attribute when jBox opens
// AJAX request
ajax:{// Setting an url will make an AJAX call when jBox opens
url:null,// URL to send the AJAX request to
data:'',// Data to send with your AJAX call (e.g. 'id=82&limit=10')
// Optional you can add any jQuery AJAX option (http://api.jquery.com/jquery.ajax/)
reload:false,// Resend the ajax call every time jBox opens
getData:'data-ajax',// The attribute in the source element where the AJAX will look for the data to send with, e.g. data-ajax="id=82&limit=10"
setContent:true,// Automatically set the response as new content when the AJAX call is finished
spinner:true// Hides the current content and adds a spinner while loading, you can pass html content to add your own spinner, e.g. spinner: '<div class="mySpinner"></div>'
},
// Position
target:null,// The target element where jBox will be opened
position:{
x:'center',// Horizontal Position (Use a number, 'left', 'right' or 'center')
y:'center'// Vertical Position (Use a number, 'top', 'bottom' or 'center')
},
outside:null,// Use 'x', 'y', or 'xy' to move your jBox outside of the target element
offset:0,// Offset to final position, you can set different values for x and y with an object e.g. {x: 15, y: 0}
attributes:{// Note that attributes can only be 'left' or 'right' when using numbers for position, e.g. {x: 300, y: 20}
x:'left',// Horizontal position, use 'left' or 'right'
y:'top'// Vertical position, use 'top' or 'bottom'
},
adjustPosition:false,// Adjusts the position when there is not enough space (use true, 'flip' or 'move')
adjustTracker:false,// By default jBox adjusts the position when opening, to adjust when scrolling or resizing, use 'scroll', 'resize' or 'true' (both events)
adjustDistance:5,// How far from the window edge we start adjusting, use an object to set different values: {bottom: 5, top: 50, left: 5, right: 20}
fixed:false,// Your jBox will stay on position when scrolling
reposition:false,// Calculates new position when the window-size changes
repositionOnOpen:true,// Calculates new position each time jBox opens (rather than only when it opens the first time)
repositionOnContent:true,// Calculates new position when the content changes with .setContent() or .setTitle()
// Pointer
pointer:false,// Your pointer will always point towards the target element, so the option outside should be 'x' or 'y'
pointTo:'target',// Setting something else than 'target' will add a pointer even if there is no target element set or found (Use 'top', 'bottom', 'left' or 'right')
// Animations
fade:180,// Fade duration in ms, set to 0 or false to disable
animation:null,// Animation when opening or closing (use 'pulse', 'zoomIn', 'zoomOut', 'move', 'slide', 'flip', 'tada') (CSS inspired from Daniel Edens Animate.css: http://daneden.me/animate)
// Appearance
theme:'Default',// Set a jBox theme class
addClass:'',// Adds classes to the wrapper
overlay:false,// Adds an overlay when jBox opens (set color and opacity with CSS)
zIndex:10000,// Use a high zIndex (your overlay will have the lowest zIndex of all your jBoxes (with overlays) minus one)
// Delays
delayOpen:0,// Delay opening in ms (Note that the delay will be ignored if your jBox didn't finish closing)
delayClose:0,// Delay closing in ms (Note that there is always a closing delay of at least 10ms to ensure jBox won't be closed when opening right away)
// Closing events
closeOnEsc:false,// Close jBox when pressing [esc] key
closeOnClick:false,// Close jBox with mouseclick, use 'true' (click anywhere), 'box' (click on jBox itself), 'overlay' (click on the overlay), 'body' (click anywhere but jBox)
closeOnMouseleave:false,// Close jBox when the mouse leaves the jBox area or the area of the attached element
closeButton:false,// Adds a close button to your jBox, use 'title', 'overlay', 'box' or true (true will add the button to overlay, title or box, in that order if any of those elements can be found)
// Other options
constructOnInit:false,// Construct jBox when it's being initialized
blockScroll:false,// When jBox is open, block scrolling
appendTo:jQuery('body'),// Provide an element if you want the jBox to be positioned inside a specific element (only useful for fixed positions or when position values are numbers)
draggable:null,// Make your jBox draggable (use 'true', 'title' or provide an element as handle) (inspired from Chris Coyiers CSS-Tricks http://css-tricks.com/snippets/jquery/draggable-without-jquery-ui/)
dragOver:true,// When you have multiple draggable jBoxes, the one you select will always move over the other ones
// Events // Note: You can use 'this' in the event functions, it refers to your jBox object (e.g. onInit: function() { this.open(); })
onInit:function(){},// Triggered when jBox is initialized, just before it's being created
onCreated:function(){},// Triggered when jBox is created and is availible in DOM
onOpen:function(){},// Triggered when jBox is opened
onClose:function(){},// Triggered when jBox is closed
onCloseComplete:function(){},// Triggered when jBox is completely closed (when fading is finished, useful if you want to destroy the jBox when it is closed)
// Only for type "Confirm"
confirmButton:'Submit',// Text for the submit button
cancelButton:'Cancel',// Text for the cancel button
confirm:null,// Function to execute when clicking the submit button. By default jBox will use firstly the onclick and secondly the href attribute
cancel:null,// Function to execute when clicking the cancel button
// Only for type "Notice"
autoClose:7000,// Time when jBox should close automatically
color:null,// Makes your notices colorful, use 'black', 'red', 'green', 'blue', 'yellow'
stack:true,// Set to false to disable notice-stacking
audio:false,// Set the url to an audio file without extention, e.g. '/url/filename'. jBox will look for an .mp3 and an .ogg file
volume:100,// Percent of volume for audio files
// Only for type "Image"
src:'href',// The attribute where jBox gets the image source from, e.g. href="/path_to_image/image.jpg"
gallery:'data-jbox-image',// The attribute where you define the image gallery, e.g. data-jbox-image="gallery1"
imageLabel:'title',// The attribute where jBox gets the image label from, e.g. title="My label"
imageFade:600,// The fade duration for images
imageSize:'contain'// How to display the images: Use CSS background-position values, e.g. 'cover', 'contain', 'auto', 'initial', '50% 50%'
};
// Default type options
this.defaultOptions={
// Default options for tooltips
'Tooltip':{
getContent:'title',
trigger:'mouseenter',
position:{x:'center',y:'top'},
outside:'y',
pointer:true,
adjustPosition:true,
reposition:true
},
// Default options for mouse tooltips
'Mouse':{
target:'mouse',
position:{x:'right',y:'bottom'},
offset:15,
trigger:'mouseenter',
adjustPosition:'flip'
},
// Default options for modal windows
'Modal':{
target:jQuery(window),
fixed:true,
blockScroll:true,
closeOnEsc:true,
closeOnClick:'overlay',
closeButton:true,
overlay:true,
animation:'zoomOut'
},
// Default options for modal confirm windows
'Confirm':{
target:jQuery(window),
fixed:true,
attach:jQuery('[data-confirm]'),
getContent:'data-confirm',
content:'Do you really want to do this?',
minWidth:320,
maxWidth:460,
blockScroll:true,
closeOnEsc:true,
closeOnClick:'overlay',
closeButton:true,
overlay:true,
animation:'zoomOut',
preventDefault:true,
_onAttach:function(el){
// Extract the href or the onclick event if no submit event is passed
"auto":function(str){return$.serializeJSON.parseValue(str,null,null,{parseNumbers:true,parseBooleans:true,parseNulls:true});},// try again with something like "parseAll"
"skip":null// skip is a special type that makes it easy to ignore elements
// Make sure that the user didn't misspell an option
validOpts=['checkboxUncheckedValue','parseNumbers','parseBooleans','parseNulls','parseAll','parseWithFunction','skipFalsyValuesForTypes','skipFalsyValuesForFields','customTypes','defaultTypes','useIntKeysAsArrayIndex'];// re-define because the user may override the defaultOptions
for(optinoptions){
if(validOpts.indexOf(opt)===-1){
thrownewError("serializeJSON ERROR: invalid option '"+opt+"'. Please use one of "+validOpts.join(', '));
}
}
// Helper to get the default value for this option if none is specified by the user
isObject:function(obj){returnobj===Object(obj);},// is it an Object?
isUndefined:function(obj){returnobj===void0;},// safe check for undefined values
isValidArrayIndex:function(val){return/^[0-9]+$/.test(String(val));},// 1,2,3,4 ... are valid array indexes
isNumeric:function(obj){returnobj-parseFloat(obj)>=0;},// taken from jQuery.isNumeric implementation. Not using jQuery.isNumeric to support old jQuery and Zepto versions
optionKeys:function(obj){if(Object.keys){returnObject.keys(obj);}else{varkey,keys=[];for(keyinobj){keys.push(key);}returnkeys;}},// polyfill Object.keys to get option keys in IE<9
// Fill the formAsArray object with values for the unchecked checkbox inputs,
// using the same format as the jquery.serializeArray function.
// The value of the unchecked values is determined from the opts.checkboxUncheckedValue
// and/or the data-unchecked-value attribute of the inputs.
// If there's an uncheckedValue, push it into the serialized formAsArray
if(uncheckedValue!=null){
if(el.name&&el.name.indexOf("[][")!==-1){// identify a non-supported
thrownewError("serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '"+el.name+"'. See https://github.com/marioizquierdo/jquery.serializeJSON/issues/67");
escapedName=name.replace(/(:|\.|\[|\]|\s)/g,'\\$1');// every non-standard character need to be escaped by \\
selector='[name="'+escapedName+'"]';
$input=$form.find(selector).add($form.filter(selector));// NOTE: this returns only the first $input element if multiple are matched with the same name (i.e. an "array[]"). So, arrays with different element types specified through the data-value-type attr is not supported.
if(f.isUndefined(o)){thrownewError("ArgumentError: param 'o' expected to be an object or array, found undefined");}
if(!keys||keys.length===0){thrownewError("ArgumentError: param 'keys' expected to be an array with least one element");}
key=keys[0];
// Only one key, then it's not a deepSet, just assign the value.
if(keys.length===1){
if(key===''){
o.push(value);// '' is used to push values into the array (assume o is an array)
}else{
o[key]=value;// other keys can be used as object keys or array indexes
}
// With more keys is a deepSet. Apply recursively.
}else{
nextKey=keys[1];
// '' is used to push values into the array,
// with nextKey, set the value into the same object, in object[nextKey].
// Covers the case of ['', 'foo'] and ['', 'var'] to push the object {foo, var}, and the case of nested arrays.
if(key===''){
lastIdx=o.length-1;// asume o is array
lastVal=o[lastIdx];
if(f.isObject(lastVal)&&(f.isUndefined(lastVal[nextKey])||keys.length>2)){// if nextKey is not present in the last object element, or there are more keys to deep set
key=lastIdx;// then set the new value in the same object element
}else{
key=lastIdx+1;// otherwise, point to set the next index in the array
}
}
// '' is used to push values into the array "array[]"
if(nextKey===''){
if(f.isUndefined(o[key])||!$.isArray(o[key])){
o[key]=[];// define (or override) as array to push values
}
}else{
if(opts.useIntKeysAsArrayIndex&&f.isValidArrayIndex(nextKey)){// if 1, 2, 3 ... then use an array, where nextKey is the index
if(f.isUndefined(o[key])||!$.isArray(o[key])){
o[key]=[];// define (or override) as array, to insert values using int keys as array indexes
}
}else{// for anything else, use an object, where nextKey is going to be the attribute name
if(f.isUndefined(o[key])||!f.isObject(o[key])){
o[key]={};// define (or override) as object, to set nested properties
Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*/
!function(a){if("function"==typeofdefine&&define.amd)define(["jquery"],a);elseif("object"==typeofexports){varb=require("jquery");module.exports=a(b)}elsea(window.jQuery||window.Zepto||window.$)}(function(a){"use strict";a.fn.serializeJSON=function(b){varc,d,e,f,g,h,i,j,k,l,m,n,o;returnc=a.serializeJSON,d=this,e=c.setupOpts(b),f=d.serializeArray(),c.readCheckboxUncheckedValues(f,e,d),g={},a.each(f,function(a,b){h=b.name,i=b.value,k=c.extractTypeAndNameWithNoType(h),l=k.nameWithNoType,m=k.type,m||(m=c.attrFromInputWithName(d,h,"data-value-type")),c.validateType(h,m,e),"skip"!==m&&(n=c.splitInputNameIntoKeysArray(l),j=c.parseValue(i,h,m,e),o=!j&&c.shouldSkipFalsy(d,h,l,m,e),o||c.deepSet(g,n,j,e))}),g},a.serializeJSON={defaultOptions:{checkboxUncheckedValue:void0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],customTypes:{},defaultTypes:{string:function(a){returnString(a)},number:function(a){returnNumber(a)},boolean:function(a){varb=["false","null","undefined","","0"];returnb.indexOf(a)===-1},null:function(a){varb=["false","null","undefined","","0"];returnb.indexOf(a)===-1?a:null},array:function(a){returnJSON.parse(a)},object:function(a){returnJSON.parse(a)},auto:function(b){returna.serializeJSON.parseValue(b,null,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})},skip:null},useIntKeysAsArrayIndex:!1},setupOpts:function(b){varc,d,e,f,g,h;h=a.serializeJSON,null==b&&(b={}),e=h.defaultOptions||{},d=["checkboxUncheckedValue","parseNumbers","parseBooleans","parseNulls","parseAll","parseWithFunction","skipFalsyValuesForTypes","skipFalsyValuesForFields","customTypes","defaultTypes","useIntKeysAsArrayIndex"];for(cinb)if(d.indexOf(c)===-1)thrownewError("serializeJSON ERROR: invalid option '"+c+"'. Please use one of "+d.join(", "));returnf=function(a){returnb[a]!==!1&&""!==b[a]&&(b[a]||e[a])},g=f("parseAll"),{checkboxUncheckedValue:f("checkboxUncheckedValue"),parseNumbers:g||f("parseNumbers"),parseBooleans:g||f("parseBooleans"),parseNulls:g||f("parseNulls"),parseWithFunction:f("parseWithFunction"),skipFalsyValuesForTypes:f("skipFalsyValuesForTypes"),skipFalsyValuesForFields:f("skipFalsyValuesForFields"),typeFunctions:a.extend({},f("defaultTypes"),f("customTypes")),useIntKeysAsArrayIndex:f("useIntKeysAsArrayIndex")}},parseValue:function(b,c,d,e){varf,g;returnf=a.serializeJSON,g=b,e.typeFunctions&&d&&e.typeFunctions[d]?g=e.typeFunctions[d](b):e.parseNumbers&&f.isNumeric(b)?g=Number(b):!e.parseBooleans||"true"!==b&&"false"!==b?e.parseNulls&&"null"==b&&(g=null):g="true"===b,e.parseWithFunction&&!d&&(g=e.parseWithFunction(g,c)),g},isObject:function(a){returna===Object(a)},isUndefined:function(a){returnvoid0===a},isValidArrayIndex:function(a){return/^[0-9]+$/.test(String(a))},isNumeric:function(a){returna-parseFloat(a)>=0},optionKeys:function(a){if(Object.keys)returnObject.keys(a);varb,c=[];for(bina)c.push(b);returnc},readCheckboxUncheckedValues:function(b,c,d){vare,f,g,h,i;null==c&&(c={}),i=a.serializeJSON,e="input[type=checkbox][name]:not(:checked):not([disabled])",f=d.find(e).add(d.filter(e)),f.each(function(d,e){if(g=a(e),h=g.attr("data-unchecked-value"),null==h&&(h=c.checkboxUncheckedValue),null!=h){if(e.name&&e.name.indexOf("[][")!==-1)thrownewError("serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '"+e.name+"'. See https://github.com/marioizquierdo/jquery.serializeJSON/issues/67");b.push({name:e.name,value:h})}})},extractTypeAndNameWithNoType:function(a){varb;return(b=a.match(/(.*):([^:]+)$/))?{nameWithNoType:b[1],type:b[2]}:{nameWithNoType:a,type:null}},shouldSkipFalsy:function(b,c,d,e,f){varg=a.serializeJSON,h=g.attrFromInputWithName(b,c,"data-skip-falsy");if(null!=h)return"false"!==h;vari=f.skipFalsyValuesForFields;if(i&&(i.indexOf(d)!==-1||i.indexOf(c)!==-1))return!0;varj=f.skipFalsyValuesForTypes;returnnull==e&&(e="string"),!(!j||j.indexOf(e)===-1)},attrFromInputWithName:function(a,b,c){vard,e,f;returnd=b.replace(/(:|\.|\[|\]|\s)/g,"\\$1"),e='[name="'+d+'"]',f=a.find(e).add(a.filter(e)),f.attr(c)},validateType:function(b,c,d){vare,f;if(f=a.serializeJSON,e=f.optionKeys(d?d.typeFunctions:f.defaultOptions.defaultTypes),c&&e.indexOf(c)===-1)thrownewError("serializeJSON ERROR: Invalid type "+c+" found in input name '"+b+"', please use one of "+e.join(", "));return!0},splitInputNameIntoKeysArray:function(b){varc,d;returnd=a.serializeJSON,c=b.split("["),c=a.map(c,function(a){returna.replace(/\]/g,"")}),""===c[0]&&c.shift(),c},deepSet:function(b,c,d,e){varf,g,h,i,j,k;if(null==e&&(e={}),k=a.serializeJSON,k.isUndefined(b))thrownewError("ArgumentError: param 'o' expected to be an object or array, found undefined");if(!c||0===c.length)thrownewError("ArgumentError: param 'keys' expected to be an array with least one element");f=c[0],1===c.length?""===f?b.push(d):b[f]=d:(g=c[1],""===f&&(i=b.length-1,j=b[i],f=k.isObject(j)&&(k.isUndefined(j[g])||c.length>2)?i:i+1),""===g?!k.isUndefined(b[f])&&a.isArray(b[f])||(b[f]=[]):e.useIntKeysAsArrayIndex&&k.isValidArrayIndex(g)?!k.isUndefined(b[f])&&a.isArray(b[f])||(b[f]=[]):!k.isUndefined(b[f])&&k.isObject(b[f])||(b[f]={}),h=c.slice(1),k.deepSet(b[f],h,d,e))}}});
!function(e,i){if("function"==typeofdefine&&define.amd)define(["exports","jquery"],function(e,r){returni(e,r)});elseif("undefined"!=typeofexports){varr=require("jquery");i(exports,r)}elsei(e,e.jQuery||e.Zepto||e.ender||e.$)}(this,function(e,i){functionr(e,r){functionn(e,i,r){returne[i]=r,e}functiona(e,i){for(varr,a=e.match(t.key);void0!==(r=a.pop());)if(t.push.test(r)){varu=s(e.replace(/\[\]$/,""));i=n([],u,i)}elset.fixed.test(r)?i=n([],r,i):t.named.test(r)&&(i=n({},r,i));returni}functions(e){returnvoid0===h[e]&&(h[e]=0),h[e]++}functionu(e){switch(i('[name="'+e.name+'"]',r).attr("type")){case"checkbox":return"on"===e.value?!0:e.value;default:returne.value}}functionf(i){if(!t.validate.test(i.name))returnthis;varr=a(i.name,u(i));returnl=e.extend(!0,l,r),this}functiond(i){if(!e.isArray(i))thrownewError("formSerializer.addPairs expects an Array");for(varr=0,t=i.length;t>r;r++)this.addPair(i[r]);returnthis}functiono(){returnl}functionc(){returnJSON.stringify(o())}varl={},h={};this.addPair=f,this.addPairs=d,this.serialize=o,this.serializeJSON=c}vart={validate:/^[a-z_][a-z0-9_]*(?:\[(?:\d*|[a-z0-9_]+)\])*$/i,key:/[a-z0-9_]+|(?=\[\])/gi,push:/^$/,fixed:/^\d+$/,named:/^[a-z0-9_]+$/i};returnr.patterns=t,r.serializeObject=function(){returnnewr(i,this).addPairs(this.serializeArray()).serialize()},r.serializeJSON=function(){returnnewr(i,this).addPairs(this.serializeArray()).serializeJSON()},"undefined"!=typeofi.fn&&(i.fn.serializeObject=r.serializeObject,i.fn.serializeJSON=r.serializeJSON),e.FormSerializer=r,r});