forked from: forked from: forked from: flash on 2014-5-29

by tepe forked from forked from: forked from: flash on 2014-5-29 (diff: 153)
youtube プレイヤー
検索リストからマイリストへ追加するボタンを作成する
検索リストのデザインを修正する

マイリストの管理
soへ動画IDを保存
♥0 | Line 1088 | Modified 2014-06-27 12:09:30 | MIT License
play

ActionScript3 source code

/**
 * Copyright tepe ( http://wonderfl.net/user/tepe )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/77MX
 */

// forked from tepe's forked from: forked from: flash on 2014-5-29
// forked from tepe's forked from: flash on 2014-5-29
// forked from tepe's flash on 2014-5-29
//youtube プレイヤー
//検索リストからマイリストへ追加するボタンを作成する
//検索リストのデザインを修正する
/*マイリストの管理
soへ動画IDを保存
*/
package {
    import flash.display.*;
    import flash.events.*;
    import flash.text.*;
    import flash.net.*;
    import flash.ui.*;
    public class FlashTest extends Sprite {
        
        private var loader:TubeLoader;
        private var player:TubePlayer;
        private var t3:TextField = new TextField();
        private var scrY:int=0;
        private var s1:Sprite =new Sprite();
        private var mylist:TubeMylist = new TubeMylist();
        private var idData:Object = new Object();
        //private var save:TubeMylist = new TubeMylist();
        private var search:SearchBar;;

        
        public function FlashTest(){
            s1Init();
            loader = new TubeLoader();
            loader.addEventListener(Event.COMPLETE,onComplete);
            addChild(t3);
            //addChild(player);
            t3.border = true;
            t3.height=300;
            t3.width = 400;
            t3.y =50;
            t3.x = 320;
            addChild(s1);//リスト
            
            //検索窓
            search = new SearchBar();
            search.x = 320;
            search.y = 20;
            search.text = "MMDPV";
            addChild(search);
            
            search.addEventListener(KeyboardEvent.KEY_DOWN,onKey);
            search.btn.addEventListener(MouseEvent.CLICK,function():void{
                loader.requestWords(search.text);
            });
            
            //t2.addEventListener(KeyboardEvent.KEY_UP,onKey);
            stage.addEventListener(KeyboardEvent.KEY_DOWN,onKey2);
            stage.addEventListener(MouseEvent.MOUSE_WHEEL,onWheel);
            player = new TubePlayer(120,80);
            //addChild(player);
            //player.y = 30;
            loadMylist();
            
            
            
            //t4.text = loadMylist().toString();

        }
        private function s1Init():void{
            s1.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent):void{
                s1.startDrag();
                Mouse.cursor = MouseCursor.HAND;
                stage.addEventListener(MouseEvent.MOUSE_MOVE,onDrag);
            });
            s1.addEventListener(MouseEvent.MOUSE_UP,function(e:MouseEvent):void{ 
                Mouse.cursor = MouseCursor.AUTO;
                s1.x =0;
                s1.stopDrag();
                stage.removeEventListener(MouseEvent.MOUSE_MOVE,onDrag); 
            });
            

        }
        private var nowLoading:Boolean;
        private function onDrag(e:MouseEvent):void{
            s1.x =0;
            if(0<s1.y)s1.y = 0;
            if(s1.y<-s1.height)s1.y = -s1.height;
            if(s1.y+lastY<500){
                //ロード
                if(!nowLoading){
                    t3.appendText("onLoading\n");
                    nowLoading=true;
                    loader.requestWords(search.text);
                    Mouse.cursor = MouseCursor.AUTO;
                    s1.stopDrag();
                }
            }

        }



        
        private function onWheel(e:MouseEvent):void{
            var scr:int = e.delta*5;
            s1.y += scr;
            scrY += scr;
                if(scrY<200){
                    loader.requestWords(search.text);
                }
        }

        
        private function onKey(e:KeyboardEvent):void{
            if(e.keyCode == 13){
                loader.requestWords(search.text);
            }
        }
        private function onKey2(e:KeyboardEvent):void{
            if(e.keyCode==40){
                s1.y-=20;
                scrY-=20;
                if(scrY<200){
                    loader.requestWords(search.text);
                }

            }
            if(e.keyCode==38){
                s1.y+=20;
                scrY+=20;
            }


        } 
         
        private var lastY:int=0;
        private var listCnt:int=0;
        private var prevKey:String;
        private function onComplete(e:Event):void{            
            //t.text = "";
            
            if(prevKey!=search.text){//リストリセット
                prevKey = search.text;
                while(0<s1.numChildren)s1.removeChildAt(0);
                lastY=0;
                listCnt=0;
                scrY=0;
                s1.y=0;
            } 

            //リスト追加
            for(var i:int=listCnt;i<loader.idList.length;i++){ 
                var s:Sprite = createThumb(i);
                s1.addChild(s);
                s.y = lastY;
                lastY += 100;
                
            }
            var t:TextField = new TextField();
            //t = new TextField();
            t.text = loader.idList.length.toString();
            t.height = 20;
            t.y = lastY;
            s1.addChild(t);
            
            lastY+=20;
            scrY = lastY+s1.y-400;
            listCnt = loader.idList.length;
            
            s1.graphics.clear();
            s1.graphics.beginFill(0x00aaff,0);
            s1.graphics.drawRect(0,0,455,lastY);
            s1.graphics.endFill();
            //t.text+="\n";
            //t.scrollV = t.maxScrollV;
            //t.text += loader._xml;
            
            nowLoading=false;
        }
        
        //サムネイル作成
        private function createThumb(num:int):Sprite{
            var id:String = loader.idList[num].toString();
            
            var data:Object = new Object();//動画プロパティを保存する
            data["author"] = loader.authorList[num];//投稿者名
            data["title"] = loader.titleList[num];//タイトル
            data["duration"] = loader.durationList[num];//再生時間(sec)
            idData[id] = data;
            
            var s:Sprite = loader.getImage(id);
            s.addEventListener(MouseEvent.CLICK,onClick);
            s.name = id;
            s.buttonMode = true;
            
            var result:Sprite = new Sprite();
            result.addChild(s);//loader.getImage(id);
            
            var t:TextField = new TextField();
            var str:String = new String();
            str+=loader.titleList[num]+"\n";
            str+= "投稿者:"+loader.authorList[num]+"\n";
            var n:int = loader.durationList[num];
            var h:int = n/3600;
            var min:int = (n/60)%60;
            var sec:int = n%60;
            if(0<h)str+=h.toString()+":";
            str+= min.toString()+":"+sec.toString()+"\n";
            //str+=loader.idList[num].toString()+"\n";
            t.text = str;
            
            t.width=t.textWidth+5;
            t.height=t.textHeight+5;
            t.selectable=false;
            t.x = 130;
            result.addChild(t);
            
            //マイリスト追加ボタン
            var btn:Sprite = new Sprite();
            btn.buttonMode = true;
            btn.name = id;
            btn.graphics.lineStyle(0,0);
            if(mylist.getTitle(id)!=null)btn.graphics.beginFill(0xff0000);
            else btn.graphics.beginFill(0xffffff);
            btn.graphics.drawRect(0,0,20,20);
            btn.graphics.endFill();
            btn.x = 130;
            btn.y = 70;
            btn.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{//マイリストへ追加 
                var idStr:String = e.currentTarget.name;
                var col:uint;
                if(mylist.getTitle(idStr)!=null){ 
                    mylist.remove(idStr);//マイリスト解除
                    col=0xffffff;
                    e.currentTarget.getChildByName("info").text = "解除しました";
                    e.currentTarget.getChildByName("info").pop(0.8);
                }
                else{ 

                    mylist.add(idStr,idData[idStr]);//マイリスト登録
                    col=0xff0000;
                    e.currentTarget.getChildByName("info").text ="マイリストに追加しました";
                    e.currentTarget.getChildByName("info").pop(0.8);
                }
                //mylist.add(idStr);
                
                with(e.currentTarget.graphics){
                    clear();
                    lineStyle(0,0);
                    beginFill(col);
                    drawRect(0,0,20,20);
                    endFill();
                }

            });
            btn.addEventListener(MouseEvent.MOUSE_OVER,function(e:MouseEvent):void{
                var i:InfoLabel = new InfoLabel();
                i.x = 10;
                i.y = 5;
                var idStr:String = e.currentTarget.name;
                i.name = "info";
                if(mylist.getTitle(idStr)!=null){ 
                    i.text = "マイリスト解除"
                    //i.pop();
                    i.fadeIn(1);
                }
                else{ 
                    i.text = "マイリストに追加";
                    //i.pop();
                    i.fadeIn(1); 
                }
                e.currentTarget.addChild(i);
            });
            btn.addEventListener(MouseEvent.MOUSE_OUT,function(e:MouseEvent):void{
                e.currentTarget.getChildByName("info").fadeOut(3);
                e.currentTarget.removeChild(e.currentTarget.getChildByName("info"))
            });

            result.addChild(btn);
            return result;
        }
        
        
        //サムネイル作成
        private function createThumb2(id:String):Sprite{
            //var id:String = loader.idList[num].toString();
            var data:Object = mylist.getData(id);//idData[id];//動画プロパティを保存する
            idData[id] = data;
            var s:Sprite;
            if(data)s = loader.getImage(id);
            else{
                t3.appendText("no data\n");
                s = new Sprite();
                s.graphics.beginFill(0x000000);
                s.graphics.drawRect(0,0,120,90);
                s.graphics.endFill();
                //return s;
                
            }
            
            

            s.addEventListener(MouseEvent.CLICK,onClick);
            s.name = id;
            s.buttonMode = true;
            var result:Sprite = new Sprite();
            result.addChild(s);//loader.getImage(id);
            
            if(data){            
            //t3.appendText("dd\n");
            var t:TextField = new TextField();
            var str:String = new String();
            str+=data["title"]+"\n";
            str+= "投稿者:"+data["author"]+"\n";
            var n:int = data["duration"];//loader.durationList[num];
            var h:int = n/3600;
            var min:int = (n/60)%60;
            var sec:int = n%60;
            if(0<h)str+=h.toString()+":";
            str+= min.toString()+":"+sec.toString()+"\n";
            //str+=loader.idList[num].toString()+"\n";
            t.text = str;
            
            t.width=t.textWidth+5;
            t.height=t.textHeight+5;
            t.selectable=false;
            t.x = 130;
            result.addChild(t);
            }
            
            
            //マイリスト追加ボタン
            var btn:Sprite = new Sprite();
            btn.buttonMode = true;
            btn.name = id;
            btn.graphics.lineStyle(0,0);
            if(mylist.getTitle(id)!=null)btn.graphics.beginFill(0xff0000);
            else btn.graphics.beginFill(0xffffff);
            btn.graphics.drawRect(0,0,20,20);
            btn.graphics.endFill();
            btn.x = 130;
            btn.y = 70;
            btn.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{//マイリストへ追加 
                var idStr:String = e.currentTarget.name;
                var col:uint;
                if(mylist.getTitle(idStr)!=null){ 
                    mylist.remove(idStr);//マイリスト解除
                    col=0xffffff;
                    e.currentTarget.getChildByName("info").text = "解除しました";
                    e.currentTarget.getChildByName("info").pop(0.8);
                }
                else{ 
                    
                    mylist.add(idStr,idData[idStr]);//マイリスト登録
                    col=0xff0000;
                    e.currentTarget.getChildByName("info").text ="マイリストに追加しました";
                    e.currentTarget.getChildByName("info").pop(0.8);
                }
                //mylist.add(idStr);
                
                with(e.currentTarget.graphics){
                    clear();
                    lineStyle(0,0);
                    beginFill(col);
                    drawRect(0,0,20,20);
                    endFill();
                }

            });
            btn.addEventListener(MouseEvent.MOUSE_OVER,function(e:MouseEvent):void{
                var i:InfoLabel = new InfoLabel();
                i.x = 10;
                i.y = 5;
                var idStr:String = e.currentTarget.name;
                i.name = "info";
                if(mylist.getTitle(idStr)!=null){ 
                    i.text = "マイリスト解除"
                    //i.pop();
                    i.fadeIn(1);
                }
                else{ 
                    i.text = "マイリストに追加";
                    //i.pop();
                    i.fadeIn(1); 
                }
                e.currentTarget.addChild(i);
            });
            btn.addEventListener(MouseEvent.MOUSE_OUT,function(e:MouseEvent):void{
                e.currentTarget.getChildByName("info").fadeOut(3);
                e.currentTarget.removeChild(e.currentTarget.getChildByName("info"))
            });
            
            

            result.addChild(btn);
            return result;
        }


        
        private function loadMylist():int{
            t3.appendText("loadMylist\n");
            
            //if(prevKey!=search.text){//リストリセット
                prevKey = "";
                while(0<s1.numChildren)s1.removeChildAt(0);
                lastY=0;
                listCnt=0;
                scrY=0;
                s1.y=0;
            //} 
            
            
            var list:Array = mylist.getIdlist(); 
            list.reverse();
            if(list==null)t3.appendText("err\n");
            else t3.appendText("length:"+list.length.toString()+"\n");
            ///*           
            for(var i:int = 0;i<list.length;i++){ 
                //t3.appendText("i:"+i.toString()+" "+list[i]+"\n");
                var s:Sprite = createThumb2(list[i]);
                if(s!=null){ 
                    s1.addChild(s);
                    s.y = lastY;
                    lastY += 100;
                }
                else{
                    t3.appendText("err:"+list[i]);
                }
            }

            listCnt = s1.numChildren;
            return list.length;

        }
        
        
        private function onClick(e:MouseEvent):void{ 
            var id:String = e.currentTarget.name;
            //var yp2:YoutubePlayer = new YoutubePlayer();
            //yp2.resize(e.currentTarget.width,e.currentTarget.height);
            //e.currentTarget.addChild(yp2);
            //chat.player.play(id);
            e.currentTarget.addChild(player);
            player.play(id);
            //save.add(id);
        }

    }
}

