Subversion Repositories HomeAutomation

Rev

Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
3 - 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
}