Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Раздвижные блоки (http://www.flasher.ru/forum/showthread.php?t=162445)

kaploson 01.08.2011 18:31

Раздвижные блоки
 
Всем доброго времени суток!
Подскажите пожалуйста новичку!

Мне надо сделать так что бы я мог информацию в виде текста помещать в блок ( ну так называемый квадрат просто ) и что бы этот блок раскрывался и складывался показывая тем самым всю и лишь часть информации!

Помогите пожалуйста как реализовать сию мысль? Я вообще не имею понятия как это сделать((

Заранее очень признателен. Извиняюсь сразу за некорректность поставленной задачи, я надеюсь более менее все поняли что мне требуется сделать.

Wolsh 01.08.2011 22:16

Например, у спрайта есть свойство scrollRect

kaploson 02.08.2011 12:10

А можно по подробнее объяснить мне процесс реализации? А то я никак не могу понять как мне заставить такую вещь после клика по ней раздвигаться и сдвигаться соответственно после нажатия на другую...

Wolsh 02.08.2011 13:01

Так... определитесь, в первом посте был простой хайдер – нажал-открылся, нажал-закрылся.
Сейчас Вы говорите о закрытии при нажатии на ДРУГОЙ блок. А это уже не хайдер, а что-то типа Аккордеона. Уточните ТЗ))

Добавлено через 7 минут
Main.as
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.text.TextFormat;
        import Hider;
/* * * * * * * * * *
*                  *
*  @author wolsh  *
*                  *
\* * * * * * * * * */

        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.showDefaultContextMenu = false;
                        // entry point
                        var s:String = "Мне надо сделать так что бы я мог информацию в виде текста помещать в блок ( ну так называемый квадрат просто ) и что бы этот блок раскрывался и складывался показывая тем самым всю и лишь часть информации!";
                        var hider1:Hider = new Hider(150, 50, 250, s, new TextFormat("Arial", 12, 0x666666));
                        addChild(hider1);
                        hider1.x = 100;
                        hider1.y = 100;
                }
 
        }
 
}

Hider.as
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Rectangle;
        import flash.text.TextField;
        import flash.text.TextFormat;
 
/* * * * * * * * * *
*                  *
*  @author wolsh  *
*                  *
\* * * * * * * * * */

        public class Hider extends Sprite
        {
                private var _text                :String;
                private var _format                :TextFormat;
                private var _txf                :TextField;
                private var _width                :Number;
                private var _minHeight        :Number;
                private var _maxHeight        :Number;
                private var _hided                :Boolean = true;
 
                public function Hider(width:Number, minHeight:Number, maxHeight:Number, text:String, format:TextFormat)
                {
                        _maxHeight = maxHeight;
                        _minHeight = minHeight;
                        _width = width;
                        _format = format;
                        _text = text;
                        if (stage)
                        {
                                init();
                        }
                        else
                        {
                                addEventListener(Event.ADDED_TO_STAGE, init);
                        }
                }
 
                private function init(event:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // создаем текстовое поле для контента.
                        _txf = new TextField();
                        _txf.defaultTextFormat = _format;
                        _txf.multiline = true;
                        _txf.wordWrap = true;
                        _txf.mouseEnabled = false;
                        _txf.width = _width - 20;
                        _txf.x = 10;
                        _txf.htmlText = _text;
                        _txf.height = Math.min(_maxHeight, _txf.textHeight + 4);
                        addChild(_txf);
                        // рисуем фончик, он нужен также для реакции на клик. Можно сделать его прозрачным, задав не 1 а 0 вторым параметром beginFill().
                        this.graphics.beginFill(0xEEEEEE, 1);
                        this.graphics.drawRect(0, 0, _width, this.height);
                        this.scrollRect = new Rectangle(0, 0, _width, _minHeight);
                        // начинаем слушать клик
                        this.addEventListener(MouseEvent.CLICK, clickHandler);
                }
 
                private function clickHandler(event:MouseEvent):void
                {
                        // меняем режим.
                        _hided = !_hided;
                        if (_hided)
                        {
                                // если скрытый - задаем прямоугольник отображения с минимальной высотой, иначе - с максимальной.
                                this.scrollRect = new Rectangle(0, 0, _width, _minHeight);
                        }
                        else this.scrollRect = new Rectangle(0, 0, _width, _maxHeight);
                }
        }
 
}


