In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

MusicPlayer Thi

...
@author Thi
Get Adobe Flash player
by Thy 17 Apr 2010
/**
 * Copyright Thy ( http://wonderfl.net/user/Thy )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/g6Xa
 */

package 
{
	import flash.display.Bitmap;
	import flash.display.BlendMode;
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.events.Event;
	
	//
	
	
	
	/**
	 * ...
	 * @author Thi
	 */
	public class Main extends Sprite 
	{
		//[Embed(source = '../lib/fundo2.jpg')]
		//private var Fundo:Class
		
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private var pause:SmartPause
		private var topic:Topicos
		private var player:MusicPlayer
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			//
			
			//stage.addChild(new Fundo() )
			var fundo:String = "http://thethi.webs.com/fundo2.jpg"
			var back:background = new background(stage, fundo, 1)
			
			
			pause = new SmartPause(stage,.2,40)
			pause.start()
			
			//
			
			
			
			var links:Array = 
			[
			["Labs", 
			["blablabla" , "www.wonderfl.net"]
			],
			
			["Blah", 
			["lalala", "www.wonderfl.net"]
			],
			
			["Nah",
			["_|_", "www.google.com"]
			]
			
			]
			
			
			topic = new Topicos(stage, links, 399, 50)
			stage.addChild(topic)
			
			var musicas:Array = 
			[
			"http://thethi.webs.com/Entrosa8.swf",
			"http://thethi.webs.com/m/03%20Plan%20B%20-%20She%20Said.mp3",
			"http://thethi.webs.com/m/39%20Glee%20Cast%20-%20It's%20My%20Life-Confessions%20Pt.II.mp3",
			"http://thethi.webs.com/m/23%20Black%20Eyes%20Peas%20-%20Rock%20That%20Body.mp3",
			"http://thethi.webs.com/m/07%20Sugababes%20-%20Wear%20My%20Kiss.mp3",
			"http://thethi.webs.com/m/09%20Inna%20-%20Hot.mp3",
			"http://thethi.webs.com/m/22%20Boyzone%20-%20Gave%20It%20All%20Away.mp3",
			"http://thethi.webs.com/m/03%20Rihanna%20-%20Rude%20Boy.mp3",
			"http://thethi.webs.com/m/04%20Ellie%20Goulding%20-%20Starry%20Eyed.mp3",
			"http://thethi.webs.com/m/12%20Chiddy%20Bang%20-%20The%20Opposite%20Of%20Adults.mp3",
			"http://thethi.webs.com/m/29%20Alphabeat%20-%20Hole%20In%20My%20Heart.mp3",			
			"http://thethi.webs.com/m/Starstrukk_.mp3",
			"http://thethi.webs.com/m/All%20the%20Right%20Moves_.mp3",	
			"http://thethi.webs.com/m/3%20Words_.mp3",
			"http://thethi.webs.com/m/Im%20Not%20Alone_.mp3",
			"http://thethi.webs.com/m/If%20We%20Ever%20Meet%20Again.mp3"
			]
			
			player = new MusicPlayer(stage, musicas, 399, 25)
			player.y = 50
			stage.addChild(player)
			//player.blendMode = BlendMode.MULTIPLY
		}
		
		
	}
	
}

//------------ ------------- -------------- ----------------- ---------------- ----------------------------- ------------------------------
import flash.display.Loader;
	import flash.display.Stage;
	import flash.events.Event;
	import flash.net.URLRequest;
	/**
	 * ...
	 * @author Thi
	 */
	class background
	{
		
		private var loader:Loader = new Loader()
		private var stage:Stage
		private var index:int
		private var request:URLRequest
		
		public function background(stage:Stage, request:String, index:int) 
		{
			this.index = index
			this.stage = stage
			this.request = new URLRequest(request)
			loader.load(this.request)
			request = null
			this.request = null
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, complete)
		}
		
		private function complete(e:Event):void
		{
			loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, complete)
			stage.addChildAt(loader.content, index)
			index = 0
			loader = null
		}
		
	}



