PDA

Volledige versie bekijken : SOLVED (BY ROENES) OnLoadListener in een for loopje....


tha beaver
%Europe/Berlin %896 %2006, 21:31
Weet iemand waar ik de "i" moet zetten in de onloadlistener om em mee te laten draaien in een for loopje.

Thanks in advance




for (var i = 0; i<number; i++) {
var outline = _root.menu_mc1.createEmptyMovieClip("outline_mc"+i, _root.menu_mc1.getNextHighestDepth());
var menu = _root.menu_mc1.createEmptyMovieClip("menuphoto_mc"+i, _root.menu_mc1.getNextHighestDepth());
_root._visible = false;
mcLoader = new MovieClipLoader;
loadListener = new Object();
mcLoader.addListener(loadListener);
mcLoader.loadClip(folder+i+".jpg", menu);
loadListener.onLoadComplete = function() {
_root._visible = true;
if (menu._width < 49 ) {
outline._width = 36;
} else {
outline._height = 36;
}
};

Dauntless
%Europe/Berlin %908 %2006, 21:48
Ik zou 'm gewoon opslaan in mcLoader ?

tha beaver
%Europe/Berlin %911 %2006, 21:52
Sorry Dauntless ik begrijp het niet?

Dauntless
%Europe/Berlin %912 %2006, 21:54
mcLoader.i = i;

En in je onLoadComplete heb je dan this.i tot je beschikking.

tha beaver
%Europe/Berlin %915 %2006, 21:59
Je bedoelt waarschijnlijk niet zo, want dit werkt niet... [V]

for (var i = 0; i<number; i++) {
var outline = _root.menu_mc1.createEmptyMovieClip("outline_mc"+i, _root.menu_mc1.getNextHighestDepth());
var menu = _root.menu_mc1.createEmptyMovieClip("menuphoto_mc"+i, _root.menu_mc1.getNextHighestDepth());
_root._visible = false;
mcLoader.i = i;
mcLoader = new MovieClipLoader;
loadListener = new Object();
mcLoader.addListener(loadListener);
mcLoader.loadClip(folder+i+".jpg", menu);
loadListener.onLoadComplete = function() {
_root._visible = true;
if (this.i._width < 49 ) {
outline._width = 36;
} else {
outline._height = 36;
}
};

Dauntless
%Europe/Berlin %924 %2006, 22:10
Nu sla je die i op in mcLoader, voor je mcLoader aanmaakt :p. Niet echt logisch dus.

Overigens zit er nog een fout in: Achter 'new MovieClipLoader' moeten twee haakjes: () .

In de onLoadComplete vraag je 'i._width' op, maar dat kan niet omdat 'i' een number is.

Kan je ven vertellen wat juist de bedoeling van dit script is? (Wat je dus wil bereiken).

tha beaver
%Europe/Berlin %932 %2006, 22:22
Hoi Dauntless,

De bedoeling is een x aantal foto's te laden, en daar kaders om heen te zetten.
De foto's zijn altijd even groot alleen soms landscape en soms portrait.
Daarom wil ik per foto nadat deze geladen is de _width uitvragen en aan de hand daarvan bepalen wat de _height en _width van het kader moet zijn.

Zie onderstaand het gehele script :#

///////////////////////////////////////
//////////MCCReATor////////////////////
///////////////////////////////////////
function mccreator() {
var masked = _root.createEmptyMovieClip("menu_mc1", _root.getNextHighestDepth());
var mask = _root.createEmptyMovieClip("mask_mc", _root.menu_mc.getNextHighestDepth());
trace(_root.menu_mc1.getDepth());
trace(_root.mask_mc.getDepth());
mask.lineStyle(1, 0xFFFFFF, 100);
mask.beginFill(0xFFFFFF, 100);
mask.lineTo(500, 0);
mask.lineTo(500, 55);
mask.lineTo(0, 55);
mask.lineTo(0, 0);
mask.endFill();
mask._x = 19;
mask._y = 9;
masked.setMask(mask);
for (var i = 0; i<number; i++) {
var outline = _root.menu_mc1.createEmptyMovieClip("outline_mc"+i, _root.menu_mc1.getNextHighestDepth());
var menu = _root.menu_mc1.createEmptyMovieClip("menuphoto_mc"+i, _root.menu_mc1.getNextHighestDepth());
_root._visible = false;
mcLoader = new MovieClipLoader();
loadListener = new Object();
mcLoader.addListener(loadListener);
mcLoader.loadClip(folder+i+".jpg", menu);
loadListener.onLoadComplete = function() {
_root._visible = true;
if (menu._width<49) {
outline._width = 36;
} else {
outline._height = 36;
}
};
var button = _root.menu_mc1.createEmptyMovieClip("menubutton_btn"+i, _root.menu_mc1.getNextHighestDepth());
outline.lineStyle(1, 0xFFFFFF, 100);
outline.beginFill(0xFFFFFF, 100);
outline.lineTo(ww+1, 0);
outline.lineTo(ww+1, hh+1);
outline.lineTo(0, hh+1);
outline.lineTo(0, 0);
outline.endFill();
outline._x = xx-1+i*offset1;
outline._y = yy-1;
menu._x = xx+i*offset1;
menu._y = yy;
button.lineStyle(1, 0xB3B3B3, 0);
button.beginFill(0x6C6C6C, 0);
button.lineTo(ww, 0);
button.lineTo(ww, hh);
button.lineTo(0, hh);
button.lineTo(0, 0);
button.endFill();
button._x = xx+i*offset1;
button._y = yy;
button.i = i;
button.onRelease = function() {
_root.picture_mc.loadMovie(folder+this.i+"large.jpg");
};
}
}

Dauntless
%Europe/Berlin %939 %2006, 22:33
Maar nu laadt je X aantal foto's vlak na elkaar, in dezelfde movieclip in....

Roenes
%Europe/Berlin %945 %2006, 22:40
FF mee bemoeien, volgens mij heeft de onLoadComplete normaal gesproken 1 parameter genaamd de target_mc. Deze mc verwijst naar de mc die de onLoadComplete triggert. je kunt dus aan de hand van die parameter de _width opvragen.

Dus je hoeft helemaal niet die onLoadComplete te creëeren in een for lus, want dat werkt niet. 1 onLoadComplete en werken met die parameter zou het probleem moeten oplossen :)

//Edit
@DL: neej hoor, menu verwijst steeds naar een andere mc. (createEmptyMovieClip.... ;))

