Mac Doc & XML Photo Gallery (routing problem)

Hello,

I’m using the MAC DOC from http://jrgraphix.net/

Currently I have modified it to incorporate an XML Picture database (from Kirupa Tutorials http://www.kirupa.com/developer/mx2004/xml_flash_photogallery.htm). I have created two buttons, one for NEXT and another for PREVIOUS (to load the next set of pictures into the different ICONS). This script is duplicated and placed in the individual ICON MC’s. The buttons also change each icons target to load further .SWF files dynamically when pressed (corresponding to each individual picture, and library respectfully).

The problem is as follows:

As it’s not possible to reference a button’s instant name in multiple MC’s, and, since their example (XML Library) does not include using more than one set of libraries, it means that I need to create one script for the buttons with multiple targets to the ‘function nextImage()’ in each ICONS MC. But, as the DOC is created using various createEmptyMovieClip commands with complicated strings, I can’t work out what the actual path ends up being.

Is anyone familiar with the dock.as file that the MAC DOCK comes with, and the path that is created to each ICON MC?

I’ve tried, for example:

_root.menu_mc.items[1].nextImage()
_root.menu_mc.items[2].nextImage()
_root.menu_mc.items[3].nextImage() etc.

… and various other ways, but nothing!

Many thanks!

The .as file is below:

/*

Free stuff. Do not redistribute.

http://jrgraphix.net/

March 8, 2005

*/

class Dock extends MovieClip {

var icon_min        : Number;

var icon_max        : Number;

var icon_size        : Number;

var icon_spacing    : Number;

var width            : Number;

var span            : Number;

var amplitude        : Number;

var ratio            : Number;

var scale            : Number = Number.NEGATIVE_INFINITY;

var trend            : Number = 0;

var xmouse            : Number;

var ymouse            : Number;

var layout            : String;

var callback        : Function;

var items            : Array;



function Dock() {

    setParameters();

    setLayout();

    createIcons();

    createTray();

    onEnterFrame = monitorDock;

}



private function setParameters():Void {

    this.layout = this.layout ? this.layout : 'bottom';

    this.icon_min = this.icon_min ? this.icon_min : 32;

    this.icon_max = this.icon_max ? this.icon_max : 96;

    this.icon_spacing = this.icon_spacing ? this.icon_spacing : 2;

    this.span = this.span ? this.span : getSpan();

    this.amplitude = this.amplitude ? this.amplitude : getAmplitude();

    this.ratio =  Math.PI / 2 / this.span;

}



private function getSpan():Number {

    return (this.icon_min - 16) * (240 - 60) / (96 - 16) + 60;

}



private function getAmplitude():Number {

    return 2 * (this.icon_max - this.icon_min + this.icon_spacing);

}



private function createIcons():Void {

    var i:Number;

    var id:String;

    this.scale = 0;

    this.width = (this.items.length - 1) * this.icon_spacing + this.items.length * this.icon_min;

    var left:Number = (this.icon_min - this.width) / 2;

    for(i = 0; i < this.items.length; i++) {

        this.createEmptyMovieClip(String(i), i + 10).attachMovie(this.items*.id, '_mc', 1);

        this*._mc._y = -this.icon_size / 2;

        this*._mc._rotation = -this._rotation;

        this*._x = this*.x = left + i * (this.icon_min + this.icon_spacing) + this.icon_spacing / 2;

        this*._y = -this.icon_spacing;

        this*.onRelease = launchIcon;

        this*.useHandCursor = false;

    }

}



private function launchIcon():Void {

    this._parent.callback(this._parent.items[this._name].label);

}



private function createTray():Void {

    var height:Number = this.icon_min + 2 * this.icon_spacing;

    var width:Number = this.width + 2 * this.icon_spacing;

    var mc:MovieClip = this.createEmptyMovieClip('tray_mc', 1);

    mc.lineStyle(0, 0xcccccc, 80);

    mc.beginFill(0xe8e8e8, 50);

    mc.lineTo(0, -height);

    mc.lineTo(width, -height);

    mc.lineTo(width, 0);

    mc.lineTo(0, 0);

    mc.endFill();

}



private function setLayout():Void {

    switch(this.layout) {

        case 'left':

            this._rotation = 90;

            break;

        case 'top':

            this._rotation = 180;

            break;

        case 'right':

            this._rotation = 270;

            break;

        default:

            this._rotation = Number(this.layout);

    }

}



private function checkBoundary():Boolean {

    var buffer:Number = 4 * this.scale;

    return (this.ymouse < 0)

        && (this.ymouse > -2 * this.icon_spacing - this.icon_min + (this.icon_min - this.icon_max) * this.scale)

        && (this.xmouse > this[0]._x - this[0]._width / 2 - this.icon_spacing - buffer)

        && (this.xmouse < this[this.items.length - 1]._x + this[this.items.length - 1]._width / 2 + this.icon_spacing + buffer);

}



private function updateTray():Void {

    var x:Number;

    var w:Number;

    x = this[0]._x - this[0]._width / 2 - this.icon_spacing;

    w = this[this.items.length - 1]._x + this[this.items.length - 1]._width / 2 + this.icon_spacing;

    this['tray_mc']._x = x;

    this['tray_mc']._width = w - x;

}



private function monitorDock():Boolean {

    var i:Number;

    var x:Number;

    var dx:Number;

    var dim:Number;



    // Mouse did not move and Dock is not between states. Skip rest of the block.

    if((this.xmouse == this._xmouse) && (this.ymouse == this._ymouse) && ((this.scale <= 0.01) || (this.scale >= 0.99))) { return false; }



    // Mouse moved or Dock is between states. Update Dock.

    this.xmouse = this._xmouse;

    this.ymouse = this._ymouse;



    // Ensure that inflation does not change direction.

    this.trend = (this.trend == 0 ) ? (checkBoundary() ? 0.25 : -0.25) : (this.trend);

    this.scale += this.trend;

    if( (this.scale < 0.02) || (this.scale > 0.98) ) { this.trend = 0; }



    // Actual scale is in the range of 0..1

    this.scale = Math.min(1, Math.max(0, this.scale));



    // Hard stuff. Calculating position and scale of individual icons.

    for(i = 0; i < this.items.length; i++) {

        dx = this*.x - this.xmouse;

        dx = Math.min(Math.max(dx, -this.span), this.span);

        dim = this.icon_min + (this.icon_max - this.icon_min) * Math.cos(dx * this.ratio) * (Math.abs(dx) > this.span ? 0 : 1) * this.scale;

        this*._x = this*.x + this.scale * this.amplitude * Math.sin(dx * this.ratio);

        this*._xscale = this*._yscale =  100 * dim / this.icon_size;

    }



    // Resize tray to contain icons.

    updateTray();

    return true;

}

}