//------------ ------------- -------------- ----------------- ---------------- ----------------------------- ------------------------------


	import flash.display.Stage
	import flash.events.Event;
	import flash.events.MouseEvent;
	/**
	 * ...
	 * @author Thi
	 */
	class SmartPause //extends Object
	{
		
		public var min:Number
		public var max:Number
		
		private var stage:Stage
		private var event:int = 0
		
		public function SmartPause(stage:Stage = null, a:Number = 0,b:Number = 40) 
		{
			this.stage = stage
			min = a
			max = b
			stage.frameRate = min
		}
		//
		public function start():void
		{
			event = 1
			trace(stage)
			stage.addEventListener(MouseEvent.MOUSE_MOVE, In)
		}
		
		public function stop():void
		{
			if (event == 1)
			{
				stage.removeEventListener(MouseEvent.MOUSE_MOVE, In)
			}
			if (event == 2)
			{
				stage.removeEventListener(Event.MOUSE_LEAVE, Out)
			}
			event = 0
		}
		//
		private function In(e:MouseEvent = null):void
		{
			event = 2
			stage.frameRate = max
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, In)
			stage.addEventListener(Event.MOUSE_LEAVE, Out)
		}
		
		private function Out(e:Event = null):void
		{
			event = 1
			stage.frameRate = min
			stage.addEventListener(MouseEvent.MOUSE_MOVE, In)
			stage.removeEventListener(Event.MOUSE_LEAVE, Out)
		}	
	}
	
	
	
//------------ ------------- -------------- ----------------- ---------------- ----------------------------- ------------------------------

import flash.display.Graphics;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.ProgressEvent;
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.net.URLRequest;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.utils.ByteArray;
	/**
	 * ...
	 * @author Thi
	 */
