PageRenderTime 44ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/src/com/facecontrol/forms/MainForm.as

https://github.com/vkflashmedia/Facecontrol
ActionScript | 838 lines | 713 code | 125 blank | 0 comment | 78 complexity | d09f16a2e1bd3eb99b2ba077f54409cd MD5 | raw file
  1. package com.facecontrol.forms
  2. {
  3. import com.adobe.images.JPGEncoder;
  4. import com.efnx.events.MultiLoaderEvent;
  5. import com.efnx.net.MultiLoader;
  6. import com.facecontrol.dialog.Alert;
  7. import com.facecontrol.gui.Photo;
  8. import com.facecontrol.util.Constants;
  9. import com.facecontrol.util.Images;
  10. import com.facecontrol.util.Util;
  11. import com.flashmedia.basics.GameObjectEvent;
  12. import com.flashmedia.basics.GameScene;
  13. import com.flashmedia.basics.View;
  14. import com.flashmedia.gui.Button;
  15. import com.flashmedia.gui.ComboBox;
  16. import com.flashmedia.gui.ComboBoxEvent;
  17. import com.flashmedia.gui.Form;
  18. import com.flashmedia.gui.LinkButton;
  19. import com.flashmedia.gui.RatingBar;
  20. import com.flashmedia.util.BitmapUtil;
  21. import com.net.VKontakte;
  22. import com.net.VKontakteEvent;
  23. import com.serialization.json.JSON;
  24. import flash.display.Bitmap;
  25. import flash.display.BitmapData;
  26. import flash.display.Sprite;
  27. import flash.events.ErrorEvent;
  28. import flash.events.Event;
  29. import flash.events.FocusEvent;
  30. import flash.events.TextEvent;
  31. import flash.net.URLVariables;
  32. import flash.text.AntiAliasType;
  33. import flash.text.TextField;
  34. import flash.text.TextFieldAutoSize;
  35. import flash.text.TextFieldType;
  36. import flash.text.TextFormat;
  37. import flash.utils.ByteArray;
  38. import ru.inspirit.net.MultipartURLLoader;
  39. public class MainForm extends Form
  40. {
  41. private static const COUNTRY_DEFAULT:String = 'Весь мир';
  42. private static const CITY_DEFAULT:String = 'Вся страна';
  43. private static const CURRENT_PHOTO_COMMENT_HEIGHT:int = 100;
  44. private static const CURRENT_USER_NAME_HEIGHT:int = 25;
  45. private static const INDENT_BETWEEN_CURRENT_PHOTO_AND_NAME:int = 4;
  46. private static const INDENT_BETWEEN_CURRENT_PHOTO_AND_COMMENT:int = 32;
  47. private static const INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_STAR_ICON:int = 8;
  48. private static const INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_DELIMITER_ICON:int = 68;
  49. private static const INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_RATING_AVERAGE:int = 3;
  50. private static const INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_RATING_AVERAGE_LABEL:int = 43;
  51. private static const INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_VOTES_COUNT:int = 90;
  52. private static const INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_VOTES_COUNT_LABEL:int = 72;
  53. private static const INDENT_BETWEEN_INVITE_LABEL_AND_PHOTO:int = 5;
  54. private static const INDENT_BETWEEN_INVITE_PHOTO_AND_BUTTON:int = 0;
  55. private static var _instance:MainForm = null;
  56. public static function get instance():MainForm {
  57. if (!_instance) _instance = new MainForm(Util.scene);
  58. return _instance;
  59. }
  60. private var _currentUser:Object;
  61. private var _currentUserArea:Sprite;
  62. private var _currentUserPhoto:Photo;
  63. private var _currentUserName:LinkButton;
  64. private var _currentUserPhotoComment:TextField;
  65. private var _currentUserMorePhotosButton:LinkButton;
  66. private var _currentUserSetFavoriteButton:LinkButton;
  67. private var _previousUser:Object;
  68. private var _previousUserPhoto:Photo;
  69. private var _previousUserPhotoRatingAverage:TextField;
  70. private var _previousUserPhotoVotesCount:TextField;
  71. private var _previousUserPhotoRatingAverageLabel:TextField;
  72. private var _previousUserPhotoVotesCountLabel:TextField;
  73. private var _previousUserArea:Sprite;
  74. private var _previousUserStarIcon:Bitmap;
  75. private var _previousUserDelimiterIcon:Bitmap;
  76. private var _inviteArea:Sprite;
  77. private var _inviteLabel:TextField;
  78. private var _invitePhoto:Photo;
  79. private var _inviteButton:Button;
  80. private var _rateBar:RatingBar;
  81. private var _sexBox:ComboBox;
  82. private var _minAgeBox:TextField;
  83. private var _maxAgeBox:TextField;
  84. private var _countryBox:ComboBox;
  85. private var _cityBox:ComboBox;
  86. private var _filter:Object;
  87. private var _multiloader:MultiLoader;
  88. private var _vkontakte:VKontakte;
  89. private var _friends:Array;
  90. private var _friend:Object;
  91. private var _toUnload:String = undefined;
  92. private var _friendPhotoLoader:MultiLoader;
  93. private var _mpLoader:MultipartURLLoader;
  94. private var _server:String;
  95. private var _photo:String;
  96. private var _hash:String;
  97. public function MainForm(value:GameScene)
  98. {
  99. super(value, 0, 0, Constants.APP_WIDTH, Constants.APP_HEIGHT);
  100. _multiloader = new MultiLoader();
  101. _mpLoader = new MultipartURLLoader();
  102. _mpLoader.addEventListener(Event.COMPLETE, function(event:Event):void {
  103. var response:Object = JSON.deserialize(_mpLoader.loader.data);
  104. _server = response.server;
  105. _photo = response.photo;
  106. _hash = response.hash;
  107. _vkontakte.wallSavePost(_friend.uid, response.server, response.photo, response.hash);
  108. });
  109. _friendPhotoLoader = new MultiLoader();
  110. _friendPhotoLoader.addEventListener(MultiLoaderEvent.COMPLETE, function(event:MultiLoaderEvent):void {
  111. var url:String = _friend.photo_big;
  112. if (_friendPhotoLoader.hasLoaded(url)) {
  113. showInviteArea();
  114. }
  115. });
  116. _vkontakte = new VKontakte();
  117. _vkontakte.addEventListener(VKontakteEvent.COMPLETED, function(event:VKontakteEvent):void {
  118. var response:Object = event.response;
  119. try {
  120. switch (event.method) {
  121. case 'getFriends':
  122. _friends = response as Array;
  123. _vkontakte.getAppFriends();
  124. break;
  125. case 'getAppFriends':
  126. var appFriends:Array = response as Array;
  127. _friends.filter(function(element:*, index:int, arr:Array):* {
  128. for each (var uid:int in appFriends) {
  129. if (element.uid == uid) {
  130. return false;
  131. }
  132. }
  133. return true;
  134. });
  135. randomizeFriend();
  136. break;
  137. case 'getPhotoUploadServer':
  138. var vars:URLVariables = new URLVariables();
  139. var bitmap:Bitmap = Util.multiLoader.get(Images.INVITE_ICON);
  140. var myEncoder:JPGEncoder = new JPGEncoder(70);
  141. var myCapStream:ByteArray = myEncoder.encode(bitmap.bitmapData);
  142. _mpLoader.addFile(myCapStream, 'file.jpg', 'photo', 'image/jpeg');
  143. _mpLoader.load(response.upload_url);
  144. break;
  145. case 'wallSavePost':
  146. if (Util.wrapper.external) {
  147. Util.wrapper.external.saveWallPost(response.post_hash);
  148. }
  149. break;
  150. }
  151. }
  152. catch (e:Error) {
  153. if (Util.DEBUG) trace(e.message);
  154. }
  155. });
  156. _vkontakte.getFriends('first_name,sex,photo_big');
  157. visible = false;
  158. width = Constants.APP_WIDTH;
  159. height = Constants.APP_HEIGHT;
  160. var label:TextField = Util.createLabel('Оцени это фото!', 0, 72, Constants.APP_WIDTH);
  161. label.setTextFormat(new TextFormat(Util.opiumBold.fontName, 12, 0xffffff));
  162. label.embedFonts = true;
  163. label.antiAliasType = AntiAliasType.ADVANCED;
  164. label.autoSize = TextFieldAutoSize.CENTER;
  165. addChild(label);
  166. var junkIcon:Bitmap = Util.multiLoader.get(Images.JUNK_ICON);
  167. junkIcon.x = 58;
  168. junkIcon.y = 73;
  169. addChild(junkIcon);
  170. _rateBar = new RatingBar(_scene, 10);
  171. _rateBar.x = 180;
  172. _rateBar.y = 98;
  173. _rateBar.setLayout(5, 13, 26, 21);
  174. _rateBar.bitmap = Util.multiLoader.get(Images.RATING_BACKGROUND);
  175. _rateBar.rateIconOff = Util.multiLoader.get(Images.RATING_OFF);
  176. _rateBar.rateIconOn = Util.multiLoader.get(Images.RATING_ON);
  177. _rateBar.addEventListener(GameObjectEvent.TYPE_MOUSE_CLICK, onRateClicked);
  178. addChild(_rateBar);
  179. var superIcon:Bitmap = Util.multiLoader.get(Images.SUPER_ICON);
  180. superIcon.x = 452;
  181. superIcon.y = 75;
  182. addChild(superIcon);
  183. initCurrentUserArea();
  184. initPreviousUserArea();
  185. initInviteArea();
  186. var filterBackgruond:Bitmap = BitmapUtil.cloneImageNamed(Images.FILTER_BACKGROUND);
  187. filterBackgruond.x = 452;
  188. filterBackgruond.y = 176;
  189. addChild(filterBackgruond);
  190. var filterLabelFormat:TextFormat = new TextFormat(Util.tahoma.fontName, 12, 0xf2c3ff);
  191. var filterLabel:TextField = Util.createLabel('Я ищу:', filterBackgruond.x + 18, filterBackgruond.y + 2);
  192. filterLabel.embedFonts = true;
  193. filterLabel.antiAliasType = AntiAliasType.ADVANCED;
  194. filterLabel.setTextFormat(filterLabelFormat);
  195. filterLabel.autoSize = TextFieldAutoSize.LEFT;
  196. addChild(filterLabel);
  197. _sexBox = createComboBox(filterBackgruond.x + 20, filterBackgruond.y + 22, 113);
  198. _sexBox.addItem(Constants.SEX_FEMALE);
  199. _sexBox.addItem(Constants.SEX_MALE);
  200. _sexBox.addItem(Constants.SEX_BOTH);
  201. _sexBox.selectedItem = Constants.SEX_FEMALE;
  202. _sexBox.addEventListener(ComboBoxEvent.ITEM_SELECT, onFilterChanged);
  203. addChild(_sexBox);
  204. filterLabel = Util.createLabel('От:', filterBackgruond.x + 18, filterBackgruond.y + 51);
  205. filterLabel.antiAliasType = AntiAliasType.ADVANCED;
  206. filterLabel.embedFonts = true;
  207. filterLabel.setTextFormat(filterLabelFormat);
  208. filterLabel.autoSize = TextFieldAutoSize.LEFT;
  209. addChild(filterLabel);
  210. var spr: Sprite = new Sprite();
  211. spr.graphics.beginFill(0xffffff);
  212. spr.graphics.drawRoundRect(filterBackgruond.x + 50, filterBackgruond.y + 54, 83, 15, 12);
  213. spr.graphics.endFill();
  214. addChild(spr);
  215. _minAgeBox = new TextField();
  216. _minAgeBox.selectable = true;
  217. _minAgeBox.x = filterBackgruond.x + 28;
  218. _minAgeBox.y = filterBackgruond.y + 54;
  219. _minAgeBox.maxChars = 3;
  220. _minAgeBox.defaultTextFormat = new TextFormat(Util.tahoma.fontName, 11);
  221. _minAgeBox.type = TextFieldType.INPUT;
  222. _minAgeBox.autoSize = TextFieldAutoSize.RIGHT;
  223. _minAgeBox.embedFonts = true;
  224. _minAgeBox.antiAliasType = AntiAliasType.ADVANCED;
  225. _minAgeBox.restrict = '0-9';
  226. _minAgeBox.addEventListener(FocusEvent.FOCUS_OUT, onMinAgeFocusOut);
  227. _minAgeBox.addEventListener(TextEvent.TEXT_INPUT, onTextInput);
  228. addChild(_minAgeBox);
  229. filterLabel = Util.createLabel('До:', filterBackgruond.x + 18, filterBackgruond.y + 69);
  230. filterLabel.setTextFormat(filterLabelFormat);
  231. filterLabel.antiAliasType = AntiAliasType.ADVANCED;
  232. filterLabel.embedFonts = true;
  233. filterLabel.autoSize = TextFieldAutoSize.LEFT;
  234. addChild(filterLabel);
  235. spr = new Sprite();
  236. spr.graphics.beginFill(0xffffff);
  237. spr.graphics.drawRoundRect(filterBackgruond.x + 50, filterBackgruond.y + 72, 83, 15, 12);
  238. spr.graphics.endFill();
  239. addChild(spr);
  240. _maxAgeBox = new TextField();
  241. _maxAgeBox.selectable = true;
  242. _maxAgeBox.x = filterBackgruond.x + 28;
  243. _maxAgeBox.y = filterBackgruond.y + 72;
  244. _maxAgeBox.maxChars = 3;
  245. _maxAgeBox.defaultTextFormat = new TextFormat(Util.tahoma.fontName, 11);
  246. _maxAgeBox.autoSize = TextFieldAutoSize.RIGHT;
  247. _maxAgeBox.type = TextFieldType.INPUT;
  248. _maxAgeBox.embedFonts = true;
  249. _maxAgeBox.antiAliasType = AntiAliasType.ADVANCED;
  250. _maxAgeBox.restrict = '0-9';
  251. _maxAgeBox.addEventListener(FocusEvent.FOCUS_OUT, onMaxAgeFocusOut);
  252. _maxAgeBox.addEventListener(TextEvent.TEXT_INPUT, onTextInput);
  253. addChild(_maxAgeBox);
  254. filterLabel = Util.createLabel('Страна:', filterBackgruond.x + 18, filterBackgruond.y + 92);
  255. filterLabel.setTextFormat(filterLabelFormat);
  256. filterLabel.antiAliasType = AntiAliasType.ADVANCED;
  257. filterLabel.embedFonts = true;
  258. filterLabel.autoSize = TextFieldAutoSize.LEFT;
  259. addChild(filterLabel);
  260. _countryBox = createComboBox(filterBackgruond.x + 20, filterBackgruond.y + 112, 113);
  261. _countryBox.setTextFormat(new TextFormat(Util.tahoma.fontName, 11), true, AntiAliasType.ADVANCED);
  262. _countryBox.horizontalAlign = View.ALIGN_HOR_RIGHT;
  263. _countryBox.addEventListener(ComboBoxEvent.ITEM_SELECT, onFilterChanged);
  264. addChild(_countryBox);
  265. filterLabel = Util.createLabel('Город:', filterBackgruond.x + 18, filterBackgruond.y + 132);
  266. filterLabel.setTextFormat(filterLabelFormat);
  267. filterLabel.antiAliasType = AntiAliasType.ADVANCED;
  268. filterLabel.embedFonts = true;
  269. filterLabel.autoSize = TextFieldAutoSize.LEFT;
  270. addChild(filterLabel);
  271. _cityBox = createComboBox(filterBackgruond.x + 20, filterBackgruond.y + 152, 113);
  272. _cityBox.addEventListener(ComboBoxEvent.ITEM_SELECT, onFilterChanged);
  273. addChild(_cityBox);
  274. }
  275. private function initCurrentUserArea():void {
  276. _currentUserArea = new Sprite();
  277. _currentUserArea.visible = false;
  278. addChild(_currentUserArea);
  279. _currentUserPhoto = new Photo(_scene, null, (Constants.APP_WIDTH - 234) / 2, 176, 234, 317);
  280. _currentUserPhoto.horizontalScale = Photo.HORIZONTAL_SCALE_ALWAYS;
  281. _currentUserArea.addChild(_currentUserPhoto);
  282. _currentUserMorePhotosButton = new LinkButton(_scene, '', 195, 150);
  283. _currentUserMorePhotosButton.setTextFormatForState(new TextFormat(Util.tahoma.fontName, 12, 0x8bbe79, null, null, true), CONTROL_STATE_NORMAL);
  284. _currentUserMorePhotosButton.textField.embedFonts = true;
  285. _currentUserMorePhotosButton.textField.antiAliasType = AntiAliasType.ADVANCED;
  286. _currentUserMorePhotosButton.addEventListener(GameObjectEvent.TYPE_MOUSE_CLICK, onOtherPhotosClick);
  287. _currentUserArea.addChild(_currentUserMorePhotosButton);
  288. _currentUserSetFavoriteButton = new LinkButton(_scene, '', 305, 150);
  289. _currentUserSetFavoriteButton.setTextFormatForState(new TextFormat(Util.tahoma.fontName, 12, 0x63cdff, null, null, true), CONTROL_STATE_NORMAL);
  290. _currentUserSetFavoriteButton.textField.embedFonts = true;
  291. _currentUserSetFavoriteButton.textField.antiAliasType = AntiAliasType.ADVANCED;
  292. _currentUserSetFavoriteButton.addEventListener(GameObjectEvent.TYPE_MOUSE_CLICK, onFavoriteClick);
  293. _currentUserArea.addChild(_currentUserSetFavoriteButton);
  294. _currentUserName = new LinkButton(_scene, null, _currentUserPhoto.x, _currentUserPhoto.y + _currentUserPhoto.photoHeight + INDENT_BETWEEN_CURRENT_PHOTO_AND_NAME,
  295. TextFieldAutoSize.CENTER);
  296. _currentUserName.width = _currentUserPhoto.width;
  297. _currentUserName.height = CURRENT_USER_NAME_HEIGHT;
  298. _currentUserName.setTextFormatForState(new TextFormat(Util.opiumBold.fontName, 16, 0xffe6be, null, null, true), CONTROL_STATE_NORMAL);
  299. _currentUserName.textField.embedFonts = true;
  300. _currentUserName.textField.antiAliasType = AntiAliasType.ADVANCED;
  301. _currentUserName.addEventListener(GameObjectEvent.TYPE_MOUSE_CLICK,
  302. function(event:GameObjectEvent):void {
  303. Util.gotoUserProfile(_currentUser.uid);
  304. }
  305. );
  306. _currentUserArea.addChild(_currentUserName);
  307. _currentUserPhotoComment = Util.createLabel(null, 180, _currentUserPhoto.y + _currentUserPhoto.photoHeight + INDENT_BETWEEN_CURRENT_PHOTO_AND_COMMENT,
  308. _currentUserPhoto.width, CURRENT_PHOTO_COMMENT_HEIGHT);
  309. _currentUserPhotoComment.setTextFormat(new TextFormat(Util.tahoma.fontName, 12, 0xa7b3b4));
  310. _currentUserPhotoComment.embedFonts = true;
  311. _currentUserPhotoComment.multiline = true;
  312. _currentUserPhotoComment.wordWrap = true;
  313. _currentUserArea.addChild(_currentUserPhotoComment);
  314. }
  315. private function initPreviousUserArea():void {
  316. _previousUserArea = new Sprite();
  317. _previousUserArea.visible = false;
  318. addChild(_previousUserArea);
  319. _previousUserPhoto = new Photo(_scene, null, 38, 176, 132, 176);
  320. _previousUserPhoto.horizontalScale = Photo.HORIZONTAL_SCALE_ALWAYS;
  321. _previousUserArea.addChild(_previousUserPhoto);
  322. _previousUserStarIcon = BitmapUtil.cloneImageNamed(Images.BIG_STAR);
  323. _previousUserStarIcon.y = _previousUserPhoto.y + _previousUserPhoto.height + 8;
  324. _previousUserStarIcon.x = 44;
  325. _previousUserArea.addChild(_previousUserStarIcon);
  326. _previousUserDelimiterIcon = BitmapUtil.cloneImageNamed(Images.LINE);
  327. _previousUserDelimiterIcon.x = 38;
  328. _previousUserDelimiterIcon.y = _previousUserPhoto.y + _previousUserPhoto.height + 68;;
  329. _previousUserArea.addChild(_previousUserDelimiterIcon);
  330. _previousUserPhotoRatingAverage = Util.createLabel('0', 38, _previousUserPhoto.y + _previousUserPhoto.height + 3, _previousUserDelimiterIcon.width);
  331. _previousUserPhotoRatingAverage.setTextFormat(new TextFormat(Util.tahoma.fontName, 30, 0xffffff));
  332. _previousUserPhotoRatingAverage.embedFonts = true;
  333. _previousUserPhotoRatingAverage.antiAliasType = AntiAliasType.ADVANCED;
  334. _previousUserPhotoRatingAverage.autoSize = TextFieldAutoSize.CENTER;
  335. _previousUserArea.addChild(_previousUserPhotoRatingAverage);
  336. _previousUserPhotoRatingAverageLabel = Util.createLabel('средний балл', 38, _previousUserPhoto.y + _previousUserPhoto.height + 43, _previousUserDelimiterIcon.width);
  337. _previousUserPhotoRatingAverageLabel.setTextFormat(new TextFormat(Util.opiumBold.fontName, 13, 0xd2dee0));
  338. _previousUserPhotoRatingAverageLabel.embedFonts = true;
  339. _previousUserPhotoRatingAverageLabel.antiAliasType = AntiAliasType.ADVANCED;
  340. _previousUserPhotoRatingAverageLabel.type = TextFieldType.DYNAMIC;
  341. _previousUserPhotoRatingAverageLabel.autoSize = TextFieldAutoSize.CENTER;
  342. _previousUserArea.addChild(_previousUserPhotoRatingAverageLabel);
  343. _previousUserPhotoVotesCountLabel = Util.createLabel('голосовало:', 38, _previousUserPhoto.y + _previousUserPhoto.height + 72, _previousUserDelimiterIcon.width);
  344. _previousUserPhotoVotesCountLabel.setTextFormat(new TextFormat(Util.opiumBold.fontName, 12, 0x86a4a8));
  345. _previousUserPhotoVotesCountLabel.embedFonts = true;
  346. _previousUserPhotoVotesCountLabel.autoSize = TextFieldAutoSize.CENTER;
  347. _previousUserPhotoVotesCountLabel.antiAliasType = AntiAliasType.ADVANCED;
  348. _previousUserArea.addChild(_previousUserPhotoVotesCountLabel);
  349. _previousUserPhotoVotesCount = Util.createLabel('0', 38, _previousUserPhoto.y + _previousUserPhoto.height + 90, _previousUserDelimiterIcon.width);
  350. _previousUserPhotoVotesCount.setTextFormat(new TextFormat(Util.tahoma.fontName, 20, 0xb0dee6));
  351. _previousUserPhotoVotesCount.embedFonts = true;
  352. _previousUserPhotoVotesCount.antiAliasType = AntiAliasType.ADVANCED;
  353. _previousUserPhotoVotesCount.autoSize = TextFieldAutoSize.CENTER;
  354. _previousUserArea.addChild(_previousUserPhotoVotesCount);
  355. }
  356. private function initInviteArea():void {
  357. _inviteArea = new Sprite();
  358. _inviteArea.visible = false;
  359. addChild(_inviteArea);
  360. var backgruond:Bitmap = BitmapUtil.cloneImageNamed(Images.INVITE_BACKGROUND);
  361. backgruond.x = 452;
  362. backgruond.y = 376;
  363. _inviteArea.addChild(backgruond);
  364. _inviteLabel = Util.createLabel('Федя еще не прошел Фейсконтроль?', 465, 380, 140, 60);
  365. _inviteLabel.setTextFormat(new TextFormat(Util.tahoma.fontName, 11, 0xd3d96c));
  366. _inviteLabel.embedFonts = true;
  367. _inviteLabel.antiAliasType = AntiAliasType.ADVANCED;
  368. _inviteLabel.wordWrap = true;
  369. _inviteArea.addChild(_inviteLabel);
  370. _invitePhoto = new Photo(_scene, null, 481, _inviteLabel.y + _inviteLabel.height + INDENT_BETWEEN_INVITE_LABEL_AND_PHOTO, 100, 100);
  371. _invitePhoto.horizontalScale = Photo.HORIZONTAL_SCALE_ALWAYS;
  372. _invitePhoto.verticalScale = Photo.VERTICAL_SCALE_ALWAYS;
  373. _inviteArea.addChild(_invitePhoto);
  374. _inviteButton = new Button(_scene, 469, _invitePhoto.y + _invitePhoto.photoHeight + INDENT_BETWEEN_INVITE_PHOTO_AND_BUTTON);
  375. _inviteButton.setTitleForState('пригласить', CONTROL_STATE_NORMAL);
  376. _inviteButton.setBackgroundImageForState(BitmapUtil.cloneImageNamed(Images.MY_PHOTO_BUTTON_RED), CONTROL_STATE_NORMAL);
  377. _inviteButton.setTextFormatForState(new TextFormat(Util.tahoma.fontName, 10, 0xffffff), CONTROL_STATE_NORMAL);
  378. _inviteButton.textField.embedFonts = true;
  379. _inviteButton.textField.antiAliasType = AntiAliasType.ADVANCED;
  380. _inviteButton.setTextPosition(30, 17);
  381. _inviteButton.addEventListener(GameObjectEvent.TYPE_MOUSE_CLICK, function(event:GameObjectEvent):void {
  382. if (_server && _photo && _hash) {
  383. _vkontakte.wallSavePost(_friend.uid, _server, _photo, _hash);
  384. }
  385. else {
  386. _vkontakte.getPhotoUploadServer();
  387. }
  388. });
  389. _inviteArea.addChild(_inviteButton);
  390. }
  391. public function randomizeFriend():void {
  392. if (_friends && _friends.length > 0) {
  393. _friend = _friends[Util.random(0, _friends.length)];
  394. showInviteArea();
  395. }
  396. }
  397. private function showInviteArea():void {
  398. if (_friend) {
  399. if (_friendPhotoLoader.hasLoaded(_friend.photo_big)) {
  400. _inviteLabel.defaultTextFormat = _inviteLabel.getTextFormat();
  401. switch (_friend.sex) {
  402. case '1':
  403. _inviteLabel.text = _friend.first_name + ' еще не прошла Фейсконтроль?\nПригласи ее и получи 5 монет.';
  404. break;
  405. case '2':
  406. _inviteLabel.text = _friend.first_name + ' еще не прошел Фейсконтроль?\nПригласи его и получи 5 монет.';
  407. break;
  408. }
  409. _invitePhoto.photo = _friendPhotoLoader.get(_friend.photo_big);
  410. _inviteButton.y = _invitePhoto.y + _invitePhoto.photoHeight + INDENT_BETWEEN_INVITE_PHOTO_AND_BUTTON;
  411. _inviteArea.visible = true;
  412. }
  413. else {
  414. _friendPhotoLoader.load(_friend.photo_big, _friend.photo_big, 'Bitmap');
  415. }
  416. }
  417. else {
  418. randomizeFriend();
  419. }
  420. }
  421. public function nextPhoto(obj:Object):void {
  422. _rateBar.rating = 0;
  423. if (!obj.hasOwnProperty('pid')) {
  424. if (_currentUser) {
  425. bigPhoto = null;
  426. if (_currentUser.votes_count) {
  427. if (_previousUser) {
  428. try {
  429. _multiloader.unload(_previousUser.pid);
  430. }
  431. catch (e:Error) {}
  432. }
  433. _previousUser = _currentUser;
  434. previousPhoto();
  435. }
  436. }
  437. _rateBar.enabled = false;
  438. _currentUser = null;
  439. _currentUserName.title = '';
  440. _currentUserPhotoComment.text = '';
  441. Alert.show('Сообщение:', 'Ты проголосовал за всех пользователей. ' +
  442. 'Попробуй изменить фильтр "Я ищу" или пригласи больше друзей.', 'Ок');
  443. }
  444. else {
  445. if (_currentUser && _currentUser.pid != obj.pid) {
  446. if (_previousUser) _toUnload = _previousUser.pid;
  447. _previousUser = _currentUser;
  448. }
  449. if (!_currentUser || _currentUser.pid != obj.pid) {
  450. _multiloader.addEventListener(ErrorEvent.ERROR, multiloaderError);
  451. _multiloader.load(obj.src_big, obj.pid, 'Bitmap');
  452. _multiloader.addEventListener(MultiLoaderEvent.COMPLETE, multiLoaderComplete);
  453. _currentUser = obj;
  454. return;
  455. }
  456. _currentUser = obj;
  457. _currentUserName.title = Util.fullName(_currentUser);
  458. _currentUserPhotoComment.defaultTextFormat = _currentUserPhotoComment.getTextFormat();
  459. _currentUserPhotoComment.text = _currentUser.comment ? _currentUser.comment : '';
  460. _currentUserPhotoComment.visible = true;
  461. _rateBar.enabled = true;
  462. _currentUserSetFavoriteButton.title = (_currentUser.favorite) ? 'Удалить из избранных' : 'Добавить в избранные';
  463. }
  464. PreloaderSplash.instance.resetModal();
  465. }
  466. public function get currentUser(): Object {
  467. return _currentUser;
  468. }
  469. public function vote(obj:Object):void {
  470. PreloaderSplash.instance.showModal();
  471. _currentUser.rating_average = obj.rating_average;
  472. _currentUser.votes_count = obj.votes_count;
  473. Util.api.nextPhoto(Util.viewer_id);
  474. }
  475. private function multiloaderError(event:ErrorEvent):void {
  476. PreloaderSplash.instance.showModal();
  477. Util.api.nextPhoto(Util.viewer_id);
  478. }
  479. private function multiLoaderComplete(event:MultiLoaderEvent):void {
  480. if (_multiloader.hasLoaded(_currentUser.pid)) {
  481. bigPhoto = _multiloader.get(_currentUser.pid);
  482. nextPhoto(_currentUser);
  483. previousPhoto();
  484. try {
  485. if (_toUnload) _multiloader.unload(_toUnload);
  486. _toUnload = null;
  487. }
  488. catch (e:Error) {}
  489. _multiloader.removeEventListener(ErrorEvent.ERROR, multiloaderError);
  490. _multiloader.removeEventListener(MultiLoaderEvent.COMPLETE, multiLoaderComplete);
  491. }
  492. }
  493. private function previousPhoto():void {
  494. _previousUserArea.visible = _previousUser && _previousUser.votes_count;
  495. if (_previousUserArea.visible) {
  496. smallPhoto = _multiloader.get(_previousUser.pid);
  497. _previousUserPhotoRatingAverage.defaultTextFormat = _previousUserPhotoRatingAverage.getTextFormat();
  498. _previousUserPhotoRatingAverage.text = _previousUser.rating_average ? _previousUser.rating_average : '';
  499. _previousUserPhotoVotesCount.defaultTextFormat = _previousUserPhotoVotesCount.getTextFormat();
  500. _previousUserPhotoVotesCount.text = _previousUser.votes_count ? _previousUser.votes_count : '';
  501. }
  502. }
  503. public override function refresh():void {
  504. Util.api.mainPhoto(_currentUser.uid);
  505. }
  506. public function updateFilter():void {
  507. _sexBox.removeEventListener(ComboBoxEvent.ITEM_SELECT, onFilterChanged);
  508. _countryBox.removeEventListener(ComboBoxEvent.ITEM_SELECT, onFilterChanged);
  509. _cityBox.removeEventListener(ComboBoxEvent.ITEM_SELECT, onFilterChanged);
  510. switch (_filter.sex) {
  511. case '1':
  512. _sexBox.selectedItem = Constants.SEX_FEMALE;
  513. break;
  514. case '2':
  515. _sexBox.selectedItem = Constants.SEX_MALE;
  516. break;
  517. default:
  518. _sexBox.selectedItem = Constants.SEX_BOTH;
  519. break;
  520. }
  521. if (_filter.age_min) {
  522. var format:TextFormat = _minAgeBox.getTextFormat();
  523. _minAgeBox.text = (_filter.age_min == 60) ? '60+' : _filter.age_min;
  524. _minAgeBox.setTextFormat(format);
  525. }
  526. if (_filter.age_max) {
  527. format = _maxAgeBox.getTextFormat();
  528. _maxAgeBox.text = (_filter.age_max == 60) ? '60+' : _filter.age_max;
  529. _maxAgeBox.setTextFormat(format);
  530. }
  531. _countryBox.clear();
  532. if (Util.user.country_name) {
  533. _countryBox.addItem(Util.user.country_name);
  534. }
  535. _countryBox.addItem(COUNTRY_DEFAULT);
  536. _countryBox.selectedItem = (_filter.country) ? _filter.country : COUNTRY_DEFAULT;
  537. _cityBox.clear();
  538. if (Util.user.city_name) {
  539. _cityBox.addItem(Util.user.city_name);
  540. }
  541. _cityBox.addItem(CITY_DEFAULT);
  542. _cityBox.selectedItem = (_filter.city) ? _filter.city : CITY_DEFAULT;
  543. _sexBox.addEventListener(ComboBoxEvent.ITEM_SELECT, onFilterChanged);
  544. _countryBox.addEventListener(ComboBoxEvent.ITEM_SELECT, onFilterChanged);
  545. _cityBox.addEventListener(ComboBoxEvent.ITEM_SELECT, onFilterChanged);
  546. }
  547. private function createComboBox(x:int, y:int, width:int):ComboBox {
  548. var spr: Sprite = new Sprite();
  549. spr.graphics.beginFill(0xffffff);
  550. spr.graphics.drawRoundRect(0, 0, width, 15, 12);
  551. spr.graphics.endFill();
  552. var sprD: Sprite = new Sprite();
  553. sprD.graphics.beginFill(0xffffff);
  554. sprD.graphics.drawRect(0, 0, width, 15);
  555. sprD.graphics.endFill();
  556. var sprDmask: Sprite = new Sprite();
  557. sprDmask.graphics.beginFill(0xffffff);
  558. sprDmask.graphics.drawRoundRect(0, 0, width, 30, 12);
  559. sprDmask.graphics.endFill();
  560. sprD.mask = sprDmask;
  561. var bd: BitmapData = new BitmapData(width, 15, true, undefined);
  562. bd.draw(spr);
  563. var bdDropped: BitmapData = new BitmapData(width, 15, true, undefined);
  564. bdDropped.draw(sprD);
  565. var box:ComboBox = new ComboBox(_scene);
  566. box.setDropListHoverColor(0xd0d0d0, 1, 0xababab, 1);
  567. box.bitmap = new Bitmap(bd);
  568. box.bitmapDropped = new Bitmap(bdDropped);
  569. box.dropIcon = new Bitmap(BitmapUtil.cloneImageNamed(Images.CHOOSE_BUTTON).bitmapData);
  570. box.setTextFormat(new TextFormat(Util.tahoma.fontName, 11), true, AntiAliasType.ADVANCED);
  571. box.horizontalAlign = View.ALIGN_HOR_RIGHT;
  572. box.x = x;
  573. box.y = y;
  574. box.width = width;
  575. box.height = 15;
  576. return box;
  577. }
  578. public override function destroy():void {
  579. while (numChildren > 0) {
  580. removeChildAt(0);
  581. }
  582. super.destroy();
  583. }
  584. public function get bigPhoto():Bitmap {
  585. return _currentUserPhoto.photo;
  586. }
  587. public function set bigPhoto(image:Bitmap):void {
  588. if (image) {
  589. _currentUserPhoto.frameIndex = _currentUser.frame;
  590. _currentUserPhoto.photo = image;
  591. _currentUserMorePhotosButton.title = Util.getMorePhotoString(_currentUser.sex);
  592. _currentUserSetFavoriteButton.title = (_currentUser.favorite) ? 'Удалить из избранных' :
  593. 'Добавить в избранные';
  594. _currentUserName.y = _currentUserPhoto.y + _currentUserPhoto.photoHeight + INDENT_BETWEEN_CURRENT_PHOTO_AND_NAME;
  595. _currentUserPhotoComment.y = _currentUserPhoto.y + _currentUserPhoto.photoHeight + INDENT_BETWEEN_CURRENT_PHOTO_AND_COMMENT;
  596. _currentUserArea.visible = true;
  597. randomizeFriend();
  598. } else {
  599. _currentUserArea.visible = false;
  600. _currentUserPhoto.photo = null;
  601. }
  602. }
  603. public function set smallPhoto(image:Bitmap):void {
  604. if (image) {
  605. _previousUserPhoto.photo = image;
  606. _previousUserPhoto.frameIndex = _previousUser.frame;
  607. var photoBottomY:int = _previousUserPhoto.y + _previousUserPhoto.photoHeight;
  608. _previousUserStarIcon.y = photoBottomY + INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_STAR_ICON;
  609. _previousUserDelimiterIcon.y = photoBottomY + INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_DELIMITER_ICON;
  610. _previousUserPhotoRatingAverage.y = photoBottomY + INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_RATING_AVERAGE;
  611. _previousUserPhotoRatingAverageLabel.y = photoBottomY + INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_RATING_AVERAGE_LABEL;
  612. _previousUserPhotoVotesCountLabel.y = photoBottomY + INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_VOTES_COUNT_LABEL;
  613. _previousUserPhotoVotesCount.y = photoBottomY + INDENT_BETWEEN_PREVIOUS_USER_PHOTO_AND_VOTES_COUNT;
  614. }
  615. }
  616. public function set filter(obj:Object):void {
  617. _filter = obj;
  618. updateFilter();
  619. }
  620. public function onRateClicked(event:GameObjectEvent):void {
  621. PreloaderSplash.instance.showModal();
  622. Util.api.vote(_currentUser.pid, _rateBar.rating);
  623. }
  624. public function onFilterChanged(event:ComboBoxEvent):void {
  625. saveFilters();
  626. }
  627. public function onTextInput(event:TextEvent):void {
  628. if (event.target.length + event.text.length > 2) {
  629. event.preventDefault();
  630. }
  631. }
  632. public function onMinAgeFocusOut(event:FocusEvent):void {
  633. var format:TextFormat = _minAgeBox.getTextFormat();
  634. if (_minAgeBox.length > 0) {
  635. if (_minAgeBox.text != '60+') {
  636. var age:int = int(_minAgeBox.text);
  637. if (age < 8) _minAgeBox.text = '8';
  638. else if (age >= 60) _minAgeBox.text = '60+';
  639. }
  640. }
  641. else _minAgeBox.text = '8';
  642. _minAgeBox.setTextFormat(format);
  643. var ageMin:int = _minAgeBox.text == '60+' ? 60 : int(_minAgeBox.text);
  644. var ageMax:int = _maxAgeBox.text == '60+' ? 60 : int(_maxAgeBox.text);
  645. if (ageMax < ageMin) {
  646. format = _maxAgeBox.getTextFormat();
  647. _maxAgeBox.text = _minAgeBox.text;
  648. _maxAgeBox.setTextFormat(format);
  649. }
  650. saveFilters();
  651. }
  652. public function onMaxAgeFocusOut(event:FocusEvent):void {
  653. var format:TextFormat = _maxAgeBox.getTextFormat();
  654. if (_maxAgeBox.length > 0) {
  655. if (_maxAgeBox.text != '60+') {
  656. var age:int = int(_maxAgeBox.text);
  657. if (age < 8) _maxAgeBox.text = '8';
  658. else if (age >= 60) _maxAgeBox.text = '60+';
  659. }
  660. }
  661. else _maxAgeBox.text = '8';
  662. _maxAgeBox.setTextFormat(format);
  663. var ageMin:int = _minAgeBox.text == '60+' ? 60 : int(_minAgeBox.text);
  664. var ageMax:int = _maxAgeBox.text == '60+' ? 60 : int(_maxAgeBox.text);
  665. if (ageMin > ageMax) {
  666. format = _minAgeBox.getTextFormat();
  667. _minAgeBox.text = _maxAgeBox.text;
  668. _minAgeBox.setTextFormat(format);
  669. }
  670. saveFilters();
  671. }
  672. private function saveFilters():void {
  673. var sex:int = _sexBox.selectedIndex + 1;
  674. var ageMin:int = _minAgeBox.text == '60+' ? 60 : int(_minAgeBox.text);
  675. var ageMax:int = _maxAgeBox.text == '60+' ? 60 : int(_maxAgeBox.text);
  676. var city:String = null;
  677. var country:String = null;
  678. if (_cityBox.selectedItem != CITY_DEFAULT) {
  679. city = Util.user.city;
  680. }
  681. if (_countryBox.selectedItem != COUNTRY_DEFAULT) {
  682. country = Util.user.country;
  683. }
  684. PreloaderSplash.instance.showModal();
  685. Util.api.saveSettings(Util.viewer_id, sex, ageMin, ageMax, city, country);
  686. }
  687. public function onOtherPhotosClick(event: GameObjectEvent): void {
  688. PreloaderSplash.instance.showModal();
  689. AllUserPhotoForm.instance.returnForm = this;
  690. AllUserPhotoForm.instance.user = _currentUser;
  691. AllUserPhotoForm.instance.show();
  692. }
  693. public function onFavoriteClick(event: GameObjectEvent):void {
  694. PreloaderSplash.instance.showModal();
  695. if (_currentUser.favorite) {
  696. Util.api.deleteFavorite(Util.viewer_id, _currentUser.uid);
  697. }
  698. else {
  699. Util.api.addFavorite(Util.viewer_id, _currentUser.uid);
  700. }
  701. }
  702. public override function show():void {
  703. if (_scene) {
  704. for (var i:int = 0; i < _scene.numChildren; ++i) {
  705. if (_scene.getChildAt(i) is Form) {
  706. var form:Form = _scene.getChildAt(i) as Form;
  707. form.visible = (form is MainForm);
  708. }
  709. }
  710. }
  711. }
  712. }
  713. }