(function(window, config)
{
"use strict";
var
script = window.document.getElementById('kf5-provide-supportBox'),
parts = script.src.split('//'),
host = parts.length > 1 ? parts[0] + '//' + parts[1].split('/')[0] : '',
kf5Domain = script.getAttribute('kf5-domain'),
supportboxConfigURL = '//' + kf5Domain + '/supportbox/buttonconfig',
_config = {
btn_name : '帮助按钮',
facade : '1',
color : '#7A88FF',
position : 'right',
iframeURL : '//' + kf5Domain + '/supportbox/index',
btn_icon : '//assets.kf5.com/supportbox/images/icon2.png',
styleURL : '//assets.kf5.com/supportbox/css/btn.css',
template : '
{{title}} '
};
function KF5SupportBox(config)
{
this.config = config || {};
this.init();
}
window.KF5SupportBox = KF5SupportBox;
KF5SupportBox.prototype = {
el: null,
getElement: function(selector)
{
return window.document.getElementById(selector.replace('#', ''));
},
getOpt: function(key)
{
if(this.config.hasOwnProperty(key))
{
return this.config[key];
}
else
{
return _config[key];
}
},
init: function()
{
this._prepareStyle();
return this;
},
initElements: function()
{
this._prepareElement();
this.append();
this._bindEvents();
},
append: function()
{
window.document.body.appendChild(this.el);
return this;
},
_prepareStyle: function()
{
var link = window.document.createElement('link');
link.rel = 'styleSheet';
link.type = 'text/css';
link.href = this.getOpt('styleURL');
var self = this;
link.onload = function()
{
self.initElements();
link.onload = null;
};
window.document.body.appendChild(link);
return this;
},
_prepareElement: function()
{
var className = 'kf5-support-123456789';
// 位置
if(this.getOpt('position') === 'left')
{
className += ' kf5-left';
}
else
{
className += ' kf5-right'
}
// 外观
className += ' kf5-style' + (parseInt(this.getOpt('facade')) || 1);
// 设备
if(this.getOpt('is_mobile'))
{
className += ' kf5-mobile';
}
this.el = window.document.createElement('div');
this.el.setAttribute('class', className);
this.el.setAttribute('id', 'kf5-support-123456789');
this.el.innerHTML = this.getOpt('template')
.replace('{{title}}', this.getOpt('btn_name') || '获取帮助')
.replace('{{btn_icon}}', this.getOpt('btn_icon'))
.replace('{{bg_color}}', this.getOpt('color') ? 'background:' + this.getOpt('color') : '');
return this;
},
_bindEvents: function()
{
var self = this;
this.getElement('#kw-tab').onclick = function()
{
self.open();
};
this.getElement('#kw-close').onclick = function()
{
self.close();
};
this.getElement('#kw-widget-iframe').onload = function()
{
// setTimeout(function()
// {
self.getElement('#kw-loading').style.display = 'none';
// }, 2000);
};
if(cookie('kf5-supportBox-autoOpen'))
{
this.open();
}
return this;
},
loadIframe: function()
{
var iframe = this.getElement('#kw-widget-iframe');
if(!iframe.getAttribute('src'))
{
iframe.setAttribute('src', this.getOpt('iframeURL'));
}
return this;
},
// resizeIframe: function(data)
// {
// var elem = this.getElement('#kw-block');
// if(elem)
// {
// elem.style.height = parseFloat(data) + 'px';
// }
// },
open: function(e)
{
if(!this.isOpened)
{
var self = this;
this.loadIframe();
slideDown(this.getElement('#kw-tab'), {duration: 200, easing: 'swing'});
slideUp(self.getElement('#kw-block'), {duration: 200, easing: 'swing'});
cookie('kf5-supportBox-autoOpen', 1, {expires: 3 / 24, path: '/'});
this.isOpened = true;
}
},
close: function(e)
{
// slideDown(this.getElement('#kw-block'), 200);
// showElement(this.getElement('#kw-tab'));
var self = this;
slideDown(
this.getElement('#kw-block'),
{
duration: 200,
easing: 'swing',
callback: function()
{
slideUp(
self.getElement('#kw-tab'),
{
duration: 200,
easing: 'swing'
}
);
}
}
);
cookie('kf5-supportBox-autoOpen', null, {path: '/'});
this.isOpened = false;
}
};
var supportbox;
function onload()
{
// if(supportbox)
// {
// return;
// }
var script = window.document.createElement('script'),
configURL = supportboxConfigURL;
embed(configURL, function(win)
{
if(win.KF5_SUPPORTBOX_BUTTON && win.KF5_SUPPORTBOX_BUTTON.show)
{
supportbox = new KF5SupportBox(win.KF5_SUPPORTBOX_BUTTON);
// 延时自动加载iframe
// setTimeout(function()
// {
// supportbox.loadIframe();
// }, 30 * 1000);
}
});
}
document.addEventListener('page:load', onload, false);
window.addEventListener('load', onload, false);
if(!window.initializeKF5SupportBox)
{
// 暴露初始化方法,以解决特殊情况下load事件无法触发
window.initializeKF5SupportBox = onload;
}
// allow cross origin operation
window.addEventListener('message', function(e)
{
var context, cmd, data;
if(e.data)
{
context = e.data.match(/^([^ ]+)(?: +(.*))?/);
cmd = context[1];
data = context[2];
}
if(cmd === 'CMD::showSupportbox')
{
if(supportbox)
{
supportbox.open();
}
}
else if(cmd === 'CMD::hideSupportbox')
{
if(supportbox)
{
supportbox.close();
}
}
else if(cmd === 'CMD::resizeIframe')
{
// supportbox.resizeIframe(data);
}
});
function embed(mainJS, output)
{
var domain, doc, iframeWindow, iframeDoc,
iframe = window.document.createElement("iframe");
iframe.src = "javascript:false",
iframe.title = "",
iframe.role = "presentation",
(iframe.frameElement || iframe).style.cssText = "display: none",
window.document.body.appendChild(iframe);
iframeWindow = iframe.contentWindow,
iframeDoc = iframeWindow.document;
try {
doc = iframeDoc
} catch (c) {
domain = window.document.domain,
iframe.src = 'javascript:var doc=document.open();doc.domain="' + domain + '";void(0);',
doc = iframeDoc
}
doc.open().start = function() {
if(output)
{
if(typeof output === 'object')
{
output.iframeWindow = iframeWindow;
}
else if(typeof output === 'function')
{
output(iframeWindow);
}
}
},
doc.write(''),
doc.write(''),
doc.close();
}
function getStyle(el, style)
{
var
pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source,
rmargin = /^margin/,
rposition = /^(top|right|bottom|left)$/,
rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ),
getStyles, curCSS;
if ( window.getComputedStyle ) {
getStyles = function( elem ) {
return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
};
curCSS = function( elem, name, computed ) {
var width, minWidth, maxWidth, ret,
style = elem.style;
computed = computed || getStyles( elem );
// getPropertyValue is only needed for .css('filter') in IE9, see #12537
ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
if ( computed ) {
// if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
// ret = jQuery.style( elem, name );
// }
// A tribute to the "awesome hack by Dean Edwards"
// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
// Remember the original values
width = style.width;
minWidth = style.minWidth;
maxWidth = style.maxWidth;
// Put in the new values to get a computed value out
style.minWidth = style.maxWidth = style.width = ret;
ret = computed.width;
// Revert the changed values
style.width = width;
style.minWidth = minWidth;
style.maxWidth = maxWidth;
}
}
// Support: IE
// IE returns zIndex value as an integer.
return ret === undefined ?
ret :
ret + "";
};
} else if ( document.documentElement.currentStyle ) {
getStyles = function( elem ) {
return elem.currentStyle;
};
curCSS = function( elem, name, computed ) {
var left, rs, rsLeft, ret,
style = elem.style;
computed = computed || getStyles( elem );
ret = computed ? computed[ name ] : undefined;
// Avoid setting ret to empty string here
// so we don't default to auto
if ( ret == null && style && style[ name ] ) {
ret = style[ name ];
}
// From the awesome hack by Dean Edwards
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
// If we're not dealing with a regular pixel number
// but a number that has a weird ending, we need to convert it to pixels
// but not position css attributes, as those are proportional to the parent element instead
// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
// Remember the original values
left = style.left;
rs = elem.runtimeStyle;
rsLeft = rs && rs.left;
// Put in the new values to get a computed value out
if ( rsLeft ) {
rs.left = elem.currentStyle.left;
}
style.left = name === "fontSize" ? "1em" : ret;
ret = style.pixelLeft + "px";
// Revert the changed values
style.left = left;
if ( rsLeft ) {
rs.left = rsLeft;
}
}
// Support: IE
// IE returns zIndex value as an integer.
return ret === undefined ?
ret :
ret + "" || "auto";
};
}
return curCSS && curCSS(el, style);
}
var easing = {
swing: function(p)
{
return 0.5 - Math.cos( p * Math.PI ) / 2;
},
linear: function(p)
{
return p;
}
};
function slideUp(elem, options)
{
var originalStyle = elem.getAttribute('style');
elem.style.display = 'block';
var originalHeight = parseInt(getStyle(elem, 'height'));
elem.style.height = '0px';
var duration = options.duration || 500;
var tStart = Date.now(),
percent = 0,
timer = setInterval(function()
{
percent = (Date.now() - tStart) / duration;
percent = percent > 1 ? 1 : percent;
elem.style.height = (easing[options.easing || 'swing'](percent)
* originalHeight) + 'px';
if(percent >= 1)
{
clearInterval(timer);
timer = null;
if(originalStyle)
{
elem.setAttribute('style', originalStyle);
}
else
{
elem.removeAttribute('style');
}
elem.style.display = 'block';
options.callback && options.callback.call(elem);
}
}, 1000 / 60);
}
function slideDown(elem, options)
{
var originalStyle = elem.getAttribute('style');
elem.style.display = 'block';
var originalHeight = parseInt(getStyle(elem, 'height'));
var duration = options.duration || 500;
var tStart = Date.now(),
percent = 0,
timer = setInterval(function()
{
percent = (Date.now() - tStart) / duration;
percent = percent > 1 ? 1 : percent;
elem.style.height = (easing[options.easing || 'swing'](1 - percent)
* originalHeight) + 'px';
if(percent >= 1)
{
clearInterval(timer);
timer = null;
if(originalStyle)
{
elem.setAttribute('style', originalStyle);
}
else
{
elem.removeAttribute('style');
}
elem.style.display = 'none';
options.callback && options.callback.call(elem);
}
}, 1000 / 60);
}
function hideElement(el)
{
el.style.display = 'none';
}
function showElement(el)
{
el.style.display = 'block';
}
function cookie(name, value, options)
{
if (typeof value != 'undefined')
{ // name and value given, set cookie
options = options || {};
if (value === null) {
value = '';
options.expires = -1;
}
var expires = '';
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
var date;
if (typeof options.expires == 'number') {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
} else {
date = options.expires;
}
expires = '; expires=' + date.toUTCString();
}
var path = options.path ? '; path=' + (options.path) : '';
var domain = options.domain ? '; domain=' + (options.domain) : '';
var secure = options.secure ? '; secure' : '';
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
} else {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i].replace(/^\s+|\s+$/g, '');
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
}
function isPC()
{
var userAgentInfo = navigator.userAgent;
var Agents = ['Android', 'iPhone',
'SymbianOS', 'Windows Phone',
'iPad', 'iPod'];
var flag = true;
for(var i = 0; i < Agents.length; i++)
{
if(userAgentInfo.indexOf(Agents[i]) !== -1)
{
flag = false;
break;
}
}
return flag;
}
})(window);