kaploson 02.08.2011 13:25

Мне необходимо что бы именно как аккордеон был, так вы это назвали, то есть в при нажатии на один блок он раскрывается, а потом при нажатии на другой, первый закрывается)
Извините за не правильную формулировку изначальную)

Добавлено через 20 минут
А и вот еще сама суть проблемы и ради чего я это все спросил в том, что
возник вопросик с выводом данных из БД. Сейчас вывод происходит в таблицу.. (DataGrid), а нужно сделать вывод строчный. Это связано с дизайном приложения.

Код AS3:

private function newslist(e:Event):void
            var b;
            var h=e.target.data;
            h=h.split("_");
            for (var i = 0; i < (h.length-1); i++)         
            {
                b=h[i].split(":");
 
                dp.addItem({pid:b[0], uid:b[1], Name:b[2], News:b[3], Information:b[6] , date:b[4]});
                            }         
 
            list.x=220;
            list.y=125;
            list.resizableColumns=false;
            list.setSize(500,600);         
            list.columns=["Name", "News", "Information","date"];
            list.getColumnAt(3).width=80;
            list.getColumnAt(2).width=50
            list.getColumnAt(1).width=170;
            list.getColumnAt(0).width=120;
            list.dataProvider=dp;
            list.doubleClickEnabled=true;
            list.addEventListener(ListEvent.ITEM_CLICK,goon);
            scene.addChild(list);     
 
        }

Тоесть сейчас вывод таблицей такой |Имя|Новость|Информация|дата|,
а нужно вывести в такой вид
Имя Новость Информация (какая нибудь кнопка ) дата.
По принципу раскрывающегося блока, ну то есть когда блок скрыт видно только треть информации, а при нажатии на него всю.
Ну тоесть свобода размещения и форматирования.
Подскажите пожалуйста.

вот php код:

PHP код:

while ($row mysql_fetch_array($result))
 {
        echo 
$name.":".$date.":".$information.":".$news."_";
 } 

Добавлено через 3 часа 7 минут
И извините за нубский вопрос... но я никак не пойму что именно мне сделать кодом, который вы предоставили =(
Объясните пожалуйста(

Wolsh 02.08.2011 16:32

Опять не понял(( Может на солнце пятна и телепатические способности мои пофиксились.. Как-то ваш текст трояко можно понять.. могли бы вы сварганить картинку, как примерно эти "строки" должны выглядеть закрытые и раскрытые? Я так понимаю, что "новость" и "информация" это не два-три слова, как это все долно быть размещено в блоке? Не представляю. Изобразите? Хоть в гуглдоках))

kaploson 02.08.2011 17:15

http://cs5126.vkontakte.ru/u2473597/...x_7e9b3916.jpg

Вот я накидал картинку =) Вот что-то такое мне требуется =)

Добавлено через 5 минут
А вот тут если как должно быть на самом деле, примерно конечно это просто в FS накидал =)

http://cs5126.vkontakte.ru/u2473597/...x_981e0e9e.jpg

Wolsh 03.08.2011 00:09

Вложений: 1
Вот пример, проект для FlashDevelop, не знаю каким редактором пользуетесь Вы и сможете ли переделать под Флэш ИДЕ если что.
В локальном плеере свфка (лежит в bin/) скорее всего не запустится, не сможет загрузить xml (имитирует ответ сервера)), если не добавить проект в доверенную директорию или не открыть в ФД. Разбирайтесь, удачи)))

kaploson 03.08.2011 11:12

Вообще все делаю =) Adobe Flash Professional CS5 =)
Спасибо большое =) Буду сейчас пытаться =)

Wolsh 03.08.2011 13:19

Вложений: 1
Ок. Вот для CS5.

kaploson 03.08.2011 15:37

Спасибо большое за помощь=)) буду пытаться сейчас =))

