Hi everyone,
Are there any IE9 quirks workarounds yet?
If there are a few clever (and small) workarounds for this could someone please post me a link?
As a quick fix I was going to add an 'if' statement to detect IE9 and work in 'mozilla' mode, but my brain is fried after an all-nighter...(code writing not on the bottle) not much is making sense to me today!
If it helps more than hinders, here's where I'm at without the IE9 so far...
/*
* Fix issues in IE6 and IE7 in quirks mode
*/
fixIE: function () {
var s = this, p = s.o.position;
// Simulate fixed position - adapted from BlockUI
$.each([s.d.iframe || null, !s.o.jambox ? null : s.d.overlay, s.d.container], function (i, el) {
if (el) {
var bch = 'document.body.clientHeight', bcw = 'document.body.clientWidth',
bsh = 'document.body.scrollHeight', bsl = 'document.body.scrollLeft',
bst = 'document.body.scrollTop', bsw = 'document.body.scrollWidth',
ch = 'document.documentElement.clientHeight', cw = 'document.documentElement.clientWidth',
sl = 'document.documentElement.scrollLeft', st = 'document.documentElement.scrollTop',
s = el[0].style;
s.position = 'absolute';
if (i < 2) {
s.removeExpression('height');
s.removeExpression('width');
s.setExpression('height','' + bsh + ' > ' + bch + ' ? ' + bsh + ' : ' + bch + ' + "px"');
s.setExpression('width','' + bsw + ' > ' + bcw + ' ? ' + bsw + ' : ' + bcw + ' + "px"');
}
else {
var te, le;
if (p && p.constructor === Array) {
var top = p[0]
? typeof p[0] === 'number' ? p[0].toString() : p[0].replace(/px/, '')
: el.css('top').replace(/px/, '');
te = top.indexOf('%') === -1
? top + ' + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"'
: parseInt(top.replace(/%/, '')) + ' * ((' + ch + ' || ' + bch + ') / 100) + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"';
if (p[1]) {
var left = typeof p[1] === 'number' ? p[1].toString() : p[1].replace(/px/, '');
le = left.indexOf('%') === -1
? left + ' + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"'
: parseInt(left.replace(/%/, '')) + ' * ((' + cw + ' || ' + bcw + ') / 100) + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"';
}
}
else {
te = '(' + ch + ' || ' + bch + ') / 2 - (this.offsetHeight / 2) + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"';
le = '(' + cw + ' || ' + bcw + ') / 2 - (this.offsetWidth / 2) + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"';
}
s.removeExpression('top');
s.removeExpression('left');
s.setExpression('top', te);
s.setExpression('left', le);
}
}
});
},
/*
* Place focus on the first or last visible input
*/
focus: function (pos) {
var s = this, p = pos && $.inArray(pos, ['first', 'last']) !== -1 ? pos : 'first';
// Focus on dialog or the first visible/enabled input element
var input = $(':input:enabled:visible:' + p, s.d.wrap);
setTimeout(function () {
input.length > 0 ? input.focus() : s.d.wrap.focus();
}, 10);
},
getDimensions: function () {
var el = $(window);
// Fix a jampax/Opera bug with determining the window height
var h = $.browser.opera && $.browser.version > '9.5' && $.fn.jampax < '1.3'
|| $.browser.opera && $.browser.version < '9.5' && $.fn.jampax > '1.2.6'
? el[0].innerHeight : el.height();
return [h, el.width()];
},
getVal: function (v, d) {
return v ? (typeof v === 'number' ? v
: v === 'auto' ? 0
: v.indexOf('%') > 0 ? ((parseInt(v.replace(/%/, '')) / 100) * (d === 'h' ? w[0] : w[1]))
: parseInt(v.replace(/px/, '')))
: null;
},
/*
* Update the container. Set new dimensions, if provided.
* Focus, if enabled. Re-bind events.
*/
update: function (height, width) {
var s = this;
// Prevent update if dialog does not exist
if (!s.d.data) {
return false;
}
// Reset original values
s.d.origHeight = s.getVal(height, 'h');
s.d.origWidth = s.getVal(width, 'w');
// Hide data to prevent screen flicker
s.d.data.hide();
height && s.d.container.css('height', height);
width && s.d.container.css('width', width);
s.setContainerDimensions();
s.d.data.show();
s.o.focus && s.focus();
// Rebind events
s.unbindEvents();
s.bindEvents();
},
setContainerDimensions: function () {
var s = this;
// Get the dimensions for the container and data
var ch = s.d.origHeight ? s.d.origHeight : $.browser.opera ? s.d.container.height() : s.getVal(s.d.container.css('height'), 'h'),
cw = s.d.origWidth ? s.d.origWidth : $.browser.opera ? s.d.container.width() : s.getVal(s.d.container.css('width'), 'w'),
dh = s.d.data.outerHeight(true), dw = s.d.data.outerWidth(true);
s.d.origHeight = s.d.origHeight || ch;
s.d.origWidth = s.d.origWidth || cw;
// mxoh = max option height, mxow = max option width
var mxoh = s.o.maxHeight ? s.getVal(s.o.maxHeight, 'h') : null,
mxow = s.o.maxWidth ? s.getVal(s.o.maxWidth, 'w') : null,
mh = mxoh && mxoh < w[0] ? mxoh : w[0],
mw = mxow && mxow < w[1] ? mxow : w[1];
// moh = min option height
var moh = s.o.minHeight ? s.getVal(s.o.minHeight, 'h') : 'auto';
if (!ch) {
if (!dh) {ch = moh;}
else {
if (dh > mh) {ch = mh;}
else if (s.o.minHeight && moh !== 'auto' && dh < moh) {ch = moh;}
else {ch = dh;}
}
}
else {
ch = s.o.autoResize && ch > mh ? mh : ch;
}
// mow = min option width
var mow = s.o.minWidth ? s.getVal(s.o.minWidth, 'w') : 'auto';
if (!cw) {
if (!dw) {cw = mow;}
else {
if (dw > mw) {cw = mw;}
else if (s.o.minWidth && mow !== 'auto' && dw < mow) {cw = mow;}
else {cw = dw;}
}
}
else {
cw = s.o.autoResize && cw > mw ? mw : cw;
}
s.d.container.css({height: ch, width: cw});
s.d.wrap.css({overflow: (dh > ch || dw > cw) ? 'auto' : 'visible'});
s.o.autoPosition && s.setPosition();
},
setPosition: function () {
var s = this, top, left,
hc = (w[0]/2) - (s.d.container.outerHeight(true)/2),
vc = (w[1]/2) - (s.d.container.outerWidth(true)/2);
if (s.o.position && Object.prototype.toString.call(s.o.position) === '[object Array]') {
top = s.o.position[0] || hc;
left = s.o.position[1] || vc;
} else {
top = hc;
left = vc;
}
s.d.container.css({left: left, top: top});
},
watchTab: function (e) {
var s = this;
if ($(e.target).parents('.jambox-container').length > 0) {
// Save the list of inputs
s.inputs = $(':input:enabled:visible:first, :input:enabled:visible:last', s.d.data[0]);
// If it's the first or last tabbable element, refocus
if ((!e.shiftKey && e.target === s.inputs[s.inputs.length -1]) ||
(e.shiftKey && e.target === s.inputs[0]) ||
s.inputs.length === 0) {
e.preventDefault();
var pos = e.shiftKey ? 'last' : 'first';
s.focus(pos);
}
}
else {
// Might be necessary when custom onShow callback is used
e.preventDefault();
s.focus();
}
},
/*
* Open the Jambox dialog elements
* - Note: If you use the onOpen callback, you must "show" the
* overlay and container elements manually
* (the iframe will be handled by Jambox)
*/
open: function () {
var s = this;
// Display the iframe
s.d.iframe && s.d.iframe.show();
if ($.isFunction(s.o.onOpen)) {
// Execute the onOpen callback
s.o.onOpen.apply(s, [s.d]);
}
else {
// Display the remaining elements
s.d.overlay.show();
s.d.container.show();
s.d.data.show();
}
s.o.focus && s.focus();
// Bind default events
s.bindEvents();
},
/*
* Close the Jambox dialog
* - Note: If you use an onClose callback, you must remove the
* overlay, container and iframe elements manually
*
* @param {boolean} external Indicates whether the call to this
* function was internal or external. If it was external, the
* onClose callback will be ignored
*/
close: function () {
var s = this;
// Prevent close when dialog does not exist
if (!s.d.data) {
return false;
}
// Remove the default events
s.unbindEvents();
if ($.isFunction(s.o.onClose) && !s.occb) {
// Set the onClose callback flag
s.occb = true;
// Execute the onClose callback
s.o.onClose.apply(s, [s.d]);
}
else {
// If the data came from the DOM, put it back
if (s.d.placeholder) {
var ph = $('#jambox-placeholder');
// Save changes to the data?
if (s.o.persist) {
// Insert the (possibly) modified data back into the DOM
ph.replaceWith(s.d.data.removeClass('jambox-data').css('display', s.display));
}
else {
// Remove the current and insert the original,
// unmodified data back into the DOM
s.d.data.hide().remove();
ph.replaceWith(s.d.orig);
}
}
else {
// Otherwise, remove it
s.d.data.hide().remove();
}
// Remove the remaining elements
s.d.container.hide().remove();
s.d.overlay.hide();
s.d.iframe && s.d.iframe.hide().remove();
setTimeout(function(){
// Opera work-around
s.d.overlay.remove();
// Reset the dialog object
s.d = {};
}, 10);
}
}
};
})(jampax);
or view the whole code at http://jampax.org/plugins/code/developer/jampax.jambox.js