tha beaver
%Europe/Berlin %945 %2006, 22:41
De foto's komen allen in een eigen movieclip:

"menuphoto_mc"+i
Al deze movieclips staan in:
"menu_mc1"

maar dat werkt gewoon goed:
Kijk maar eens op http://www.xs4all.nl/~festen

selecteer portfolio in het menu en selecteer de foto links onder in beeld.
Boven in beeld komen dan kleine fototjes (hier lijkt het goed te gaan maar dit is toeval)

Dauntless
%Europe/Berlin %948 %2006, 22:46
Goed gezien Roenes.

Ik wou hem overigens ook juist verwijzen naar de volgende tut:
http://www.flashfocus.nl/forum/showthread.php?t=8166

Hier staat hoe je verschillende images door middel van 1 mcl kan inladen.

tha beaver
%Europe/Berlin %950 %2006, 22:49
@Roenes,

Hoi Roenes,

Kan je in mijn bovenstaande script aangeven hoe je dit dan precies in gedachte hebt, want als ik binnen het niet binnen de for loop doe hoe zorg ik er dan voor dat wel voor iedere foto (script moet werken voor een onbepaald aantal foto's) het juiste kader creeer...? :#

Thank in advance

@ Dauntless,

Maar mijn script om meerdere foto's in te laden werkt prima het gaat alleen om het kader en de listener. :O

Thanks

Roenes
%Europe/Berlin %976 %2006, 23:25
@Roenes,

Hoi Roenes,

Kan je in mijn bovenstaande script aangeven hoe je dit dan precies in gedachte hebt, want als ik binnen het niet binnen de for loop doe hoe zorg ik er dan voor dat wel voor iedere foto (script moet werken voor een onbepaald aantal foto's) het juiste kader creeer...? :#

Thank in advance
Duurde ff want ik moest het vervolg van Die Hard 2 ff afkijken ;)

Maar wat heb ik gedaan? Ik heb jouw script gepakt en wat dingen gewijzigd (niet veel). Voornaamste wijzigingen:
- 1x de MovieClipLoader zooi aangemaakt
- een verwijzing naar de outline mc opgeslagen per kader (voor in de onLoadComplete)

Ik heb het niet getest aangezien ik niet alles had maar volgens mij moet het zo werken. Mocht het niet werken dan heb ik waarschijnlijk een klein foutje gemaakt tussen de verschillende mc's maar dat kan je zelf dan wel achterhalen denk ik. Kijk er maar eens naar en laat maar horen of het werkt en of je begrijpt wat het script doet :)

///////////////////////////////////////
//////////MCCReATor////////////////////
///////////////////////////////////////
mcLoader = new MovieClipLoader();
loadListener = new Object();
loadListener.onLoadComplete = function(target_mc)
{
_root._visible = true; //Waarvoor is die???
if (target_mc._width < 49)
{
//outline bevat een verwijzing naar de juiste mc (zie for lus)
target_mc.outline._width = 36;
}
else
{
target_mc.outline._height = 36;
}
}
mcLoader.addListener(loadListener);

function mccreator() {
var masked = _root.createEmptyMovieClip("menu_mc1", _root.getNextHighestDepth());
var mask = _root.createEmptyMovieClip("mask_mc", _root.menu_mc.getNextHighestDepth());
trace(_root.menu_mc1.getDepth());
trace(_root.mask_mc.getDepth());
mask.lineStyle(1, 0xFFFFFF, 100);
mask.beginFill(0xFFFFFF, 100);
mask.lineTo(500, 0);
mask.lineTo(500, 55);
mask.lineTo(0, 55);
mask.lineTo(0, 0);
mask.endFill();
mask._x = 19;
mask._y = 9;
masked.setMask(mask);
for (var i = 0; i<number; i++) {
var outline = _root.menu_mc1.createEmptyMovieClip("outline_mc"+i, _root.menu_mc1.getNextHighestDepth());
var menu = _root.menu_mc1.createEmptyMovieClip("menuphoto_mc"+i, _root.menu_mc1.getNextHighestDepth());
//Verwijzing opslaan naar bijbehorende outline voor in de onLoadComplete
menu.outline = outline;
mcLoader.loadClip(folder+i+".jpg", menu);
_root._visible = false;
var button = _root.menu_mc1.createEmptyMovieClip("menubutton_btn"+i, _root.menu_mc1.getNextHighestDepth());
outline.lineStyle(1, 0xFFFFFF, 100);
outline.beginFill(0xFFFFFF, 100);
outline.lineTo(ww+1, 0);
outline.lineTo(ww+1, hh+1);
outline.lineTo(0, hh+1);
outline.lineTo(0, 0);
outline.endFill();
outline._x = xx-1+i*offset1;
outline._y = yy-1;
menu._x = xx+i*offset1;
menu._y = yy;
button.lineStyle(1, 0xB3B3B3, 0);
button.beginFill(0x6C6C6C, 0);
button.lineTo(ww, 0);
button.lineTo(ww, hh);
button.lineTo(0, hh);
button.lineTo(0, 0);
button.endFill();
button._x = xx+i*offset1;
button._y = yy;
button.i = i;
button.onRelease = function() {
_root.picture_mc.loadMovie(folder+this.i+"large.jpg");
};
}
}

tha beaver
%Europe/Berlin %293 %2006, 07:03
Thanks Roenes,

Ik ga er vanavond mee aan de slag.

ps de visible is true was alleen handig voor het testen om e kijken of de listeren werkte>>>

tha beaver
%Europe/Berlin %844 %2006, 20:15
Hmmm,

Nou ik snap er nu eigenlijk niets meer van (ligt waarschijnlijk aan mij hoor):
Ik heb een paar vragen:

1) In mijn voorbeeld stond de listener binnen de for loop, dit leek mij logisch omdat ik in princiepe voor iedere ingeladen foto een listener wil creeren die kijk of de width van de foto groter kleiner is dan 49. In het voorbeeld van Roenes begrijp ik niet waarom de listener nadat de eerste foto is geladen nog iets zou doen (hoe wordt de listener opnieuw getriggered). Of laat ik het anders zeggen hoe weet de listener dat er een nieuwe foto geladen wordt.