Добавлено через 22 минуты
Спаасибо огромное это именно то что нужно =))))) Просто анреал помогли)))
Только вопросик такой есть еще последний, а зачем все так разбито? Ведь можно все соединить во едино? =)
И ведь я смогу туда впихивать данные из своей БД? по тому же принципу как вы из XML =)

Drac0Sha 09.08.2011 12:14

Здравствуйте, а хотел поинтересоваться, вот эти раздвижные блоки у вас реализованы не как объекты сцены, а если у меня приложение всё на сценах построено...как мне раздвижные блоки порой убирать...

более подробно.
при нажатии на определенную кнопку
у меня срабатывает скрипт с раздвижными блоками
выдаёт мне информацию
затем при нажатии на другую кнопку у меня он должен убрать её.

как если со сценой listbool

Wolsh 09.08.2011 12:43

Drac0Sha, к сожалению Вам я не могу ничем помочь, ибо во Flash IDE вообще не работаю и никогда за всю жизнь, ни разу, не пользовался Сценами. Я не мультипликатор, а Программы не делаются на таймлайне, сорри.
kaploson, "все так разбито" для удобства, это основы ООП - выделяется область связной функциональности и оформляется в отдельный Объект, в котором эта функциональность может быть обособлена от остального кода (инкапсулирована). Объект выполняет какие-то функции по запросу извне, но как он это делает – остальному коду "неизвестно", он только спрашивает и получает ответ, или просит что-то сделать и Объект это делает. Что при этом происходит в самом объекте – никого не трогает, это его "личное дело", "секрет фирмы". Это упрощает обслуживание кода и его повторное использование. Например, если я захочу изменить отображение "системных" блочков в этом проекте, мне не надо ворошить 10000 строк кода – я открою файл IconLabel.as и внесу требуемые изменения; и не менее важно, что в ДРУГОМ проекте мне не надо копипастить и как-то подгонять под остальной код эту функциональность - я просто беру уже готовый класс IconLabel и использую его, если надо - расширяю. Вы это делаете постоянно с классами, данными Адобом вместе с Флэш. С кастомными классами та же история, если делать их грамотно, не хардкодить (не забивать жестко настройки, а давать возможность настраивать объект извне), получится со временем своя библиотека классов, которые можно использовать в разных проектах повторно - еще одна из важных концепций ООП, универсальность.
2. Конечно сможете, я в Вас верю)) Ничто технически этому не мешает. Я использовал XML просто потому что тогда для показа примера не нужен сервер и серверный скрипт, и база данных)))))) Получение и разбор данных будут другие, но вопрос то ваш был не об этом, а о раздвижных блоках. И это тоже относится к разделению обязанностей между Объектами. В идеале должно получаться так, что получением и разбором данных занимается специальный объект лоадер/парсер данных, а показом их на экране – другой объект-визуализатор. Чем слабже связанность между ними, тем лучше. В идеале вы должны иметь возможность в любой момент поменять лоадер-парсер с XMLного на JSONовский или любой другой формат общения с сервером, НЕ ЗАТРАГИВАЯ при этом визуализатор.
Надеюсь, я не слишком тут сложно изъяснялся... Удачи еще раз.

Котяра 09.08.2011 13:04

Цитата:

ведь я смогу туда впихивать данные из своей БД? по тому же принципу как вы из XML =)
Данные из БД вы всё равно будете пихать не напрямую, а, например, через тот же XML.

kaploson 09.08.2011 13:10

Спасибо большое, за такой развернутый ответ, буду сидеть все изучать =))

Drac0Sha 09.08.2011 13:10

ну я программу не на таймлане делаю. просто пользуюсь addChild
а с раздвижными блоками насколько понял так нельзя
ничего так же не получилось и с методом DisplayObjectContainer

Wolsh 09.08.2011 13:19

Тогда поясните, что у Вас "сцены". Возможно загвоздка в терминологии)

Drac0Sha 09.08.2011 13:52

у меня два вопроса теперь к вам, если вам не трудно ответить )

1.насчёт "сцен"
все объекты, которые выводятся на экран при нажатии той или иной кнопки, вызываемые scene.addChild
я назвал сценами
и их можно убрать с помощью листбула
ааа
с раздвижными блоками немного не ясно как это происходит )