//動画リストを追加する
//タイトルバー:リストのタイトル
//リストクリア
//追加
//スクロールからの自動追加
//スクロール
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.ui.*;
class ListUI extends Sprite{
    
    private var _width:uint;
    private var _height:uint;
    private var s1:Sprite = new Sprite();
    private var lastY:Number;
    private var nowLoading:Boolean;
    public function add(target:DisplayObject):void{//リスト追加
        s1.addChild(target);
        target.y = lastY;
        lastY += target.height+5;
    }
    public function remove(n:uint):void{//リスト削除
        
    }
    public function clear():void{//リストクリア
        
    }
    
        private function s1Init():void{
            s1.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent):void{
                s1.startDrag();
                Mouse.cursor = MouseCursor.HAND;
                stage.addEventListener(MouseEvent.MOUSE_MOVE,onDrag);
            });
            s1.addEventListener(MouseEvent.MOUSE_UP,function(e:MouseEvent):void{ 
                Mouse.cursor = MouseCursor.AUTO;
                s1.x =0;
                s1.stopDrag();
                stage.removeEventListener(MouseEvent.MOUSE_MOVE,onDrag); 
            });
            

        }
        
        private function onDrag(e:MouseEvent):void{
            s1.x =0;
            if(0<s1.y)s1.y = 0;
            if(s1.y<-s1.height)s1.y = -s1.height;
            if(s1.y+lastY<500){
                //ロード
                if(!nowLoading){
                    //t3.appendText("onLoading\n");
                    nowLoading=true;
                    //loader.requestWords(search.text);
                    Mouse.cursor = MouseCursor.AUTO;
                    s1.stopDrag();
                }
            }

        }



}