class MusicPlayer extends Sprite
	{
		
		private var st:Stage
		public var links:Array
		private var link_entrosa:String
		public var W:Number, H:Number
		public var format:TextFormat
		
		
		
		public function MusicPlayer(stage:Stage = null, links:Array = null, W:Number = 399, H:Number = 49, format:TextFormat = null) 
		{
			st = stage
			link_entrosa = links[0]
			links.splice(0,1)
			this.links = links
			trace(links)
			this.W = W
			this.H = H
			if (format == null)
			{
				this.format = new TextFormat("Arial", 12,0)
			} else {
				this.format = format
			}
			// função que desenha, escreve e adiciona listeners
			start()
		}
		
		
		public function start():void
		{
			this.addChild(Tinf)
			this.addChild(linha)
			
			
			
			loader()
			backPlaying.graphics.beginFill(0, 0)
			backPlaying.graphics.drawRect(10,0,128,H*.5)
			backPlaying.addEventListener(MouseEvent.CLICK, click)
			this.addChild(backPlaying)
			trace(this)
			
			
		}
		
		private var carregou:Boolean
		private var Entrosa:Loader = new Loader()
		private var carregadorCarregado:Boolean = false
		private var objEntrosa:Object
		private var primeiroID3:Boolean = false
		private var id3Pego:Boolean
		private function loader():void
		{
			trace("vai começar a carregar o entrosa")
			Entrosa.load(new URLRequest(link_entrosa))
			Entrosa.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loader_progress)
			Entrosa.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete)
		}
		
		
		
		private function loader_progress(e:ProgressEvent):void
		{
			trace("tá carregano o filho da puta", 100*e.bytesLoaded/e.bytesTotal)
		}
		
		
		private function loader_complete(e:Event):void
		{
			trace("FINALMENTE CARREGOU O LOADER")
			objEntrosa = Object(Entrosa.content)
			
			trace("AGORA VAI COMEÇAR UMA NOVA MÚSICA")
			newMusic()
		}
		
		private var som:Sound = new Sound()
		private var somC:SoundChannel = new SoundChannel()
		private var link:int = 0
		private function newMusic():void
		{
			trace("NewMusic")
			
			this.removeChild(linha)
			linha = null
			linha = new Sprite()
			this.addChild(linha)
			
			
			carregou = false
			position = 0
			
			trace("link ants", link)
			link = link >= links.length ? link - links.length : link < 0? links.length + link : link
			trace("link dpois", link)
			
			objEntrosa.link = links[link]
			objEntrosa.loadLink()
			
			som = null
			som = objEntrosa.som
			
			//somC = som.play()
			
			som.addEventListener(Event.COMPLETE, Lcomp)
			som.addEventListener(ProgressEvent.PROGRESS, Lprog)
			
			//Listener pra pegar e mostrar o ID3 quando este 'ficar pronto'
			this.addEventListener(Event.ENTER_FRAME, id3)
			this.addEventListener(Event.ENTER_FRAME, linhaLoop)
			
		}
		
		private function Lcomp(e:Event):void
		{
			trace("COMPLETOU o Loading")
			som.removeEventListener(Event.COMPLETE, Lcomp)
			som.removeEventListener(ProgressEvent.PROGRESS, Lprog)
			//som.removeEventListener(IOErrorEvent.IO_ERROR, Lerro)
			carregou = true
		}
		
		private var loading:Number
		
		private function Lprog(e:ProgressEvent):void
		{
			//trace("progressando", e.bytesLoaded*100/e.bytesTotal)
			//mostra o loading bar
			loading = 128 * e.bytesLoaded / e.bytesTotal
			
			//algumas coisas
			carregou = false
			
		}
		
		public var Tinf:TextField = new TextField()
		private function id3(e:Event = null):void
		{
			trace("verificou se", objEntrosa.id3Pronto,"&&", !id3Pego)
			
			if (objEntrosa.id3Pronto && !id3Pego)
			{
				this.removeChild(Tinf)
				Tinf = null
				
				Tinf = new TextField()
				Tinf.defaultTextFormat = format
				Tinf.autoSize = TextFieldAutoSize.LEFT
				this.addChild(Tinf)
				
				trace("FINALMETE O ID3 FICO PRONTO !")
				
				Tinf.text = (objEntrosa.id3.songName == null ? "?" : objEntrosa.id3.songName) + " - "  + (objEntrosa.id3.artist == null ? "?" : objEntrosa.id3.artist)
			    Tinf.textColor = 0x7F7F7F
				Tinf.alpha = .8
				Tinf.x = 128 + 20
				id3Pego = true
				butons()
				
				if (play)
				{
					somC = som.play()
					this.addEventListener(Event.ENTER_FRAME, soundComplete)
				}
				
				
				//remove o listener desta função
				this.removeEventListener(Event.ENTER_FRAME, id3)
			}
		}
		
		private var b0:Sprite = new Sprite(), b1:Sprite = new Sprite(), b2:Sprite = new Sprite()
		private var play:Boolean
		private function butons():void
		{
			b0.graphics.clear()
			b1.graphics.clear()
			b2.graphics.clear()
			
			b0 = new Sprite()
			b1 = new Sprite()
			b2 = new Sprite()
			
			var G:Graphics = b0.graphics
			with (G)
			{
				lineStyle(1, 0)
				
				beginFill(0x7F7F7F, .5)
				
				moveTo(5, 0)
				lineTo(0, 3)
				lineTo(5, 6)
				lineTo(5, 0)
				
				moveTo(10, 0)
				lineTo(5, 3)
				lineTo(10, 6)
				lineTo(10, 0)
				
				endFill()
			}
			
			G = b1.graphics
			if (play)
			{
				trace("EH PLAY")
				with (G)
				{
					lineStyle(1, 0)
					
					beginFill(0x7F7F7F, .5)
					
					drawRect(0, 0, 3, 6)
					drawRect(5, 0, 3, 6)
					
					endFill()
				}
			} else {
				trace("NAUM EH PLAY")
				with (G)
				{
					lineStyle(1, 0)
					
					beginFill(0x7F7F7F, .5)
					
					lineTo(9, 3)
					lineTo(0, 6)
					lineTo(0, 0)
					
					endFill()
				}
			}
			
			G = b2.graphics
			with (G)
			{
				lineStyle(1, 0)
				beginFill(0x7F7F7F, .5)
				
				lineTo(0, 6)
				lineTo(5, 3)
				lineTo(0, 0)
				
				moveTo(5, 0)
				lineTo(5, 6)
				lineTo(10, 3)
				lineTo(5, 0)
				
				endFill()
			}
			
			b0.x = 0 + 44 + 10
			b1.x = 15 + 44 + 10
			b2.x = 29 + 44 + 10
			b0.y = b1.y = b2.y = H * .5
			
			b0.addEventListener(MouseEvent.CLICK, bClick)
			b1.addEventListener(MouseEvent.CLICK, bClick)
			b2.addEventListener(MouseEvent.CLICK, bClick)
			
			this.addChild(b0)
			this.addChild(b1)
			this.addChild(b2)
		}
		
		private function soundComplete(e:Event=null):void
		{
			if (playing > 127.8)
			{
				this.removeEventListener(Event.ENTER_FRAME, soundComplete)
				trace("POHAAAAAAAAAAAAAAA_______________")
				somC.stop()
				id3Pego = false
				++link
				newMusic()
			}
		}
		
		
		private var linha:Sprite = new Sprite()
		private var ba:ByteArray
		private var playing:Number
		private var length:Number
		private function linhaLoop(e:Event = null):void
		{
			var G:Graphics = linha.graphics
			with (G)
			{
				clear()
				lineStyle(1, 0, .2)
			}
			
			if (play)
			{
				length = som.length  / (loading/128)
				playing = 128 * somC.position / length
				objEntrosa.getByteArray()
				ba = objEntrosa.ba
				
				var num:Number = 0
				var i:int = 0
				
				
				while (i < 128)
				{
					if (i <= playing)
					{
						//played
						G.lineStyle(1, 0xFF0000, .9)
						
					} else if (i >= loading)
					{
						//not loaded
						G.lineStyle(.5, 0x000000, .5)
					} else {
						//loaded
						G.lineStyle(1, 0x000000, .9)
					}
					
					num = ba.readFloat()
					G.lineTo(i, - num*H*.25)
					
					++i
				}
				
				G.lineTo(128, 0)
				
				
				
			} else {
				
				with (G)
				{
					lineTo(loading, 0)
					lineStyle(1,0, .1)
					lineTo(128,0)
					
				}
					
			}
			
			/*
			with (G)
			{
				lineTo(128,0)
				lineTo(128, H * .65)
				lineTo(0, H * .65)
				lineTo(0, 0)
			}
			*/
			
			
			
			linha.x = 10
			linha.y = H*.25
			
		}
		
		private var position:Number = 0
		private function bClick(e:MouseEvent):void
		{
			var target:Sprite = Sprite(e.target)
			trace("CLICK", target)
			if (target == b0)
			{
				this.removeEventListener(Event.ENTER_FRAME, soundComplete)
				somC.stop()
				if (!carregou)
				{
					som.close()
				}
				
				id3Pego = false
				--link
				newMusic()
			} else if (target == b1)
			{
				if (play)
				{
					play = false
					position = somC.position
					somC.stop()
					this.removeEventListener(Event.ENTER_FRAME, soundComplete)
				} else {
					play = true
					somC = som.play(position)
					this.addEventListener(Event.ENTER_FRAME, soundComplete)
				}
				butons()
				
			} else if (target == b2)
			{
				this.removeEventListener(Event.ENTER_FRAME, soundComplete)
				somC.stop()
				id3Pego = false
				if (!carregou)
				{
					som.close()
				}
				++link
				newMusic()
			}
			
			
		}
		
		private var backPlaying:Sprite = new Sprite()
		private function click(e:MouseEvent = null):void
		{
			
			//var Y:Number = mouseY
			var X:Number = mouseX
			position = (mouseX - 10) * length / 128
			if (position <= som.length)
			{
				somC.stop()
				somC = som.play(position)
				trace("position > length", position,">",length)
			}
			
			
			
		}
		
		
		
	}




