Просмотр полной версии : Двойной щелчок и правая кнопка.
Danilishin
30.08.2004, 16:21
Подскажите, как программируется двойной щелчок левой кн. мыши и как щелчок правой?
здесь (http://www.flasher.ru/forum/showthread.php?s=&threadid=59399) есть это под N10 и N16.
А, впрочем, поиск рулит.
Nox Noctis
30.08.2004, 16:57
кстати вот подправленный исходник для даблклика
в АС2 почему-о сменили названия
в шестёрке было: ASBroadcaster
в семёрке стало: AsBroadcaster
разница всего лишь в одной заглавной букве - а ничего под семёрку не будет работать иначе.
// ________________________________________________
// ___________ Global DoubleClick Event ___________
var m = _global.$MouseEventHandler={};
ASSetPropFlags(_global, "$MouseEventHandler", 7, 8);
//
m.isDouble = function() {
if (!this.clickFlag) {
if (!this.clickTimeout) {
this.clickTimeout = 300;
}
this.clickFlag = setInterval(this, "cancelDouble", this.clickTimeout);
} else {
Mouse.broadcastMessage("onDoubleClick");
this.cancelDouble();
}
};
m.cancelDouble = function() {
if (this.clickFlag) {
clearInterval(this.clickFlag);
delete this.clickFlag;
}
};
m.onMouseMove = m.cancelDouble;
m.onMouseDown = m.isDouble;
Mouse.addListener(m);
//
// the time between clicks in msec
m.clickTimeout = 400;
// *******************************
delete m;
// ________________________________________________
//
// **** EXAMPLE ****
//
_root.onDoubleClick = function() {
trace(this+" doubleclicked!");
};
Mouse.addListener(_root);
эх прям горе с вами)))
вот вам дабл клик при помощи гет таймера , пашет хоть в семерке хоть в шестерке да везде блин )))
artfla$her
31.08.2004, 00:42
в АС2 почему-о сменили названия
Ага, я твой урок прочитал про создание событий,а у меня 7-мой стоял ))) Ну и долгое время чувтсвовал себя каким-то отверженным - у тебя там все получалось, у меня - нет. Потом догадался залезть в AsBroadcaster.as, и там все сразу сверил и посмотрел )))) Все получилось ) Пользуясь случае хочу сказать тебе БОЛЬШОЕ спасибо за урок. Мне лично он оказал офигенную помощь и облегчение в программировании )))))
Nox Noctis
31.08.2004, 11:54
Оригинал написал(а) D12
эх прям горе с вами)))
вот вам дабл клик при помощи гет таймера , пашет хоть в семерке хоть в шестерке да везде блин ))) работает - замечательно :) это самое главное.
но воспользоваться тем что у тебя намного сложнее чем просто скопировать код и создать события. по поводу того что нужно править объявление исходного класса - так это... мне просто лень переписать это на другой объект какой-нить :)) кому надо, и кто поймёт что тут за код написан - тот поймёт как это легко и просто исправить. разве нет? :)
разве нет? :)
ыгы))))))))))))) :rolleyes:
хи ))) хи )))) ну да ) да )))
поймут )вздохнут ) и начнут юзать поиск за готовым результатом)))))))))))))
ощущая) всю прелесть этого поиско-метода)))) и как это легко и просто )))))))))))))))))))))))))))))) чем см. выше))))
ну разве нет? :)
P.S. хи) хи) хи) хи) хи) хи) хи) хи) хи)))))
artfla$her
31.08.2004, 23:45
ну разве нет?
Кому как, кому как :) Мне например - нет. :D
Nox Noctis
01.09.2004, 13:01
вы занудствуете, товарисчи.
исправил. евриуан из хэппи нау? :)
евриуан из хэппи нау :)
иииииииииихххххааааааааааааааа)))))
за ето нуна выпить )))) открывашка есть???))))
artfla$her
02.09.2004, 00:34
На-а-аливай!
............................................................................................
Э-э-й ухне-е-ем, еще ра-а-аз, э-э-эй ухнем! :D
щелчок правой
можно ли как - то по красивее сделать ?
_root.createEmptyMovieClip("ass", 1);
with (_root.ass) {
beginFill(0x4E6DAB);
lineStyle(5, 0xff00ff, 100);
moveTo(200, 200);
lineTo(300, 300);
lineTo(100, 300);
lineTo(200, 200);
endFill();
}
Mouse.rightState = false;
Mouse.freq = 50;
Mouse.testClic = function()
{
if (ASnative(800, 2)(2)) {
if (Mouse.rightState == false) {
Mouse.broadcastMessage("onRightMouseDown");
}
Mouse.broadcastMessage("onRightMousePress");
Mouse.rightState = true;
} else if (Mouse.rightState == true) {
Mouse.broadcastMessage("onRightMouseUp");
Mouse.rightState = false;
}
};
_global.setMouseFreq = function(f)
{
Mouse.freq = f;
clearInterval(Mouse.testClicID);
Mouse.testClicID = setInterval(Mouse.testClic, Mouse.freq);
};
_global.getMouseFreq = function()
{
return (Mouse.freq);
};
Mouse.testClicID = setInterval(Mouse.testClic, Mouse.freq);
Mouse.addListener(ass);
ass.onRightMouseDown = function()
{
if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
trace("Down");
pressed = true;
}
};
ass.onRightMouseUp = function()
{
if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
trace("up");
} else if (pressed) {
trace("upOutside");
}
pressed = false;
};
не хочу писать hittest для всех батанов...
llllllllll
03.09.2004, 16:36
Оригинал написал(а) Nox Noctis
в АС2 почему-о сменили названия
в шестёрке было: ASBroadcaster
в семёрке стало: AsBroadcaster
В шестерке тоже было AsBroadcaster, просто было пофиг ;)
Nox Noctis
03.09.2004, 16:38
ээ... правда?
а я вроде видел в инициализационном коде шестёрки АСБроадкастер...
но вобщем ты прав - в шестёрке не актуально канеш :)
llllllllll
05.09.2004, 19:02
Оригинал написал(а) fiot
можно ли как - то по красивее сделать ?
не хочу писать hittest для всех батанов...
Переходи на семерку ;)
mc.menu = new ContextMenu(function(){trace("Right Click");});
:( мне это для диреткора МХ так что нужно на 6-ке...
2 fiot
Mouse.rightState = false;
Mouse.freq = 50;
Что это такое, где про это написано и почему на это (а по-правде и на все остальное) ругается Flash MX 2004 Pro:
**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 12: There is no property with the name 'rightState'.
Mouse.rightState = false;
**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 13: There is no property with the name 'freq'.
Mouse.freq = 50;
Nox Noctis
06.09.2004, 19:48
Оригинал написал(а) dimarik
Что это такое, где про это написано и почему на это (а по-правде и на все остальное) ругается Flash MX 2004 Proпотому что в МХ 2004 intrinsic (т.е. внутренние) классы - почти все не-динамические. (не позволяют в рантайме добавлять статические свойства и методы к классу)
поэтому попытка записать в класс Mouse то, чего там нет, приведет к ошибке. если только не залезть ручками в класс Mouse и не добавить в заголовок его объявления спецификатор dynamic.
собсно свой вариант даблклика я именно поэтому и переделал.
llllllllll
06.09.2004, 19:49
Оригинал написал(а) fiot
:( мне это для диреткора МХ так что нужно на 6-ке...
Так тебе под Директор нада правый флешовый клик? :)
Nox Noctis
06.09.2004, 19:53
ну так напиши на директоре :)) в чем печаль-то вообще тогда? :)
печать в том, что нужно по событию из флеша что-то делать с директором... и это событие на правый клик мыши... я спросил... может можно что-то сделать с кодом который я постил выше... а то ломает писать постоянно - хиттест.
llllllllll
06.09.2004, 20:58
Ну сделай вот так :)
llllllllll
06.09.2004, 21:10
По идее в Дире можно посылать по событию rightMouseDown запрос (getVariable) геттер-сеттеру во флеше и тут же возвращать значение мувика на который кликнули или null, ну и в зависимости от имени мува делать что-то ...
llllllllll
07.09.2004, 02:16
А вообще я балда :), нафиг нам еще что-то писать во флеше если можно прямо в дире? ;)
global _root
global _listeners
on startMovie()
_root = sprite(1).getVariable("_root", false)
_listeners = [ \
[#target:_root.mc, #action:"Hello"], \
[#target:_root.mc2, #action:"World!"] \
]
end
on rightMouseDown()
repeat with i = 1 to _listeners.count
o = _listeners[i]
mc = o.target
if(mc.hitTest(_root._xmouse, _root._ymouse, true)) then
alert(o.action)
end if
end repeat
end
Оригинал написал(а) llllllllll
А вообще я балда :), нафиг нам еще что-то писать во флеше если можно прямо в дире? ;)
классо ... вери биг сенкс :)
вот класс на AS1. очень легко переделать в AS2.this.setDoubleClickClass = function() {
delete this.setDoubleClickClass;
_global.org = _global.org || {};
_global.org.dembicki = _global.org.dembicki || {};
if (_global.org.dembicki.DoubleClick) {
return;
}
var DoubleClick = _global.org.dembicki.DoubleClick=function () {
};
// get set interval time
var interval_time = 300;
function getIntervalTime() {
return interval_time;
}
function setIntervalTime(time) {
if (isNaN(time) || time<50 || time>3000) {
return;
}
interval_time = time;
}
DoubleClick.addProperty("_time", getIntervalTime, setIntervalTime);
// clicks handler
var last_time = 0;
DoubleClick.onMouseUp = function() {
if ((getTimer()-last_time)<interval_time) {
DoubleClick.broadcastMessage("onDoubleClick");
}
last_time = getTimer();
};
Mouse.addListener(DoubleClick);
AsBroadcaster.initialize(DoubleClick);
ASSetPropFlags(_global, 'DoubleClick', 7, 1);
};
this.setDoubleClickClass();
// usage:
org.dembicki.DoubleClick.addListener(_root);
_root.onDoubleClick = function() {
trace("DoubleClick");
};
Нидл будь другом не пори чуши.
Iv , радость моя , ты только проснулся )))
Помоему исходник данный гдето почти 2года назад от D12 решает проблему на корню , и кода поменьше ...
P.S. Целую =)
- я еще не ложился.
- я не юзаю свои старые, а так-же чужие, а тем более чужие старые исходники. всегда интересно написать самому.
- количество кода не показатель его качества. это я не к тому, что у d12 (или даже d24) он лучше или хуже, просто это не аргумент.
- смею утверждать, что d28 далеко не единственный кто решил проблему на корню. но решений много и привычки и пристрастия у всех разные.
вот
ОК ...
P.S. Делай что хочешь революционер... небуду спорить ... из уважения к форуму .
P.S.2. Nirth ты ведь нас учил верить в новые технологии , для данного случая на AS3 есть "MouseEvent.DOUBLE_CLICK,onDouble" за этим завтрашний день , а смотреть как люди делают 1001й анологичный пример и еще удивляются где аплодисменты , тогда я вообще непонимаю зачем делать "Блейзер".
P.S.3. Иван незнаю как вас по батюшке , но если бы вы предложили что то новенькое , я бы вам аплодировал стоя ...
P.S.4. D12 Пишется с большой , это значит имя - Денис .
P.S.5. И D12 не перво-открыватель , он просто дал пользователям пример , когда он был нужен , моряк ты слишком долго плавал ...
AS3 не существует. Это миф.
99% занимающихся флэшом не знают что такое AS2.
из оставшегося процента половина до AS3 еще не добралась.
к тому же люди, которые знают AS2 и выше не задают вопросы "как отловить даблклик".
Данный топик помещен в раздел FAQ и предназначен для тех, у кого этот вопрос вызывает сложности.
Иванович по батюшке... Новое... хм... я очень стараюсь, поверь. Но новое у меня получается в среднем раз в год. Впрочем, и это считаю неплохим показателем.
D12... а... Тебе бы статейку на эту тему написать, типа "онтология ников".
- Откуда ты знаешь, что я моряк? И почему не знаешь, что моряки не плавают, а ходят? :)
2Ив, ну я бы не сказал что 99% не знают, может ты о России\СНГ говоришь =) ?
к тому же люди, которые знают AS2 и выше не задают вопросы "как отловить даблклик".
но зато я сутки гонялся по аське, и спрашивал у людей как сделлать так чтобы C# не ругался на AxShockwaveFlashObjects.AxShockwaveFlash =)
2 Д12
Тут мне кажется не откат назад, а откат просто демонстрация своего стиля, у меня например отрабатывание дабл клика вложенно в два базовых компонента(один из них для "легких" флэшек, реализует аналог IEventDispatcher из AS3, другой там где юзаются компоненты, наследует UIComponent ) тебе просто показали как делают это по другому.
Насчет кол-ва кода, я бы к нему не придерался, иногда я пишу
createEmptyMovieClip("mc",1).createTextField("txt",1,0,0,100,20).text = "hello";
иногда разношу по строчкам, иногда я инкапсулирую каждое действие, иногда пишу методы по 40 строк. объем кода зависит от целей, если цель не определенна точно, не вижу причины придераться к этому.(ну это не значит что надо выдавать 500 строк, для рисование квадрата)
[...]99%[...] - отчего же... везде так. и Россия не исключение из правил.
просто flash, в отличие, скажем, от C# по определению юзает много людей не имеющих программерского образования да и желания плотно влезать в программинг. Им достаточно знать некоторые основы типа gotoAndStop и onMouseUp... и это нормально. Выделять в этом смысле Россию/СНГ я бы не стал.
ыгы)))))))))))))
хи ))) хи )))) ну да ) да )))
поймут )вздохнут ) и начнут юзать поиск за готовым результатом)))))))))))))
ощущая) всю прелесть этого поиско-метода)))) и как это легко и просто )))))))))))))))))))))))))))))) чем см. выше))))
помой клавиатуру - залипает явно
_root.z = 0;
_root.zz = 0;
_root.zzz = 0;
_root.mc.onMouseDown = function() {
if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
_root.zzz += 1;
}
};
///////////////////////////////////////////
_root.onEnterFrame = function() {
if (_root.zzz == 1) {
_root.z = 1;
}
if (_root.zz>=40) {
_root.z = 0;
_root.zz = 0;
_root.zzz = 0;
}
if (_root.zzz == 2) {
_root.z = 0;
_root.zz = 0;
_root.zzz = 0;
//////////////
trace("Прошу прощения за вчерашний пост-инцидент , я никак недумал что будет такая реакция от вас Iv и Nirth , думал как всегда посмеется народ , прошу прощения , в знак признательности сделал этот скрипт для отлова двойного нажатия . P.S. С уважением Denis12" );
//////////////
}
};
///////////////////////////////////////////
function DoubleClic() {
_root.zz += z;
updateAfterEvent();
}
setInterval(DoubleClic, 10);
P.S.2. А вот Король другое дело , давно руки чешутся по короне врезать так чтоб все рубины осыпались ...
- наконец-то мы вступили на твердую почву скрипта.
в общем, вместо твоего кода достаточно было воткнуть мой класс и написать вот это:org.dembicki.DoubleClick.addListener(_root.mc);
_root.mc.onDoubleClick = function() {
if (this.hitTest(_root._xmouse, _root._ymouse)) {
trace("Прошу прощения за вчерашний пост-инцидент , я никак недумал что будет такая реакция от вас Iv и Nirth , думал как всегда посмеется народ , прошу прощения , в знак признательности сделал этот скрипт для отлова двойного нажатия . P.S. С уважением Denis12");
}
}; - не думаю, что это сложно. и это главное.
а теперь предлагаю сравнить результаты.
прошу принять это не за пузомерку, а за дружественное обсуждение различных подходов.
итак,
1.
- твой код для работы использует две долбилки: onEnterFrame и setInterval. это откровенно плохо. т.е. каждый кадр и каждые 10 миллисекунд нагружается комп расчетами вне зависимости от того нужны они или нет. причем одну их них никак не остановить, если не вносить в твой код изменений.
- в моем коде нет долбилок. ни одной.
2.
- твой код использует рутовые переменные, что совсем плохо, давай заглянем в листинг переменных после выполнения твоего кода:
Variable _level0.DoubleClic = [function 'DoubleClic']
Variable _level0.z = 0
Variable _level0.zz = 0
Variable _level0.zzz = 0
Variable _level0.onEnterFrame = [function 'onEnterFrame']
Movie Clip: Target="_level0.mc"
Variable _level0.mc.onMouseDown = [function 'onMouseDown']
имеем: три переменных непонятного назначения, рутовый onEnterFrame и onMouseDown навешеный на мувик.
- что в этом плохого?
по-порядку:
Читая код, обнаруживаю DoubleClic и с удивлением вижу, что это не класс, а рутовая функция. Почему с удивлением? Если вы задаете этот вопрос, то вам срочно нужно купить книжку по программингу. Есть такая штука: правила именования. Имена классов задаются с большой буквы. Имена методов с маленькой. Если есть конструкции, в которых можно поступать двояко, например, именовать переменные вот так: my_variable или так: myVariable, то именование классов с большой буквы, а методов с маленькой - просто аксиома, давно не подлежащая никакой ревизии и обсуждению. помимо прочего наличие данного метода в руте нарущает принципы сокрытия реализации, об этом в следующем пункте. и твой DoubleClic я бы всё-таки переименовал в doubleClick.
- переменные z, zz, zzz. Имена переменных ничего не скажут человеку, который заглянет в листинг переменных. Зачем они нужны? Где и как используются? Что они делают в руте? Откуда они там взялись?
Есть такое понятие - универсальность и реюзабельность кода.
Это когда ты пишешь код один раз и затем юзаешь его в различных проектах. Это правильно, писать реюзабельный код. Ты экономишь собственное время, а следовательно можешь сделать (заработать) больше. Но, чтобы писать такой код, нужно знать и понимать, какие требования предъявляются к такому коду.
Ести в коде ты используешь рутовые переменные, то другой код, также использующий рутовые переменные, снесет твой проект напрочь.
Отсюда принцип: код должен быть самодостаточным, сам в себе. Наружу должно торчать только то, что ты хочешь, то, что действительно необходимо. Всё остальное должно быть скрыто и недоступно для случайного изменения.
- _root.onEnterFrame. я уже лет пять не использовал такую конструкцию. Она противоречит всему, чему только можно. И предыдущему пункту - ее может снести любой и требованиям производительности и... ну это трудно объяснить... короче если я вижу такую конструкцию в проекте кандидата на вакансию, то у него нет шансов.
- _root.mc.onMouseDown может быть самая правильная конструкция в твоем коде, но она тоже неправильна. Ты навешиваешь на мувик обработку стандартного события, соответственно, при этом, ты занимаешь ее и нет никакой возможности иначе обработать это событие в дальнейшем, если это понадобится.
Это по листингу кратенько прошлись.
Самое же неприятное кроется в том, чего в листинге нет: задан setInterval, который долбит и долбит и, твой код, будучи однажды запущеным не остановить ничем и никак.
давай теперь посмотрим, что живет у меня:Global Variables:
Variable _global.org = [object #1, class 'Object'] {
dembicki:[object #2, class 'Object'] {
DoubleClick:[function 'DoubleClick']
}
}
Movie Clip: Target="_level0.mc"
Variable _level0.mc.onDoubleClick = [function 'onDoubleClick'] - задан класс, который находится по адресу, стандартному для подобных AS2 классов. Хоть класс и не AS2, я могу быть увереным, что никто его случайно не снесет. В листинге ты не увидишь, никаких переменных. Ты также не сможешь изменить время даблклика например на строку:
org.dembicki.DoubleClick._time = "hello world"; Поскольку обработчик не пропустит такую конструкцию.
хехе... кстати, он не пропустит вообще ничего, потому, что я вместо addProperty написал setProperty. поправлю ща...
Да, так вот... Несмотря на то, что я намеренно не использовал типизацию данных, это вовсе не значит, что значения и типы данных не проверяются. Время даблклика можно задать только через setter и нет возможности случайно переопределить переменную interval_time.
Я говорил, что этот класс легко переделать в AS2, давай глянем:
class org.dembicki.DoubleClick {
private static var interval_time:Number = 300;
private static var last_time:Number=0;
public static function get _time ():Number {
return interval_time;
}
public static function set _time (value:Number):Void {
if (interval_time<50 || interval_time>3000) return;
interval_time = value;
}
private static var _listeners:Array;
public static function addListener (obj:Object):Boolean {
AsBroadcaster.initialize(DoubleClick);
Mouse.addListener(DoubleClick);
DoubleClick.addListener(obj);
return false;
}
private static function onMouseUp ():Void {
if ((getTimer()-last_time)<interval_time) {
DoubleClick.broadcastMessage("onDoubleClick");
}
last_time = getTimer();
}
public static function removeListener (obj:Object):Boolean {
return false;
}
private static function broadcastMessage ():Void {}
} - я потратил меньше 3х минут на это.
Это, собственно, был разбор отличий представленных вариантов.
Если уж и приходится писать код, даже "чисто для себя" (правда мне этот подход совсем непонятен - за что себя так люди ненавидят, что пишут для себя плохой код, а для других хороший...), так даже чисто для себя стоит писать хорошо. Это выгодно.
А уж если возникает необходимость код показать кому-то, то тем более стоит обращать внимание как на правила хорошего тона при написании кода, так и на универсальность и объективность.
PS:
Возможно, многое из того, что я сейчас пишу тебе не так понятно как мне или не кажется таким важным. Это нормально. Но. Маленькая история:
Когда я только начинал программить, я, первый в мире, написал функцию skew (http://www.flashkit.com/movies/Scripting/Maths/skew_fun-Ivan_Dem-5805/index.php) (неделю бился над ней) и тут же на радостях запостил ее во flashcoders. Роберт Пеннер её слегка переписал и запостил в эху, в ответ мне, с комментом, что вот в таком виде эта функция будет более ООП-истой. Я тогда даже не догнал о чем речь. Догнал значительно позже, когда начал встречать в сети исходники и эффеекты построенные на моей математике, в которых люди горячо благодарили Роберта за функцию skew. Ну и что мне было делать? Бегать по сети и орать, что на самом деле автор я? Бред.
А вот если бы я сразу написал правильно, в соответствии с принципами OOP, то эта волна пошла бы под моим именем. И я бы был известен как Роберт, работал бы в Майкрософте, на работу ходил бы с охраной, потому, что поклонницы не давали бы проходу, ездил бы на феррари... во размечтался.. аа.. :yahoo:
Перед классом skew у тебя был класс tween =) ты еще на форуме его показывал )
Iv я еще и раньше знал что до твоего уровня мне еще нужно время =)
"Долбилка" и у тебя есть , иначе ты бы несмог управлять временным участком за интервал которого необходимо кликнуть 2 раза =)
P.S. а вообще я незнаю кого слушать , одни говорят _root плохо другие стараются избегать _global , во всяком случае ясно одно необходимо знание что-бы понимать что когда и где лутше =)
_root и _global плохо.
все что можно хранить в global это классы.
все что должно быть в _root Это мувиклипы и текстовые поля.
если это плохо то остается только this и _parent , эх...тяжело жить дальше =)
постараюсь запомнить : классы в _global ах... все равно я их делать неумею =)
мувики и текстовые поля в _root
Ааа остальное то куда ?
_parent я бы тоже не назвал хорошей OOП практикой. остается только this =) но поверь мне этого совсем не мало.
Перед классом skew у тебя был класс tween- нет. обрати внимание на дату. в то время я понятия не имел что такое класс.
"Долбилка" и у тебя есть , иначе ты бы несмог управлять временным участком за интервал которого необходимо кликнуть 2 раза =) - указуй мне перстом на ея.
- ну тогда я бы и this не назвал хорошей OOP практикой. Хорошая OOP практика исключает код из жизни программера, оставляя только встречи с коллегами 5-го и 15-го в бухгалтерии. :drinks:
Ну я использую this только для auto-complete :away:
ну.. если по-сурьезному, то this я бы рекомендовал втыкать везде, где это возможно. многие поэтому, и еще потому, что я активно юзаю постфиксы (при наличии типизации данных-то) меня считают типа неправильным перцем.
моя позиция тут такова: лишней инфы не бывает. если указывать this, то код гораздо читабельнее и к тому же позволяет избежать проблем в некоторых ситуациях.
Ты знаешь имхо это субъективно, когда я вижу код с кучей this мне его читать труднее, скажем в классе mx.transitions.Tween, this повсюду, и читать я его без бутылки не могу =)
Субъективно конечно. Мне без this сложно читать.
А постфиксы или префиксы (в моем случаи) точно не помешают, в середине кода вспоминать что за тип у переменой не хочется.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.