2.
Код:

  <?xml version="1.0" encoding="utf-8" ?>
- <data>
- <topic>
  <date>02.08.2011 12:42</date>
  <user>Дмитрий</user>
  <age>18</age>
  <title>Нужна помощь!</title>
  <message>Изучаю флэш, но пока что плохо получается...</message>
  </topic>
- <topic>
  <date>22.07.2011 10:15</date>
  <user>Chamberlen</user>
  <age>22</age>
  <title>чо как..</title>
  <message>А чо такой этат флещь?...</message>
  </topic>
- <topic>
  <date>28.06.2011 02:12</date>
  <user>Инт3грат0ръ</user>
  <age>16</age>
  <title>WTF???</title>
  <message>Не пойму как зафаззить бинарный аспект в акцидентном итераторе комплексного 3D-массива на слабосвязанных акцепторах. Расшифруйте пожалуйста?</message>
  </topic>
- <topic>
  <date>08.07.2011 22:02</date>
  <user>X0tT@6bl4</user>
  <age>648</age>
  <title>Salam!</title>
  <message>I wanna learn you, how it feels</message>
  </topic>
- <topic>
  <date>30.06.2011 05:31</date>
  <user>Сергий Отрышкин</user>
  <age>12</age>
  <title>Сделал игру!!! Помогите запустить!!</title>
  <message>Штота типо кваки с олиментыми как мазафект две. Жму контрал ентер - а оно не едит!</message>
  </topic>
  </data>

это у вас в файле data.xml
у меня естественно другой
и тэги другие
при нажатии
в Charles смотрел с сервера выводит так как надо
а на экран нет
в чем может быть проблема!?

Wolsh 09.08.2011 14:24

кто такой листбул?
кто такой Charles?
другие теги - надо и парсить эти другие теги, а не мои.
Слушайте, я привел пример, как сделать блоки. Это пример, не универсальный фреймворк и даже не компонент. Вы можете использовать идею, КАК, но вряд ли можно просто скопипастить код. Надо его понять и написать свой. Это не мой подарок человечеству, это только подсказка, как можно реализовать.

Drac0Sha 09.08.2011 15:10

1. первый вопрос отклоняется )
2.я понимаю, и я пытаюсь понять сразу на примере. я и парьсю естественно другие теги.
извините, что потревожил ) спасибо в любом случаи )
попытаюсь разорабраться )

Wolsh 09.08.2011 15:25

Немного прокомментирую писанину.
Сначала создал класс ИнфоБлок. Это дисплейный объект-контейнер, поэтому наследуем Спрайт. У ИнфоБлока будет 2 состояния - скрытый и раскрытый. Их отличие - в кол-ве элементов и соответственно в размере. В скрытом состоянии показывается несколько элементов, их сразу добавляем в контейнер и они сразу отображаются. А дополнительный элемент - в данном случае это одно текстовое поле - будет показываться (добавляться в контейнер отображения) только в режиме "раскрытый". Фон блока будет перерисовываться при изменении режимов в соответствии с новым размером контента. Само собой, кол-во и порядок элементов для режимов вы определяете сами и дописываете соответствующий код сами.
Для перехода из одного состояния в другое сделаем либо два метода-переключалки, либо один метод с передачей параметра Режим, либо его вариант - просто сеттер, как у меня, устанавливающий флаг "скрытый/не скрытый", и запускающий метод, непосредственно меняющий отображение. Вот и весь ИнфоБлок. Можно было бы сделать внутреннюю реализацию реагирования на мышь, но я оставил эту заботу внешнему менеджеру, чтобы позволить ему решать логику при работе с несколькими такими блоками. Ведь если блок будет сам раскрываться /закрываться только при нажатии на него, как нам реализовать закрытие других блоков при открытии одного? Блоки надо связать в систему, которая будет контролировать их все. Лучше было бы сделать отдельный класс, но я написал это все в Мейне, видимо из лени или чтобы не усложнять вам восприятие.
Менеджер работает с массивом ИнфоБлоков. Когда лоадер загрузил данные, парсер пробежался по списку и создал нужное кол-во ИнфоБлоков, передав им необходимые фрагменты этих данных для отображения. Создавая блок, он тут же записывает ссылку на него в массив для Менеджера, и блоку добавляется листенер клика мыши для обработки функциями менеджера. Когда блок кликают, менеджер определяет, что это за блок конкретно и вызывает у него сеттер состояния, меняя его на противоположное. Размер блока меняется, и менеджеру надо закрыть остальные блоки и сместить их для сохранения правильного расположения. Менеджер пробегается по всему массиву блоков, вызывая у каждого незакрытого блока (кроме активного) переход в состояние "закрытый" и смещает его в новое упорядоченное положение.
Вот и всё.