2) Ik begrijp niet waarom je de width van target_mc gebruikt (if (target_mc._width < 49)) Target_mc wordt mi namelijk nergens gedefinieerd??

3) Kan iemand aangeven of het echt onmogelijk is een listener binnen een for loop te gebruiken, ik dacht echt dat ik op de goede weg was.

Roenes en andere alvast bij voorbaat dank voor jullie moeite, PS als jullie willen dat ik de fla upload doe ik dat even hoor....?

Roenes
%Europe/Berlin %905 %2006, 21:44
Here we go ;)

1) In mijn voorbeeld stond de listener binnen de for loop, dit leek mij logisch omdat ik in princiepe voor iedere ingeladen foto een listener wil creeren die kijk of de width van de foto groter kleiner is dan 49. In het voorbeeld van Roenes begrijp ik niet waarom de listener nadat de eerste foto is geladen nog iets zou doen (hoe wordt de listener opnieuw getriggered). Of laat ik het anders zeggen hoe weet de listener dat er een nieuwe foto geladen wordt.Die listener hoef je maar 1x te gebruiken omdat je aan de MovieClipLoader instantie moet aangeven welk object hij moet gebruiken bij bepaalde events die de MovieClipLoader genereerd. Die onLoadComplete schrijf je en koppel je aan de MCL. Aangezien je bij de loadClip statement steeds dezelfde MCL instantie gebruikt (mcLoader) hoef je de listener maar 1x te definieren. Die listener zorgt ervoor dat de MCL instantie weet wat die moet doen bij het event onLoadComplete.