//ブックマーク登録
//id title author time 
class TubeMylist{
    private var so:SharedObject;
    private var _obj:Object;
    private var _timeline:Array;
    public function TubeMylist():void{
        so = SharedObject.getLocal("tubeMylist");
        if(so){
            //so.clear();
            _obj = so.data;
        }
        if(!_obj.hasOwnProperty("timeLine")){ 
            _timeline = new Array();
            _obj["timeLine"]= _timeline;
        }
        else _timeline = _obj["timeLine"];



    }
    
    //マイリストを配列で取得
    public function getIdlist():Array{ 
        //var list:Array = new Array();
        
        return _timeline;
    }
    public function getData(id:String):Object{
        if(so && _obj.hasOwnProperty(id)){
            return _obj[id];
        }
        return null;

    }

    
    public function getTitle(id:String):String{
        if(_obj.hasOwnProperty(id) == true){ 
            return _obj[id];
        }
        
        return null;
    }

    
    //マイリストへ追加
        public function add(id:String,data:Object=null):void{
            _obj[id] = data;
            _timeline.push(id);
            _obj["timeLine"] = _timeline;
        }
        public function remove(id:String):void{ 
            for(var i:int=0;i<_timeline.length;i++){
                if(_timeline[i]==id)_timeline.splice(i,1);
            }
            _obj["timeLine"] = _timeline;
            if(_obj.hasOwnProperty(id) == true) delete _obj[id];
        }
}



import flash.text.*;
import flash.display.*;
import flash.net.*;
import flash.events.*;
import flash.utils.*;
import flash.system.*;
class TubeLoader extends Sprite{

        //動画ID取得
        //投稿者取得
        //動画タイトル取得
        //再生時間取得
        
        //キーワード検索
        //投稿者検索
        
        private var loader:URLLoader;
        public var idList:Array;
        public var titleList:Array;
        public var authorList:Array;
        public var durationList:Array;
        private var _words:String = "";//前回の検索ワード
        private var cnt:int=0;//リクエスト回数
        private var _results:int = 20;
        
        public function TubeLoader() {
            idList = new Array();
            titleList = new Array();
            authorList = new Array();
            durationList = new Array();
        }
        
        public function clear():void{
            idList = new Array();
            titleList = new Array();
            authorList = new Array();
            durationList = new Array();
            cnt=0;
        }
        
