if ( Cartionary === undefined ) {
    /* global Cartionary */
    Cartionary = {};
}

var YUD = YAHOO.util.Dom;
var YUE = YAHOO.util.Event;
var YUA = YAHOO.util.Anim;

Cartionary.Gallery = function(config) {
    this.image_list = [];
    this.selected;
    this.frame;

    this.parseLI = function(li) {
        var link = YUD.getChildren(li)[0];
        var img  = YUD.getChildren(link)[0];
        var uuid = li.id.substr(8);
        var image = {
            uuid:    uuid,
            source:  li,
            image:   link.href,
            preview: img.src
        };

        YUE.on(link, 'click', function(e) {
            YUE.preventDefault(e);
            var tgt = YUE.getTarget(e);
            while ( tgt.tagName !== 'LI' && tgt.parentNode ) 
                tgt = tgt.parentNode;
            var uuid = tgt.id.substr(8);
            this.loadImageEvent.fire({
                uuid:    uuid,
                source:  tgt,
                image:   image.image,
                preview: image.preview
            });
        }, this, true);
        return image;
    };

    this.init = function(config) {
        this.selectedIndex = 0;
        this.frame = document.getElementById(config.display);
        if ( this.frame === undefined )
            throw "Can't use a gallery without a display frame";

        this.image_list = [];
        var image_source;
        if ( config.listClass ) {
            image_source = YUD.getElementsByClassName(config.listClass, 'ul');
            if ( image_source && image_source.length > 0 ) 
                image_source = image_source[0];
        }
        else if ( config.list )
            image_source = YUD.getElementById(config.list);
        if ( undefined === image_source )
            throw "Unable to find image list source";
        var children = YUD.getChildren(image_source);
        var load_img;
        if ( document.location.hash ) {
            var uuid = document.location.hash.toString();
            uuid = uuid.substr(1); /* Remove the # */
            var el   = document.getElementById("preview_" + uuid);
            if ( el )
                load_img = uuid;
        }
        for ( var i = 0; i < children.length; i++ ) {
            this.image_list.push( this.parseLI(children[i]) );
            if ( load_img && children[i].id === "preview_" + load_img ) {
                this.selectedIndex = i;
            }
        }
        if ( this.selectedIndex !== undefined ) {
            this.selected = this.image_list[this.selectedIndex];
            this.loadImageEvent.fire(this.selected);
        }

        if ( config.prevClass ) {
            var links = YUD.getElementsByClassName( config.prevClass, 'a' );
            for ( var i = 0; i < links.length; i++ ) {
                YUE.on(links[i], 'click', function(ev) {
                    YUE.preventDefault(ev);
                    this.loadPrevEvent.fire();
                }, this, true);
            }
        }
        if ( config.nextClass ) {
            var me    = this;
            var links = YUD.getElementsByClassName( config.nextClass, 'a' );
            for ( var i = 0; i < links.length; i++ ) {
                YUE.on(links[i], 'click', function(ev) {
                    YUE.preventDefault(ev);
                    this.loadNextEvent.fire();
                }, this, true);
            }
        }
    };

    this.loadPrev  = function() {
        this.selectedIndex--;
        if ( this.selectedIndex < 0 )
            this.selectedIndex = this.image_list.length - 1;
        this.selected = this.image_list[this.selectedIndex];
        this.loadImageEvent.fire(this.selected);
    };

    this.loadNext = function() {
        this.selectedIndex++;
        if ( this.selectedIndex >= this.image_list.length )
            this.selectedIndex = 0;
        this.selected = this.image_list[this.selectedIndex];
        this.loadImageEvent.fire(this.selected);
    };

    this.loadImage = function( type, args, me ) {
        this.frame.innerHTML = "";
        if ( this.selectedEl )
            YUD.removeClass(this.selectedEl, 'selected');
        YUD.addClass(args[0].source, 'selected');
        this.selectedEl = args[0].source;
        var image = new Image();
            image.src = args[0].image;
        this.frame.appendChild(image);
        document.location.hash = args[0].uuid;
    };

    this.loadImageEvent = new YAHOO.util.CustomEvent("loadImage", this);
    this.loadNextEvent  = new YAHOO.util.CustomEvent("loadPrev", this);
    this.loadPrevEvent  = new YAHOO.util.CustomEvent("loadNext", this);

    this.loadImageEvent.subscribe( this.loadImage, this );
    this.loadNextEvent.subscribe( this.loadNext, this );
    this.loadPrevEvent.subscribe( this.loadPrev, this );

    this.init(config);
};