2) Ik begrijp niet waarom je de width van target_mc gebruikt (if (target_mc._width < 49)) Target_mc wordt mi namelijk nergens gedefinieerd??Als je goed kijkt naar de code dan zul je zien dat de onLoadComplete als parameter de target_mc gebruikt. De MCL zorgt er zelf voor dat als een laadproces klaar is dat aan de onLoadComplete de mc wordt meegegeven die klaar is met laden. Hoe dit intern werkt weet ik niet, ik weet alleen dat de MCL dat zelf al voor jouw regelt. Maar om die mc te kunnen gebruiken in die methode moet je aangeven wat de naam is van die verwijzing. Vandaar dat ik target_mc definieer. De MCL zorgt er dan zelf voor dat deze naar de juiste mc verwijst. Daarom kun je direct de _width opvragen van de target_mc omdat deze dus verwijst naar de mc die het event genereerde (en dus klaar was met laden). Andere properties kun je op dezelfde manier opvragen. :)

3) Kan iemand aangeven of het echt onmogelijk is een listener binnen een for loop te gebruiken, ik dacht echt dat ik op de goede weg was.Die listener hoef je dus niet binnen een for loop te gebruiken. Zie mijn antwoord op vraag 1. Als je toch in de for loop de listener regel zet, dan overschrijf je steeds hetzelfde en krijg je hetzelfde resultaat. Alleen kost het dan meer rekenkracht omdat er steeds acties worden uitgevoerd die eigenlijk overbodig zijn :)

Ik hoop dat bovenstaande het een en ander duidelijk maakt en anders horen we het wel in deze topic :)

tha beaver
%Europe/Berlin %917 %2006, 22:00
Hoi Roenes,

Cool dat je al die moeite doet om het mij uit te leggen, ik snap je verhaal maar heb nog 1 aanvullende vraag:

je maakt een variable = waarin je een verwijzing naar outline opslaat, maar die gebruik je toch nergens in de listener.

//Verwijzing opslaan naar bijbehorende outline voor in de onLoadComplete
menu.outline = outline;

Ps ik heb het script getest maar het werk (nog) niet ik zal wel wat fout doen

http://www.xs4all.nl/~festen/lightworks/portfolio1.fla

Ik heb een link naar de fla toegevoegd

Roenes
%Europe/Berlin %950 %2006, 22:49
je maakt een variable = waarin je een verwijzing naar outline opslaat, maar die gebruik je toch nergens in de listener.Wel hoor. Kijk maar eens in je ifje in de listener. Daar gebruik ik target_mc.outline :)

Ps ik heb het script getest maar het werk (nog) niet ik zal wel wat fout doenIk heb even gekeken, maar het is vrij lastig zoeken omdat de foto's en zo er niet bij zitten. Maar je roept toch wel ergens die functie aan he? :)

tha beaver
%Europe/Berlin %961 %2006, 23:04
Hoi Roenes,

je gebruikt inderdaad target_mc.outline

