/**
* Common functions/utils used in all page
*/
if (typeof window.LP == 'undefined') {
window.LP = window.LearnPress = {};
}
(function ($) {
/**
* Manage event callbacks.
* Allow add/remove a callback function into custom event of an object.
*
* @constructor
*/
window.LP.Event_Callback = function (self) {
var callbacks = {};
this.on = function (event, callback) {
var namespaces = event.split('.'),
namespace = '';
if (namespaces.length > 1) {
event = namespaces[0];
namespace = namespaces[1];
}
if (!callbacks[event]) {
callbacks[event] = [[], {}];
}
if (namespace) {
if (!callbacks[event][1][namespace]) {
callbacks[event][1][namespace] = [];
}
callbacks[event][1][namespace].push(callback);
} else {
callbacks[event][0].push(callback);
}
return self;
};
this.off = function (event, callback) {
var namespaces = event.split('.'),
namespace = '';
if (namespaces.length > 1) {
event = namespaces[0];
namespace = namespaces[1];
}
if (!callbacks[event]) {
return self;
}
var at = -1;
if (!namespace) {
if ($.isFunction(callback)) {
at = callbacks[event][0].indexOf(callback);
if (at < 0) {
return self;
}
callbacks[event][0].splice(at, 1);
} else {
callbacks[event][0] = [];
}
} else {
if (!callbacks[event][1][namespace]) {
return self;
}
if ($.isFunction(callback)) {
at = callbacks[event][1][namespace].indexOf(callback);
if (at < 0) {
return self;
}
callbacks[event][1][namespace].splice(at, 1);
} else {
callbacks[event][1][namespace] = [];
}
}
return self;
};
this.callEvent = function (event, callbackArgs) {
if (!callbacks[event]) {
return;
}
if (callbacks[event][0]) {
for (var i = 0; i < callbacks[event][0].length; i++) {
$.isFunction(callbacks[event][0][i]) && callbacks[event][i][0].apply(self, callbackArgs);
}
}
if (callbacks[event][1]) {
for (var i in callbacks[event][1]) {
for (var j = 0; j < callbacks[event][1][i].length; j++) {
$.isFunction(callbacks[event][1][i][j]) && callbacks[event][1][i][j].apply(self, callbackArgs);
}
}
}
}
};
$.fn.serializeJSON = function (path) {
var isInput = $(this).is('input') || $(this).is('select') || $(this).is('textarea');
var unIndexed = isInput ? $(this).serializeArray() : $(this).find('input, select, textarea').serializeArray(),
indexed = {},
validate = /(\[([a-zA-Z0-9_-]+)?\]?)/g,
arrayKeys = {},
end = false;
$.each(unIndexed, function () {
var that = this,
match = this.name.match(/^([0-9a-zA-Z_-]+)/);
if (!match) {
return;
}
var keys = this.name.match(validate),
objPath = "indexed['" + match[0] + "']";
if (keys) {
if (typeof indexed[match[0]] != 'object') {
indexed[match[0]] = {};
}
$.each(keys, function (i, prop) {
prop = prop.replace(/\]|\[/g, '');
var rawPath = objPath.replace(/'|\[|\]/g, ''),
objExp = '',
preObjPath = objPath;
if (prop == '') {
if (arrayKeys[rawPath] == undefined) {
arrayKeys[rawPath] = 0;
} else {
arrayKeys[rawPath]++;
}
objPath += "['" + arrayKeys[rawPath] + "']";
} else {
if (!isNaN(prop)) {
arrayKeys[rawPath] = prop;
}
objPath += "['" + prop + "']";
}
try {
if (i == keys.length - 1) {
objExp = objPath + "=that.value;";
end = true;
} else {
objExp = objPath + "={}";
end = false;
}
var evalString = "" +
"if( typeof " + objPath + " == 'undefined'){" + objExp + ";" +
"}else{" +
"if(end){" +
"if(typeof " + preObjPath + "!='object'){" + preObjPath + "={};}" +
objExp +
"}" +
"}";
eval(evalString);
} catch (e) {
console.log('Error:' + e + "\n" + objExp);
}
})
} else {
indexed[match[0]] = this.value;
}
});
if (path) {
path = "['" + path.replace('.', "']['") + "']";
var c = 'try{indexed = indexed' + path + '}catch(ex){console.log(c, ex);}';
eval(c);
}
return indexed;
};
$.fn.LP_Tooltip = function (options) {
options = $.extend({}, {
offset: [0, 0]
}, options || {});
return $.each(this, function () {
var $el = $(this),
content = $el.data('content');
if (!content || ($el.data('LP_Tooltip') !== undefined)) {
return;
}
console.log(content);
var $tooltip = null;
$el.hover(function (e) {
$tooltip = $('
').html(content).appendTo($('body')).hide();
var position = $el.offset();
if ($.isArray(options.offset)) {
var top = options.offset[1],
left = options.offset[0];
if ($.isNumeric(left)) {
position.left += left;
} else {
}
if ($.isNumeric(top)) {
position.top += top;
} else {
}
}
$tooltip.css({
top : position.top,
left: position.left
});
$tooltip.fadeIn();
}, function () {
$tooltip && $tooltip.remove();
});
$el.data('tooltip', true);
});
};
$.fn.hasEvent = function (name) {
var events = $(this).data('events');
if (typeof events.LP == 'undefined') {
return false;
}
for (i = 0; i < events.LP.length; i++) {
if (events.LP[i].namespace == name) {
return true;
}
}
return false;
};
$.fn.dataToJSON = function () {
var json = {};
$.each(this[0].attributes, function () {
var m = this.name.match(/^data-(.*)/);
if (m) {
json[m[1]] = this.value;
}
});
return json;
};
String.prototype.getQueryVar = function (name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^]*)"),
results = regex.exec(this);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
};
String.prototype.addQueryVar = function (name, value) {
var url = this,
m = url.split('#');
url = m[0];
if (name.match(/\[/)) {
url += url.match(/\?/) ? '&' : '?';
url += name + '=' + value;
} else {
if ((url.indexOf('&' + name + '=') != -1) || (url.indexOf('?' + name + '=') != -1)) {
url = url.replace(new RegExp(name + "=([^]*)", 'g'), name + '=' + value);
} else {
url += url.match(/\?/) ? '&' : '?';
url += name + '=' + value;
}
}
return url + (m[1] ? '#' + m[1] : '');
};
String.prototype.removeQueryVar = function (name) {
var url = this;
var m = url.split('#');
url = m[0];
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "([\[][^=]*)?=([^]*)", 'g');
url = url.replace(regex, '');
return url + (m[1] ? '#' + m[1] : '');
};
if ($.isEmptyObject("") == false) {
$.isEmptyObject = function (a) {
for (prop in a) {
if (a.hasOwnProperty(prop)) {
return false;
}
}
return true;
};
}
LP.MessageBox = {
/*
*
*/
$block : null,
$window : null,
events : {},
instances : [],
instance : null,
quickConfirm : function (elem, args) {
var $e = $(elem);
$('[learn-press-quick-confirm]').each(function () {
( $ins = $(this).data('quick-confirm') ) && ( console.log($ins), $ins.destroy() );
});
!$e.attr('learn-press-quick-confirm') && $e.attr('learn-press-quick-confirm', 'true').data('quick-confirm',
new (function (elem, args) {
var $elem = $(elem),
$div = $('').insertAfter($elem), //($(document.body)),
offset = $(elem).position() || {left: 0, top: 0},
timerOut = null,
timerHide = null,
n = 3,
hide = function () {
$div.fadeOut('fast', function () {
$(this).remove();
$div.parent().css('position', '');
});
$elem.removeAttr('learn-press-quick-confirm').data('quick-confirm', undefined);
stop();
},
stop = function () {
timerHide && clearInterval(timerHide);
timerOut && clearInterval(timerOut);
},
start = function () {
timerOut = setInterval(function () {
if (--n == 0) {
hide.call($div[0]);
$.isFunction(args.onCancel) && args.onCancel(args.data);
stop();
}
$div.find('span').html(' (' + n + ')');
}, 1000);
timerHide = setInterval(function () {
if (!$elem.is(':visible') || $elem.css("visibility") == 'hidden') {
stop();
$div.remove();
$div.parent().css('position', '');
$.isFunction(args.onCancel) && args.onCancel(args.data);
}
}, 350);
};
args = $.extend({
message : '',
data : null,
onOk : null,
onCancel: null,
offset : {top: 0, left: 0}
}, args || {});
$div.html(args.message || $elem.attr('data-confirm-remove') || 'Are you sure?').append(' (' + n + ')').css({});
$div.click(function () {
$.isFunction(args.onOk) && args.onOk(args.data);
hide();
}).hover(function () {
stop();
}, function () {
start();
});
//$div.parent().css('position', 'relative');
$div.css({
left: ( ( offset.left + $elem.outerWidth() ) - $div.outerWidth() ) + args.offset.left,
top : offset.top + $elem.outerHeight() + args.offset.top + 5
}).hide().fadeIn('fast');
start();
this.destroy = function () {
$div.remove();
$elem.removeAttr('learn-press-quick-confirm').data('quick-confirm', undefined);
stop();
};
})(elem, args)
);
},
show: function (message, args) {
//this.hide();
$.proxy(function () {
args = $.extend({
title: '',
buttons: '',
events: false,
autohide: false,
message: message,
data: false,
id: LP.uniqueId(),
onHide: null
}, args || {});
this.instances.push(args);
this.instance = args;
var $doc = $(document),
$body = $(document.body);
if (!this.$block) {
this.$block = $('').appendTo($body);
}
if (!this.$window) {
this.$window = $('').insertAfter(this.$block);
this.$window.click(function () {
});
}
//this.events = args.events || {};
this._createWindow(message, args.title, args.buttons);
this.$block.show();
this.$window.show().attr('instance', args.id);
$(window)
.bind('resize.message-box', $.proxy(this.update, this))
.bind('scroll.message-box', $.proxy(this.update, this));
this.update(true);
if (args.autohide) {
setTimeout(function () {
LP.MessageBox.hide();
$.isFunction(args.onHide) && args.onHide.call(LP.MessageBox, args);
}, args.autohide);
}
}, this)();
},
blockUI: function (message) {
message = (message !== false ? (message ? message : 'Wait a moment') : '') + '';
this.show(message);
},
hide: function (delay, instance) {
if (instance) {
this._removeInstance(instance.id);
} else if (this.instance) {
this._removeInstance(this.instance.id);
}
if (this.instances.length === 0) {
if (this.$block) {
this.$block.hide();
}
if (this.$window) {
this.$window.hide();
}
$(window)
.unbind('resize.message-box', this.update)
.unbind('scroll.message-box', this.update);
} else {
if (this.instance) {
this._createWindow(this.instance.message, this.instance.title, this.instance.buttons);
}
}
},
update: function (force) {
var that = this,
$wrap = this.$window.find('#message-box-wrap'),
timer = $wrap.data('timer'),
_update = function () {
LP.Hook.doAction('learn_press_message_box_before_resize', that);
var $content = $wrap.find('.message-box-content').css("height", "").css('overflow', 'hidden'),
width = $wrap.outerWidth(),
height = $wrap.outerHeight(),
contentHeight = $content.height(),
windowHeight = $(window).height(),
top = $wrap.offset().top;
if (contentHeight > windowHeight - 50) {
$content.css({
height: windowHeight - 25
});
height = $wrap.outerHeight();
} else {
$content.css("height", "").css('overflow', '');
}
$wrap.css({
marginTop: ($(window).height() - height) / 2
});
LP.Hook.doAction('learn_press_message_box_resize', height, that);
};
if (force) _update();
timer && clearTimeout(timer);
timer = setTimeout(_update, 250);
},
_removeInstance: function (id) {
for (var i = 0; i < this.instances.length; i++) {
if (this.instances[i].id === id) {
this.instances.splice(i, 1);
var len = this.instances.length;
if (len) {
this.instance = this.instances[len - 1];
this.$window.attr('instance', this.instance.id);
} else {
this.instance = false;
this.$window.removeAttr('instance');
}
break;
}
}
},
_getInstance: function (id) {
for (var i = 0; i < this.instances.length; i++) {
if (this.instances[i].id === id) {
return this.instances[i];
}
}
},
_createWindow: function (message, title, buttons) {
var $wrap = this.$window.find('#message-box-wrap').html('');
if (title) {
$wrap.append('' + title + '
');
}
$wrap.append($('').html(message));
if (buttons) {
var $buttons = $('');
switch (buttons) {
case 'yesNo':
$buttons.append(this._createButton(LP_Settings.localize.button_yes, 'yes'));
$buttons.append(this._createButton(LP_Settings.localize.button_no, 'no'));
break;
case 'okCancel':
$buttons.append(this._createButton(LP_Settings.localize.button_ok, 'ok'));
$buttons.append(this._createButton(LP_Settings.localize.button_cancel, 'cancel'));
break;
default:
$buttons.append(this._createButton(LP_Settings.localize.button_ok, 'ok'));
}
$wrap.append($buttons);
}
},
_createButton: function (title, type) {
var $button = $(''),
callback = 'on' + (type.substr(0, 1).toUpperCase() + type.substr(1));
$button.data('callback', callback).click(function () {
var instance = $(this).data('instance'),
callback = instance.events[$(this).data('callback')];
if ($.type(callback) === 'function') {
if (callback.apply(LP.MessageBox, [instance]) === false) {
// return;
} else {
LP.MessageBox.hide(null, instance);
}
} else {
LP.MessageBox.hide(null, instance);
}
}).data('instance', this.instance);
return $button;
}
};
LP.Hook = {
hooks: {action: {}, filter: {}},
addAction: function (action, callable, priority, tag) {
this.addHook('action', action, callable, priority, tag);
return this;
},
addFilter: function (action, callable, priority, tag) {
this.addHook('filter', action, callable, priority, tag);
return this;
},
doAction: function (action) {
this.doHook('action', action, arguments);
return this;
},
applyFilters: function (action) {
return this.doHook('filter', action, arguments);
},
removeAction: function (action, tag) {
this.removeHook('action', action, tag);
return this;
},
removeFilter: function (action, priority, tag) {
this.removeHook('filter', action, priority, tag);
return this;
},
addHook: function (hookType, action, callable, priority, tag) {
if (undefined === this.hooks[hookType][action]) {
this.hooks[hookType][action] = [];
}
var hooks = this.hooks[hookType][action];
if (undefined === tag) {
tag = action + '_' + hooks.length;
}
this.hooks[hookType][action].push({tag: tag, callable: callable, priority: priority});
return this;
},
doHook: function (hookType, action, args) {
// splice args from object into array and remove first index which is the hook name
args = Array.prototype.slice.call(args, 1);
if (undefined !== this.hooks[hookType][action]) {
var hooks = this.hooks[hookType][action], hook;
//sort by priority
hooks.sort(function (a, b) {
return a["priority"] - b["priority"];
});
for (var i = 0; i < hooks.length; i++) {
hook = hooks[i].callable;
if (typeof hook !== 'function')
hook = window[hook];
if ('action' === hookType) {
hook.apply(null, args);
} else {
args[0] = hook.apply(null, args);
}
}
}
if ('filter' === hookType) {
return args[0];
}
return this;
},
removeHook: function (hookType, action, priority, tag) {
if (undefined !== this.hooks[hookType][action]) {
var hooks = this.hooks[hookType][action];
for (var i = hooks.length - 1; i >= 0; i--) {
if ((undefined === tag || tag === hooks[i].tag) && (undefined === priority || priority === hooks[i].priority)) {
hooks.splice(i, 1);
}
}
}
return this;
}
};
LP = $.extend({
setUrl: function (url, ember, title) {
if (url) {
history.pushState({}, title, url);
LP.Hook.doAction('learn_press_set_location_url', url);
}
},
toggleGroupSection: function (el, target) {
var $el = $(el),
isHide = $el.hasClass('hide-if-js');
if (isHide) {
$el.hide().removeClass('hide-if-js');
}
$el.removeClass('hide-if-js').slideToggle(function () {
var $this = $(this);
if ($this.is(':visible')) {
$(target).addClass('toggle-on').removeClass('toggle-off');
} else {
$(target).addClass('toggle-off').removeClass('toggle-on');
}
});
},
overflow: function (el, v) {
var $el = $(el),
overflow = $el.css('overflow');
if (v) {
$el.css('overflow', v).data('overflow', overflow);
} else {
$el.css('overflow', $el.data('overflow'));
}
},
getUrl: function () {
return window.location.href;
},
addQueryVar: function (name, value, url) {
return (url === undefined ? window.location.href : url).addQueryVar(name, value);
},
removeQueryVar: function (name, url) {
return (url === undefined ? window.location.href : url).removeQueryVar(name);
},
reload: function (url) {
if (!url) {
url = window.location.href;
}
window.location.href = url;
},
parseResponse: function (response, type) {
var m = response.match(/<-- LP_AJAX_START -->(.*)<-- LP_AJAX_END -->/);
if (m) {
response = m[1];
}
return (type || "json") === "json" ? this.parseJSON(response) : response;
},
parseJSON: function (data) {
var m = (data + '').match(/<-- LP_AJAX_START -->(.*)<-- LP_AJAX_END -->/);
try {
if (m) {
data = $.parseJSON(m[1]);
} else {
data = $.parseJSON(data);
}
} catch (e) {
data = {};
}
return data;
},
ajax: function (args) {
var type = args.type || 'post',
dataType = args.dataType || 'json',
data = args.action ? $.extend(args.data, {'lp-ajax': args.action}) : args.data,
beforeSend = args.beforeSend || function () {
},
url = args.url || window.location.href;
// console.debug( beforeSend );
$.ajax({
data: data,
url: url,
type: type,
dataType: 'html',
beforeSend: beforeSend.apply(null, args),
success: function (raw) {
var response = LP.parseResponse(raw, dataType);
$.isFunction(args.success) && args.success(response, raw);
},
error: function () {
$.isFunction(args.error) && args.error.apply(null, LP.funcArgs2Array());
}
});
},
doAjax: function (args) {
var type = args.type || 'post',
dataType = args.dataType || 'json',
action = ((args.prefix === undefined) || 'learnpress_') + args.action,
data = args.action ? $.extend(args.data, {action: action}) : args.data;
$.ajax({
data: data,
url: (args.url || window.location.href),
type: type,
dataType: 'html',
success: function (raw) {
var response = LP.parseResponse(raw, dataType);
$.isFunction(args.success) && args.success(response, raw);
},
error: function () {
$.isFunction(args.error) && args.error.apply(null, LP.funcArgs2Array());
}
});
},
funcArgs2Array: function (args) {
var arr = [];
for (var i = 0; i < args.length; i++) {
arr.push(args[i]);
}
return arr;
},
addFilter: function (action, callback) {
var $doc = $(document),
event = 'LP.' + action;
$doc.on(event, callback);
LP.log($doc.data('events'));
return this;
},
applyFilters: function () {
var $doc = $(document),
action = arguments[0],
args = this.funcArgs2Array(arguments);
if ($doc.hasEvent(action)) {
args[0] = 'LP.' + action;
return $doc.triggerHandler.apply($doc, args);
}
return args[1];
},
addAction: function (action, callback) {
return this.addFilter(action, callback);
},
doAction: function () {
var $doc = $(document),
action = arguments[0],
args = this.funcArgs2Array(arguments);
if ($doc.hasEvent(action)) {
args[0] = 'LP.' + action;
$doc.trigger.apply($doc, args);
}
},
toElement: function (element, args) {
if ($(element).length === 0) {
return;
}
args = $.extend({
delay: 300,
duration: 'slow',
offset: 50,
container: null,
callback: null,
invisible: false
}, args || {});
var $container = $(args.container),
rootTop = 0;
if ($container.length === 0) {
$container = $('body, html');
}
rootTop = $container.offset().top;
var to = ($(element).offset().top + $container.scrollTop()) - rootTop - args.offset;
function isElementInView(element, fullyInView) {
var pageTop = $container.scrollTop();
var pageBottom = pageTop + $container.height();
var elementTop = $(element).offset().top - $container.offset().top;
var elementBottom = elementTop + $(element).height();
if (fullyInView === true) {
return ((pageTop < elementTop) && (pageBottom > elementBottom));
} else {
return ((elementTop <= pageBottom) && (elementBottom >= pageTop));
}
}
if (args.invisible && isElementInView(element, true)) {
return;
}
$container.fadeIn(10)
.delay(args.delay)
.animate({
scrollTop: to
}, args.duration, args.callback);
},
uniqueId: function (prefix, more_entropy) {
if (typeof prefix === 'undefined') {
prefix = '';
}
var retId;
var formatSeed = function (seed, reqWidth) {
seed = parseInt(seed, 10)
.toString(16); // to hex str
if (reqWidth < seed.length) { // so long we split
return seed.slice(seed.length - reqWidth);
}
if (reqWidth > seed.length) { // so short we pad
return new Array(1 + (reqWidth - seed.length))
.join('0') + seed;
}
return seed;
};
// BEGIN REDUNDANT
if (!this.php_js) {
this.php_js = {};
}
// END REDUNDANT
if (!this.php_js.uniqidSeed) { // init seed with big random int
this.php_js.uniqidSeed = Math.floor(Math.random() * 0x75bcd15);
}
this.php_js.uniqidSeed++;
retId = prefix; // start with prefix, add current milliseconds hex string
retId += formatSeed(parseInt(new Date()
.getTime() / 1000, 10), 8);
retId += formatSeed(this.php_js.uniqidSeed, 5); // add seed hex string
if (more_entropy) {
// for more entropy we add a float lower to 10
retId += (Math.random() * 10)
.toFixed(8)
.toString();
}
return retId;
},
log: function () {
//if (typeof LEARN_PRESS_DEBUG != 'undefined' && LEARN_PRESS_DEBUG && console) {
for (var i = 0, n = arguments.length; i < n; i++) {
console.log(arguments[i]);
}
//}
},
blockContent: function () {
if ($('#learn-press-block-content').length === 0) {
$(LP.template('learn-press-template-block-content', {})).appendTo($('body'));
}
LP.hideMainScrollbar().addClass('block-content');
$(document).trigger('learn_press_block_content');
},
unblockContent: function () {
setTimeout(function () {
LP.showMainScrollbar().removeClass('block-content');
$(document).trigger('learn_press_unblock_content');
}, 350);
},
hideMainScrollbar: function (el) {
if (!el) {
el = 'html, body';
}
var $el = $(el);
$el.each(function () {
var $root = $(this),
overflow = $root.css('overflow');
$root.css('overflow', 'hidden').attr('overflow', overflow);
});
return $el;
},
showMainScrollbar: function (el) {
if (!el) {
el = 'html, body';
}
var $el = $(el);
$el.each(function () {
var $root = $(this),
overflow = $root.attr('overflow');
$root.css('overflow', overflow).removeAttr('overflow');
});
return $el;
},
template: typeof _ !== 'undefined' ? _.memoize(function (id, data) {
var compiled,
options = {
evaluate: /<#([\s\S]+?)#>/g,
interpolate: /\{\{\{([\s\S]+?)\}\}\}/g,
escape: /\{\{([^\}]+?)\}\}(?!\})/g,
variable: 'data'
};
var tmpl = function (data) {
compiled = compiled || _.template($('#' + id).html(), null, options);
return compiled(data);
};
return data ? tmpl(data) : tmpl;
}, function (a, b) {
return a + '-' + JSON.stringify(b);
}) : function () {
return '';
},
alert: function (localize, callback) {
var title = '',
message = '';
if (typeof localize === 'string') {
message = localize;
} else {
if (typeof localize['title'] !== 'undefined') {
title = localize['title'];
}
if (typeof localize['message'] !== 'undefined') {
message = localize['message'];
}
}
$.alerts.alert(message, title, function (e) {
LP._on_alert_hide();
callback && callback(e);
});
this._on_alert_show();
},
confirm: function (localize, callback) {
var title = '',
message = '';
if (typeof localize === 'string') {
message = localize;
} else {
if (typeof localize['title'] !== 'undefined') {
title = localize['title'];
}
if (typeof localize['message'] !== 'undefined') {
message = localize['message'];
}
}
$.alerts.confirm(message, title, function (e) {
LP._on_alert_hide();
callback && callback(e);
});
this._on_alert_show();
},
_on_alert_show: function () {
var $container = $('#popup_container'),
$placeholder = $('').insertAfter($container).data('xxx', $container);
$container.stop().css('top', '-=50').css('opacity', '0').animate({
top: '+=50',
opacity: 1
}, 250);
},
_on_alert_hide: function () {
var $holder = $("#popup_container_placeholder"),
$container = $holder.data('xxx');
if ($container) {
$container.replaceWith($holder);
}
$container.appendTo($(document.body))
$container.stop().animate({
top: '+=50',
opacity: 0
}, 250, function () {
$(this).remove();
});
},
sendMessage: function (data, object, targetOrigin, transfer) {
if ($.isPlainObject(data)) {
data = JSON.stringify(data);
}
object = object || window;
targetOrigin = targetOrigin || '*';
object.postMessage(data, targetOrigin, transfer);
},
receiveMessage: function (event, b) {
var target = event.origin || event.originalEvent.origin,
data = event.data || event.originalEvent.data || '';
if (typeof data === 'string' || data instanceof String) {
if (data.indexOf('{') === 0) {
data = LP.parseJSON(data);
}
}
LP.Hook.doAction('learn_press_receive_message', data, target);
}
}, LP);
$.fn.rows = function () {
var h = $(this).height();
var lh = $(this).css('line-height').replace("px", "");
$(this).attr({height: h, 'line-height': lh});
return Math.floor(h / parseInt(lh));
};
$.fn.checkLines = function (p) {
return this.each(function () {
var $e = $(this),
rows = $e.rows();
p.call(this, rows);
});
};
$.fn.findNext = function (selector) {
var $selector = $(selector),
$root = this.first(),
index = $selector.index($root),
$next = $selector.eq(index + 1);
return $next.length ? $next : false;
};
$.fn.findPrev = function (selector) {
var $selector = $(selector),
$root = this.first(),
index = $selector.index($root),
$prev = $selector.eq(index - 1);
return $prev.length ? $prev : false;
};
$.each(['progress'], function (i, property) {
$.Tween.propHooks[property] = {
get: function (tween) {
return $(tween.elem).css('transform');
},
set: function (tween) {
/*var style = tween.elem.style;
var p_begin = parseColor($(tween.elem).css(property));
var p_end = parseColor(tween.end);
tween.run = function(progress) {
style[property] = calculateColor(p_begin, p_end, progress);
}*/
if (tween.now < 180) {
$(this).find('.progress-circle').removeClass('gt-50');
} else {
$(this).find('.progress-circle').addClass('gt-50');
}
$(tween.elem).find('.fill').css({
transform: 'rotate(' + tween.end + 'deg)'
});
}
};
});
$.fn.progress = function (v) {
return this.each(function () {
var t = parseInt(v / 100 * 360),
timer = null,
$this = $(this);
if (t < 180) {
$this.find('.progress-circle').removeClass('gt-50');
} else {
$this.find('.progress-circle').addClass('gt-50');
}
$this.find('.fill').css({
transform: 'rotate(' + t + 'deg)'
});
});
};
var xxx = 0;
function QuickTip(el, options) {
var $el = $(el),
uniId = $el.attr('data-id') || LP.uniqueId();
options = $.extend({
event: 'hover',
autoClose: true,
single: true,
closeInterval: 1000,
arrowOffset: null,
tipClass: ''
}, options, $el.data());
$el.attr('data-id', uniId);
var content = $el.attr('data-content-tip') || $el.html(),
$tip = $('' + content + '
'),
t = null,
closeInterval = 0,
useData = false,
arrowOffset = options.arrowOffset === 'el' ? $el.outerWidth() / 2 : 8,
$content = $('#__' + uniId);
if ($content.length === 0) {
$(document.body).append($('').attr('id', '__' + uniId).html(content).css('display', 'none'))
}
content = $content.html();
$tip.addClass(options.tipClass);
$el.data('content-tip', content);
if ($el.attr('data-content-tip')) {
//$el.removeAttr('data-content-tip');
useData = true;
}
closeInterval = options.closeInterval;
if (options.autoClose === false) {
$tip.append('');
$tip.on('click', '.close', function () {
close();
})
}
function show() {
if (t) {
clearTimeout(t);
return;
}
if (options.single) {
$('.learn-press-tip').not($el).QuickTip('close');
}
$tip.appendTo(document.body);
var pos = $el.offset();
$tip.css({
top: pos.top - $tip.outerHeight() - 8,
left: pos.left - $tip.outerWidth() / 2 + arrowOffset
});
}
function hide() {
t && clearTimeout(t);
t = setTimeout(function () {
$tip.detach();
t = null;
}, closeInterval);
}
function close() {
closeInterval = 0;
hide();
closeInterval = options.closeInterval;
}
function open() {
show();
}
if (!useData) {
$el.html('');
}
if (options.event === 'click') {
$el.on('click', function (e) {
e.stopPropagation();
show();
})
}
$(document).on('learn-press/close-all-quick-tip', function () {
close();
});
$el.hover(
function (e) {
e.stopPropagation();
if (options.event !== 'click') {
show();
}
},
function (e) {
e.stopPropagation();
if (options.autoClose) {
hide();
}
}
).addClass('ready');
return {
close: close,
open: open
}
}
$.fn.QuickTip = function (options) {
return $.each(this, function () {
var $tip = $(this).data('quick-tip');
if (!$tip) {
$tip = new QuickTip(this, options);
$(this).data('quick-tip', $tip);
}
if ($.type(options) === 'string') {
$tip[options] && $tip[options].apply($tip);
}
})
}
function __initSubtabs() {
$('.learn-press-subtabs').each(function () {
var $tabContainer = $(this),
$tabs = $tabContainer.find('a'),
current = null;
$tabs.click(function (e) {
var $tab = $(this),
$contentID = $tab.attr('href');
$tab.parent().addClass('current').siblings().removeClass('current');
current = $($contentID).addClass('current');
current.siblings().removeClass('current');
//LP.setUrl($contentID);
e.preventDefault();
}).filter(function () {
return $(this).attr('href') === window.location.hash;
}).trigger('click');
if (!current) {
$tabs.first().trigger('click');
}
});
}
$(document).ready(function () {
if (typeof $.alerts !== 'undefined') {
$.alerts.overlayColor = '#000';
$.alerts.overlayOpacity = 0.5;
$.alerts.okButton = lpGlobalSettings.localize.button_ok;
$.alerts.cancelButton = lpGlobalSettings.localize.button_cancel;
}
$('.learn-press-message.fixed').each(function () {
var $el = $(this),
options = $el.data();
(function ($el, options) {
if (options.delayIn) {
setTimeout(function () {
$el.show().hide().fadeIn();
}, options.delayIn);
}
if (options.delayOut) {
setTimeout(function () {
$el.fadeOut();
}, options.delayOut + (options.delayIn || 0));
}
})($el, options);
});
$(document).on('input', '#meta-box-tab-course_payment', function (e) {
var _self = $(this),
_price = $('#_lp_price'),
_sale_price = $('#_lp_sale_price'),
_target = $(e.target).attr('id');
_self.find('#field-_lp_price div, #field-_lp_sale_price div').remove('.learn-press-tip-floating');
if (parseInt(_sale_price.val()) >= parseInt(_price.val())) {
if (_target === '_lp_price') {
_price.parent('.rwmb-input').append('' + lpAdminCourseEditorSettings.i18n.notice_price + '
');
} else if (_target === '_lp_sale_price') {
_sale_price.parent('.rwmb-input').append('' + lpAdminCourseEditorSettings.i18n.notice_sale_price + '
');
}
}
});
$(document).on('change', '#_lp_sale_start', function (e) {
var _sale_start_date = $(this),
_sale_end_date = $('#_lp_sale_end'),
_start_date = Date.parse(_sale_start_date.val()),
_end_date = Date.parse(_sale_end_date.val()),
_parent_start = _sale_start_date.parent('.rwmb-input'),
_parent_end = _sale_end_date.parent('.rwmb-input');
if (!_start_date) {
_parent_start.append('' + lpAdminCourseEditorSettings.i18n.notice_invalid_date + '
')
}
$('#field-_lp_sale_start div, #field-_lp_sale_end div').remove('.learn-press-tip-floating');
if (_start_date < _end_date) {
_parent_start.append('' + lpAdminCourseEditorSettings.i18n.notice_sale_start_date + '
')
}
});
$(document).on('change', '#_lp_sale_end', function (e) {
var _sale_end_date = $(this),
_sale_start_date = $('#_lp_sale_start'),
_start_date = Date.parse(_sale_start_date.val()),
_end_date = Date.parse(_sale_end_date.val()),
_parent_start = _sale_start_date.parent('.rwmb-input'),
_parent_end = _sale_end_date.parent('.rwmb-input');
if (!_end_date) {
_parent_end.append('' + lpAdminCourseEditorSettings.i18n.notice_invalid_date + '
')
}
$('#field-_lp_sale_start div, #field-_lp_sale_end div').remove('.learn-press-tip-floating');
if (_start_date < _end_date) {
_parent_end.append('' + lpAdminCourseEditorSettings.i18n.notice_sale_end_date + '
')
}
});
$('body')
.on('click', '.learn-press-nav-tabs li a', function (e) {
e.preventDefault();
var $tab = $(this), url = '';
$tab.closest('li').addClass('active').siblings().removeClass('active');
$($tab.attr('data-tab')).addClass('active').siblings().removeClass('active');
$(document).trigger('learn-press/nav-tabs/clicked', $tab);
});
setTimeout(function () {
$('.learn-press-nav-tabs li.active:not(.default) a').trigger('click');
}, 300);
$('body.course-item-popup').parent().css('overflow', 'hidden');
///
(function () {
var timer = null,
callback = function () {
$('.auto-check-lines').checkLines(function (r) {
if (r > 1) {
$(this).removeClass('single-lines');
} else {
$(this).addClass('single-lines');
}
$(this).attr('rows', r);
});
};
$(window).on('resize.check-lines', function () {
if (timer) {
timer && clearTimeout(timer);
timer = setTimeout(callback, 300);
} else {
callback();
}
});
})();
// $(document).on('click', '[data-block-content="yes"]', function () {
// LP.blockContent();
// });
$('.learn-press-tooltip, .lp-passing-conditional').LP_Tooltip({offset: [24, 24]});
$('.learn-press-icon').LP_Tooltip({offset: [30, 30]});
$('.learn-press-message[data-autoclose]').each(function () {
var $el = $(this), delay = parseInt($el.data('autoclose'));
if (delay) {
setTimeout(function ($el) {
$el.fadeOut();
}, delay, $el);
}
});
$(document).on('click', function () {
$(document).trigger('learn-press/close-all-quick-tip')
})
});
LearnPress = LP;
})(jQuery);