        public function set results(n:int):void{
            _results = n;
            clear();
        }
        //キーワード検索
        public function requestWords(key:String):void{            
            //var str:String = "http://gdata.youtube.com/feeds/api/videos/-/";
            var str:String = "http://gdata.youtube.com/feeds/api/videos?"
            if(_words != key){ 
                _words = key;
                clear();
            }
            str += "q="+escapeMultiByte(_words);//検索ワード
            //str += escapeMultiByte(_words)+"?";//検索ワード
            str += "&max-results="+_results.toString();//件数
            str += "&start-index="+(cnt*_results+1).toString();//インデックス
            str += "&v=2";
            //var loader:URLLoader = new URLLoader();
            
            loader = new URLLoader();
            loader.addEventListener(Event.COMPLETE,onComplete);
            var url:URLRequest = new URLRequest(str);
            loader.load(url);
            cnt++;
        }
        
        
        public function getImage(id:String,num:int=1):Sprite{
            var loader:Loader;
            loader = new Loader();
            //const req:String = "http://www.ozworks.dip.jp/img/01/1426006.png";
            const str1:String = "http://i.ytimg.com/vi/";
            const str3:String = "/default.jpg";
            const str4:String = "/0.jpg";
            var req2:String;
            switch(num){
                case 0:
                    req2 = str1+id+str4;
                    break;
                case 1:
                    req2 = str1+id+"/default.jpg";
                    break;
                
            }

            
            loader.load(new URLRequest(req2));//youtubeプレイヤー読み込み
            var s:Sprite = new Sprite();
            s.addChild(loader);
            return s;
        }


        
        public var _xml:String;
        private function onComplete(e:Event):void{
            loader.removeEventListener(Event.COMPLETE,onComplete);
            var res:XML = new XML(e.target.data);
            var list:XMLList = res.children();
            //var str:String = "";
            var cnt:int=0;
            
            for(var i:int=0;i<list.length();i++){
                if(list[i].localName()!="entry")continue;
                var list3:XMLList = list[i].elements();
                for(var j:int=0;j<list3.length();j++){
                    if(list3[j].localName()=="title"){ //タイトル抽出
                        //str += list3[j].text()+"\n";
                        var title:String = new String();
                        title += list3[j].text();
                        titleList.push(title);
                    }
                    else if(list3[j].localName()=="id"){ //ID抽出
                        var str3:String = list3[j].text();
                        var n:int = str3.indexOf("video:")+6;
                        //var n:int = str3.indexOf("videos/")+7;
                        var id:String = str3.substring(n);
                        //str += id+"\n";
                        idList.push(id);
                    }
                    else if(list3[j].localName()=="author"){//投稿者名
                        var str4:String;
                        var list2:XMLList = list3[j].elements();
                        str4 = list2[0].text();
                        authorList.push(str4);
                    }    
                    else if(list3[j].localName()=="group"){//再生時間
                        var str5:String = list3[j].toXMLString();
                        var n2:int = str5.indexOf('duration="')+10;
                        var n3:int = str5.indexOf('"',n2);
                        var n4:int = parseInt(str5.substring(n2,n3));
                        durationList.push(n4);
                    }//*/
                    else if(list3[j].localName()=="uploaded"){//再生時間
                        
                    }
                }

                //str += list3.elements("id").toXMLString()+"\n\n";
                //str += i.toString()+" "+list[i].localName()+"\n";
                //str += list[i].toXMLString()+"\n\n";
                //str += "\n";
                _xml = res.toXMLString();
            }
            
            //コンプリートイベント発行
            var event:Event = new Event(Event.COMPLETE);
            this.dispatchEvent(event);
        }
    }
//}

 

import flash.display.*;
import flash.net.*;
import flash.system.*;
import flash.events.*;
import flash.text.*;
class TubePlayer extends Sprite{
    
    private var WIDTH:int = 320;
    private var HEIGHT:int= 240;
    private var player:Object;
    //private var players:Array;
    private var _state:int = -1;//プレイヤー状態
    private var txt:TextField;
    public function TubePlayer(w:int=320,h:int=240):void{
        WIDTH=w;
        HEIGHT=h;
        var loader:Loader;
            loader = new Loader();
            Security.loadPolicyFile('http://www.youtube.com/crossdomain.xml');            
            loader.contentLoaderInfo.addEventListener(Event.INIT, onLoaderInit);
            const req:String = "http://www.youtube.com/apiplayer?enablejsapi=1&version=3";
            loader.load(new URLRequest(req));//youtubeプレイヤー読み込み
            
            txt = new TextField();
            txt.textColor = 0x00ff00;
            
    }
    
    public function resize(w:int,h:int):void{
        WIDTH = w;
        HEIGHT = h;
        if(player != null){
            player.setSize(WIDTH, HEIGHT);//サイズ
        }
    }

   
    //ローダー初期化
        private function onLoaderInit(e:Event):void{
            var loader:Loader = e.currentTarget.loader;
            loader.content.addEventListener("onReady", onPlayerReady);
            loader.content.addEventListener("onStateChange",onChangeState);
            addChild(loader);
            //addChild(txt);
        }
        public function load(id:String):void{
            player.clearVideo();
            player.cueVideoById(id);//動画ID
            txt.appendText(id);
        }
        
        public function play(id:String=null):void{
            if(id!=null)load(id);
            player.playVideo();//再生
        }
        
        public function pause():void{
            player.pauseVideo();
        }
        
        public function stop():void{
            player.clearVideo();
        }

        public function get seekTime():Number{
            return player.getCurrentTime();
        }
        
        public function set seek(time:Number):void{
            player.seekTo(time);
        }
        
        public function get seekEnd():Number{
            return player.getDuration();
        }
        
        public function get state():int{
            return _state;
        }




        //プレイヤー設定
        private function onPlayerReady(e:Event):void{
            player = e.currentTarget;
            player.setSize(WIDTH, HEIGHT);//サイズ
            graphics.beginFill(0x000000);
            graphics.drawRect(0,0,WIDTH,HEIGHT);
            graphics.endFill();
        }
        