maar de var die je definieerd = menu.outline = outline;

Ik snap niet hoe dat werkt?


Daarnaast zeg je:

"Ik heb even gekeken, maar het is vrij lastig zoeken omdat de foto's en zo er niet bij zitten. Maar je roept toch wel ergens die functie aan he?"

I'm totally lost welke functie bedoel je...

Sorry IK_mc = niet.zo.snel.van.begrip

Roenes
%Europe/Berlin %012 %2006, 00:17
Hoi Roenes,

je gebruikt inderdaad target_mc.outline

maar de var die je definieerd = menu.outline = outline;

Ik snap niet hoe dat werkt?Dat kan je doen omdat target_mc op dat moment verwijst naar 1 van de mc's die je in het lusje aanmaakt. Aangezien iedere mc in dat lusje een variabele krijgt die outline heeft, kan je die via target_mc benaderen :)

Daarnaast zeg je:

"Ik heb even gekeken, maar het is vrij lastig zoeken omdat de foto's en zo er niet bij zitten. Maar je roept toch wel ergens die functie aan he?"

I'm totally lost welke functie bedoel je...

Sorry IK_mc = niet.zo.snel.van.begripDie functie waarin het lusje staat. (mccreator of zoiets) :)

tha beaver
%Europe/Berlin %294 %2006, 07:04
Hoi Roenes,

Ok ik snap het:

Ja ik roep die functie aan de foto's en de kaders worden gecreeerd alleen de kaders worden niet geresized.

Ik heb de swf met jou aangepaste versie van het script even live gezet:

maar dat werkt gewoon goed:
Kijk maar eens op http://www.xs4all.nl/~festen

selecteer portfolio in het menu en selecteer de foto links onder in beeld.
Boven in beeld komen dan kleine fototjes (de witte kaders zouden maar 1 pixel breder mogen zijn dan de foto's.

als ik in het if statement wat de resize doet een trace target_mc.ouline opneem krijg ik undefined terug?

if (target_mc._width<49) {
trace (target_mc)
trace (target_mc.outline)
//outline bevat een verwijzing naar de juiste mc (zie for lus)
target_mc.outline._width = 36;


} else {
menu.outline._height = 36;
}

Roenes
%Europe/Berlin %627 %2006, 15:04
als ik in het if statement wat de resize doet een trace target_mc.ouline opneem krijg ik undefined terug?Weird. Wat geeft die trace(target_mc); terug? Wel een goed path naar een mc?

En als je die menu.outline traced in het for lusje? Wat geeft die terug? ff om te kijken of het daar al eventueel fout gaat? :)

tha beaver
%Europe/Berlin %860 %2006, 20:39
Hoi Roenes,

De trace op target_mc binnen de het if statement geeft netjes:

_level0.menu_mc1.menuphoto_mc0
_level0.menu_mc1.menuphoto_mc1
_level0.menu_mc1.menuphoto_mc2
_level0.menu_mc1.menuphoto_mc3
_level0.menu_mc1.menuphoto_mc4

terug, hiermee weet ik dat het juiste aantal keer naar de juiste foto gekeken wordt.

Binnen de for loop een trace op menu.outline geeft:

_level0.menu_mc1.outline_mc0
_level0.menu_mc1.outline_mc1
_level0.menu_mc1.outline_mc2
_level0.menu_mc1.outline_mc3
_level0.menu_mc1.outline_mc4

Roenes
%Europe/Berlin %866 %2006, 20:47
Scoping foutje dus. Volgens mij moet de onLoadComplete dit worden om de boel te laten werken:
loadListener.onLoadComplete = function(target_mc)
{
_root._visible = true; //Waarvoor is die???
if (target_mc._width < 49)
{
//outline bevat een verwijzing naar de juiste mc (zie for lus)
target_mc._parent.outline._width = 36;
}
else
{
target_mc._parent.outline._height = 36;
}
}:)

tha beaver
%Europe/Berlin %879 %2006, 21:06
Nee dat is het ook niet

trace (target_mc._parent.outline)

geeft undefined terug.

Ps ik kwam er tot mijn schrik achter dat een trace op:

mcLoader = new MovieClipLoader();
loadListener = new Object();
loadListener.onLoadComplete = function(target_mc) {
if (target_mc._width<49) {
trace(target_mc._width);
trace(target_mc.outline);
//outline bevat een verwijzing naar de juiste mc (zie for lus)
target_mc.outline._width = 36;
} else {

menu.outline._height = 36;
}
};

hier overal 0 terug geeft hetgeen de width is voor het laden van de foto.

tha beaver
%Europe/Berlin %902 %2006, 21:40
Ok, hehe ik heb zelf ook eens wat opgelost het probleem met de width = 0 zit em in het feit dat ik onloadInit moet gebruiken ipv onloadComplete.

Het andere probleem blijft wel bestaan...

Roenes
%Europe/Berlin %924 %2006, 22:10
Dat probleem bestaat ook nogsteeds door een denkfout van mij :P Ik zie nu pas dat je steeds in 1 dezelfde mc verschillende outlines maakt. Die verwijzing van outline slaat dan ook nergens meer op. Vergeet die maar gauw. Volgens mij moet het dit worden:

///////////////////////////////////////
//////////MCCReATor////////////////////
///////////////////////////////////////
mcLoader = new MovieClipLoader();
loadListener = new Object();
loadListener.onLoadInit = function(target_mc)
{
_root._visible = true;
var suffix = target_mc._name.split("_")[1];
if (target_mc._width < 49)
{
target_mc._parent["outline_" + suffix]._width = 36;
trace(target_mc._parent["outline_" + suffix]);
}
else
{
target_mc._parent["outline_" + suffix]._height = 36;
}
}
mcLoader.addListener(loadListener);

function mccreator() {
var masked = _root.createEmptyMovieClip("menu_mc1", _root.getNextHighestDepth());
var mask = _root.createEmptyMovieClip("mask_mc", _root.menu_mc.getNextHighestDepth());
trace(_root.menu_mc1.getDepth());
trace(_root.mask_mc.getDepth());
mask.lineStyle(1, 0xFFFFFF, 100);
mask.beginFill(0xFFFFFF, 100);
mask.lineTo(500, 0);
mask.lineTo(500, 55);
mask.lineTo(0, 55);
mask.lineTo(0, 0);
mask.endFill();
mask._x = 19;
mask._y = 9;
masked.setMask(mask);
for (var i = 0; i<number; i++) {
var outline = _root.menu_mc1.createEmptyMovieClip("outline_mc"+i, _root.menu_mc1.getNextHighestDepth());
var menu = _root.menu_mc1.createEmptyMovieClip("menuphoto_mc"+i, _root.menu_mc1.getNextHighestDepth());
mcLoader.loadClip(folder+i+".jpg", menu);
_root._visible = false;
var button = _root.menu_mc1.createEmptyMovieClip("menubutton_btn"+i, _root.menu_mc1.getNextHighestDepth());
outline.lineStyle(1, 0xFFFFFF, 100);
outline.beginFill(0xFFFFFF, 100);
outline.lineTo(ww+1, 0);
outline.lineTo(ww+1, hh+1);
outline.lineTo(0, hh+1);
outline.lineTo(0, 0);
outline.endFill();
outline._x = xx-1+i*offset1;
outline._y = yy-1;
menu._x = xx+i*offset1;
menu._y = yy;
button.lineStyle(1, 0xB3B3B3, 0);
button.beginFill(0x6C6C6C, 0);
button.lineTo(ww, 0);
button.lineTo(ww, hh);
button.lineTo(0, hh);
button.lineTo(0, 0);
button.endFill();
button._x = xx+i*offset1;
button._y = yy;
button.i = i;
button.onRelease = function() {
_root.picture_mc.loadMovie(folder+this.i+"large.jpg");
};
}
}
Als dit ook niet werkt, geef dan even aan wat de traces opleveren want dan is het waarschijnlijk weer een scoping foutje. Maar voor zover ik het nu kan zien moet het dit zijn :)

tha beaver
%Europe/Berlin %929 %2006, 22:17
Roenes YOU'RE A MAYOR HERO.

You solved IT.

Ik ga er gauw op studeren MANY THANKS, ik zal even punten toekennen.
8D 8D 8D 8D 8D 8D 8D 8D 8D [8ball] [:o)]

Roenes
%Europe/Berlin %019 %2006, 00:28
Gelukkig dat dit opgelost is. Als je site helemaal af is dan moet je em nog wel ff showen he ;):)