//------------ ------------- -------------- ----------------- ---------------- ----------------------------- ------------------------------



	import flash.display.BlendMode;
	import flash.display.Graphics;
	//import flash.display.Loader;
	import flash.display.Sprite;
	import flash.display.Stage
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.net.URLRequest;
	import flash.net.navigateToURL
	//import flash.system.Security;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	/**
	 * ...
	 * @author Thi
	 */
class Topicos extends Sprite
	{
		//Security.allowDomain("*")
		//Security.LOCAL_TRUSTED
		
		private var st:Stage
		public var links:Array
		public var /*X:Number, Y:Number,*/ W:Number, H:Number
		public var format:TextFormat
		
		//função principal.
		public function Topicos(stage:Stage = null, links:Array = null, W:Number = 399, H:Number = 49, format:TextFormat = null) 
		{
			// 1# o stage, será usado ara adicionar os listeners de movimento e click do mouse
			// 2# os links, em certa organização de array, será usado para escrever os nomes dos menus, e seus links
			// 3# a largura da máscara dos Textos (cuidado! não é a largura desse Sprite) (lembre: essa classe é um sprite!)
			// 4# A altura da máscara dos textos
			// 5# o TextFormat dos textos. Ou você predefine um, ou um será predefinido aqui na classe mesmo.
			st = stage
			this.links = links
			this.W = W
			this.H = H
			if (format == null)
			{
				this.format = new TextFormat("Arial", 16,0)
			} else {
				this.format = format
			}
			// função que desenha, escreve e adiciona listeners
			start()
		}
		
		// Máscaras invisíveis pros textos
		private var S1:Sprite, S2:Sprite
		// lugar onde os textos ficarão (um conteiner)
		private var TS1:Sprite, TS2:Sprite
		// variável que guardará os TextFields
		private var TP1:Vector.<Number>, TP2:Vector.<Number>
		
		
		public function start():void
		{
			//loader()
			//desenha os menus (invisíveis; máscaras pros textos)
			desenhar()
			//desenha o menú de cima
			escrever()
			//adiciona os listeners
			listeners()
		}
		
		//
		
		/*private var objLinker:Object
		private var Linker:Loader
		
		private function loader():void
		{
			Linker = new Loader()
			Linker.load(new URLRequest("http://thethi.webs.com/Linker2.swf"))
			Linker.contentLoaderInfo.addEventListener(Event.COMPLETE, complete)
			
		}*/
		
		/*private function complete(e:Event = null):void
		{
			trace("completou")
			objLinker = Object (Linker.content)
			
			
		}*/
		
		
		//desenha os dois Menus. Sserão invisíveis, apenas máscaras.
		private function desenhar():void
		{
			S1 = S2 = null
			
			S1 = new Sprite()
			S2 = new Sprite()
			
			this.addChild(S1)
			this.addChild(S2)
			
			var G:Graphics = S1.graphics
			with (G)
			{
				clear()
				beginFill(0xFFFFFF)
				drawRect(this.x, this.y, W, H * .5 - 1)
				endFill()
			}
			
			G = S2.graphics
			with (G)
			{
				clear()
				beginFill(0xFFFFFF)
				drawRect(this.x, this.y + H * .5, W, H * .5)
				endFill()
			}
		}
		
		//valor da margem entre os textos
		//também são usadas posteriormente pra saber a largura total dos textos
		private var margem:Number, margem2:Number
		//função que escreve os textos do menu de cima
		private function escrever():void
		{
			//se livra das coisas antigas
			if (TS1 != null)
			{
				while (TS1.numChildren > 0)
				{
					TS1.removeChildAt(0)
				}
			}
			
			TS1 = TS2 = null
			TP1 = TP2 = null
			
			//prepara algumas vars
			var T:TextField
			var i:int = 0
			var j:int = links.length
			
			TS1 = new Sprite()
			TS2 = new Sprite()
			TP1 = new Vector.<Number>(j * 2)
			
			//margem pro primeiro texto
			margem = 30
			//um loop, que ficará adicionando textos, ao sprite 'que tem os textos'
			while (i < j)
			{
				//cria e arruma o texto
				T = new TextField()
				T.defaultTextFormat = format
				T.autoSize = TextFieldAutoSize.LEFT
				T.type = "dynamic"
				T.selectable = false
				T.x = margem
				T.text = String(links [int(i)] [0])
				
				T.blendMode = BlendMode.OVERLAY
				
				//adiciona a posição 'X' do texto
				TP1[int(i * 2)] = margem - 30
				//ajusta a margem que cada texto tem com o próximo
				
				//adiciona ao sprite que guarda os textos (do menu de cima)
				TS1.addChild(T)
				//adiciona a posição 'X + Lagura' do texto
				//TP1[int(i * 2 + 1)] = margem
				//passa pro próximo texto
				
				
				if (i + 1 < j)
				{
					margem += T.width + 15
					//adiciona um separador
					T = new TextField()
					T.defaultTextFormat = format
					T.autoSize = TextFieldAutoSize.LEFT
					T.type = "dynamic"
					T.selectable = false
					T.x = margem
					T.text = "|"
					
					TS1.addChild(T)
					
					T.blendMode = BlendMode.OVERLAY
					
					//adiciona a posição 'X + Lagura' do texto
					TP1[int(i * 2 + 1)] = margem
					
					margem += 25
				} else {
					trace(TP1, i, T.text)
					margem += T.width
					margem = margem < W? W : margem
					TP1[int(i * 2 + 1)] = margem
				}
				
				++i
			}
			//se livra do texto, que estava sendo usado como molde para criar textos
			//eu posso me livrar deste
			T = null
			//mostra o grupo de textos neste Sprite (nesta classe)
			this.addChild(TS1)
			//arruma máscaras
			TS1.mask = S1
			TS2.mask = S2
		}
		
		//função que escreve os textos do menu de baixo
		private function escrever2():void
		{
			//me livro das coisas que podem ser anteriores
			if (TS2 != null)
			{
				while (TS2.numChildren > 0)
				{
					TS2.removeChildAt(0)
				}
			}
			
			TS2 = null
			TP2 = null
			
			//preparo vars
			var T:TextField
			var i:int = 1
			var j:int = links[int(item)].length
			trace("j",j)
			
			TS2 = new Sprite()
			TP2 = new Vector.<Number>()//(j-2) * 2 )
			
			//margem do 1° texto
			margem2 = 30
			//função que ficará criando textos, adicionando ao 'grupão de textos', e indexando suas propriedades
			
			
			while (i < j)
			{
				//cria e arruma o texto
				T = new TextField()
				T.defaultTextFormat = format
				T.autoSize = TextFieldAutoSize.LEFT
				T.type = "dynamic"
				T.selectable = false
				T.x = margem2
				T.text = String(links [item] [i] [0])
				
				T.blendMode = BlendMode.OVERLAY
				
				//adiciona a posição 'X' do texto
				trace("HM",TP2.length, int((i-1) * 2), "=", margem2 - 30)
				TP2[int((i-1) * 2)] = margem2 - 30
				//ajusta a margem que cada texto tem com o próximo
				
				//adiciona ao sprite que guarda os textos (do menu de cima)
				TS2.addChild(T)
				//adiciona a posição 'X + Lagura' do texto
				//TP1[int(i * 2 + 1)] = margem
				//passa pro próximo texto
				
				if (i + 1 < j)
				{
					margem2 += T.width + 15
					//adiciona um separador
					T = new TextField()
					T.defaultTextFormat = format
					T.autoSize = TextFieldAutoSize.LEFT
					T.type = "dynamic"
					T.selectable = false
					T.x = margem2
					T.text = "|"
					
					TS2.addChild(T)
					
					T.blendMode = BlendMode.OVERLAY
					
					//adiciona a posição 'X + Lagura' do texto
					TP2[int((i - 1) * 2 + 1)] = margem2
					trace(int((i - 1) * 2 + 1), "=",margem2)
					
					margem2 += 25
				} else {
					margem2 += T.width
					margem2 = margem2 < W? W : margem2
					trace(TP2,i,T.text)
					TP2[int((i - 1) * 2 + 1)] = margem2
					trace(int((i - 1) * 2 + 1), "=",margem2, "fim", TP2[int((i - 1) * 2 + 1)])
				}
				
				++i
			}
			trace(TP2)
			
			//me livro das coisas que não serão usadas
			T = null
			//mostro o 'grupão de textos' (de baixo) nesse sprite (esta classe)
			this.addChild(TS2)
			//arrumo a posição e máscara
			TS2.y = H*.5
			TS2.mask = S2
		}
		
		//listeners ---------------------------------------------------------------------------------------
		
		// adicionar dois listeners
		private function listeners():void
		{
			//listener para mudar a posição dos textos
			st.addEventListener(MouseEvent.MOUSE_MOVE, mm)
			//listener para o click, tanto para abrir menus ou links
			st.addEventListener(MouseEvent.CLICK, cl)
		}
		
		// funções dos listeners --------------------------------------------------------------------------
		
		private var mx:Number, my:Number
		//evento do movimento do mouse
		private function mm(e:MouseEvent = null):void
		{
			//vê a posição do mouse
			mx = mouseX
			my = mouseY
			
			//
			var i:int, j:int, ja:Boolean
			
			//ve se o mouse está sobre os menus de cima ou nos de baixo
			if (my >= 0 && my <= H * .5 && mx >= 0 && mx <= W)
			{
				// tá nos menus de cima
				margem = margem < W? W : margem
				//arruma a posição dos textos
				TS1.x = - (mouseX / W) * (margem - W)
				
				//
				i = 0
				j = TP1.length
				ja = false
				while (i < j)
				{
					TextField(TS1.getChildAt(i)).blendMode = BlendMode.OVERLAY
					if (mx > TP1[int(i)] && mx < TP1[int(i+1)] && !ja)
					{
						TextField(TS1.getChildAt(i)).blendMode = BlendMode.NORMAL
						ja = true
					}
					++i;++i;
				}
				
				
			} else if (TP2 != null && my >= 0 && my <= H && mx >= 0 && mx <= W) 
			{
				// tá nos menus de baixo
				margem2 = margem2 < W? W : margem2
				//arruma a posição dos textos
				TS2.x = - (mouseX / W) * (margem2 - W)
				mx -= TS2.x
				trace("mx", mx)
				
				//
				
				//
				i = 0
				j = TP2.length
				ja = false
				trace(j)
				while (i < j)
				{
					//trace("fez", i,TS2.numChildren, j)
					TextField(TS2.getChildAt(i)).blendMode = BlendMode.OVERLAY
					if (mx > TP2[int(i)] && mx < TP2[int(i+1)] && !ja)
					{
						trace(i, TP2[int(i)], TP2[int(i+1)])
						TextField(TS2.getChildAt(i)).blendMode = BlendMode.NORMAL
						ja = true
					}
					++i;++i;
				}
				
				
			}
		}
		
		//valor que guarda o index do 'menu' e do 'link', respectivamente
		private var item:int, item2:int
		//função do click
		private function cl(e:MouseEvent = null):void
		{
			//pega valores Y do mouse e prepara vars
			mx = mouseX
			my = mouseY
			
			var i:int = 0, j:int
			//vê se clicou no menu de cima ou de baixo
			if (my >= 0 && my <= H * .5 && mx >= 0 && mx <= W)
			{
				// tá nos menus de cima
				// vê em 'quem' clicou
				mx = (mouseX / W) * margem
				item = 0
				j = TP1.length
				while (i < j)
				{
					if (mx > TP1[int(i)] && mx < TP1[int(i+1)])
					{
						item = i * .5
						i = j
					}
					++i;++i;
				}
				// aqui no final desta função, pegou-se o index do 'menu de cima' que foi clicado
				//agora escreverá o menu de baixo, segundo o index 'item'
				escrever2()
				
			} else if (TP2 != null && my >= 0 && my <= H && mx >= 0 && mx <= W) 
			{
				// tá nos menus de baixo
				mx = (mouseX / W) * margem2
				item2 = 0
				j = TP2.length
				while (i < j)
				{
					if (mx > TP2[int(i)] && mx < TP2[int(i+1)])
					{
						//pega o index do 'menu de baixo' que foi clicado
						item2 = i * .5 + 1
						i = j
						
						/*objLinker.link = links [ int(item) ] [item2] [1]
						objLinker.navegar()*/
						
						//e já carrega este link
						var url:URLRequest = new URLRequest(links [int(item)] [item2] [1])
						try
						{
							navigateToURL(url, "_blank")
						} catch (e:Error)
						{
							trace("Merda, num foi", e.message);
						}
						trace("navego pra", url.url)
						//var jscommand:String = "window.open('http://www.adobe.com','win','height=200,width=300,toolbar=no,scrollbars=yes');"; var url:URLRequest = new URLRequest("javascript:" + jscommand + " void(0);"); navigateToURL(url, "_self");
					}
					++i;++i;
				}
			}
		}
		
	}