/*
* jQuery jBox 2.3
* http://www.kudystudio.com
* Author: kudy chen (kudychen@gmail.com)
*
* Copyright 2011, kudy studio
* Dual licensed under the MIT or GPL Version 3 licenses.
*
* Last Modified: 2011-11-11
*/
(function ($) {
$.jBox = function (content, options) {
options = $.extend({}, $.jBox.defaults, options);
options.showFade = options.opacity > 0;
options.isTip = options.isTip || false;
options.isMessager = options.isMessager || false;
if (content == undefined) { content = ''; }
if (options.border < 0) { options.border = 0; }
if (options.id == undefined) { options.id = 'jBox_' + Math.floor(Math.random() * 1000000); }
var isIE6 = !-[1,]&&!window.XMLHttpRequest;
var prevBox = $('#' + options.id);
if (prevBox.length > 0) {
options.zIndex = $.jBox.defaults.zIndex++;
prevBox.css({ zIndex: options.zIndex });
prevBox.find('#jbox').css({ zIndex: options.zIndex + 1 });
return prevBox;
}
var data = { url: '', type: '', html: '', isObject: content.constructor == Object };
if (!data.isObject) {
content = content + '';
var tempContent = content.toLowerCase();
if (tempContent.indexOf('id:') == 0) data.type = 'ID';
else if (tempContent.indexOf('get:') == 0) data.type = 'GET';
else if (tempContent.indexOf('post:') == 0) data.type = 'POST';
else if (tempContent.indexOf('iframe:') == 0) data.type = 'IFRAME';
else if (tempContent.indexOf('html:') == 0) data.type = 'HTML';
else { content = 'html:' + content; data.type = 'HTML'; }
content = content.substring(content.indexOf(":") + 1, content.length);
}
var withTitle = !options.isTip && !(options.title == undefined);
var isRequest = data.type == 'GET' || data.type == 'POST' || data.type == 'IFRAME';
var titleWidth = typeof options.width == 'number' ? (options.width - 50) + 'px' : "90%";
var boxHtml = [];
boxHtml.push('
');
if (options.showFade) {
if ((isIE6 && $('iframe').length > 0) || $('object, applet').length > 0) {
boxHtml.push('
');
}
else {
if (isIE6) {
$('select').css('visibility', 'hidden');
}
boxHtml.push('
');
}
}
boxHtml.push('
');
if (options.draggable) {
boxHtml.push('
');
}
boxHtml.push('
');
boxHtml.push('
');
boxHtml.push('
');
boxHtml.push('
');
if (options.border > 0) {
boxHtml.push('');
boxHtml.push(' | ');
boxHtml.push(' | ');
boxHtml.push(' | ');
boxHtml.push('
');
}
boxHtml.push('');
boxHtml.push(' | ');
boxHtml.push('');
boxHtml.push('');
boxHtml.push(' ');
if (withTitle) {
boxHtml.push(' ');
boxHtml.push(' ' + (options.title == '' ? ' ' : options.title) + ' ');
boxHtml.push(' ');
}
boxHtml.push(' ');
boxHtml.push('');
boxHtml.push(' | ');
boxHtml.push(' | ');
boxHtml.push('
');
if (options.border > 0) {
boxHtml.push('');
boxHtml.push(' | ');
boxHtml.push(' | ');
boxHtml.push(' | ');
boxHtml.push('
');
}
boxHtml.push('
');
boxHtml.push('
');
boxHtml.push('
');
var iframeHtml = '');
states.push('
' + loadingHtml + '
' + stateOptions.content + '
');
states.push('
');
if (!options.isTip) {
states.push('');
}
$.each(stateOptions.buttons, function (k, v) {
states.push('');
});
states.push('
');
});
$box.find('#jbox-states').html(states.join('')).children('.jbox-state:first').css('display', 'block');
/*$box.find('.jbox-button-panel:empty').css('display', 'none');*/
if (isRequest) {
var $iframe = $box.find('#jbox-content').css({ position: (isIE6) ? "absolute" : "fixed", left: -10000 });
}
$.each(content, function (stateName, stateOptions) {
var $state = $box.find('#jbox-state-' + stateName);
$state.children('.jbox-button-panel').children('button').click(function () {
var object = $state.find('#jbox-content');
var clicked = stateOptions.buttons[$(this).text()];
var formInputs = {};
$.each($box.find('#jbox-states :input').serializeArray(), function (i, obj) {
if (formInputs[obj.name] === undefined) {
formInputs[obj.name] = obj.value;
} else if (typeof formInputs[obj.name] == Array) {
formInputs[obj.name].push(obj.value);
} else {
formInputs[obj.name] = [formInputs[obj.name], obj.value];
}
});
var closed = stateOptions.submit(clicked, object, formInputs);
if (closed === undefined || closed) {
removeBox();
}
})
/*.bind('focus', function () { $(this).blur(); })*/
.bind('mousedown', function () { $(this).addClass('jbox-button-active'); })
.bind('mouseup', function () { $(this).removeClass('jbox-button-active'); })
.bind('mouseover', function () { $(this).addClass('jbox-button-hover'); })
.bind('mouseout', function () { $(this).removeClass('jbox-button-active').removeClass('jbox-button-hover'); });
$state.find('.jbox-button-panel button:eq(' + stateOptions.buttonsFocus + ')').addClass('jbox-button-focus');
});
var ie6scroll = function () {
$boxBody.css({ top: $window.scrollTop() });
if (options.isMessager) {
$box.css({
position: (isIE6) ? "absolute" : "fixed",
right: 1,
bottom: 1
});
}
};
var fadeClicked = function () {
if (!options.showFade) {
return;
}
if (options.persistent) {
var i = 0;
$boxBody.addClass('jbox-warning');
var intervalid = setInterval(function () {
$boxBody.toggleClass('jbox-warning');
if (i++ > 1) {
clearInterval(intervalid);
$boxBody.removeClass('jbox-warning');
}
}, 100);
} else {
removeBox();
}
};
var keyPressEventHandler = function (e) {
if (options.isTip || options.isMessager) {
return false;
}
var key = (window.event) ? event.keyCode : e.keyCode;
if (key == 27) {
removeBox();
}
if (key == 9) {
var $inputels = $(':input:enabled:visible', $boxBody);
var fwd = !e.shiftKey && e.target == $inputels[$inputels.length - 1];
var back = e.shiftKey && e.target == $inputels[0];
if (fwd || back) {
setTimeout(function () {
if (!$inputels) return;
var el = $inputels[back === true ? $inputels.length - 1 : 0];
if (el) el.focus();
}, 10);
return false;
}
}
};
var setFade = function () {
if (options.showFade) {
$.jBox.FadeBoxCount++;
$(/msie/.test(navigator.userAgent.toLowerCase()) ? 'html' : 'body').attr('style', 'overflow:hidden;padding-right:17px;');
$boxFade.css({
position: "absolute",
height: options.isTip ? 5000 : $window.height(),
width: isIE6 ? $window.width() : "100%",
top: 0,
left: 0,
right: 0,
bottom: 0
});
}
};
var positionBox = function () {
if (options.isMessager) {
$box.css({
position: (isIE6) ? "absolute" : "fixed",
right: 1,
bottom: 1
});
} else {
$boxTemp.css({ top: options.top });
$box.css({
position: "absolute",
top: $boxTemp.offset().top + (options.isTip ? $window.scrollTop() : 0),
left: (($window.width() - $box.outerWidth()) / 2)
});
}
if ((options.showFade && !options.isTip) || (!options.showFade && !options.isTip && !options.isMessager)) {
$boxBody.css({
position: (isIE6) ? "absolute" : "fixed",
height: options.showFade ? $window.height() : 0,
width: "100%",
top: (isIE6) ? $window.scrollTop() : 0,
left: 0,
right: 0,
bottom: 0
});
}
setFade();
};
var setTop = function () {
options.zIndex = $.jBox.defaults.zIndex++;
$boxBody.css({ zIndex: options.zIndex });
$box.css({ zIndex: options.zIndex + 1 });
};
var styleBox = function () {
options.zIndex = $.jBox.defaults.zIndex++;
$boxBody.css({ zIndex: options.zIndex });
$box.css({
display: "none",
zIndex: options.zIndex + 1
});
if (options.showFade) {
$boxFade.css({
display: "none",
zIndex: options.zIndex,
opacity: options.opacity
});
}
};
var doDown = function (e) {
var dragData = e.data;
dragData.target.find('iframe').hide();
if (options.dragClone) {
dragData.target.prev().css({
left: dragData.target.css('left'),
top: dragData.target.css('top'),
marginLeft: -2,
marginTop: -2,
width: dragData.target.width() + 2,
height: dragData.target.height() + 2
}).show();
}
return false;
}
var doMove = function (e) {
var dragData = e.data;
var left = dragData.startLeft + e.pageX - dragData.startX;
var top = dragData.startTop + e.pageY - dragData.startY;
if (options.dragLimit) {
var minTop = 1;
var maxTop = document.documentElement.clientHeight - e.data.target.height() - 1;
var minLeft = 1;
var maxLeft = document.documentElement.clientWidth - e.data.target.width() - 1;
if (top < minTop) top = minTop + (options.dragClone ? 2 : 0);
if (top > maxTop) top = maxTop - (options.dragClone ? 2 : 0);
if (left < minLeft) left = minLeft + (options.dragClone ? 2 : 0);
if (left > maxLeft) left = maxLeft - (options.dragClone ? 2 : 0);
}
if (options.dragClone) {
dragData.target.prev().css({ left: left, top: top });
} else {
dragData.target.css({ left: left, top: top });
}
return false;
}
var doUp = function (e) {
$(document).unbind('.draggable');
if (options.dragClone) {
var drag = e.data.target.prev().hide();
e.data.target.css({ left: drag.css('left'), top: drag.css('top') }).find('iframe').show();
} else {
e.data.target.find('iframe').show();
}
return false;
}
var onMouseDown = function (e) {
var position = e.data.target.position();
var data = {
target: e.data.target,
startX: e.pageX,
startY: e.pageY,
startLeft: position.left,
startTop: position.top
};
$(document).bind('mousedown.draggable', data, doDown).bind('mousemove.draggable', data, doMove).bind('mouseup.draggable', data, doUp);
}
var removeBox = function () {
if (options.showFade) {
if ($.jBox.FadeBoxCount == 1) {
$(/msie/.test(navigator.userAgent.toLowerCase()) ? 'html' : 'body').removeAttr('style');
}
$.jBox.FadeBoxCount--;
}
if (options.isTip) {
var tip = $(document.body).data('tip');
if (tip && tip.next == true) {
$boxTemp.css('top', tip.options.top);
var top = $boxTemp.offset().top + $window.scrollTop();
if (top == $box.offset().top) {
removeBoxImpl();
}
else {
$box.find('#jbox-content').html(tip.options.content.substr(5)).end().css({ left: (($window.width() - $box.outerWidth()) / 2) }).animate({ top: top, opacity: 0.1 }, 500, removeBoxImpl);
}
}
else {
$box.animate({ top: '-=200', opacity: 0 }, 500, removeBoxImpl);
}
}
else {
switch (options.showType) {
case 'slide':
$box.slideUp(options.showSpeed, removeBoxImpl);
break;
case 'fade':
$box.fadeOut(options.showSpeed, removeBoxImpl);
break;
case 'show':
default:
$box.hide(options.showSpeed, removeBoxImpl);
break;
}
}
};
var removeBoxImpl = function () {
$window.unbind('resize', setFade);
if (options.draggable && !options.isTip && !options.isMessager) {
$box.find('.jbox-title-panel').unbind('mousedown', onMouseDown);
}
if (data.type != 'IFRAME') {
$box.find('#jbox-iframe').attr({ 'src': 'about:blank' });
}
$box.html('').remove();
if (isIE6 && !options.isTip) {
$body.unbind('scroll', ie6scroll);
}
if (options.showFade) {
$boxFade.fadeOut('fast', function () {
$boxFade.unbind('click', fadeClicked).unbind('mousedown', setTop).html('').remove();
});
}
$boxBody.unbind('keydown keypress', keyPressEventHandler).html('').remove();
if (isIE6 && options.showFade) {
$('select').css('visibility', 'visible');
//$(data.selects).attr('disabled', false);
}
if (typeof options.closed == 'function') { options.closed(); }
};
var autoClosing = function () {
if (options.timeout > 0) {
$box.data('autoClosing', window.setTimeout(removeBox, options.timeout));
if (options.isMessager) {
$box.hover(function () {
window.clearTimeout($box.data('autoClosing'));
}, function () {
$box.data('autoClosing', window.setTimeout(removeBox, options.timeout));
});
}
}
};
var loaded = function () {
if (typeof options.loaded == 'function') {
options.loaded($box.find('.jbox-state:visible').find('.jbox-content'));
}
};
if (!data.isObject) {
switch (data.type) {
case "GET":
case "POST":
$.ajax({
type: data.type,
url: data.url,
data: options.ajaxData == undefined ? {} : options.ajaxData,
dataType: 'html',
cache: false,
success: function (data, textStatus) {
$box.find('#jbox-content').css({ position: "static" }).html(data).show().prev().hide();
loaded();
},
error: function () {
$box.find('#jbox-content-loading').html('Loading Error.
');
}
});
break;
case "IFRAME":
$box.find('#jbox-iframe').attr({ 'src': data.url }).bind("load", function (event) {
$(this).parent().css({ position: "static" }).show().prev().hide();
$box.find('#jbox-states .jbox-state:first .jbox-button-focus').focus();
loaded();
});
break;
default:
$box.find('#jbox-content').show();
break;
}
}
positionBox();
styleBox();
if (isIE6 && !options.isTip) {
$window.scroll(ie6scroll);
}
if (options.showFade) {
$boxFade.click(fadeClicked);
}
$window.resize(setFade);
$boxBody.bind('keydown keypress', keyPressEventHandler);
$box.find('.jbox-close').click(removeBox);
if (options.showFade) {
$boxFade.fadeIn('fast');
}
var showFunc = 'show';
if (options.showType == 'slide') {
showFunc = 'slideDown';
} else if (options.showType == 'fade') {
showFunc = 'fadeIn';
}
if (options.isMessager) {
$box[showFunc](options.showSpeed, autoClosing);
} else {
var tip = $(document.body).data('tip');
if (tip && tip.next == true) {
$(document.body).data('tip', { next: false, options: {} });
$box.css('display', '');
} else {
if (!data.isObject && isRequest) {
$box[showFunc](options.showSpeed);
} else {
$box[showFunc](options.showSpeed, loaded); /* loaded */
}
}
}
if (!options.isTip) {
$box.find('.jbox-bottom-text').html(options.bottomText);
} else {
$box.find('.jbox-container,.jbox-content').addClass('jbox-tip-color');
}
if (data.type != 'IFRAME') {
$box.find('#jbox-states .jbox-state:first .jbox-button-focus').focus();
}
else {
$box.focus();
}
if (!options.isMessager) {
autoClosing();
}
$boxBody.bind('mousedown', setTop);
if (options.draggable && !options.isTip && !options.isMessager) {
$box.find('.jbox-title-panel').bind('mousedown', { target: $box }, onMouseDown).css('cursor', 'move');
}
return $boxBody;
};
$.jBox.version = 2.3;
$.jBox.defaults = {
id: null,
top: "15%",
zIndex: 1984,
border: 5,
opacity: 0.1,
timeout: 0,
showType: 'fade',
showSpeed: 'fast',
showIcon: true,
showClose: true,
draggable: true,
dragLimit: true,
dragClone: false,
persistent: true,
showScrolling: true,
ajaxData: {},
iframeScrolling: 'auto',
title: 'jBox',
width: 350,
height: 'auto',
bottomText: '',
buttons: { '确定': 'ok' },
buttonsFocus: 0,
loaded: function (h) { },
submit: function (v, h, f) { return true; },
closed: function () { }
};
$.jBox.stateDefaults = { content: '', buttons: { '确定': 'ok' }, buttonsFocus: 0, submit: function (v, h, f) { return true; } };
$.jBox.tipDefaults = { content: '', icon: 'info', top: '40%', width: 'auto', height: 'auto', opacity: 0, timeout: 3000, closed: function () { } };
$.jBox.messagerDefaults = { content: '', title: 'jBox', icon: 'none', width: 350, height: 'auto', timeout: 3000, showType: 'slide', showSpeed: 600, border: 0, buttons: {}, buttonsFocus: 0, loaded: function () { }, submit: function (v, h, f) { return true; }, closed: function () { } };
$.jBox.languageDefaults = { close: '关闭', ok: '确定', yes: '是', no: '否', cancel: '取消' };
$.jBox.setDefaults = function (configs) {
$.jBox.defaults = $.extend({}, $.jBox.defaults, configs.defaults);
$.jBox.stateDefaults = $.extend({}, $.jBox.stateDefaults, configs.stateDefaults);
$.jBox.tipDefaults = $.extend({}, $.jBox.tipDefaults, configs.tipDefaults);
$.jBox.messagerDefaults = $.extend({}, $.jBox.messagerDefaults, configs.messagerDefaults);
$.jBox.languageDefaults = $.extend({}, $.jBox.languageDefaults, configs.languageDefaults);
};
$.jBox.getBox = function () {
return $('.jbox-body').eq($('.jbox-body').length - 1);
};
$.jBox.getIframe = function (jBoxId) {
var box = (typeof jBoxId == 'string') ? $('#' + jBoxId) : $.jBox.getBox();
return box.find('#jbox-iframe').get(0);
};
$.jBox.getContent = function () {
return $.jBox.getState().find('.jbox-content').html();
};
$.jBox.setContent = function (content) {
return $.jBox.getState().find('.jbox-content').html(content);
};
$.jBox.getState = function (stateNmae) {
if (stateNmae == undefined) {
return $.jBox.getBox().find('.jbox-state:visible');
} else {
return $.jBox.getBox().find('#jbox-state-' + stateNmae);
}
};
$.jBox.getStateName = function () {
return $.jBox.getState().attr('id').replace('jbox-state-', '');
};
$.jBox.goToState = function (stateName, stateContent) {
var box = $.jBox.getBox();
if (box != undefined && box != null) {
var $next;
stateName = stateName || false;
box.find('.jbox-state').slideUp('fast');
if (typeof stateName == 'string') {
$next = box.find('#jbox-state-' + stateName);
} else {
$next = stateName ? box.find('.jbox-state:visible').next() : box.find('.jbox-state:visible').prev();
}
$next.slideDown(350, function () {
window.setTimeout(function () {
$next.find('.jbox-button-focus').focus();
if (stateContent != undefined) {
$next.find('.jbox-content').html(stateContent);
}
}, 20);
});
}
};
$.jBox.nextState = function (stateContent) {
$.jBox.goToState(true, stateContent);
};
$.jBox.prevState = function (stateContent) {
$.jBox.goToState(false, stateContent);
};
$.jBox.close = function (token, boxType) {
token = token || false;
boxType = boxType || 'body';
if (typeof token == 'string') {
$('#' + token).find('.jbox-close').click();
}
else {
var boxs = $('.jbox-' + boxType);
if (token) {
for (var i = 0, l = boxs.length; i < l; ++i) {
boxs.eq(i).find('.jbox-close').click();
}
} else {
if (boxs.length > 0) {
boxs.eq(boxs.length - 1).find('.jbox-close').click();
}
}
}
};
$.jBox.open = function (content, title, width, height, options) {
var defaults = {
content: content,
title: title,
width: width,
height: height
};
options = $.extend({}, defaults, options);
options = $.extend({}, $.jBox.defaults, options);
$.jBox(options.content, options);
};
/*'none'、'info'、'question'、'success'、'warning'、'error'*/
$.jBox.prompt = function (content, title, icon, options) {
var defaults = {
content: content,
title: title,
icon: icon,
buttons: eval('({ "' + $.jBox.languageDefaults.ok + '": "ok" })')
};
options = $.extend({}, defaults, options);
options = $.extend({}, $.jBox.defaults, options);
if (options.border < 0) {
options.border = 0;
}
if (options.icon != 'info' && options.icon != 'warning' && options.icon != 'success' && options.icon != 'error' && options.icon != 'question') {
padding = '';
options.icon = 'none';
}
var top = options.title == undefined ? 10 : 35;
var minHeight = options.icon == 'none' ? 'height:auto;' : 'min-height:30px;' + (!-[1,]&&!window.XMLHttpRequest ? 'height:auto !important;height:100%;_height:30px;' : 'height:auto;');
var html = [];
html.push('html:');
html.push('