• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 508
  • Last Modified:

Flash/Flex change xml data according to time

Hi All,

Busy with a project, but need help to compile a flash/flex component to change data got from XML according to time.

Here is my XML sample:
<?xml version="1.0"?>
<catalog>
   <dj id="00h00>
      <onair>Gambardella, Matthew</onair>
      <showname>Grave Shift</showname>
      <image>http://www.domain.com/app/images/matthew.png</image>
      <blog>http://www.domain.com/blog/mattheew</blog>
      <email>matthew@domain.com</email>
   </dj>
   <dj id="03h00>
      <onair>Delport, Mardi</onair>
      <showname>After Night</showname>
      <image>http://www.domain.com/app/images/mardi.png</image>
      <blog>http://www.domain.com/blog/mardi</blog>
      <email>mardi@domain.com</email>
   </dj>
</catalog>

Open in new window


What i need is a way to display the details according to different times (radio station). When on certain time, the component change the data gotten from XML document.

Please help :)
0
VeyronSA
Asked:
VeyronSA
  • 3
  • 2
1 Solution
 
petiexCommented:
You can build a string like the ones you have in the dj id value from the current date object, and then, since alphabetical order and time order are the same in this case, the first dj time slot that is in the past will be the active one:
private function chooseDJ(x:XML):XML{
            var date:Date = new Date();
            var nowH:int = date.getHours();
            var nowM:int = date.getMinutes();
            var activeDj:XML = null;
            var nowStr:String = (nowH > 9?"":"0")+nowH+"h"+(nowM > 9?"":"0")+nowM;
            for each (var dj:XML in x.dj){
                if(dj.id < nowStr){
                    activeDj = dj;
                    break;
                }
            }
            return activeDj;
        }

Open in new window

0
 
petiexCommented:
Then, of course, if the current time is earlier than the earliest time slot, you cycle through the dj xmls to get the latest timeslot...


private function chooseDJ(x:XML):XML{
            var date:Date = new Date();
            var nowH:int = date.getHours();
            var nowM:int = date.getMinutes();
            var activeDj:XML = null;
            var latestSlot:XML = null;
            var nowStr:String = (nowH > 9?"":"0")+nowH+"h"+(nowM > 9?"":"0")+nowM;
            for each (var dj:XML in x.dj){
                if(!latestSlot || latestSlot.id < dj.id){
                    latestSlot = dj;
                }
                if(dj.id < nowStr){
                    activeDj = dj;
                    break;
                }
            }
            if(activeDj == null){
               activeDj = latestSlot;
             }
            return activeDj;
        }

Open in new window

0
 
VeyronSAAuthor Commented:
Ok, lol. Now i dont know how to integrate :D. A big beginner and a Newbie with this, can you show me please.
0
 
petiexCommented:
I'll assume this is an extension of your other question (http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/Flex/Q_26581471.html) and plug the new code into that. I'm glad I tested this again, because the code I posted above doesn't actually work :-O

The attached code holds up to testing -- and the timer makes it easy to test out different values in the xml without redeploying.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" percentHeight="100" percentWidth="100"
                creationComplete="setTimer()"
        >
    <mx:Script><![CDATA[

        private var myXML:XML;
        //You will want to make this much larger. I have it at 20 seconds
        //for testing.
        private const intervalInMilliseconds:Number = 20000;

        private function setTimer():void {
            loadXML(null);
            var timer:Timer = new Timer(intervalInMilliseconds, 0);
            timer.addEventListener(TimerEvent.TIMER, loadXML);
            timer.start();
        }

        private function loadXML(event:Event):void {
            //add new date querystring to avoid browser caching
            var loader:URLLoader = new URLLoader(new URLRequest("http://www.domain.com/test.xml?v=" + (new Date()).getTime()));
            loader.addEventListener(Event.COMPLETE, loadComplete);
        }

        private function loadComplete(event:Event):void {
            myXML = chooseDJ(new XML(event.target.data));
            myImage.source = myXML.image;
            myImage.addEventListener(MouseEvent.CLICK, openLink);
        }

        private function openLink(event:MouseEvent):void {
            navigateToURL(new URLRequest(myXML.blog))
        }

        private function chooseDJ(x:XML):XML {
            var date:Date = new Date();
            var nowH:int = date.getHours();
            var nowM:int = date.getMinutes();
            var activeDj:XML = null;
            var latestSlot:XML = null;
            var nowStr:String = (nowH > 9 ? "" : "0") + nowH + "h" + (nowM > 9 ? "" : "0") + nowM;

            for each (var dj:XML in x.dj) {
                if (!latestSlot || latestSlot.@id < dj.@id) {
                    latestSlot = dj;
                }
                if (dj.@id < nowStr) {
                    if (!activeDj || activeDj.@id < dj.@id) {
                        activeDj = dj;
                    }
                }
            }
            if (activeDj == null) {
                activeDj = latestSlot;
            }

            return activeDj;
        }
        ]]></mx:Script>
    <mx:Image id="myImage" useHandCursor="true" buttonMode="true"/>

</mx:Application>

Open in new window

0
 
VeyronSAAuthor Commented:
Genius!!!! Give this man a Medal!

Thanks
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now