Drac0Sha 10.08.2011 13:12

спасибо большое! очень Вам благодарен !

Wolsh 10.08.2011 15:06

Здесь Мейн можно рассматривать как контейнер для блоков, он же менеджер. Надо только вычленить из него загрузчик данных, и тогда можно этот контейнер с блоками добавлять на сцену и убирать с нее. Возможно надо будет также подкрутить init(), чтобы блоки не создавались заново при добавлении контейнера на сцену. Хотя отписки от ADDED_TO_STAGE должно хватить).
В классе ИнфоБлок также остались ненужные фичи - диспатч событий и константы типов для этих событий. Это как раз для варианта с встроенной обработкой нажатия на блок. Блок должен был бы закрыться/раскрыться и послать соответствующее событие. На это событие должен был быть подписан менеджер, и он произвел бы нужные действия. В результате я сделал проще, вынеся всю логику в менеджер и "ужесточив" контроль над "детьми".

fljot 10.08.2011 15:13

Кстати, интересно как сделать аккордеон, в котором возможны несколько параллельных анимаций (несколько закрываются, одно открывается) и при этом всё по целым пикселям. Кому-нибудь приходилось делать?

Drac0Sha 10.08.2011 15:56

то есть я правильно понимаю, что ADDED_TO_STAGE из DisplayObject отвечает за то что контэйнер виден или не виден при нажатии!?

Wolsh 10.08.2011 16:58

Нет.
ADDED_TO_STAGE это Событие, которое DO отправляет, когда его помещают в Список Отображения (Display List). События ни за что не "отвечают". Они только информируют.

Drac0Sha 11.08.2011 12:07

а ещё, можно спросить!? )

если я хочу добавить в контэйнер кнопку
то мне надо её определять в InfoBlock
её координаты
но если её там определять
а функция, которая вызывается находится в Main
или правильно определить в Main саму кнопку!?

Wolsh 11.08.2011 13:26

Я бы, наверное, повесил слушатель на кнопку в ИнфоБлоке, но посылал из него событие "кнопку нажали", а при создании ИнфоБлока подписывал Мейн на это событие от него. То есть вариант с промежуточной ловлей и пересылкой.
кнопка Событие CLICK InfoBlock#clickHandler Событие MY_BUTTON_CLICKED Main#InfoBlockButtonClickHandler

kaploson 11.08.2011 15:34

Снова здравствуйте!

