package { // imports import flash.display.Sprite; import flash.events.Event; import flash.events.ErrorEvent; import flash.events.ProgressEvent; import flash.events.MouseEvent; import flash.net.URLLoader; import flash.display.Loader; import flash.net.URLRequest; import flash.xml.XMLDocument; import flash.events.TimerEvent; import flash.utils.Timer; public class XMLSlideshow extends Sprite { private var xmlFileLoc:String;//location of xml file private var slideTimer:Timer; private var urlLoader:URLLoader; private var data:XML; private var _slide:String; private var i:uint; private var cNodes:Array; private var child1:Loader = new Loader();// declared here so it can be accessed in all functions private var child2:Loader = new Loader();// declared here so it can be accessed in all functions private var contLoaded:uint; private var _control:Control = new Control(); private var isPlaying:Boolean; private var childVal:uint; private var _preBg:PreBg = new PreBg();//preloader bar //constructor public function XMLSlideshow(xmlFileName:String, ctrl:Boolean, timerVal:uint) { slideTimer = new Timer(timerVal, 0); child1.contentLoaderInfo.addEventListener(Event.OPEN,showPreloader); child1.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,showProgress); child1.contentLoaderInfo.addEventListener(Event.COMPLETE,showLoadResult); child2.contentLoaderInfo.addEventListener(Event.OPEN,showPreloader); child2.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,showProgress); child2.contentLoaderInfo.addEventListener(Event.COMPLETE,showLoadResult); var urlRequest:URLRequest = new URLRequest(xmlFileName); urlLoader = new URLLoader(); urlLoader.addEventListener("complete", onLoaded); urlLoader.addEventListener("ioerror", ifFailed); urlLoader.load(urlRequest); slideTimer.addEventListener(TimerEvent.TIMER, onTick); slideTimer.start(); isPlaying = true; child1.x = 0; child1.y = 100; child2.x = 0; child2.y = 100; addChild(child1); addChild(child2); if (ctrl == true) { _control.txtDesc.text = ""; addChild(_control); setChildIndex(_control, this.numChildren - 1); _control.x = 400; _control.y = 15; _control.mcCtrlBg.alpha = _control.btnPause.alpha = 0.4; _control.btnForward.alpha = _control.btnBack.alpha = 0; _control.btnPause.addEventListener(MouseEvent.MOUSE_OVER, ctrlOver); _control.btnPause.addEventListener(MouseEvent.MOUSE_OUT, ctrlOut); _control.btnPause.addEventListener(MouseEvent.CLICK, ctrlStop); childVal = 3; } else { childVal = 2; } } // control stuff private function ctrlOver(evt:Event):void { evt.target.alpha = 1; if (evt.target.name == "btnPause") { if (isPlaying == true) { _control.txtDesc.text = "Pause"; } else { _control.txtDesc.text = "Play"; } } else if (evt.target.name == "btnForward") { _control.txtDesc.text = "Next"; } else if (evt.target.name == "btnBack") { _control.txtDesc.text = "Back"; } } private function ctrlOut(evt:Event):void { evt.target.alpha = 0.4; _control.txtDesc.text = ""; } //stop button private function ctrlStop(evt:Event):void { if (isPlaying == true) { slideTimer.stop(); isPlaying = false; _control.btnForward.alpha = _control.btnBack.alpha = 0.4; _control.btnBack.addEventListener(MouseEvent.MOUSE_OVER, ctrlOver); _control.btnForward.addEventListener(MouseEvent.MOUSE_OVER, ctrlOver); _control.btnBack.addEventListener(MouseEvent.MOUSE_OUT, ctrlOut); _control.btnForward.addEventListener(MouseEvent.MOUSE_OUT, ctrlOut); _control.btnBack.addEventListener(MouseEvent.CLICK, ctrlBack); _control.btnForward.addEventListener(MouseEvent.CLICK, ctrlForward); _control.txtDesc.text = "Play"; } else { slideTimer.start(); isPlaying = true; _control.btnForward.alpha = _control.btnBack.alpha = 0; _control.btnBack.removeEventListener(MouseEvent.MOUSE_OVER, ctrlOver); _control.btnForward.removeEventListener(MouseEvent.MOUSE_OVER, ctrlOver); _control.btnBack.removeEventListener(MouseEvent.MOUSE_OUT, ctrlOut); _control.btnForward.removeEventListener(MouseEvent.MOUSE_OUT, ctrlOut); _control.btnBack.removeEventListener(MouseEvent.CLICK, ctrlBack); _control.btnForward.removeEventListener(MouseEvent.CLICK, ctrlForward); _control.txtDesc.text = "Pause"; } } //forward button private function ctrlForward(evt:Event):void { if (contLoaded == 1) { setChildIndex(child2, this.numChildren - 2); if (i == cNodes.length - 1) { i = 0; } else { i += 1; } } else if (contLoaded == 2) { setChildIndex(child1, this.numChildren - 2); if (i == cNodes.length - 1) { i = 0; } else { i += 1; } } _slide = data.slide[i].url; loadImage(_slide); } //back button private function ctrlBack(evt:Event):void { if (contLoaded == 1) { setChildIndex(child2, this.numChildren - 2); if (i == 0) { i = cNodes.length - 1; } else { i -= 1; } } else if (contLoaded == 2) { setChildIndex(child1, this.numChildren - 2); if (i == 0) { i = cNodes.length - 1; } else { i -= 1; } } _slide = data.slide[i].url; loadImage(_slide); } //xml stuff private function onLoaded(event:Event):void { data = XML(urlLoader.data); parseData(data); contLoaded = 1; i = 0; _slide = data.slide[i].url; loadImage(_slide); } private function ifFailed(errorEvent:ErrorEvent):void { trace("ERROR"); } private function parseData(data:XML):void { var x2:XMLDocument = new XMLDocument(); x2.ignoreWhite = true; var list:String = data.toXMLString(); x2.parseXML(list); cNodes = x2.firstChild.childNodes; } // timer function: runs every interval function onTick(event:TimerEvent):void { if (i == cNodes.length - 1) {// if in the last slide, go back to first slide i = 0; } else {// if not in last slide, increment by one node i++; } // load the image. _slide = data.slide[i].url; loadImage(_slide); } // image loading private function loadImage(url:String):void { var request:URLRequest = new URLRequest(url); if (contLoaded == 1) { child2.load(request); } else { child1.load(request); } } private function showPreloader(evt:Event):void { addChild(_preBg); _preBg.x = 400; _preBg.y = 32; _preBg.width = 90; _preBg.height = 5; _preBg.alpha = 0; } private function showProgress(evt:ProgressEvent):void { _preBg.gotoAndStop(Math.floor(evt.bytesLoaded/evt.bytesTotal*100)); } private function showLoadResult(evt:Event):void { if (contLoaded == 1) { addChild(child2); child2.alpha = 0; setChildIndex(child2, this.numChildren - childVal); TweenLite.to(child2, 1, {alpha:1}); contLoaded = 2; } else { addChild(child1); child1.alpha = 0; setChildIndex(child1, this.numChildren - childVal); TweenLite.to(child1, 1, {alpha:1}); contLoaded = 1; } _preBg.alpha = 0; } } }