var IS_CLIENT_SIDE = typeof window !== 'undefined'; var IS_ANDROID_WEBVIEW = Boolean(IS_CLIENT_SIDE && window.AndroidBridge); var IS_IOS_WEBVIEW = Boolean( IS_CLIENT_SIDE && window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.VKWebAppClose ); var IS_WEB = IS_CLIENT_SIDE && !IS_ANDROID_WEBVIEW && !IS_IOS_WEBVIEW; var androidBridge = IS_CLIENT_SIDE ? window.AndroidBridge : undefined; var iosBridge = IS_IOS_WEBVIEW ? window.webkit.messageHandlers : undefined; function _bridgeSend(method, props) { if (androidBridge && androidBridge[method]) { androidBridge[method](JSON.stringify(props)); } else if (iosBridge && iosBridge[method] && typeof iosBridge[method].postMessage === 'function') { iosBridge[method].postMessage(props); } } function _bridgeSupports(method) { if (IS_ANDROID_WEBVIEW) { return androidBridge && typeof androidBridge[method] === 'function'; } else if (IS_IOS_WEBVIEW) { return iosBridge && iosBridge[method] && typeof iosBridge[method].postMessage === 'function'; } return false; } var IS_BRIDGE_AVAILABLE = !IS_WEB && _bridgeSupports('VKWebAppConversionHit'); (function(w) { if (w.fastXDM) return; var handlers = {}; var proxyToServer = {}; var onEnvLoad = []; var env = {}; // Key generation function genKey() { var key = ''; for (var i = 0; i < 5; i++) { key += Math.ceil(Math.random() * 15).toString(16); } return key; } function waitFor(obj, prop, func, self, count) { if (obj[prop]) { func.apply(self); } else { count = count || 0; if (count < 1000) { setTimeout(function() { waitFor(obj, prop, func, self, count + 1); }, 0); } } } function attachScript(url) { setTimeout(function() { var newScript = document.createElement('script'); newScript.type = 'text/javascript'; newScript.src = url || w.fastXDM.helperUrl; waitFor(document, 'body', function() { document.getElementsByTagName('HEAD')[0].appendChild(newScript); }); }, 0); } function walkVar(value, clean) { var newValue; switch (typeof value) { case 'string': if (clean) { newValue = value.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, '''); } else { newValue = value.replace(/'/g, '\'').replace(/"/g, '"').replace(/>/g, '>').replace(/</g, '<').replace(/&/g, '&'); } break; case 'object': if (Object.prototype.toString.apply(value) === '[object Array]') { newValue = []; for (var i = 0, len = value.length; i < len; i++) { newValue[i] = walkVar(value[i], clean); } } else { newValue = {}; for (var k in value) { if (Object.hasOwnProperty.call(value, k)) { newValue[k] = walkVar(value[k], clean); } } } break; default: newValue = value; break; } return newValue; } // Env functions function getEnv(callback, self) { if (env.loaded) { callback.apply(self, [env]); } else { onEnvLoad.push([self, callback]); } } function envLoaded() { env.loaded = true; for (var i = 0, len = onEnvLoad.length; i < len; i++) { onEnvLoad[i][1].apply(onEnvLoad[i][0], [env]); } } function applyMethod(strData, self, origin) { getEnv(function(env) { var data = env.json.parse(strData); var method = data[0]; if (method) { if ( env.protocol === 'p' && self.options.sameOrigin && origin !== w.origin && !self.isUnsafeMethod(method) ) { throw Error('Insecure method call.'); } if (!data[1]) data[1] = []; for (var i = 0, len = data[1].length; i < len; i++) { if (data[1][i] && data[1][i]._func) { var funcNum = data[1][i]._func; data[1][i] = function() { var args = Array.prototype.slice.call(arguments); args.unshift('_func' + funcNum); self.callMethod.apply(self, args); } } else if (self.options.safe) { data[1][i] = walkVar(data[1][i], true); } } setTimeout(function() { if (!self.methods[method]) { throw Error('fastXDM: Method ' + method + ' is undefined'); } self.methods[method].apply(self, data[1]); }, 0); } }); } function extend(obj1, obj2) { for (var i in obj2) { if (obj1[i] && typeof(obj1[i]) === 'object') { extend(obj1[i], obj2[i]) } else { obj1[i] = obj2[i]; } } } // XDM object w.fastXDM = { _id: 0, helperUrl: 'https://vk.com/js/api/xdmHelper.js', Server: function(methods, filter, options) { this.methods = methods || {}; this.filter = filter; this.options = options || {}; this.id = w.fastXDM._id++; this.key = genKey(); this.frameName = 'fXD' + this.key; this.server = true; this.methods['%init%'] = this.methods.__fxdm_i = function() { getEnv(function(env) { for (var method in this.methods) { if (this.methods[method] instanceof w.fastXDM.Server) { var proxyFromServer = this; var proxyToServer = this.methods[method]; if (env.protocol === 'p') { env.send(proxyFromServer, env.json.stringify(['%proxy%', [method, proxyToServer.key]])); } this.methods[method] = function() { this.callMethod.apply(this, arguments); }.bind(proxyToServer) } } }, this); w.fastXDM.run(this.id); if (this.methods.onInit) { this.methods.onInit(); } }; handlers[this.key] = [applyMethod, this]; }, Client: function(methods, options) { this.methods = methods || {}; this.options = options || {}; this.id = w.fastXDM._id++; this.client = true; w.fastXDM.run(this.id); if (window.name.indexOf('fXD') === 0) { this.key = window.name.substr(3); } else { throw Error('Wrong window.name property.'); } this.caller = window.parent; if (!proxyToServer[this.key]) { proxyToServer[this.key] = {}; } this.methods['%proxy%'] = function(method, key) { if (method && key && this.caller.frames['fXD' + key]) { proxyToServer[this.key][method] = { key: key, frame: { contentWindow: this.caller.frames['fXD' + key] } }; } }.bind(this); handlers[this.key] = [applyMethod, this]; w.fastXDM.on('helper', function() { w.fastXDM.onClientStart(this); }, this); getEnv(function(env) { env.send(this, env.json.stringify(['%init%'])); var methods = this.methods; setTimeout(function() { if (methods.onInit) { methods.onInit(); } }, 0); }, this); }, onMessage: function(e) { var data = e.data; if (!data) { return false; } if (typeof data !== 'string' && !(data instanceof String)) { return false; } var key = data.substr(0, 5); if (handlers[key]) { var self = handlers[key][1]; if (self && (!self.filter || self.filter(e.origin))) { handlers[key][0](data.substr(6), self, e.origin); } } }, setJSON: function(json) { env.json = json; }, getJSON: function(callback) { if (!callback) { return env.json; } getEnv(function(env) { callback(env.json); }); }, getProxyToServer: function(key, method) { return proxyToServer[key] && proxyToServer[key][method]; }, setEnv: function(exEnv) { for (var i in exEnv) { env[i] = exEnv[i]; } envLoaded(); }, _q: {}, on: function(key, act, self) { if (!this._q[key]) this._q[key] = []; if (this._q[key] == -1) { act.apply(self); } else { this._q[key].push([act, self]); } }, run: function(key) { var len = (this._q[key] || []).length; for (var i = 0; i < len; i++) { this._q[key][i][0].apply(this._q[key][i][1]); } this._q[key] = -1; }, waitFor: waitFor } w.fastXDM.Server.prototype.start = function(obj, count) { if (obj.contentWindow) { this.caller = obj.contentWindow; this.frame = obj; w.fastXDM.on('helper', function() { w.fastXDM.onServerStart(this); }, this); } else { // Opera old versions var self = this; count = count || 0; if (count < 50) { setTimeout(function() { self.start.apply(self, [obj, count + 1]); }, 100); } } } w.fastXDM.Server.prototype.destroy = function() { delete handlers[this.key]; } w.fastXDM.Server.prototype.append = function(obj, options, attrs) { var div = document.createElement('DIV'); div.innerHTML = ''; var frame = div.firstChild; var self = this; setTimeout(function() { frame.frameBorder = '0'; if (options) extend(frame, options); obj.insertBefore(frame, obj.firstChild); self.start(frame); }, 0); return frame; } w.fastXDM.Client.prototype.callMethod = w.fastXDM.Server.prototype.callMethod = function() { var args = Array.prototype.slice.call(arguments); var method = args.shift(); for (var i = 0, len = args.length; i < len; i++) { if (typeof(args[i]) === 'function') { this.funcsCount = (this.funcsCount || 0) + 1; var func = args[i]; var funcName = '_func' + this.funcsCount; this.methods[funcName] = function() { func.apply(this, arguments); delete this.methods[funcName]; } args[i] = {_func: this.funcsCount}; } else if (this.options.safe) { args[i] = walkVar(args[i], false); } } waitFor(this, 'caller', function() { w.fastXDM.on(this.id, function() { getEnv(function(env) { var xdm = this; var proxyToServer = w.fastXDM.getProxyToServer(this.key, method); if (proxyToServer) { xdm = proxyToServer; method = args.shift(); } env.send(xdm, env.json.stringify([method, args])); }, this); }, this); }, this); } w.fastXDM.Client.prototype.isUnsafeMethod = w.fastXDM.Server.prototype.isUnsafeMethod = function(method) { return ~['%proxy%', '%init%'].indexOf(method) || this.options.unsafeMethods && ~this.options.unsafeMethods.indexOf(method); } if (w.JSON && typeof(w.JSON) === 'object' && w.JSON.parse && w.JSON.stringify && w.JSON.stringify({a:[1,2,3]}).replace(/ /g, '') === '{"a":[1,2,3]}') { env.json = {parse: w.JSON.parse, stringify: w.JSON.stringify}; } else { w.fastXDM._needJSON = true; } // PostMessage cover if (w.postMessage) { env.protocol = 'p'; env.send = function(xdm, strData) { var win = (xdm.frame ? xdm.frame.contentWindow : xdm.caller); if (win) { try { win.postMessage(xdm.key + ':' + strData, "*"); } catch(e) { window.postMessage.call(win, xdm.key + ':' + strData, "*"); } } } if (w.addEventListener) { w.addEventListener("message", w.fastXDM.onMessage, false); } else { w.attachEvent("onmessage", w.fastXDM.onMessage); } if (w.fastXDM._needJSON) { w.fastXDM._onlyJSON = true; attachScript(); } else { envLoaded(); } } else { attachScript(); } })(window); if (!window.VK) window.VK = {}; /* * Based on JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Copyright (C) Paul Johnston 1999 - 2009 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License */ if(!VK.MD5){VK.MD5=function(n){var j=function(o,r){var q=(o&65535)+(r&65535),p=(o>>16)+(r>>16)+(q>>16);return(p<<16)|(q&65535)},g=function(o,p){return(o<
>>(32-p))},k=function(w,r,p,o,v,u){return j(g(j(j(r,w),j(o,u)),v),p)},a=function(q,p,w,v,o,u,r){return k((p&w)|((~p)&v),q,p,o,u,r)},h=function(q,p,w,v,o,u,r){return k((p&v)|(w&(~v)),q,p,o,u,r)},c=function(q,p,w,v,o,u,r){return k(p^w^v,q,p,o,u,r)},m=function(q,p,w,v,o,u,r){return k(w^(p|(~v)),q,p,o,u,r)},b=function(A,u){var z=1732584193,y=-271733879,w=-1732584194,v=271733878,r,q,p,o;A[u>>5]|=128<<((u)%32);A[(((u+64)>>>9)<<4)+14]=u;for(var t=0,s=A.length;t>>6)&31),128|(o&63))}else{if(o<=65535){q+=String.fromCharCode(224|((o>>>12)&15),128|((o>>>6)&63),128|(o&63))}else{if(o<=2097151){q+=String.fromCharCode(240|((o>>>18)&7),128|((o>>>12)&63),128|((o>>>6)&63),128|(o&63))}}}}}return q},e=function(p){var o=Array(p.length>>2),r,q;for(r=0,q=o.length;r>5]|=(p.charCodeAt(r/8)&255)<<(r%32)}return o},l=function(p){var o="";for(var r=0,q=p.length*32;r
>5]>>>(r%32))&255)}return o},d=function(o){return l(b(e(o),o.length*8))},i=function(q){var t="0123456789abcdef",p="",o;for(var s=0,r=q.length;s
'
);
el.innerHTML = html;
el.style.width = el.childNodes[0].offsetWidth + 'px';
},
_change: function(state, index) {
var row = document.getElementById('openapi_UI_' + index).rows[0];
var elems = [row.cells[0].firstChild.firstChild, row.cells[2].firstChild.firstChild];
for (var i = 0; i < 2; ++i) {
var elem = elems[i];
if (state === 0) {
elem.style.backgroundColor = '#6D8DB1';
elem.style.borderTopColor = '#7E9CBC';
elem.style.borderLeftColor = elem.style.borderRightColor = elem.style.borderBottomColor = '#5C82AB';
} else if (state == 1) {
elem.style.backgroundColor = '#7693B6';
elem.style.borderTopColor = '#88A4C4';
elem.style.borderLeftColor = elem.style.borderRightColor = elem.style.borderBottomColor = '#6088B4';
} else if (state == 2) {
elem.style.backgroundColor = '#6688AD';
elem.style.borderBottomColor = '#7495B8';
elem.style.borderLeftColor = elem.style.borderRightColor = elem.style.borderTopColor = '#51779F';
}
}
if (state === 0 || state == 2) {
row.cells[2].firstChild.style.backgroundPosition = '0px -42px';
} else if (state == 1) {
row.cells[2].firstChild.style.backgroundPosition = '0px -63px';
}
}
};
}
if (!VK.XDM) {
VK.XDM = {
remote: null,
init: function() {
if (this.remote) return false;
var url = VK._domain.api + '/' + VK._path.proxy;
this.remote = new fastXDM.Server({
onInit: function() {
VK.xdReady = true;
VK.Observer.publish('xdm.init');
}
});
this.remote.append(document.getElementById(VK._rootId), {
src: url
});
},
xdHandler: function(code) {
try {
eval('VK.' + code);
} catch(e) {}
}
};
}
if (!VK.Observer) {
VK.Observer = {
_subscribers: function() {
if (!this._subscribersMap) {
this._subscribersMap = {};
}
return this._subscribersMap;
},
publish: function(eventName) {
var
args = Array.prototype.slice.call(arguments),
eventName = args.shift(),
subscribers = this._subscribers()[eventName],
i, j;
if (!subscribers) return;
for (i = 0, j = subscribers.length; i < j; i++) {
if (subscribers[i] != null) {
subscribers[i].apply(this, args);
}
}
},
subscribe: function(eventName, handler) {
var
subscribers = this._subscribers();
if (typeof handler != 'function') return false;
if (!subscribers[eventName]) {
subscribers[eventName] = [handler];
} else {
subscribers[eventName].push(handler);
}
},
unsubscribe: function(eventName, handler) {
var
subscribers = this._subscribers()[eventName],
i, j;
if (!subscribers) return false;
if (typeof handler == 'function') {
for (i = 0, j = subscribers.length; i < j; i++) {
if (subscribers[i] == handler) {
subscribers[i] = null;
}
}
} else {
delete this._subscribers()[eventName];
}
}
};
}
if (!VK.Widgets) {
VK.Widgets = {};
VK.Widgets.count = 0;
VK.Widgets.RPC = {};
VK.Widgets.loading = function(obj, enabled) {
obj.style.background = enabled ? 'url("' + VK._domain.base + '/images/upload.gif") center center no-repeat transparent' : 'none';
};
VK.Widgets.Comments = function(objId, options, page) {
var pData = VK.Util.getPageData();
if (!VK._apiId) throw Error('VK not initialized. Please use VK.init');
options = VK.Util.parseOptions(options);
var obj = document.getElementById(objId),
params = {
limit: options.limit || 10,
height: options.height || 0,
mini: options.mini === undefined ? 'auto' : options.mini,
norealtime: options.norealtime ? 1 : 0
}, mouseup = function() {
rpc.callMethod('mouseUp');
return false;
}, move = function(event) {
rpc.callMethod('mouseMove', {screenY: event.screenY});
}, iframe, rpc;
if (options.browse) { // browse all comments
params.browse = 1;
params.replies = options.replies || 0;
} else { // page
var url = options.pageUrl || pData.url;
if (url.substr(0, 1) == '/') {
url = (location.protocol + '//' + location.host) + url;
}
VK.extend(params, {
page: page || 0,
status_publish: options.autoPublish === undefined ? 0 : options.autoPublish,
attach: options.attach === undefined ? '*' : (options.attach ? options.attach : ''),
url: url,
title: options.pageTitle || pData.title,
description: options.pageDescription || pData.description,
image: options.pageImage || pData.image
});
}
if (options.onChange) { // DEPRECATED
VK.Observer.subscribe('widgets.comments.new_comment', options.onChange);
VK.Observer.subscribe('widgets.comments.delete_comment', options.onChange);
}
return VK.Widgets._constructor('widget_comments.php', objId, options, params, {
showBox: function(url, props) {
var box = VK.Util.Box(VK.Util.getAbsUrl(url), [], {
proxy: rpc
});
box.show();
},
startDrag: function() {
cursorBack = window.document.body.style.cursor;
window.document.body.style.cursor = 'pointer';
VK.Util.addEvent('mousemove', move);
VK.Util.addEvent('mouseup', mouseup);
},
stopDrag: function() {
window.document.body.style.cursor = cursorBack;
VK.Util.removeEvent('mousemove', move);
VK.Util.removeEvent('mouseup', mouseup);
}
}, {
startHeight: 133,
minWidth: 300
}, function(o, i, r) {iframe = i; rpc = r;});
};
VK.Widgets.CommentsBrowse = function(objId, options) {
options = VK.Util.parseOptions(options);
options.browse = 1;
return VK.Widgets.Comments(objId, options);
};
VK.Widgets.Recommended = function(objId, options) {
var pData = VK.Util.getPageData();
if (!VK._apiId) throw Error('VK not initialized. Please use VK.init');
options = VK.Util.parseOptions(options);
var params = {
limit: options.limit || 5,
max: options.max || 0,
sort: options.sort || 'friend_likes',
verb: options.verb || 0,
period: options.period || 'week',
target: options.target || 'parent'
};
return VK.Widgets._constructor('widget_recommended.php', objId, options, params, {}, {
startHeight: (116 + params.limit * 47 - 15),
minWidth: 150
});
};
VK.Widgets.Post = function(objId, ownerId, postId, hash, options) {
options = VK.Util.parseOptions(options);
var obj = document.getElementById(objId),
params = {
owner_id: ownerId,
post_id: postId,
hash: hash || '',
from: options ? options.from : '',
}, iframe, rpc, cursorBack;
return VK.Widgets._constructor('widget_post.php', objId, options, params, {
showBox: function(url, props) {
var box = VK.Util.Box(VK.Util.getAbsUrl(url), [], {
proxy: rpc
});
box.show();
},
startDrag: function() {
cursorBack = window.document.body.style.cursor;
window.document.body.style.cursor = 'pointer';
},
stopDrag: function() {
window.document.body.style.cursor = cursorBack;
}
}, {
startHeight: 90,
minWidth: 250
}, function(o, i, r) {iframe = i; rpc = r;});
};
VK.Widgets.TextLive = function(widgetRootElementId, textLiveId, textPostId, hash, options) {
options = VK.Util.parseOptions(options);
return VK.Widgets._constructor('widget_textlive.php', widgetRootElementId, options, {
textlive_id: textLiveId,
textpost_id: textPostId,
hash: hash || '',
}, null, {
startHeight: textPostId ? 176 : 167,
minWidth: 320
});
};
VK.Widgets.Like = (function(Like) {
if (Like) return Like;
var instances = [];
Like = function(objId, options, page) {
var pData = VK.Util.getPageData();
if (!VK._apiId) throw Error('VK not initialized. Please use VK.init');
options = VK.extend(VK.Util.parseOptions(options), {allowTransparency: true});
var verticalBtnHeightWidth = {
18: 43,
20: 47,
22: 51,
24: 55,
30: 67,
},
type = (options.type == 'full' || options.type == 'button' || options.type == 'vertical' || options.type == 'mini') ? options.type : 'full',
autoWidth = options.width === 'auto' && (type == 'button' || type == 'mini'),
btnHeight = parseInt(options.height, 10) || 22,
size = btnHeight && verticalBtnHeightWidth[btnHeight] ? btnHeight : 22,
width = autoWidth ? 153 : (type == 'full' ? Math.max(200, options.width || 350) : (type == 'button' ? 180 : (type == 'mini' ? 115 : verticalBtnHeightWidth[size]))),
height = type == 'vertical' ? (2 * btnHeight + 7) : btnHeight,
params = {
page: page || 0,
url: options.pageUrl || pData.url,
type: type,
verb: options.verb == 1 ? 1 : 0,
color: options.color || '',
title: options.pageTitle || pData.title,
description: options.pageDescription || pData.description,
image: options.pageImage || pData.image,
text: (options.text || '').substr(0, 140),
h: btnHeight
},
ttHere = options.ttHere || false,
isOver = false,
hideTimeout = null,
obj, buttonIfr, buttonRpc, tooltipIfr, tooltipRpc, checkTO;
if (type == 'vertical' || type == 'button' || type == 'mini') delete options.width;
if (autoWidth) params.auto_width = 1;
function showTooltip(force) {
if ((!isOver && !force) || !tooltipRpc) return;
if (!tooltipIfr || !tooltipRpc || tooltipIfr.style.display != 'none' && tooltipIfr.getAttribute('vkhidden') != 'yes') return;
hideTimeout && clearTimeout(hideTimeout);
checkTO && clearTimeout(checkTO);
var scrollTop = options.getScrollTop ? options.getScrollTop() : (document.body.scrollTop || document.documentElement.scrollTop || 0);
var objPos = VK.Util.getXY(obj, options.fixed);
var startY = ttHere ? 0 : objPos[1];
if (scrollTop > objPos[1] - 120 && options.tooltipPos != 'top' || type == 'vertical' || options.tooltipPos == 'bottom') {
tooltipIfr.style.top = (startY + height + 2) + 'px';
tooltipRpc.callMethod('show', false, type+'_'+size);
} else {
tooltipIfr.style.top = (startY - 128) + 'px';
tooltipRpc.callMethod('show', true, type+'_'+size);
}
VK.Util.ss(tooltipIfr, {left: (ttHere ? 0 : objPos[0]) - (type == 'full' || type == 'button' ? 32 : 2) + 'px', display: 'block', opacity: 1, filter: 'none'});
tooltipIfr.setAttribute('vkhidden', 'no');
isOver = true;
}
function hideTooltip(force) {
if ((isOver && !force) || !tooltipRpc) return;
tooltipRpc.callMethod('hide');
buttonRpc.callMethod('hide');
hideTimeout = setTimeout(function() {
tooltipIfr.style.display = 'none'
}, 400);
}
var widgetId = VK.Widgets._constructor('widget_like.php', objId, options, params, {
initTooltip: function(counter) {
tooltipRpc = new fastXDM.Server({
onInit: counter ? function() {
showTooltip();
} : function() {},
proxy: buttonRpc,
showBox: function(url, props) {
var box = VK.Util.Box(VK.Util.getAbsUrl(url), [props.width, props.height], {
proxy: tooltipRpc
});
box.show();
},
}, false, {safe: true});
tooltipIfr = tooltipRpc.append(ttHere ? obj : document.body, {
src: buttonIfr.src + '&act=a_like_tooltip',
scrolling: 'no',
allowTransparency: true,
id: buttonIfr.id + '_tt',
style: {position: 'absolute', padding: 0, display: 'none', opacity: 0.01, filter: 'alpha(opacity=1)', border: '0', width: '274px', height: '130px', zIndex: 5000, overflow: 'hidden'}
});
tooltipIfr.setAttribute('vkhidden', 'yes');
tooltipIfr.onmouseover = function() {
clearTimeout(checkTO);
isOver = true;
};
tooltipIfr.onmouseout = function() {
clearTimeout(checkTO);
isOver = false;
checkTO = setTimeout(function() {hideTooltip(); }, 200);
};
},
showTooltip: showTooltip,
hideTooltip: hideTooltip,
destroy: function() {
buttonRpc.destroy();
try {buttonIfr.src = 'about: blank;';} catch (e) {}
buttonIfr.parentNode.removeChild(buttonIfr);
if (tooltipIfr) {
try {tooltipIfr.src = 'about: blank;';} catch (e) {}
tooltipIfr.parentNode.removeChild(tooltipIfr);
}
tooltipRpc && tooltipRpc.destroy();
},
showBox: function(url, props) {
var box = VK.Util.Box(VK.Util.getAbsUrl(url), [], {
proxy: buttonRpc
});
box.show();
},
proxy: function() {
if (tooltipRpc) {
tooltipRpc.callMethod.apply(tooltipRpc, arguments);
}
}
}, {
startHeight: height,
minWidth: width
}, function(o, i, r) {
buttonRpc = r;
VK.Util.ss(obj = o, {height: height + 'px', width: width + 'px', position: 'relative', clear: 'both'});
VK.Util.ss(buttonIfr = i, {height: height + 'px', width: width + 'px', overflow: 'hidden', zIndex: 150});
obj.onmouseover = function() {
clearTimeout(checkTO);
isOver = true;
};
obj.onmouseout = function() {
clearTimeout(checkTO);
isOver = false;
checkTO = setTimeout(function() {hideTooltip(); }, 200);
};
});
instances.push(widgetId);
return widgetId;
};
Like.destroyAll = function() {
var xdm = null;
while (instances[0]) {
xdm = VK.Widgets.RPC[instances.pop()];
xdm && xdm.methods.destroy();
}
}
return Like;
})(VK.Widgets.Like);
VK.Widgets.Poll = function(objId, options, pollId) {
var pData = VK.Util.getPageData();
if (!pollId) throw Error('No poll id passed');
options = VK.Util.parseOptions(options);
var params = {
poll_id: pollId,
url: options.pageUrl || pData.url || location.href,
title: options.pageTitle || pData.title,
description: options.pageDescription || pData.description
};
if (options.preview) {
params.is_preview = 1;
delete options['preview'];
}
if (options.share !== undefined) {
params.share = options.share ? 1 : 0;
}
var rpc;
return VK.Widgets._constructor('al_widget_poll.php', objId, options, params, {
showBox: function(url, props) {
var box = VK.Util.Box(VK.Util.getAbsUrl(url), [], {
proxy: rpc
});
box.show();
}
}, {
startHeight: 144,
minWidth: 300
}, function(o, i, r) {
rpc = r;
});
};
VK.Widgets.App = function(objId, app_id, options) {
if (!app_id) throw Error('No app id passed');
options = VK.Util.parseOptions(options);
var startHeight = void 0,
height = void 0,
minWidth = void 0,
params = {
aid: app_id,
mode: parseInt(options.mode, 10) || 1,
};
switch (params.mode) {
case 1:
options.width = 144;
startHeight = 251;
break;
case 2:
options.width = options.width ? Math.max(200, Math.min(10000, parseInt(options.width, 10))) : 200;
height = startHeight = 193;
break;
case 3:
options.width = options.width ? Math.max(50, Math.min(10000, parseInt(options.width, 10))) : void 0;
height = startHeight = options.height = ({18: 18, 20: 20, 22: 22, 24: 24, 30: 30})[parseInt(options.height, 10) || 30];
break;
}
minWidth = options.width;
return VK.Widgets._constructor('widget_app.php', objId, options, params, {}, {
startHeight: startHeight,
height: height,
minWidth: minWidth
});
};
VK.Widgets.Community = VK.Widgets.Group = function(objId, options, gid) {
options = VK.Util.parseOptions(options);
gid = parseInt(gid, 10);
if (!gid) {
throw Error('No group_id passed');
}
options.mode = parseInt(options.mode, 10).toString();
var params = {
gid: gid,
mode: (options.mode) ? options.mode : '0'
},
startHeight = options.mode == 3 ? 185 : (options.mode == 1 ? 141 : options.height|0 || 290),
rpc;
if (options.wall) params.wall = options.wall;
params.color1 = options.color1 || '';
params.color2 = options.color2 || '';
params.color3 = options.color3 || '';
params.class_name = options.class_name || '';
if (options.no_head) params.no_head = 1;
if (options.no_cover) params.no_cover = 1;
if (options.wide) {
params.wide = 1;
if (!options.width || options.width < 300) {
options.width = 300;
}
}
if (!options.width|0) options.width = 200;
var cursorBack;
function mouseup() {
rpc.callMethod('mouseUp');
return false;
}
function move(event) {
rpc.callMethod('mouseMove', {screenY: event.screenY});
return false;
}
return VK.Widgets._constructor('widget_community.php', objId, options, params, {
showBox: function(url, props) {
var box = VK.Util.Box(VK.Util.getAbsUrl(url), [], {
proxy: rpc
});
box.show();
},
startDrag: function() {
cursorBack = window.document.body.style.cursor;
window.document.body.style.cursor = 'pointer';
VK.Util.addEvent('mousemove', move);
VK.Util.addEvent('mouseup', mouseup);
},
stopDrag: function() {
window.document.body.style.cursor = cursorBack;
VK.Util.removeEvent('mousemove', move);
VK.Util.removeEvent('mouseup', mouseup);
},
auth: function() {
VK.Auth.login(null, 1);
}
}, {
minWidth: 120,
startHeight: startHeight
}, function(o, i, r) {
rpc = r;
});
};
VK.Widgets.Auth = function(objId, options) {
var pData = VK.Util.getPageData();
if (!VK._apiId) throw Error('VK not initialized. Please use VK.init');
options = VK.Util.parseOptions(options);
if (!options.width) {
options.width = 200;
}
if (options.type) {
type = 1;
} else {
type = 0;
}
return VK.Widgets._constructor('widget_auth.php', objId, options, {}, {makeAuth: function(data) {
if (data.session) {
VK.Auth._loadState = 'loaded';
VK.Auth.setSession(data.session, 'connected');
VK.Observer.publish('auth.loginStatus', {session: data.session, status: 'connected'});
VK.Observer.unsubscribe('auth.loginStatus');
}
if (options.onAuth) {
options.onAuth(data);
} else {
if (options.authUrl) {
var href = options.authUrl;
} else {
var href = window.location.href;
}
if (href.indexOf('?') == -1) {
href+='?';
} else {
href+='&';
}
var vars = [];
for (var i in data) {
if (i != 'session') vars.push(i+'='+decodeURIComponent(data[i]).replace(/&/g, '%26').replace(/\#/g, '%23').replace(/\?/, '%3F'));
}
window.location.href = href + vars.join('&');
}
}}, {
startHeight: 134
});
};
VK.Widgets.Subscribe = function(objId, options, oid) {
oid = parseInt(oid, 10);
if (!oid) {throw Error('No owner_id passed');}
options = VK.Util.parseOptions(options);
var params = {
oid: oid
}, rpc;
if (options.mode) {
params.mode = options.mode;
}
if (options.soft) {
params.soft = options.soft;
}
return VK.Widgets._constructor('widget_subscribe.php', objId, options, params, {
showBox: function(url, props) {
var box = VK.Util.Box(VK.Util.getAbsUrl(url), [], {
proxy: rpc
});
box.show();
},
auth: function() {
VK.Auth.login(null, 1);
}
}, {
minWidth: 220,
startHeight: 22
}, function(o, i, r) {
rpc = r;
});
};
VK.Widgets.ContactUs = function(objId, options, oid) {
oid = parseInt(oid, 10);
if (!oid) throw Error('No group or user id passed');
options = VK.Util.parseOptions(options);
var params = {
oid: oid,
height: ({18: 18, 20: 20, 22: 22, 24: 24, 30: 30})[parseInt(options.height, 10) || 24],
text: (options.text || '').substr(0, 140)
}, rpc;
return VK.Widgets._constructor('widget_contactus.php', objId, options, params, {}, {
startHeight: params.height,
height: params.height
}, function(o, i, r) {
rpc = r;
});
};
VK.Widgets.Bookmarks = function(objId, options) {
options = VK.Util.parseOptions(options);
var params = {
height: ({18: 18, 20: 20, 22: 22, 24: 24, 30: 30})[parseInt(options.height, 10) || 30],
url: options.url || window.location.href
}, rpc;
return VK.Widgets._constructor('widget_bookmarks.php', objId, options, params, {}, {
startHeight: params.height,
height: params.height
}, function(o, i, r) {
rpc = r;
});
};
VK.Widgets.Playlist = function(objId, ownerId, playlistId, hash, options) {
var params = {
oid: parseInt(ownerId, 10),
pid: parseInt(playlistId, 10),
hash: hash || ''
}, rpc;
if (!params.oid) throw Error('No owner id passed');
if (!params.pid) throw Error('No playlist id passed');
options = VK.Util.parseOptions(options);
return VK.Widgets._constructor('widget_playlist.php', objId, options, params, {
showBox: function(url, props) {
var box = VK.Util.Box(VK.Util.getAbsUrl(url), [], {
proxy: rpc
});
box.show();
}
}, {
minWidth: 200
}, function(o, i, r) {
rpc = r;
});
};
VK.Widgets.Ads = function(objId, options, paramsExtra) {
options = VK.Util.parseOptions(options);
paramsExtra = paramsExtra || {};
var params = {};
var defaults = {};
var funcs = {};
var obj = document.getElementById(objId);
var iframe;
var rpc;
var adsParams = {};
var adsParamsLocal = {};
var adsParamsDefault = {};
for (var key in paramsExtra) {
var keyFix = (inArray(key, ['hash']) ? key : 'ads_' + key);
adsParams[keyFix] = paramsExtra[key];
}
if (obj && obj.getBoundingClientRect) {
obj.style.width = '100%';
obj.style.height = '100%';
var rect = obj.getBoundingClientRect();
obj.style.width = '';
obj.style.height = '';
adsParams.ads_ad_unit_width_auto = Math.floor(rect.right - rect.left);
adsParams.ads_ad_unit_height_auto = Math.floor(rect.bottom - rect.top);
}
adsParamsDefault.ads_ad_unit_width = 100;
adsParamsDefault.ads_ad_unit_height = 100;
adsParamsLocal.ads_ad_unit_width = (parseInt(adsParams.ads_ad_unit_width) || adsParams.ads_ad_unit_width === 'auto' && adsParams.ads_ad_unit_width_auto || adsParamsDefault.ads_ad_unit_width);
adsParamsLocal.ads_ad_unit_height = (parseInt(adsParams.ads_ad_unit_height) || adsParams.ads_ad_unit_height === 'auto' && adsParams.ads_ad_unit_height_auto || adsParamsDefault.ads_ad_unit_height);
if (adsParams.ads_handler) {
adsParamsLocal.ads_handler = adsParams.ads_handler;
}
if (adsParams.ads_handler_empty_html) {
adsParamsLocal.ads_handler_empty_html = adsParams.ads_handler_empty_html;
}
delete adsParams.ads_handler;
delete adsParams.ads_handler_empty_html;
params.act = 'ads_web';
params.url = location.href;
VK.extend(params, adsParams);
options.noDefaultParams = true;
options.width = adsParamsLocal.ads_ad_unit_width;
options.allowTransparency = true;
defaults.startHeight = adsParamsLocal.ads_ad_unit_height;
defaults.minWidth = adsParamsLocal.ads_ad_unit_width;
funcs.adsOnInit = adsOnInit;
funcs.newAdsOnInitLoader = newAdsOnInitLoader;
return VK.Widgets._constructor('ads_rotate.php', objId, options, params, funcs, defaults, onDone);
function newAdsOnInitLoader(deps) {
// replace's взяты из walkVar
var json = JSON.parse(deps.replace(/'/g, '\'').replace(/"/g, '"').replace(/>/g, '>').replace(/</g, '<').replace(/&/g, '&'));
adsAttachScript(json);
}
function adsOnInit(errorCode, adsParamsExport) {
VK.Widgets.loading(obj, false);
adsProcessParams(adsParamsExport);
if (options.onAdsReady) options.onAdsReady.apply(options.onAdsReady, Array.prototype.slice.call(arguments));
adsProcessHandler(errorCode);
}
function adsAttachScript(adsScriptData) {
if (!('vk__adsLight' in window)) {
window.vk__adsLight = false;
var attachScriptFunc = (VK.Api && VK.Api.attachScript || VK.addScript);
if (Array.isArray(adsScriptData)) {
adsScriptData.forEach(function(url){
attachScriptFunc(VK._domain.base + url)
});
} else {
var adsScriptVersion = parseInt(adsScriptData);
attachScriptFunc(VK._domain.base + jsc('/web/ads_light.js?') + adsScriptVersion);
}
} else if (window.vk__adsLight && vk__adsLight.userHandlers && vk__adsLight.userHandlers.onInit) {
vk__adsLight.userHandlers.onInit(false); // false - do not publish initial onInit
}
}
function adsProcessParams(adsParamsExport) {
if (!adsParamsExport) {
return;
}
for (var paramName in adsParamsExport) {
var paramValue = adsParamsExport[paramName];
if (paramName === 'ads_ad_unit_width' || paramName === 'ads_ad_unit_height') {
if (!(paramName in adsParams)) {
adsParamsLocal[paramName] = (parseInt(paramValue) || paramValue === 'auto' && adsParams[paramName + '_auto'] || adsParamsDefault[paramName]);
}
} else {
if (!(paramName in adsParamsLocal)) {
adsParamsLocal[paramName] = paramValue;
}
}
}
}
function adsProcessHandler(errorCode) {
var handlerResult = adsEvalHandler(adsParamsLocal.ads_handler, errorCode);
if (errorCode <= 0 && handlerResult !== true) {
try { console.log('VK: ad_unit_id = ' + adsParams.ads_ad_unit_id, ', errorCode = ', errorCode); } catch (e) {}
adsInsertHtmlHandler(adsParamsLocal.ads_handler_empty_html, adsParamsLocal.ads_ad_unit_width, adsParamsLocal.ads_ad_unit_height);
}
}
function adsEvalHandler(handler) {
var result = false;
try {
if (!handler) {
return false;
}
var func = false;
if (isFunction(handler)) {
func = handler;
} else if (isString(handler)) {
var handlerFuncs = handler.split('.');
func = window;
for (var i = 0, len = handlerFuncs.length; i < len; i++) {
func = func[handlerFuncs[i]];
if (!func) {
break;
}
}
if (!func) {
if (handler.substr(0, 8) === 'function') {
handler = 'return ' + handler + ';';
}
var handlerResult = (new Function(handler))();
if (isFunction(handlerResult)) {
func = handlerResult;
} else {
result = handlerResult;
}
}
}
if (func) {
var args = Array.prototype.slice.call(arguments, 1);
result = func.apply(func, args);
}
} catch (e) {
try {
console.error(e);
} catch (e2) {}
}
return result;
function isFunction(obj) {
return Object.prototype.toString.call(obj) === '[object Function]';
}
function isString(obj) {
return Object.prototype.toString.call(obj) === '[object String]';
}
}
function adsInsertHtmlHandler(handlerHtml, width, height) {
if (!handlerHtml) {
return;
}
if (!obj) {
return;
}
width = (width ? width + 'px' : '');
height = (height ? height + 'px' : '');
var iframeHandlerHtml = '' +
' ' +
'' +
' ' +
'