        //動画ステータス変化
        private function onChangeState(e:Event):void{            
            _state = player.getPlayerState()
            txt.appendText(_state.toString()+":");
          //動画終了
            if(state == 0){   
                txt.appendText("stop");         
            }
            else if(_state == 1){
                txt.appendText("play");
            }
            else if(_state == 2){
                txt.appendText("pause");
            }
            //バッファリング中
            else if(_state == 3){
                txt.appendText("loading.....");
            }

            else if(_state == 5){//頭出し済み  
                txt.appendText("loading.....");
            }  
            txt.appendText("\n");
            txt.scrollV = txt.maxScrollV;
        }
}//class
//}//package



//////////////////////////////////////////////////
//  吹出し
//////////////////////////////////////////////////

import caurina.transitions.Tweener;
import flash.text.*;
import flash.display.*;
class InfoLabel extends Sprite{
    private var _text:String ="";
    public function InfoLabel(str:String=""){
        _text = str;
        this.mouseEnabled = this.mouseChildren = false;
        draw();
    }
    public function set text(str:String):void{
        _text = str;
        draw();
    }
    
    public function pop(t:Number=1,f:Function=null):void{
        this.scaleX =0;
        Tweener.addTween(this,{
            time:t,       
            scaleX:1,
            transition: "easeOutQuint",
            onComplete:f
        });
    }

    public function fadeIn(t:Number=2,f:Function=null):void{
        this.alpha = 0;
        Tweener.addTween(this,{
            time:t,       
            alpha: 1,
            transition: "easeOutQuint",
            onComplete:f
        });
    }
    public function fadeOut(t:Number=2,f:Function=null):void{
        this.alpha=1;
        Tweener.addTween(this,{
            time:t,       
            alpha: 0,
            transition: "easeOutQuint",
            onComplete:f
        });
    }



    //描画
    private function draw():void{
        while(0<this.numChildren)this.removeChildAt(0);
        var tf:TextField = new TextField();
        tf = new TextField();
        tf.selectable = false;
        tf.text = _text;
        tf.width = tf.textWidth+5;
        tf.height = tf.textHeight+5;
        
        var c:uint = 0xdddddd;     
        var x1:Number= tf.width/2;
        var y1:Number= tf.height+15;
        var x2:Number= x1-5;
        var x3:Number= x1+5;
        var y2:Number= tf.height+5;
        
        
        var s:Sprite = new Sprite();
        with(s.graphics){
            clear();
            beginFill(c);
            drawRoundRect(-10,-5,tf.width+20,tf.height+10,10,10);

            endFill();
            beginFill(c);
            moveTo(x2,y2);
            lineTo(x3,y2)
            lineTo(x1,y1);
            lineTo(x2,y2);
            endFill();
        }
        s.addChild(tf);
        s.x = -x1;
        s.y = -y1;
        s.alpha = 0.9;
        this.addChild(s);
        
    }
}

//////////////////////////////////////////////////
//     Sliderクラス
//////////////////////////////////////////////////

import flash.display.*;;
import flash.filters.*;
import flash.geom.*;
import flash.events.*;

class Slider extends Sprite {
    private var hole:Shape;
    private var line:Sprite;
    private var thumb:Sprite;
    private var light:Shape;
    private var shade:Shape;
    private var base:Shape;
    
    private var _width:uint = 100;
    private var _height:uint = 3;
    private static var bHeight:uint = 30;
    private static var bColor:uint = 0xFFFFFF;
    private static var bgColor:uint = 0x0099FF;
    private static var sColor:uint = 0x000000;
    private static var offColor:uint = 0x999999;
    
    private var min:Number = 0;//スライダー左端の値
    private var max:Number = 100;//スライダー右端の値
    private var initValue:Number = 0;//リセット時の初期値
    
    private var blueGlow:GlowFilter;
    private var shadeDrop:DropShadowFilter;
    private var _value:Number;
    private var _enabled:Boolean = true;
    private var info:InfoLabel = new InfoLabel();

    public function Slider() {
    }

    public function init(option:Object):void {
        if (option.width != undefined) _width = option.width;
        if (option.min != undefined) min = option.min;
        if (option.max != undefined) max = option.max;
        if (option.init != undefined) initValue = option.init;
        draw();
    }
    
    //描画
    private function draw():void {
        while(0<this.numChildren)this.removeChildAt(0);
        shadeDrop = new DropShadowFilter(1, 90, sColor, 0.5, 4, 4, 2, 3, false, false);
        blueGlow = new GlowFilter(bgColor, 0.6, 5, 5, 2, 3, false, true);
        hole = createGradientHole(_width, _height);
        line = new Sprite();
        thumb = new Sprite();
        
        shade = createThumb(8, 20, 12, sColor);
        shade.filters = [shadeDrop];
        light = createThumb(8, 20, 12, bgColor);
        light.filters = [blueGlow];
        base = createThumb(8, 20, 12, bColor);
        
        addChild(hole);
        addChild(line);
        //addChild(thumb);
        
        thumb.addChild(shade);
        thumb.addChild(light);
        thumb.addChild(base);
        
        hole.y = bHeight;
        line.y = bHeight;
        reset();
        thumb.y = bHeight;
        
        
        _up();
        enabled = true;
        thumb.mouseChildren = false;
    }
   
