package util { import events.VKWrapperEvent; import flash.events.Event; import flash.events.EventDispatcher; /** * VKWrapper, предназначен для работы с неким магическим * контейнером вконтакте. Стильно, удобно, молодежно * @author Kasoi | fsca.ru | kasoizz@gmail.com */ public class VKWrapper extends EventDispatcher { [Event(name = "onApplicationAdded", type = "events.VKWrapperEvent")] [Event(name = "onSettingsChanged", type = "events.VKWrapperEvent")] [Event(name = "onBalanceChanged", type = "events.VKWrapperEvent")] [Event(name = "onProfilePhotoSave", type = "events.VKWrapperEvent")] [Event(name = "onWindowResized", type = "events.VKWrapperEvent")] [Event(name = "onLocationChanged", type = "events.VKWrapperEvent")] [Event(name = "onWindowBlur", type = "events.VKWrapperEvent")] [Event(name = "onWindowFocus", type = "events.VKWrapperEvent")] [Event(name = "onMouseLeave", type = "events.VKWrapperEvent")] ////////////////////////////////////////////////////////// // Singleton initialization ////////////////////////////////////////////////////////// static private var _isInited: Boolean = false; static private var _instance: VKWrapper; static private var _disableWarnings: Boolean = false; static public function instance() : VKWrapper { if (!VKWrapper._instance) { VKWrapper._instance = new VKWrapper(); VKWrapper._isInited = true; } VKWrapper.checkWarnings(); return VKWrapper._instance; } public function VKWrapper() : void { if (VKWrapper._isInited) { throw new Error("VKWrapper: Error — initialization fail'"); } } static private function checkWarnings() : void { var app: VKWrapperApplication = VKWrapper._instance.application; if (app) { if (!VKWrapper._disableWarnings && app.parameters.vkwrapperIsNotDefined) { trace('VKWrapper: [WARNING] VKWrapper working in test mode'); } } } ////////////////////////////////////////////////////////// // Public properties ////////////////////////////////////////////////////////// public function get application() : VKWrapperApplication { return this._application; } public function get external() : VKWrapperExternal { return this._external; } ////////////////////////////////////////////////////////// // Private properties ////////////////////////////////////////////////////////// private var _wrapper: Object; private var _application: VKWrapperApplication; private var _external: VKWrapperExternal; ////////////////////////////////////////////////////////// // Public methods ////////////////////////////////////////////////////////// public function init(wrapper: Object) : void { if (wrapper == null) wrapper = { }; if (!wrapper.addEventListener) { wrapper.addEventListener = function() : void { }; wrapper.stage = new Object(); wrapper.stage.addEventListener = function() : void { }; } this._wrapper = wrapper; this._application = new VKWrapperApplication( wrapper.application); this._external = new VKWrapperExternal( wrapper.external); this._wrapper.addEventListener( VKWrapperEvent.ON_APPLICATION_ADDED, this.wrapper_onApplicationAdded); this._wrapper.addEventListener( VKWrapperEvent.ON_BALANCE_CHANGED, this.wrapper_onBalanceChanged); this._wrapper.addEventListener( VKWrapperEvent.ON_LOCATION_CHANGED, this.wrapper_onLocationChanged); this._wrapper.addEventListener( VKWrapperEvent.ON_MOUSE_LEAVE, this.wrapper_onMouseLeave); this._wrapper.addEventListener( VKWrapperEvent.ON_PROFILE_PHOTO_SAVE, this.wrapper_onProfilePhotoSave); this._wrapper.addEventListener( VKWrapperEvent.ON_SETTINGS_CHANGED, this.wrapper_onSettingsChanged); this._wrapper.addEventListener( VKWrapperEvent.ON_WINDOW_BLUR, this.wrapper_onWindowBlur); this._wrapper.addEventListener( VKWrapperEvent.ON_WINDOW_FOCUS, this.wrapper_onWindowFocus); this._wrapper.addEventListener( VKWrapperEvent.ON_WINDOW_RESIZED, this.wrapper_onWindowResized); this._wrapper.stage.addEventListener(Event.RESIZE, this.wrapper_onResize); VKWrapper.checkWarnings(); } public function disableWarnings() : void { VKWrapper._disableWarnings = true; trace('VKWrapper: warnings are disabled'); } ////////////////////////////////////////////////////////// // Private methods ////////////////////////////////////////////////////////// private function dispatch(type: String, settings: Number = NaN, balance: Number = NaN, width: Number = NaN, height: Number = NaN, location: String = null) : void { this.dispatchEvent(new VKWrapperEvent(type, settings, balance, width, height, location)); } ////////////////////////////////////////////////////////// // Listeners ////////////////////////////////////////////////////////// private function wrapper_onApplicationAdded(e: Object) : void { this.dispatch(VKWrapperEvent.ON_APPLICATION_ADDED); } private function wrapper_onSettingsChanged(e: Object) : void { this.dispatch(VKWrapperEvent.ON_SETTINGS_CHANGED, e.settings); } private function wrapper_onBalanceChanged(e: Object) : void { this.dispatch(VKWrapperEvent.ON_BALANCE_CHANGED, NaN, e.balance); } private function wrapper_onProfilePhotoSave(e: Object) : void { this.dispatch(VKWrapperEvent.ON_PROFILE_PHOTO_SAVE); } private function wrapper_onWindowResized(e: Object) : void { this.dispatch(VKWrapperEvent.ON_WINDOW_RESIZED, NaN, NaN, e.width, e.height); } private function wrapper_onLocationChanged(e: Object) : void { this.dispatch(VKWrapperEvent.ON_LOCATION_CHANGED, NaN, NaN, NaN, NaN, e.location); } private function wrapper_onWindowBlur(e: Object) : void { this.dispatch(VKWrapperEvent.ON_WINDOW_BLUR); } private function wrapper_onWindowFocus(e: Object) : void { this.dispatch(VKWrapperEvent.ON_WINDOW_FOCUS); } private function wrapper_onMouseLeave(e: Object) : void { this.dispatch(VKWrapperEvent.ON_MOUSE_LEAVE); } private function wrapper_onResize(e: Event) : void { this.dispatch(VKWrapperEvent.ON_WINDOW_RESIZED, NaN, NaN, this.application.stageWidth, this.application.stageHeight); } } } import flash.net.URLRequest; class VKWrapperApplication { ////////////////////////////////////////////////////////// // Public properties ////////////////////////////////////////////////////////// public function get parameters() : Object { return this._app.parameters; } public function get quality() : String { return this._app.quality; } public function set quality(value: String) : void { this._app.quality = value; } public function get scaleMode() : String { return this._app.scaleMode; } public function set scaleMode(value: String) : void { this._app.scaleMode = value; } public function get align() : String { return this._app.align; } public function set align(value: String) : void { this._app.align = value; } public function get frameRate() : Number { return this._app.frameRate; } public function set frameRate(value: Number) : void { this._app.frameRate = value; } public function get stageWidth() : Number { return this._app.stageWidth; } public function get stageHeight() : Number { return this._app.stageHeight; } ////////////////////////////////////////////////////////// // Private properties ////////////////////////////////////////////////////////// private var _app: Object; public function VKWrapperApplication(app: Object) : void { if (app == null) { app = new Object(); app.parameters = { }; app.parameters.vkwrapperIsNotDefined = true; app.quality = 'HIGH'; app.scaleMode = 'noScale'; app.align = 'TL'; app.frameRate = 30; app.stageWidth = 600; app.stageHeight = 600; } this._app = app; if (this._app.parameters == undefined) { this._app.parameters = new Object(); } } public function toString() : String { var str: String = 'VKWrapperApplication: '; str += '\n' + 'params: ' + this.parameters.toString(); str += '\n' + 'quality: ' + this.quality; str += '\n' + 'scaleMode: ' + this.scaleMode; str += '\n' + 'align: ' + this.align; str += '\n' + 'frameRate: ' + this.frameRate; str += '\n' + 'stageWidth: ' + this.stageWidth; str += '\n' + 'stageHeight: ' + this.stageHeight; return str; } } class VKWrapperExternal { /* showInstallBox, showSettingsBox, showInviteBox, showPaymentBox showProfilePhotoBox, resizeWindow, scrollWindow, setTitle setLocation, setNavigation, navigateToURL */ ////////////////////////////////////////////////////////// // Public properties ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// // Private properties ////////////////////////////////////////////////////////// private var _ext: *; ////////////////////////////////////////////////////////// // Public methods ////////////////////////////////////////////////////////// public function VKWrapperExternal(ext: *) : void { if (!ext) { ext = new Object(); ext.showInstallBox = function() : void { trace('VKWrapper: showInstallBox'); }; ext.showSettingsBox = function() : void { trace('VKWrapper: showSettingsBox'); }; ext.showInviteBox = function() : void { trace('VKWrapper: showInviteBox');}; ext.showPaymentBox = function() : void { trace('VKWrapper: showPaymentBox');}; ext.showProfilePhotoBox = function() : void { trace('VKWrapper: showProfilePhotoBox');}; ext.resizeWindow = function() : void { trace('VKWrapper: resizeWindow');}; ext.scrollWindow = function() : void { trace('VKWrapper: scrollWindow');}; ext.setTitle = function() : void { trace('VKWrapper: setTitle');}; ext.setLocation = function() : void { trace('VKWrapper: setLocation');}; ext.setNavigation = function() : void { trace('VKWrapper: setNavigation');}; ext.navigateToURL = function() : void { trace('VKWrapper: navigateToURL');}; } this._ext = ext; } /// Открывает окно с предложением установить приложение. public function showInstallBox() : void { this._ext.showInstallBox(); } /* * Открывает окно с пользовательскими настройками приложения. Параметр * settings – это битовая маска запрашиваемых настроек. Если параметр * settings равен 0, то пользователю будет предложено разрешить все действия приложению. */ public function showSettingsBox(settings: uint) : void { this._ext.showSettingsBox(); } /// Открывает окно для приглашения друзей пользователя в приложение. public function showInviteBox() : void { this._ext.showInviteBox(); } /* * Открывает окно для ввода голосов на счет в приложении. Если параметр votes равен 0, * то пользователю будет предложено указать количество голосов вручную. * По умолчанию votes равен 0. */ public function showPaymentBox(votes: uint = 0) : void { this._ext.showPaymentBox(votes); } /* * Открывает окно для подтверждения пользователем изменения фотографии на его странице. * Параметр hash должен содержать результат выполнения запроса к API photos.saveProfilePhoto */ public function showProfilePhotoBox(hash: String) : void { this._ext.showProfilePhotoBox(hash); } /* * Инициирует изменение ширины и высоты окна приложения. Максимальное значение ширины * окна соответствует 607 или 627 точек в зависимости от того включены отступы и * элементы управления или нет. Высота имеет ограничение в 4050 точек */ public function resizeWindow(w: Number, h: Number) : void { this._ext.resizeWindow(w, h); } /* * Инициирует скроллинг окна браузера по вертикали. Параметр top задает смещение скролла * относительно нулевой координаты окна. Например, для того, чтобы прокрутить окно на * самый верх страницы, необходимо передать значение 0. Второй параметр speed задает * скорость анимации в миллисекундах и по умолчанию равен 0. */ public function scrollWindow(top: uint, speed: uint) : void { this._ext.scrollWindow(top, speed); } /// Изменяет заголовок окна браузера. public function setTitle(title: String) : void { this._ext.setTitle(title); } /* * Изменяет хеш текущего адреса страницы, который записывается в адресной строке браузера после * символа #. Используется для поддержки кнопок "назад" и "вперед" в браузере. */ public function setLocation(location: String) : void { this._ext.setLocation(location); } /* * Изменяет внешнюю навигацию в верхней строке над приложением. Параметр labels * должен содержать массив строк с названиями ссылок, например ["Label 1", "Label 2", "Label 3"]. * Параметр links необязателен и должен содержать массив ссылок вида ["link1", "link2"]. * Максимальное количество уровней навигации – 3. При переходе пользователем по ссылкам, будет * вызываться событие onLocationChanged с параметром location, равному соответствующему хешу в * массиве links. В случае, если пользователь нажимает на название приложения в навигации, параметр * location будет равняться пустой строке. Если массив links не определен, то location будет иметь * стандартные значения level1, level2. */ public function setNavigation(labels: Array, links: Array) : void { this._ext.setNavigation(labels, links); } /* * Открывает ссылку в текущем окне. Данная функция является аналогом * стандартной функции flash.net.navigateToURL. */ public function navigateToURL(request: URLRequest) : void { this._ext.navigateToURL(request); } }