Хотел спросить, вот у меня получается так, я вывожу на экран раздвижные блоки. А потом мне надо их убрать. Этого не происходит и получается только накладывание друг на друга...((

Где мой касяк? ( Никак не могу разобраться... Подскажите плиз...

2Sun 11.08.2011 15:37

removeChildAt() уже пробовали?

kaploson 11.08.2011 16:47

Пробовал, removeChild ... Проблема в том что я не знаю, куда именно его нужно поместить ( Так как, если я пишу в функции, где вызываю, то у меня сразу удаляются блоки, а если в другой, то выдает ошибку, потому что не может найти, что я его вызываю...

=( Вот так вот =(

2Sun 11.08.2011 16:54

Так вы же вроде и хотели удалить блоки? Ничего не понял. Какие блоки удаляются, а какие добавляются?

kaploson 11.08.2011 17:07

Прости за непонятное объяснение( Суть вот в чем:

1.при нажатии на кнопку выходит дисплейный объект-контейнер из xml файла
2.при нажатии на другую кнопку (вне контейнера) дисплейный объект-контейнер пропадает

а то у меня сейчас
накладывается друг на друга.
вот так вот как-то =) Надеюсь так грамотнее объяснил)

2Sun 11.08.2011 17:16

ну так а что мешает по нажатию на вторю кнопку запустить процесс обратный нажатию на первую?
Чым тэбе породыв - тым и вбью! (с) Тарас Бульба.

kaploson 11.08.2011 17:21

Проблема в том что, при нажатии на другую кнопку я уже очищаю сцену removeChildAt, но убирается все кроме именно блоков (контейнер) если я добавляю везде removeChild(BlockContainer), то ничего не работает((
Но и ошибок не выдает(

В чем тут может быть проблема?

2Sun 11.08.2011 17:32

Мощнейшая вспышка на Солнце заблокировала мой телепатический канал к вашему жесткому диску. Код покажите как создаете и как удаляете.

У Вас на блоках слушатели не стоят? Вы их удалять не забываете предварительно?

kaploson 11.08.2011 17:39

Код AS3:

private function dataCompleteHandler(event:Event):void 
  {
  var data:XML = new XML( (event.currentTarget as URLLoader).data );
  var parties:XMLList = data.party;
  var blocksContainer:Sprite = new Sprite();
  addChild(blocksContainer);
  blocksContainer.x = blocksContainer.y = 130;
 
  var blockHeight:Number = 0;
  for (var i:uint = 0; i < parties.length(); i++)
  {
    var block:InfoBlock = new InfoBlock(parties[i]);
    block.y = blockHeight;
    blockHeight += block.height + 1;
    block.addEventListener(MouseEvent.CLICK, infoBlockClickHandler);
    blocksContainer.addChild(block);
    _blocksArray.push(block);
  }
  }
 
private function infoBlockClickHandler(event:MouseEvent):void
  {
 
  var blockC:InfoBlock = event.currentTarget as InfoBlock;
  blockC.hiden = !blockC.hiden;
  var blockHeight:Number = 0;
  for (var i:uint = 0; i < _blocksArray.length; i++)
  {
    var block:InfoBlock = _blocksArray[i];
    if (block !== blockC)
    {
    if (!block.hiden) block.hiden = true;
    }
    block.y = blockHeight;
    blockHeight += block.height + 1;
  }
  }

Так мне написал сделать Wolsh, все работает отлично, вот только говорю не могу разобраться с удалением.
Здесь происходи вызов InfoBlock.

2Sun 11.08.2011 17:56

Так здесь то понятно , что работает. А удаляете чем? Можно код кнопки?
Запустите по нажатию кнопки такую процедуру
Код AS3:

while (blocksContainer.numChildren)
{
blocksContainer.removeChildAt(0);
_blocksArray.splice(0,1)
}
removeChild(blocksContainer);

Должно все обнулится и исчезнуть

Wolsh 11.08.2011 18:25

В моем коде ссылка на blocksContainer есть только в хендлере загрузки XML. Естественно, что Вы не сможете достучаться до него. Вынесите эту ссылку в поле класса
Код AS3:

private var blocksContainer:Sprite = new Sprite();

(cоответственно уберите строку var blocksContainer:Sprite = new Sprite(); из функции dataCompleteHandler)
И когда надо убрать контейнер с блоками со сцены, в хендлере кнопки удаления пишете просто
Код AS3:

removeChild(blocksContainer);


kaploson 11.08.2011 18:40

Спасибо огромное!!! =) Теперь все наконец-то заработало)) слепой я просто не много видать =))
Все похоже делал, немного ошибся просто))

Добавлено через 17 часов 12 минут
Вот я сделал =) так =)
Код AS1/AS2:

if (listbool==1) 
  {
    removeChild(blocksContainer);
    var temp=scene.numChildren
    for(var i=0;scene.numChildren!=0;)
    {
    scene.removeChildAt(i);
    //list.removeAll();
    }
 
  }
  else
  {
    listbool=1;   
  }

Работает плохо... Убирается сначала при переходе на другую кнопку,
а потом все блокируются...
И я вновь не знаю в чем дело =(


Часовой пояс GMT +4, время: 08:39.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.