   //イベント設定 
    private function rollOver(evt:MouseEvent):void {
        _over();
        thumb.addChild(info);
        info.y = -5;
    }
    private function rollOut(evt:MouseEvent):void {
        _up();
        thumb.removeChild(info);
    }
    private function press(evt:MouseEvent):void {
        _down();
        var rect:Rectangle = new Rectangle(0, bHeight, _width, 0);
        thumb.startDrag(false, rect);
        thumb.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
        stage.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
        stage.addEventListener(Event.MOUSE_LEAVE, leave, false, 0, true);
        thumb.addEventListener(Event.ENTER_FRAME, change, false, 0, true);
        isSlide=true;
    }
    private function release(evt:MouseEvent):void {
        _up();
        thumb.stopDrag();
        checkValue();
        var e:CompoEvent = new CompoEvent(CompoEvent.SELECT, _value);
        dispatchEvent(e);
        thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(Event.MOUSE_LEAVE, leave);
        thumb.removeEventListener(Event.ENTER_FRAME, change);
        isSlide=false;
    }
    private function leave(evt:Event):void {
        _up();
        thumb.stopDrag();
        checkValue();
        var e:CompoEvent = new CompoEvent(CompoEvent.SELECT, _value);
        dispatchEvent(e);
        thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(MouseEvent.MOUSE_UP, release);
        stage.removeEventListener(Event.MOUSE_LEAVE, leave);
        thumb.removeEventListener(Event.ENTER_FRAME, change);
        //isSlide=false;
        
    }
    
    
    private function _up():void {
        light.visible = false;
        
    }
    private function _over():void {
        light.visible = true;
    }
    private function _down():void {
        light.visible = true;
    }
    private function _off():void {
        light.visible = false;
    }
    private var isSlide:Boolean;
    //
    private function change(evt:Event):void {
        _down();
        checkValue();
        var e:CompoEvent = new CompoEvent(CompoEvent.CHANGE, _value);
        dispatchEvent(e);
        lineDraw();
        time(_value);
    }
    
    //スライダーの状態から値を取得
    private function checkValue():void {
        _value = min + Math.round(thumb.x/_width*(max-min));
    }
    
    public function get value():Number{
        return _value;
    }
    public function set value(v:Number):void{
        if(isSlide)return;
        if(v<min)_value = min;
        else if(max<v)_value = max;
        else _value = v;
        thumb.x = _width*(_value-min)/(max-min);//スライダー位置の更新
        lineDraw();
        time(_value);
    }
    private function time(s:Number):void{
        
        var sec:int = s%60;
        var min:int = Math.floor(s/60)%60;
        var hour:int = Math.floor(s/3600);
        var str:String = "";
        if(3600<max)str+=hour.toString()+":";
        if(60<max)str+=min.toString()+":";
        str+=sec.toString();
        info.text = str;
    }

    
    private function lineDraw():void{
        var w:uint = thumb.x;
        var c:Number = _height;
        with(line){
            graphics.clear();
            graphics.beginFill(0x44aaff,0.8);
            graphics.drawRoundRect(-c, -c, w+c*2, c*2, c*2);
            graphics.endFill();
        }
    }


    //操作受付の設定 true:操作可能 false:操作不可
    public function get enabled():Boolean {
        return _enabled;
    }
    public function set enabled(param:Boolean):void {
        _enabled = param;
        if (!_enabled) _off();
        thumb.buttonMode = _enabled;
        thumb.mouseEnabled = _enabled;
        thumb.useHandCursor = _enabled;
        if (_enabled) {
            thumb.addEventListener(MouseEvent.MOUSE_OVER, rollOver, false, 0, true);
            thumb.addEventListener(MouseEvent.MOUSE_OUT, rollOut, false, 0, true);
            thumb.addEventListener(MouseEvent.MOUSE_DOWN, press, false, 0, true);
            thumb.addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
            addChild(thumb);
        } else {
            thumb.removeEventListener(MouseEvent.MOUSE_OVER, rollOver);
            thumb.removeEventListener(MouseEvent.MOUSE_OUT, rollOut);
            thumb.removeEventListener(MouseEvent.MOUSE_DOWN, press);
            thumb.removeEventListener(MouseEvent.MOUSE_UP, release);
            removeChild(thumb);
        } 
    }
    
    
    public function reset():void {
        thumb.x = _width*(initValue-min)/(max-min);//デフォルト位置に移動
        _value = initValue;//デフォルト値に設定
        lineDraw();
    }
    
    private function createThumb(w:uint, h:uint, y:uint, color:uint, alpha:Number = 1):Shape{
        var target:Shape = new Shape();
        target.graphics.beginFill(color, alpha);
        target.graphics.drawRoundRect(-w*0.5, -y, w, h, w);
        target.graphics.endFill();
        return target;
    }

    private function createGradientHole(w:uint, c:Number):Shape{
        var target:Shape = new Shape();
        var colors:Array = [0x000000, 0x000000];
        var alphas:Array = [0.4, 0];
        var ratios:Array = [0, 255];
        var matrix:Matrix = new Matrix();
        matrix.createGradientBox(w+c*2, c*2, 0.5*Math.PI, -c, -c);
        target.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, matrix, SpreadMethod.PAD, InterpolationMethod.RGB, 0);
        target.graphics.drawRoundRect(-c, -c, w+c*2, c*2, c*2);
        target.graphics.endFill();
        return target;
    }

}

//////////////////////////////////////////////////
// IconBtnクラス
//////////////////////////////////////////////////

import flash.display.Sprite;
import flash.display.Shape;
import flash.filters.GlowFilter;
import flash.events.MouseEvent;
import flash.geom.ColorTransform;

class IconBtn extends Sprite {
    public var id:uint;
    private var shade:Shape;
    private var bottom:Shape;
    private var light:Shape;
    private var base:Shape;
    private var icon:Shape;
    private var _width:uint = 60;
    private static var _height:uint = 20;
    private static var corner:uint = 5;
    private var type:uint = 1;
    private static var bColor:uint = 0xFFFFFF;
    private static var sColor:uint = 0x000000;
    private static var upColor:uint = 0x666666;
    private static var overColor:uint = 0x333333;
    private static var offColor:uint = 0x999999;
    private static var upColorTrans:ColorTransform;
    private static var overColorTrans:ColorTransform;
    private static var offColorTrans:ColorTransform;
    private var cColor:uint = 0x0099FF;
    private var colorGlow:GlowFilter;
    private var shadeGlow:GlowFilter;
    private var _clicked:Boolean = false;
    private var _enabled:Boolean = true;

    public function IconBtn(Icon:Class) {
        icon = new Icon();
    }

