text: // Vkontakte (vk.com)
  (function(hello) {
  
  	hello.init({
  
  		vk: {
  			name: 'Vk',
  
  			// See https://vk.com/dev/oauth_dialog
  			oauth: {
  				version: 2,
  				auth: 'https://oauth.vk.com/authorize',
  				grant: 'https://oauth.vk.com/access_token'
  			},
  
  			// Authorization scopes
  			// See https://vk.com/dev/permissions
  			scope: {
  				email: 'email',
  				friends: 'friends',
  				photos: 'photos',
  				videos: 'video',
  				share: 'share',
  				offline_access: 'offline'
  			},
  
  			// Refresh the access_token
  			refresh: true,
  
  			login: function(p) {
  				p.qs.display = window.navigator &&
  					window.navigator.userAgent &&
  					/ipad|phone|phone|android/.test(window.navigator.userAgent.toLowerCase()) ? 'mobile' : 'popup';
  			},
  
  			// API Base URL
  			base: 'https://api.vk.com/method/',
  
  			// Map GET requests
  			get: {
  				me: function(p, callback) {
  					p.query.fields = 'id,first_name,last_name,photo_max';
  					callback('users.get');
  				}
  			},
  
  			wrap: {
  				me: function(res, headers, req) {
  					formatError(res);
  					return formatUser(res, req);
  				}
  			},
  
  			// No XHR
  			xhr: false,
  
  			// All requests should be JSONP as of missing CORS headers in https://api.vk.com/method/*
  			jsonp: true,
  
  			// No form
  			form: false
  		}
  	});
  
  	function formatUser(o, req) {
  
  		if (o !== null && 'response' in o && o.response !== null && o.response.length) {
  			o = o.response[0];
  			o.id = o.uid;
  			o.thumbnail = o.picture = o.photo_max;
  			o.name = o.first_name + ' ' + o.last_name;
  
  			if (req.authResponse && req.authResponse.email !== null)
  				o.email = req.authResponse.email;
  		}
  
  		return o;
  	}
  
  	function formatError(o) {
  
  		if (o.error) {
  			var e = o.error;
  			o.error = {
  				code: e.error_code,
  				message: e.error_msg
  			};
  		}
  	}
  
  })(hello);
  