Managed WordPress on Hetzner NVMe — M-Pesa friendly.
Order
var orderbutton = function (){
this.data_product_id = null;
this.backgroundElem = null;
this.iframeElem = null;
this.loaderImageElem = null;
};
orderbutton.prototype.setDataProductId = function (product_id){
this.data_product_id = product_id;
};
orderbutton.prototype.getDataProductId = function (){
return this.data_product_id;
};
orderbutton.prototype.hideElements = function(){
this.backgroundElem.hide();
this.iframeElem.hide();
};
orderbutton.prototype.attachEvents = function() {
var _this = this;
$(document).keyup(function(e) { // esc
if (e.keyCode == 27) {
_this.hideElements();
}
});
var bodyElem = $('body');
bodyElem.off('click', '.order-button');
bodyElem.on('click', '.order-button', function (event) {
event.preventDefault();
_this.setDataProductId($(this).data('product'))
_this.popup();
});
// Create the event.
var event = document.createEvent('Event');
event.initEvent('OrderButtonEventsReady', true, true);
// target can be any Element or other EventTarget.
document.dispatchEvent(event);
};
orderbutton.prototype.srclink = function(){
var params = [
{ name: "theme_color", value: "green" },
{ name: "loader", value: "1" }
];
var product_id = this.getDataProductId();
if (product_id)
params.push({'name' : 'order', 'value' : product_id});
return "https://hosting.meldnest.com/billing/order?"+jQuery.param(params);
};
orderbutton.prototype.createIframe = function (){
this.iframeElem = $('').appendTo('body');
this.iframeElem .css({
'background-color': 'transparent',
'border-radius': '0px',
'-webkit-border-radius': '0px',
'-moz-border-radius': '0px',
//'box-shadow': '0 0 20px 0 #222',
//'-webkit-box-shadow': '0 0 20px 0 #222',
//'-moz-box-shadow': '0 0 20px 0 #222',
'display': 'none',
'margin': '0 auto',
'padding': '0px',
'position': 'absolute',
'width': "600px",
'z-index': '1000'
});
if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(navigator.userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0, 4))){
this.iframeElem .css({ 'width': ""});
}
var _this = this;
this.iframeElem.load(this.srclink(), function() {
_this.loaderImageElem.hide();
this.style.height = '80%';
var pWidth = jQuery(window).width();
var pTop = jQuery(window).scrollTop();
var eWidth = jQuery(this).width();
jQuery(this).css('top', pTop + 100 + 'px');
jQuery(this).css('left', parseInt((pWidth / 2) - (eWidth / 2)) + 'px');
$(this).show();
});
$(window).on('resize',function(){
var pWidth = jQuery(window).width();
var pTop = jQuery(window).scrollTop();
var eWidth = _this.iframeElem.width();
_this.iframeElem.css('top', pTop + 100 + 'px');
_this.iframeElem.css('left', parseInt((pWidth / 2) - (eWidth / 2)) + 'px');
});
};
orderbutton.prototype.createBackground = function (){
var _this = this;
this.backgroundElem = $('', {
id: 'popup-background'
}).appendTo('body');
this.backgroundElem.css({
'display': 'none',
'position': 'fixed',
'top': '0',
'left': '0',
'width': '100%',
'height': '100%',
'background-color': 'black',
'opacity': '0.5',
'-webkit-opacity': '0.5',
'-moz-opacity': '0.5',
'filter': 'alpha(opacity=50)',
'z-index': '1000'
}).on('click', function(){
_this.hideElements();
});
this.backgroundElem.show();
};
orderbutton.prototype.createLoaderImage = function(){
this.loaderImageElem = $('').attr({
'src': "https://hosting.meldnest.com/billing/modules/Orderbutton/assets/img/assets/loaders/loader8.gif",
'id' : 'loader-image'
}).css({
'display': 'block',
'margin-left': 'auto',
'margin-right': 'auto',
'position': 'relative',
'top': '50%'
}).appendTo(this.backgroundElem).show();
};
orderbutton.prototype.popup = function (){
if (this.backgroundElem && this.iframeElem){
if (this.iframeElem.attr('src') != this.srclink()){
this.iframeElem.attr('src', this.srclink());
this.loaderImageElem.show();
}
else{
this.iframeElem.show();
}
this.backgroundElem.show();
}else{
this.createBackground();
this.createLoaderImage();
this.createIframe();
}
};
(function(funcName, baseObj) {
// The public function name defaults to window.docReady
// but you can pass in your own object and own function name and those will be used
// if you want to put them in a different namespace
funcName = funcName || "docReady";
baseObj = baseObj || window;
var readyList = [];
var readyFired = false;
var readyEventHandlersInstalled = false;
// call this when the document is ready
// this function protects itself against being called more than once
function ready() {
if (!readyFired) {
// this must be set to true before we start calling callbacks
readyFired = true;
for (var i = 0; i < readyList.length; i++) {
// if a callback here happens to add new ready handlers,
// the docReady() function will see that it already fired
// and will schedule the callback to run right after
// this event loop finishes so all handlers will still execute
// in order and no new ones will be added to the readyList
// while we are processing the list
readyList[i].fn.call(window, readyList[i].ctx);
}
// allow any closures held by these functions to free
readyList = [];
}
}
function readyStateChange() {
if ( document.readyState === "complete" ) {
ready();
}
}
// This is the one public interface
// docReady(fn, context);
// the context argument is optional - if present, it will be passed
// as an argument to the callback
baseObj[funcName] = function(callback, context) {
// if ready has already fired, then just schedule the callback
// to fire asynchronously, but right away
if (readyFired) {
setTimeout(function() {callback(context);}, 1);
return;
} else {
// add the function and context to the list
readyList.push({fn: callback, ctx: context});
}
// if document already ready to go, schedule the ready function to run
if (document.readyState === "complete") {
setTimeout(ready, 1);
} else if (!readyEventHandlersInstalled) {
// otherwise if we don't have event handlers installed, install them
if (document.addEventListener) {
// first choice is DOMContentLoaded event
document.addEventListener("DOMContentLoaded", ready, false);
// backup is window load event
window.addEventListener("load", ready, false);
} else {
// must be IE
document.attachEvent("onreadystatechange", readyStateChange);
window.attachEvent("onload", ready);
}
readyEventHandlersInstalled = true;
}
}
})("docReady", window);
docReady(function() {
ob = new orderbutton();
ob.attachEvents();
});