    public function init(option:Object):void {
        if (option.id != undefined) id = option.id;
        if (option.width != undefined) _width = option.width;
        if (option.type != undefined) type = option.type;
        if (option.color != undefined) cColor = option.color;
        draw();
    }
    private function draw():void {
        switch (type) {
        case 1 :
            bColor = 0xFFFFFF;
            sColor = 0x000000;
            upColor = 0x666666;
            overColor = 0x333333;
            offColor = 0x999999;
            break;
        case 2 :
            bColor = 0x000000;
            sColor = 0xFFFFFF;
            upColor = 0x666666;
            overColor = 0x999999;
            offColor = 0x333333;
            break;
        }
        colorGlow = new GlowFilter(cColor, 0.6, 5, 5, 2, 3, false, true);
        shadeGlow = new GlowFilter(sColor, 0.3, 4, 4, 2, 3, false, true);
        upColorTrans = new ColorTransform();
        upColorTrans.color = upColor;
        overColorTrans = new ColorTransform();
        overColorTrans.color = overColor;
        offColorTrans = new ColorTransform();
        offColorTrans.color = offColor;
        shade = new Shape();
        bottom = new Shape();
        light = new Shape();
        base = new Shape();
        addChild(shade);
        addChild(bottom);
        addChild(light);
        addChild(base);
        addChild(icon);
        createBase(shade, _width, _height, corner, sColor);
        shade.filters = [shadeGlow];
        createBase(bottom, _width, _height, corner, sColor, 0.3);
        createBase(light, _width, _height, corner, cColor);
        light.filters = [colorGlow];
        createBase(base, _width, _height, corner, bColor);
        icon.y = -1;
        enabled = true;
        mouseChildren = false;
    }
    private function rollOver(evt:MouseEvent):void {
        _over();
    }
    private function rollOut(evt:MouseEvent):void {
        _up();
    }
    private function press(evt:MouseEvent):void {
        _down();
    }
    private function release(evt:MouseEvent):void {
        _up();
    }
    private function click(evt:MouseEvent):void {
    }
    private function _up():void {
        icon.y = -1;
        icon.transform.colorTransform = upColorTrans;
        base.y = -1;
        light.visible = false;
        light.y = -1;
    }
    private function _over():void {
        icon.y = -1;
        icon.transform.colorTransform = overColorTrans;
        base.y = -1;
        light.visible = true;
        light.y = -1;
    }
    private function _down():void {
        icon.y = 0;
        icon.transform.colorTransform = overColorTrans;
        base.y = 0;
        light.visible = true;
        light.y = 0;
    }
    private function _off():void {
        icon.y = 0;
        icon.transform.colorTransform = offColorTrans;
        base.y = 0;
        light.visible = false;
        light.y = 0;
    }
    public function get clicked():Boolean {
        return _clicked;
    }
    public function set clicked(param:Boolean):void {
        _clicked = param;
        if (_clicked) {
            _down();
            removeEventListener(MouseEvent.MOUSE_OVER, rollOver);
            removeEventListener(MouseEvent.MOUSE_OUT, rollOut);
            removeEventListener(MouseEvent.MOUSE_DOWN, press);
            removeEventListener(MouseEvent.MOUSE_UP, release);
        } else {
            _up();
            addEventListener(MouseEvent.MOUSE_OVER, rollOver, false, 0, true);
            addEventListener(MouseEvent.MOUSE_OUT, rollOut, false, 0, true);
            addEventListener(MouseEvent.MOUSE_DOWN, press, false, 0, true);
            addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
        }
    }
    public function get enabled():Boolean {
        return _enabled;
    }
    public function set enabled(param:Boolean):void {
        _enabled = param;
        buttonMode = _enabled;
        mouseEnabled = _enabled;
        useHandCursor = _enabled;
        if (_enabled) {
            _up();
            addEventListener(MouseEvent.MOUSE_OVER, rollOver, false, 0, true);
            addEventListener(MouseEvent.MOUSE_OUT, rollOut, false, 0, true);
            addEventListener(MouseEvent.MOUSE_DOWN, press, false, 0, true);
            addEventListener(MouseEvent.MOUSE_UP, release, false, 0, true);
            addEventListener(MouseEvent.CLICK, click, false, 0, true);
        } else {
            _off();
            removeEventListener(MouseEvent.MOUSE_OVER, rollOver);
            removeEventListener(MouseEvent.MOUSE_OUT, rollOut);
            removeEventListener(MouseEvent.MOUSE_DOWN, press);
            removeEventListener(MouseEvent.MOUSE_UP, release);
            removeEventListener(MouseEvent.CLICK, click);
        }
    }
    private function createBase(target:Shape, w:uint, h:uint, c:uint, color:uint, alpha:Number = 1):void {
        target.graphics.beginFill(color, alpha);
        target.graphics.drawRoundRect(-w*0.5, -h*0.5, w, h, c*2);
        target.graphics.endFill();
    }

}


//////////////////////////////////////////////////
// Iconクラス
//////////////////////////////////////////////////

import flash.display.Shape;

class PlayIcon extends Shape {
    private static var bColor:uint = 0x000000;

    public function PlayIcon() {
        draw();
    }

    private function draw():void {
        graphics.beginFill(bColor);
        graphics.moveTo(-4, -6);
        graphics.lineTo(-4, 6);
        graphics.lineTo(8, 0);
        graphics.endFill();
    }

}

class PauseIcon extends Shape {
    private static var bColor:uint = 0x000000;

    public function PauseIcon() {
        draw();
    }

    private function draw():void {
        graphics.beginFill(bColor);
        graphics.drawRect(-5, -5, 4, 10);
        graphics.endFill();
        graphics.beginFill(bColor);
        graphics.drawRect(3, -5, 4, 10);
        graphics.endFill();
    }

}

class StopIcon extends Shape {
    private static var bColor:uint = 0x000000;

    public function StopIcon() {
        draw();
    }

    private function draw():void {
        graphics.beginFill(bColor);
        graphics.drawRect(-5, -5, 10, 10);
        graphics.endFill();
    }

}

class NextIcon extends Shape {
    private static var bColor:uint = 0x000000;
    public function NextIcon() {
        draw();
    }
    private function draw():void {
        graphics.beginFill(bColor);
        graphics.moveTo(-14, -6);
        graphics.lineTo(-14, 6);
        graphics.lineTo(0, 0);
        graphics.endFill();
        
        graphics.beginFill(bColor);
        graphics.moveTo(0, -6);
        graphics.lineTo(0, 6);
        graphics.lineTo(12, 0);
        graphics.endFill();
        
        graphics.beginFill(bColor);
        graphics.drawRect(12,-6, 4, 12);
        graphics.endFill();
    }

}

