Subversion Repositories HomeAutomation

Rev

Rev 73 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. /*
  2. BUGGAR
  3. stor description: hackar när den beräknas?
  4. width på timedateobjekt används nog inte nu
  5.  
  6. MISSTÄNKTA BUGGAR
  7.  
  8. ATT GÖRA
  9. konfig för flinsh
  10.     vilken server:port skall anropas
  11.     färg/form/ram på markerat objekt
  12. kommentera/dokumentera
  13. cacheasbitmap för bakgrundsbild? bakgrundsbilden ska fixas om helt
  14. menyobjektet skall stödja fade (sätt _alpha för alles till ett parametervärde), ska kunna användas när en meny skall hamna över en annan, den undre skall fadea
  15. menyobjektet skall stödja inga animationer (specas i menuconfig) (jimmys önskan)
  16. menykonfigparser skall göras om, parsa in allt, sen testa
  17.  
  18. gör om alla felmeddelanden i config, så den lagrar ett meddelande istället för en siffra
  19.  
  20.  
  21. ett objekt som scrollats ut har properties:
  22. height=0
  23. alpha=0
  24. inuse=false (=>visible=false)
  25.  
  26. */
  27.  
  28.  
  29. import mx.transitions.Tween;
  30. import mx.utils.Delegate;
  31.  
  32. class MenuObj implements CommunicatorIF {
  33.  
  34.     //screen position and size
  35.     private var menuTop:Number;
  36.     private var menuLeft:Number;
  37.     private var menuWidth:Number;
  38.     private var menuHeight:Number;
  39.    
  40.     private var menuName:String;
  41.    
  42.     //to each rowitem belongs a menuTexts, this is the one that animates up/down and resizes
  43.     private var menuTexts:Array = new Array();
  44.    
  45.     //the maximum number of items or rows that is visible, one extra row/item exist in menuText for the row that should scroll in
  46.     private var nrOfMenuItem:Number;
  47.     //the position of the item that is marked and show description
  48.     private var middleItemPosition:Number;
  49.     //dataList-index of the object that is placed in middleItemPosition
  50.     private var menuMiddleItem:Number=0;
  51.     //data to list on the menu, title and description
  52.     //private var dataList:XMLNode;
  53.     private var menuData:Array = new Array();
  54.    
  55.     //object to handle the description of the menuMiddleItem
  56.     private var menuItemDesc:MenuDescObj;
  57.    
  58.     //delaytime is time before speeding up to repeattime (first scroll last delaytime and following scroll is repeattime)
  59.     private var scrollDelayTime:Number;
  60.     private var scrollRepeatTime:Number;
  61.     //time for description to fade in
  62.     private var descScrollTime:Number;
  63.    
  64.     //placeholders, makes it easy to place and move menuTexts
  65.     private var placeHolder:Array = new Array();
  66.    
  67.     private var moveTween:Tween;
  68.    
  69.     private var tweenCommand:Number = 0;
  70.         //0 = stop
  71.         //1 = scrollup
  72.         //2 = scrolldown
  73.    
  74.     private var commObj:CommunicationObj;  
  75.    
  76.     private var newDataExists:Boolean;
  77.     private var newData:XMLNode;
  78.    
  79.     private var isScrolling = false;
  80.    
  81.     private var incomDataArr:Array = new Array();
  82.     /*
  83.     lista här alla delar av configen
  84.     index   name                            description
  85.     1           menuname                   
  86.     2           menudescription    
  87.     3           rowitemfont            
  88.     4           descriptionfont    
  89.     5           left                            horizontal placing of this menu
  90.     6           top                             vertical placing of this menu
  91.     7           width                           horizontal size of this menu, text will be cut if longer than this
  92.     8           height                      vertical size of this menu
  93.     9           menurowitems           
  94.     10      sizedrowitems          
  95.     11      scrolldelaytime    
  96.     12      scrollrepeattime   
  97.     13      menucolor
  98.     14      desccolor
  99.     15      descscrolltime      the description fade-in-time
  100.     16     
  101.     17     
  102.     */
  103.  
  104.     /**
  105.     * Creates a new instance of MenuObj.
  106.     * @param mainScene Reference to the main MovieClip.
  107.     * @param configArr This is configuration data, like looks and timeing, for this menu.
  108.     */
  109.     function MenuObj (mainScene:MovieClip, configXML:XMLNode) {
  110.         //anropa parseConfig(configXML), den returnerar en array där index 0 är ett nummer, -1 om datan är ok, annars ett unikt nummer för varje fel
  111.         // om datan inte parsades okej skall inget av nedanstående köras
  112.         //en global variabel skall inte sättas och anropande rutin skall kolla denna flagga, om den inte är satt så bör den signalera fel
  113.  
  114.         var configArr:Array = parseConfig(configXML);
  115.         if (configArr[0] > -1) {
  116.             trace("Config error: " + configArr[0]);
  117.         } else {
  118.             var menuFont:TextFormat = new TextFormat();
  119.             var descFont:TextFormat = new TextFormat();
  120.            
  121.             menuName = configArr[1];
  122.            
  123.             menuFont.font = configArr[3];
  124.             menuFont.color = configArr[13];
  125.             descFont.font = configArr[4];
  126.             descFont.color = configArr[14];
  127.             descScrollTime = configArr[15];
  128.            
  129.             menuLeft = configArr[5];
  130.             menuTop = configArr[6];
  131.             menuWidth = configArr[7];
  132.             menuHeight = configArr[8];
  133.             nrOfMenuItem = configArr[9];
  134.             var itemsToSize:Number = configArr[10];
  135.             scrollDelayTime = configArr[11];
  136.             scrollRepeatTime = configArr[12];
  137.             // = configArr[13];
  138.             // = configArr[14];
  139.             // = configArr[15];
  140.             // = configArr[16];
  141.    
  142.             middleItemPosition = itemsToSize + 1; //TODO detta måste kontrolleras så itemsToSize är bra i förhållande till nrOfMenuItem
  143.            
  144.            
  145.             //menuFont.size = 16;           //ska inte behöva sättas, men det är så inte den som anropar menuobj har pillat på den
  146.            
  147.             //
  148.             //define the placeholders, give them their y-position and height
  149.             //
  150.             var heightFactor:Number = 1.2;      //1.2;
  151.             //var heightFactorMiddle:Number = 1.2; 
  152.             var heightDivider:Number = 0;
  153.             for (var i:Number=0; i<nrOfMenuItem; i++) {
  154.                 if (i<itemsToSize) {
  155.                     heightDivider = heightDivider + i + 1;
  156.                 } else if (i>nrOfMenuItem-itemsToSize-1) {
  157.                     heightDivider = heightDivider + (nrOfMenuItem - i);
  158.             //  } else if (i==itemsToSize+1) {                                                      /
  159.             //      heightDivider = heightDivider + (itemsToSize + 1)*heightFactorMiddle;
  160.                 } else {
  161.                     heightDivider = heightDivider + (itemsToSize + 1);
  162.                 }
  163.             }
  164.             var unitSize = menuHeight / heightDivider;
  165.             //unitsize borde sparas globalt
  166.             for (var i:Number=0; i<nrOfMenuItem; i++) {
  167.                 if (i==0) {
  168.                     placeHolder[i] = new PlaceHolderObj(menuTop, unitSize*(i+1)*heightFactor);
  169.                 } else if (i<itemsToSize) {
  170.                     placeHolder[i] = new PlaceHolderObj(placeHolder[i-1].top+placeHolder[i-1].height/heightFactor, unitSize*(i+1)*heightFactor);
  171.                 } else if (i>nrOfMenuItem-itemsToSize-1) {
  172.                     placeHolder[i] = new PlaceHolderObj(placeHolder[i-1].top+placeHolder[i-1].height/heightFactor, unitSize*(nrOfMenuItem - i)*heightFactor);
  173.             //  } else if (i==itemsToSize+1) {                                                      //TODO !! kolla så detta kan uppfyllas! itemsToSize måste kontrolleras ordentligt
  174.             //      placeHolder[i] = new PlaceHolderObj(placeHolder[i-1].top+placeHolder[i-1].height/heightFactor, unitSize*(itemsToSize+1)*heightFactorMiddle*heightFactor);
  175.                 } else {
  176.                     placeHolder[i] = new PlaceHolderObj(placeHolder[i-1].top+placeHolder[i-1].height/heightFactor, unitSize*middleItemPosition*heightFactor);
  177.                 }
  178.             }  
  179.             for (var i:Number = 0; i < nrOfMenuItem+1; i++) {
  180.                 menuTexts[i] = new MenuItemObj(mainScene, menuFont, menuLeft, menuWidth, unitSize*middleItemPosition);
  181.             }
  182.  
  183.             //description skall placeras under det "valda" objektet (dess top+height)
  184.             var dummytop:Number = placeHolder[middleItemPosition].top+placeHolder[middleItemPosition].height;
  185.             //den skall maximalt sträcka sig ner till det näst sista objektet med "normal" storlek
  186.             var dummymaxheight:Number = placeHolder[nrOfMenuItem - middleItemPosition-1].top+placeHolder[nrOfMenuItem - middleItemPosition-1].height - dummytop;
  187.             menuItemDesc = new MenuDescObj(mainScene, descFont, descScrollTime, menuLeft+menuWidth/15, menuWidth-menuWidth/15, dummytop, dummymaxheight,unitSize*middleItemPosition*3/4);
  188.             //unitSize*middleItemPosition*3/4 avgör storleken på texten för description, *3/4 = tre fjärdedelar så stor som en normal menuitem
  189.    
  190.            
  191.             /*var testItem2:MovieClip = mainScene.createEmptyMovieClip("testItem2",mainScene.getNextHighestDepth());
  192.             testItem2.beginFill(0x229922, 50);
  193.             testItem2.moveTo(menuLeft,dummytop)
  194.             testItem2.lineTo(menuLeft+menuWidth,dummytop)
  195.             testItem2.lineTo(menuLeft+menuWidth,dummymaxheight+dummytop)
  196.             testItem2.lineTo(menuLeft,dummymaxheight+dummytop)
  197.             testItem2.endFill();*/ 
  198.    
  199.         //bara tillfälligt så man ser hur ytan man har att jobba med ser ut
  200.         //markerar nu mittitemet
  201.             var testItem:MovieClip = mainScene.createEmptyMovieClip("testItem",mainScene.getNextHighestDepth());
  202.             //testItem.beginFill(0x883333, 40);
  203.             testItem.lineStyle(5, 0x0, 45, false, "none", "round", "round");
  204.             testItem.moveTo(menuLeft,placeHolder[middleItemPosition].top)
  205.             testItem.lineTo(menuLeft+menuWidth,placeHolder[middleItemPosition].top)
  206.             testItem.lineTo(menuLeft+menuWidth,placeHolder[middleItemPosition].top+placeHolder[middleItemPosition].height)
  207.             testItem.lineTo(menuLeft,placeHolder[middleItemPosition].top+placeHolder[middleItemPosition].height)
  208.             //testItem.endFill();
  209.             testItem.lineTo(menuLeft,placeHolder[middleItemPosition].top)
  210.        
  211.         }
  212.  
  213.     }       //end constructor
  214.    
  215.     function getName():String {
  216.         return menuName;
  217.     }
  218.    
  219.     public function setCommunicator(commObj:CommunicationObj):Void {
  220.         //trace(commObj);
  221.         this.commObj = commObj;
  222.     }
  223.    
  224.     private function sendData(data:XML) {
  225.         //använd commobj som fåtts med setcommunicator ovan, testa om den finns först
  226.         //trace(commObj);
  227.         if (commObj != undefined) {
  228.             commObj.sendToServer(data);
  229.         }
  230.     }
  231.    
  232.     public function showHide (isVisible:Boolean) :Void {
  233.         for (var i:Number = 0; i < nrOfMenuItem+1; i++) {
  234.             menuTexts[i].visible(isVisible);
  235.         }
  236.         menuItemDesc.visible(isVisible);
  237.     }
  238.    
  239.     public function setNewData (data:XMLNode) :Void {
  240.         //trace(data);
  241.         //trace("duration: " + moveTween.duration + " finish: " + moveTween.finish + " FPS: " + moveTween.FPS + " position: " + moveTween.position + " time: " + moveTween.time);
  242.  
  243.         //trace(data.nodeName);
  244.        
  245.         if (incomDataArr.length > 0) {
  246.             incomDataArr.push(data);
  247.         } else {
  248.             if (data.nodeName == "command") {
  249.                 parseCommand(data);
  250.             } else if (data.nodeName == "data") {
  251.                 if (!isScrolling) {
  252.                     parseMenuData(data);
  253.                 } else {
  254.                     incomDataArr.push(data);
  255.                 }
  256.             }
  257.         }
  258.     }
  259.    
  260.     private function popData () {
  261.         var whileCmd:Boolean = true;
  262.        
  263.        
  264.         while (whileCmd && incomDataArr.length > 0) {
  265.             trace("array size: " + incomDataArr.length);
  266.             var shifted:Object = incomDataArr.shift();
  267.             trace("parsar data, nodenamn: " + shifted.nodeName);
  268.             if (shifted.nodeName == "data") {
  269.                 //shifted = incomDataArr.shift();
  270.                 parseMenuData(shifted);
  271.                 trace("skickat till menudataparsning");
  272.             } else if (shifted.nodeName == "command") {
  273.                 //whileCmd = false;
  274.                 //trace("avsluta dataparsning");
  275.                 trace("kastar kommandon");
  276.  
  277.             }
  278.         }
  279.        
  280.         /*
  281.         //parsa data tills kommando kommer
  282.         while (whileCmd && incomDataArr.length > 0) {
  283.             var shifted:Object = incomDataArr[0];
  284.             trace("parsar data, nodenamn: " + shifted.nodeName);
  285.             if (shifted.nodeName == "data") {
  286.                 shifted = incomDataArr.shift();
  287.                 parseMenuData(shifted);
  288.                 trace("skickat till menudataparsning");
  289.             } else if (shifted.nodeName == "command") {
  290.                 whileCmd = false;
  291.                 trace("avsluta dataparsning");
  292.  
  293.             }
  294.         }
  295.        
  296.         whileCmd = true;
  297.         trace("array size: " + incomDataArr.length);
  298.  
  299.         //sen parsas kommando tills data kommer
  300.         while (whileCmd && incomDataArr.length > 0) {
  301.             var shifted:Object = incomDataArr[0];
  302.             trace("parsar kommando, nodenamn: " + shifted.nodeName);
  303.            
  304.             if (shifted.nodeName == "command") {
  305.                 shifted = incomDataArr.shift();
  306.                 //parseCommand(shifted);
  307.                 trace("skickat till kommandoparsning");
  308.             } else if (shifted.nodeName == "data") {
  309.                 whileCmd = false;
  310.                 trace("avsluta kommandoparsning");
  311.             }
  312.         }*/
  313.        
  314.     }
  315.    
  316.     private function parseCommand (data:Object) {
  317.         if (data.nodeName == "command") {
  318.             if (data.firstChild.nodeName == "scroll") {
  319.                 if (data.firstChild.firstChild.nodeValue == 0) {
  320.                     scrollStop();
  321.                 } else if (data.firstChild.firstChild.nodeValue == 1) {
  322.                     scrollUp();
  323.                 } else if (data.firstChild.firstChild.nodeValue == -1) {
  324.                     scrollDown();
  325.                 }
  326.             }
  327.         }
  328.     }
  329.        
  330.     private function parseMenuData (data:Object) {
  331.         if (data.nodeName == "data") {
  332.        
  333.         //för tillfället, strunta i att uppdatera med ny data om man håller på att scrolla
  334.         //prio på att fixa detta
  335.         //detta funkar någorlunda, kanske ha en lista med data som läses in här
  336.         //då man läst in data kollar man om listan är tom, annars får man läsa in igen
  337.             //if (!(moveTween.time == undefined || moveTween.time == moveTween.duration)) {
  338.             //  newDataExists = true;
  339.             //  newData = data;
  340.             if (false) {} else {
  341.                 menuItemDesc.hide();
  342.                
  343.                 var middleItem:Number = 0;
  344.                 var middleItemId:String = "";
  345.                 var dataList:XMLNode;
  346.                
  347.                 //trace(data);
  348.                 for (var aNode:XMLNode = data.firstChild; aNode != null; aNode=aNode.nextSibling) {
  349.                     //trace(aNode);
  350.                    
  351.                     if (aNode.nodeName == "middleid") {
  352.                         //trace("middle: " + aNode);
  353.                         middleItemId = aNode.firstChild.nodeValue;
  354.                         //trace(middleItemId);
  355.                     }
  356.                     if (aNode.nodeName == "list") {
  357.                         //trace("listan: " + aNode);
  358.                         dataList = aNode;
  359.                     }
  360.                 }
  361.                 if (dataList != null) {
  362.                     menuData = new Array();
  363.                     var cnt:Number = 0;
  364.                     for (var aNode:XMLNode = dataList.firstChild; aNode != null; aNode=aNode.nextSibling) {
  365.                         //trace("nästa child: " + aNode);
  366.                         var title:String = "";
  367.                         var description:String = "";
  368.                         var id:String = "";
  369.                         title = aNode.attributes.title;
  370.                         description = aNode.attributes.desc;
  371.                         id = aNode.attributes.id;
  372.                        
  373.                         if (id == middleItemId) {
  374.                             middleItem = cnt;
  375.                         }
  376.                        
  377.                         //trace(id);
  378.                         //trace(title);
  379.                         //trace(description);
  380.                        
  381.                         /*for (var bNode:XMLNode = aNode.firstChild; bNode != null; bNode=bNode.nextSibling) {
  382.                                 //trace("nytt" + bNode.nodeName);
  383.                             if (bNode.nodeName == "title") {
  384.                                 if (bNode.firstChild.nodeValue != undefined) {
  385.                                     title = bNode.firstChild.nodeValue;
  386.                                 } else {
  387.                                     title = "";
  388.                                 }
  389.                             } else if (bNode.nodeName == "description") {
  390.                                 if (bNode.firstChild.nodeValue != undefined) {
  391.                                     description = bNode.firstChild.nodeValue;
  392.                                 } else {
  393.                                     description = "";
  394.                                 }
  395.                             } else if (bNode.nodeName == "id") {
  396.                                 if (bNode.firstChild.nodeValue != undefined) {
  397.                                     id = bNode.firstChild.nodeValue;
  398.                                     //trace("inkommande id: " + id + " cnt2:");
  399.                                     if (id == middleItemId) {
  400.                                         middleItem = cnt;
  401.                                     }
  402.                                 } else {
  403.                                     id = "";
  404.                                 }
  405.                             }
  406.                             //trace("nästa child: " + bNode);
  407.                         }*/
  408.                         menuData[cnt] = new MenuDataObj(id, title, description);
  409.                         //trace(menuData[cnt].description);
  410.                         cnt++;
  411.                     }
  412.                 }
  413.    
  414.                 //trace(menuTexts.length);
  415.                 for (var i:Number = 0; i < menuTexts.length; i++) {
  416.                     //menuTexts[i].setText("");
  417.                     menuTexts[i].setFree(true);
  418.                     menuTexts[i].notInUse();
  419.                     menuTexts[i].visible(true);     //göm alla items (inuse är false därmed göms de när man anropa visible)
  420.                     menuTexts[i].setAlpha(100);
  421.                 }
  422.                
  423.                 //dataList = data;                          //save global
  424.                 menuMiddleItem = middleItem;    //save global
  425.                
  426.                 var menuItemCnt:Number = 0;
  427.                 for (var i:Number = middleItem-middleItemPosition; i<middleItem+nrOfMenuItem-middleItemPosition; i++) {
  428.                     if (i<0) {
  429.                         if (menuData.length > nrOfMenuItem) {
  430.                             menuTexts[menuItemCnt].setText(menuData[menuData.length + i].title);
  431.                             menuTexts[menuItemCnt].setDataIndex(i);
  432.                         }
  433.                     } else if (i < menuData.length) {
  434.                         menuTexts[menuItemCnt].setText(menuData[i].title);
  435.                         menuTexts[menuItemCnt].setDataIndex(i);
  436.                     } else {        //nu är i > antal noder i listan, vi kanske ska ladda in nod0, nod1 osv nu
  437.                         if (menuData.length >= nrOfMenuItem) {
  438.                             menuTexts[menuItemCnt].setText(menuData[i - menuData.length].title);
  439.                             menuTexts[menuItemCnt].setDataIndex(i);
  440.                         } else {
  441.                             //trace(menuItemCnt + " " + nrOfMenuItem);
  442.                             //trace(menuItemCnt);
  443.                         }
  444.                     }
  445.                     menuItemCnt++;
  446.                 }
  447.        
  448.                 for (var i:Number = 0; i < nrOfMenuItem; i++) {
  449.                     placeHolder[i].menuItemIndex = i;
  450.            
  451.                     menuTexts[i].setFree(false);
  452.                     menuTexts[i].setTop(placeHolder[i].top);
  453.                     menuTexts[i].setHeight(placeHolder[i].height);
  454.                     //trace("i: " + i + " top: " + menuTexts[i].getTop() + " text: " + menuTexts[i].getText());
  455.                 }
  456.                 showDescription();
  457.             }
  458.         }
  459.     }
  460.  
  461.    
  462.     public function test (Void):Void {
  463.             for (var i:Number = 0; i < nrOfMenuItem + 1; i++) {
  464.                 trace(i + " " + menuTexts[i].getTop() + " : " + menuTexts[i].getText());
  465.                 trace(menuTexts[i].isInUse());
  466.                 //placeHolder[i].menuItemIndex = i;
  467.        
  468.                 //trace("i: " + i + " top: " + menuTexts[i].getTop() + " text: " + menuTexts[i].getText());
  469.                 //menuTexts[i].setHeight(placeHolder[i].height);
  470.             }
  471.             showDescription();
  472.  
  473. /*      var testvar:Number;
  474.         for (var i:Number = 0; i < nrOfMenuItem+1; i++) {
  475.             testvar = menuTexts[i].getHeight();
  476.         }*/
  477.     }
  478.    
  479.     private function onMoveTweenDone() {
  480.         /*
  481.     var tweenCommand:Number = 0;
  482.         //0 = stop
  483.         //1 = scrollup
  484.         //2 = scrolldown
  485.        
  486.         */
  487.         isScrolling = false;
  488.        
  489.         if (tweenCommand == 1) {
  490.             scrollUp();
  491.         } else if (tweenCommand == 2) {
  492.             scrollDown();
  493.         } else if (tweenCommand == 0) {
  494.             if (incomDataArr.length > 0) {
  495.             //if (newDataExists) {
  496.                 //detta funkar någorlunda
  497.                 //trace(".time: " + moveTween.time + ".duration: " + moveTween.duration);
  498.                 //newDataExists = false;
  499.                 //setNewData(newData);
  500.                 popData();
  501.                
  502.             } else {
  503.             //test();
  504.                 showDescription();
  505.                 sendData(new XML("<flinshpacket menuid=\"" + menuName + "\" middleid=\"" + menuData[menuMiddleItem].id + "\" />"));
  506.             }
  507.             //sendData(new XML("<data name=\"id\" value=\"" + menuName+ "\"><middleitem>" + menuMiddleItem + "</middleitem></data>"));
  508.         }
  509.     }
  510.  
  511.     private function showDescription() {
  512.        
  513.             //finns ingen description skall detta inte köras dock (det ser menudescobj till, dess height blir 0)
  514.             menuItemDesc.update(menuData[menuMiddleItem].description);
  515.             //menuItemDesc.update("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.");
  516.            
  517.             //kör igång animering på de items som ligger ivägen
  518.             var descY:Number = menuItemDesc.getBottom();
  519.             var firstFreePlaceHolder:Number = 0;
  520.             for (var i:Number = middleItemPosition+1; i < nrOfMenuItem; i++) {
  521.                 //ta reda på vilken som är första "fria" placeHoldern
  522.                 if (descY<placeHolder[i-1].top+placeHolder[i-1].height) {
  523.                     firstFreePlaceHolder = i;
  524.                     //trace(i + " " + (placeHolder[i-1].top + placeHolder[i-1].height) );
  525.                     break;
  526.                 }
  527.             }
  528.             if (firstFreePlaceHolder > 0) {
  529.                 for (var i:Number = 0; i < nrOfMenuItem + 1 ; i++) {
  530.                     menuTexts[i].fforward();
  531.                 }
  532.                 var offset:Number = firstFreePlaceHolder - middleItemPosition-1;
  533.                 for (var i:Number = middleItemPosition+1; i < nrOfMenuItem; i++) {
  534.                     //kolla igenom de menuTexts som möjligtvis kan ligga under description
  535.                     //dessa skall tweenas i storlek och position, offsetten mellan första upptagna och första fria skall sparas
  536.                     //alla ska flyttas med offsetten, hamnar de utanför sista placeholdern skall de läggas där med height = 0
  537.                     //placeHolders ska nu bara användas för att flytta och resiza menuTexts, de skall inte ändras
  538.                     //trace(i);
  539.                     if (i+offset<nrOfMenuItem) {
  540.                         moveTween = menuTexts[placeHolder[i].menuItemIndex].scroll(placeHolder[i+offset].top, placeHolder[i+offset].height, descScrollTime/2);
  541.                     } else {
  542.                         moveTween = menuTexts[placeHolder[i].menuItemIndex].scroll(placeHolder[nrOfMenuItem-1].top + placeHolder[nrOfMenuItem-1].height, 0, descScrollTime/2);
  543.                     }
  544.                 }
  545.             }
  546.             menuItemDesc.appear();     
  547.     }
  548.        
  549.        
  550.     public function scrollUp (Void) :Void {
  551.         //trace("up");
  552.        
  553.        
  554.         var wrapMenu:Boolean = (menuData.length >= nrOfMenuItem);
  555.         moveTween.onMotionFinished = null;
  556.         if ((menuMiddleItem > 0) || (wrapMenu)) {
  557.             isScrolling = true;
  558.            
  559.             for (var i:Number = 0; i < nrOfMenuItem + 1; i++) {
  560.                 menuTexts[i].fforward();
  561.             }
  562.  
  563.             menuMiddleItem--;
  564.             menuItemDesc.hide();            //Hide the description placed under the marked item (if description is shown)
  565.        
  566.             //makes sure menumiddleitem is correct when wrapping
  567.             if (menuMiddleItem < 0) {
  568.                 menuMiddleItem = menuData.length-1;
  569.             }
  570.            
  571.             if (tweenCommand == 0) {        //om vi inte redan är igång så ska den längre scrollen köras
  572.                 var timeToScroll:Number = scrollDelayTime;
  573.             } else {                                        //annars kör vi repeatrate
  574.                 var timeToScroll:Number = scrollRepeatTime;
  575.             }
  576.             tweenCommand = 1;
  577.            
  578.             //i placeholdern längst ner finns det nu lediga menuitem
  579.             var dummyFree:Number = placeHolder[nrOfMenuItem-1].menuItemIndex;
  580.             //scrolla detta menuitem så det hamnar under den placeholdern längst ner och scrolla dess height till 0
  581.             moveTween = menuTexts[dummyFree].scroll(placeHolder[nrOfMenuItem-1].top + placeHolder[nrOfMenuItem-1].height, 0, timeToScroll);
  582.         //BUGG löst
  583.         //den beror delvis på att menuitemobj inte scrollar om objektet är på samma y-värde som tidigare
  584.         //fixat längre ner, där man scrollar in den nya
  585.        
  586.             //fadea bort den också
  587.             if (menuTexts[dummyFree].isInUse()) {
  588.                 menuTexts[dummyFree].fade(100, 0, timeToScroll);
  589.                 //detta buggar, inuse är inte riktigt rätt satt, vilket gör att itemet är visible
  590.                
  591.             }
  592.  
  593.             //trace("frigör: " + dummyFree);
  594.            
  595.             for (var i:Number = nrOfMenuItem-1; i > 0; i--) {
  596.                 //trace("flyttar " + placeHolder[i-1].menuItemIndex + " till placeHolder[" + i + "]");
  597.                 placeHolder[i].menuItemIndex = placeHolder[i-1].menuItemIndex;
  598.                 var curPlace:PlaceHolderObj = placeHolder[i];
  599.                 moveTween = menuTexts[curPlace.menuItemIndex].scroll(curPlace.top, curPlace.height, timeToScroll);
  600.             }
  601.            
  602.             //find a free menuText
  603.             var freeItem:Number;
  604.             for (var i:Number = 0; i < nrOfMenuItem+1; i++) {
  605.                 if (menuTexts[i].isFree()) {
  606.                     freeItem = i;
  607.                     break;
  608.                 }
  609.             }
  610.            
  611.             //frigör den _efter_ valet av ny kontainer
  612.             menuTexts[dummyFree].setFree(true);        
  613.             menuTexts[dummyFree].notInUse();
  614.            
  615.             var curPlace:PlaceHolderObj = placeHolder[0];
  616.             curPlace.menuItemIndex = freeItem;
  617.            
  618.             //newItem is the index of a menudata-entry, the entry that now should enter the menu
  619.             var newItem:Number = menuMiddleItem-middleItemPosition;
  620.             if ((wrapMenu) && (newItem<0)) {
  621.                 newItem = newItem + menuData.length;
  622.             }
  623.             if ((newItem>=0) || (wrapMenu)) {
  624.                 //trace("använder: " + freeItem + " till: " + menuData[newItem].title);
  625.                 menuTexts[curPlace.menuItemIndex].setFree(false);
  626.                 menuTexts[curPlace.menuItemIndex].setText(menuData[newItem].title);
  627.                 menuTexts[curPlace.menuItemIndex].setDataIndex(newItem);
  628.                 menuTexts[curPlace.menuItemIndex].setTop(menuTop+1);
  629.                 menuTexts[curPlace.menuItemIndex].setHeight(0);
  630.                 menuTexts[curPlace.menuItemIndex].fade(0, 100, timeToScroll);
  631.                 moveTween = menuTexts[curPlace.menuItemIndex].scroll(curPlace.top, curPlace.height, timeToScroll);
  632.                 //trace("inuse: " + menuTexts[freeItem].isInUse() + " kanal: " + menuData[newItem].title + " visible: " + menuTexts[freeItem].isvisible());
  633.             } else {
  634.                 //trace("använder2: " + freeItem);
  635.                 menuTexts[curPlace.menuItemIndex].setFree(false);
  636.                
  637.             }
  638.  
  639.             moveTween.onMotionFinished = Delegate.create(this, onMoveTweenDone);           
  640.         } else {
  641.             showDescription();
  642.             tweenCommand = 0;
  643.         }
  644.     }
  645.  
  646.     /**
  647.     scrollDown
  648.     */
  649.     public function scrollDown () {
  650.        
  651.         var wrapMenu:Boolean = (menuData.length >= nrOfMenuItem);
  652.         moveTween.onMotionFinished = null;
  653.        
  654.         if ((menuMiddleItem < menuData.length-1) || (wrapMenu)) {
  655.             isScrolling = true;
  656.             for (var i:Number = 0; i < nrOfMenuItem + 1 ; i++) {
  657.                 menuTexts[i].fforward();
  658.                 //fforward()
  659.             }
  660.  
  661.             menuMiddleItem++;
  662.             menuItemDesc.hide();            //Hide the description placed under the marked item (if description is shown)
  663.            
  664.             //makes sure menumiddleitem is correct when wrapping
  665.             if (menuMiddleItem >= menuData.length) {
  666.                 menuMiddleItem = 0;
  667.             }
  668.            
  669.             if (tweenCommand == 0) {        //om vi inte redan är igång så ska den längre scrollen köras
  670.                 var timeToScroll:Number = scrollDelayTime;
  671.             } else {                                        //annars kör vi repeatrate
  672.                 var timeToScroll:Number = scrollRepeatTime;
  673.             }
  674.             tweenCommand = 2;
  675.            
  676.             var dummyFree:Number = placeHolder[0].menuItemIndex;
  677.             //menuTexts[dummyFree].fforward();
  678.             moveTween = menuTexts[dummyFree].scroll(menuTexts[dummyFree].getTop, 0, timeToScroll);
  679.             menuTexts[dummyFree].fade(100, 0, timeToScroll);
  680.             //trace("frigör: " + dummyFree);
  681.  
  682.             for (var i:Number = 0; i < nrOfMenuItem-1; i++) {
  683.                 placeHolder[i].menuItemIndex = placeHolder[i+1].menuItemIndex;
  684.                 var curPlace:PlaceHolderObj = placeHolder[i];
  685.                 moveTween = menuTexts[curPlace.menuItemIndex].scroll(curPlace.top, curPlace.height, timeToScroll);
  686.             }
  687.            
  688.             //find a free menuText
  689.             var freeItem:Number;
  690.             for (var i:Number = 0; i < nrOfMenuItem+1; i++) {
  691.                 if (menuTexts[i].isFree()) {
  692.                     freeItem = i;
  693.                     break;
  694.                 }
  695.             }
  696.             //frigör den _efter_ valet av ny kontainer
  697.             menuTexts[dummyFree].setFree(true);
  698.             menuTexts[dummyFree].notInUse();
  699.            
  700.             var curPlace:PlaceHolderObj = placeHolder[nrOfMenuItem-1];
  701.             curPlace.menuItemIndex = freeItem;
  702.            
  703.             //newItem is the index of a menudata-entry, the entry that now should enter the menu
  704.             var newItem:Number = menuMiddleItem+nrOfMenuItem-middleItemPosition-1;
  705.             if ((wrapMenu) && (newItem>=menuData.length)) {
  706.                 newItem = newItem - menuData.length;
  707.             }
  708.             if ((newItem<menuData.length) || (wrapMenu)) {
  709.                 //trace("använder: " + freeItem);
  710.                 menuTexts[curPlace.menuItemIndex].setFree(false);
  711.                 menuTexts[curPlace.menuItemIndex].setText(menuData[newItem].title);
  712.                 menuTexts[curPlace.menuItemIndex].setDataIndex(newItem);
  713.                 menuTexts[curPlace.menuItemIndex].setTop(menuTop+menuHeight);
  714.                 menuTexts[curPlace.menuItemIndex].setHeight(0);
  715.                 menuTexts[curPlace.menuItemIndex].fade(0, 100, timeToScroll);
  716.                 moveTween = menuTexts[curPlace.menuItemIndex].scroll(curPlace.top, curPlace.height, timeToScroll);
  717.             } else {
  718.                 //trace("använder2: " + freeItem);
  719.                 menuTexts[curPlace.menuItemIndex].setFree(false);
  720.                
  721.             }
  722.            
  723.             moveTween.onMotionFinished = Delegate.create(this, onMoveTweenDone);
  724.         } else {
  725.             showDescription();
  726.             tweenCommand = 0;
  727.         }
  728.        
  729.     }
  730.    
  731.    
  732.    
  733.     public function scrollStop (Void) :Void {
  734.         /*
  735.         description kommer få en max-height, blir den större ska den scrolla :)
  736.         denna kommer få max-height så att det alltid finns en stor item under samt alla de små
  737.        
  738.         var tweenCommand:Number = 0;
  739.         //0 = stop
  740.         //1 = scrollup
  741.         //2 = scrolldown
  742.         */
  743.        
  744.  
  745.         tweenCommand = 0;
  746.        
  747.     }
  748.  
  749.     public function setScrollDelay (value:Number) :Void {
  750.         /*
  751.         */
  752.         if (value > 0.05) {
  753.             scrollDelayTime = value;
  754.         }
  755.     }
  756.     public function setScrollRepeat (value:Number) :Void {
  757.         /*
  758.         */
  759.         if (value > 0.05) {
  760.             scrollRepeatTime = value;
  761.         }
  762.     }
  763.  
  764.     public function getScrollDelay (Void) :Number {
  765.         /*
  766.         */
  767.             return scrollDelayTime;
  768.     }
  769.     public function getScrollRepeat (Void) :Number {
  770.         /*
  771.         */
  772.             return scrollRepeatTime;
  773.     }
  774.  
  775.     private function parseConfig(data:XMLNode): Array {
  776.         var confError:Number = -1;
  777.         var confArr:Array = new Array();
  778.         for (var bNode:XMLNode = data.firstChild; bNode != null && confError == -1; bNode=bNode.nextSibling) {
  779.             //trace(bNode.nodeName);
  780.             if (bNode.nodeName == "option") {
  781.                 switch (bNode.attributes.name) {
  782.                     case "menushortname":
  783.                     confArr[1] = bNode.attributes.value;
  784.                     break;
  785.                     case "menudescription":
  786.                     confArr[2] = bNode.attributes.value;
  787.                     break;
  788.                     case "rowitemfont":
  789.                     if (bNode.attributes.value.length > 0) {   
  790.                         confArr[3] = bNode.attributes.value;
  791.                     } else {
  792.                         confError = 3;
  793.                     }
  794.                     break;
  795.                     case "descriptionfont":
  796.                     if (bNode.attributes.value.length > 0) {   
  797.                         confArr[4] = bNode.attributes.value;
  798.                     } else {
  799.                         confError = 4;
  800.                     }
  801.                     //trace(aNode.attributes.value);
  802.                     break;
  803.                     case "left":
  804.                     if (parseFloat(bNode.attributes.value) >= 0) {
  805.                         confArr[5] = parseFloat(bNode.attributes.value) * Stage.width;
  806.                     } else {
  807.                         confError = 5;
  808.                     }
  809.                     break;
  810.                     case "top":
  811.                     if (parseFloat(bNode.attributes.value) >= 0) {
  812.                         confArr[6] = parseFloat(bNode.attributes.value) * Stage.height;
  813.                     } else {
  814.                         confError = 6;
  815.                     }
  816.                     break;
  817.                     case "width":
  818.                     if (parseFloat(bNode.attributes.value) >= 0) {
  819.                         confArr[7] = parseFloat(bNode.attributes.value) * Stage.width;
  820.                     } else {
  821.                         confError = 7;
  822.                     }
  823.                     break;
  824.                     case "height":
  825.                     if (parseFloat(bNode.attributes.value) >= 0) {
  826.                         confArr[8] = parseFloat(bNode.attributes.value) * Stage.height;
  827.                     } else {
  828.                         confError = 8;
  829.                     }
  830.                     break;
  831.                     case "menurowitems":
  832.                     if (parseInt(bNode.attributes.value) > 0) {
  833.                         confArr[9] = parseInt(bNode.attributes.value);
  834.                     } else {
  835.                         confError = 9;
  836.                     }
  837.                     break;
  838.                     case "sizedrowitems":
  839.                     if (parseInt(bNode.attributes.value) > 0) {
  840.                         confArr[10] = parseInt(bNode.attributes.value);
  841.                     } else {
  842.                         confError = 10;
  843.                     }
  844.                     break;
  845.                     case "scrolldelaytime":
  846.                     if (parseFloat(bNode.attributes.value) >= 0) {
  847.                         confArr[11] = parseFloat(bNode.attributes.value);
  848.                     } else {
  849.                         confError = 11;
  850.                     }
  851.                     //10
  852.                     break;
  853.                     case "scrollrepeattime":
  854.                     if (parseFloat(bNode.attributes.value) >= 0) {
  855.                         confArr[12] = parseFloat(bNode.attributes.value);
  856.                     } else {
  857.                         confError = 12;
  858.                     }
  859.                     break;
  860.                     case "menucolor":
  861.                     if (parseInt(bNode.attributes.value) >= 0) {
  862.                         confArr[13] = parseInt(bNode.attributes.value);
  863.                         //trace(confArr[13]);
  864.                     } else {
  865.                         confError = 13;
  866.                     }
  867.                     break;
  868.                     case "desccolor":
  869.                     if (parseInt(bNode.attributes.value) >= 0) {
  870.                         confArr[14] = parseInt(bNode.attributes.value);
  871.                     } else {
  872.                         confError = 14;
  873.                     }
  874.                     break;
  875.                     case "descscrolltime":
  876.                     if (parseFloat(bNode.attributes.value) >= 0) {
  877.                         confArr[15] = parseFloat(bNode.attributes.value);
  878.                     } else {
  879.                         confError = 15;
  880.                     }
  881.                     break;
  882.                     case "":
  883.                     if (true) {
  884.                         confArr[16] = parseFloat(bNode.attributes.value);
  885.                     } else {
  886.                         confError = 16;
  887.                     }
  888.                     break;             
  889.                     case "":
  890.                     if (true) {
  891.                         confArr[17] = parseFloat(bNode.attributes.value);
  892.                     } else {
  893.                         confError = 17;
  894.                     }
  895.                     break;             
  896.                     case "":
  897.                     if (true) {
  898.                         confArr[18] = parseFloat(bNode.attributes.value);
  899.                     } else {
  900.                         confError = 18;
  901.                     }
  902.                     break;             
  903.                 }
  904.             }
  905.         }
  906.         confArr[0] = confError;
  907.         return confArr;
  908.     }
  909. }
  910.