class BackIcon extends Shape {
    private static var bColor:uint = 0x000000;
    public function BackIcon() {
        draw();
    }
    private function draw():void {
        graphics.beginFill(bColor);
        graphics.moveTo(12, -6);
        graphics.lineTo(12, 6);
        graphics.lineTo(0, 0);
        graphics.endFill();
        
        graphics.beginFill(bColor);
        graphics.moveTo(0, -6);
        graphics.lineTo(0, 6);
        graphics.lineTo(-12, 0);
        graphics.endFill();
        
        graphics.beginFill(bColor);
        graphics.drawRect(-12,-5, 4, 10);
        graphics.endFill();
    }

}

class OpenIcon extends Shape {
    private static var bColor:uint = 0x000000;
    public function OpenIcon() {
        draw();
    }
    private function draw():void {
        graphics.beginFill(bColor);
        graphics.drawRect(-8, -5, 16, 2);
        graphics.endFill();
        
        graphics.beginFill(bColor);
        graphics.moveTo(-8, -1);
        graphics.lineTo(8, -1);
        graphics.lineTo(0, 6);
        graphics.endFill();
    }

}

//////////////////////////////////////////////////
// CompoEventクラス
//////////////////////////////////////////////////

import flash.events.Event;

class CompoEvent extends Event {
    public static const SELECT:String = "select";
    public static const CHANGE:String = "change";
    public var value:*;

    public function CompoEvent(type:String, value:*) {
        super(type);
        this.value = value;
    }

    public override function clone():Event {
        return new CompoEvent(type, value);
    }

}








///////////////////////////////////////////////////
// SearchBar
///////////////////////////////////////////////////

import flash.display.*;
import flash.text.*;
import flash.events.*;
import flash.geom.*;

class SearchBar extends Sprite{
    private var input:TextField;
    private var icon:SearchIcon = new SearchIcon();
    private var color1:uint = 0x000000;
    private var color2:uint = 0xaaaaaa;
    private var color3:uint = 0x0088ff;
    public var btn:Sprite;
    public function SearchBar():void{
        
        var a:Shape = createGradientHole(120,13);
        addChild(a);
        
        input = new TextField();
        input.type ="input";
        input.y =-10;
        input.addEventListener(Event.CHANGE,onChange);
        input.addEventListener(KeyboardEvent.KEY_DOWN,pressKey);
        input.addEventListener(KeyboardEvent.KEY_UP,releaseKey);
        addChild(input);
        
        btn = new Sprite();
        btn.addChild(icon);
        icon.x = -2;
        btn.graphics.beginFill(0,0);
        btn.graphics.drawRect(-12,-10,24,20);
        btn.graphics.endFill();
        btn.x = 120;
        btn.buttonMode = true;
        btn.addEventListener(MouseEvent.MOUSE_OVER,rollOver);
        btn.addEventListener(MouseEvent.MOUSE_OUT,rollOut);
        btn.addEventListener(MouseEvent.MOUSE_DOWN,press);
        btn.addEventListener(MouseEvent.MOUSE_UP,release);
        addChild(btn);
        
        
        rollOut();
    }
    
    
    public function set text(str:String):void{
        input.text = str;
        onChange();
    }
    public function get text():String{
        return input.text;
    }
    
    private function createGradientHole(w:uint, c:Number):Shape{
        var target:Shape = new Shape();
        var colors:Array = [0x0033aa, 0x00aaff];
        var alphas:Array = [0.4, 0];
        var ratios:Array = [0, 255];
        var matrix:Matrix = new Matrix();
        matrix.createGradientBox(w+c*2, c*2, 0.5*Math.PI, -c, -c);
        target.graphics.beginFill(0xffffff);
        target.graphics.drawRoundRect(-c, -c, w+c*2, c*2, c*2);
        target.graphics.endFill();
        target.graphics.lineStyle(2,0x555555,0.9);
        target.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, matrix, SpreadMethod.PAD, InterpolationMethod.RGB, 0);
        target.graphics.drawRoundRect(-c, -c, w+c*2, c*2, c*2);
        target.graphics.endFill();
        return target;
    }
    
    private function onChange(e:Event=null):void{
        var overColorTrans:ColorTransform = new ColorTransform();
        if(input.text.length==0)overColorTrans.color = color2;
        
        else overColorTrans.color = color1;
        icon.transform.colorTransform = overColorTrans;
    }
    private function pressKey(e:KeyboardEvent):void{
        if(e.keyCode==13 && 0<input.text.length){ 
            press();
            var ev:MouseEvent = new MouseEvent(MouseEvent.CLICK);
            btn.dispatchEvent(ev);
        }
    }
    private function releaseKey(e:KeyboardEvent):void{
        release();
    }
    


    
    private function rollOver(e:MouseEvent=null):void {
        var overColorTrans:ColorTransform = new ColorTransform();
        overColorTrans.color = color3;
        icon.transform.colorTransform = overColorTrans;
    }
    private function rollOut(e:MouseEvent=null):void {
        var overColorTrans:ColorTransform = new ColorTransform();
        if(input.text.length==0)overColorTrans.color = color2;
        else overColorTrans.color = color1;
        icon.transform.colorTransform = overColorTrans;
    }
    private function press(e:MouseEvent=null):void {
        icon.y = 1;
        
    }
    private function release(e:MouseEvent=null):void {
        icon.y = 0;
    }

}



//検索
class SearchIcon extends Shape {
    private static var bColor:uint = 0x000000;
    public function SearchIcon() {
        draw();
    }
    private function draw():void {
        graphics.beginFill(bColor);
        graphics.drawCircle(0,-1,5);
        graphics.drawCircle(0,-1,6.5);
        graphics.endFill();
        
        graphics.lineStyle(3,bColor);
        graphics.moveTo(-7,7); 
        graphics.lineTo(-4,4);
    }

}