/**
  *
  *  Copyright 2006 and onward, Agileco, LLC
  *	 All rights reserved
  *  License: See www.agilegallery.com for license details
  *
  **/

dataFromXMLRequest = function (req) {
    log('dataFromXMLRequest', req);  
    var xml = req.responseXML;

    // get the albumn base info
    var rval = {
        "albumName": map(scrapeText, xml.getElementsByTagName("albumName")),
        "albumItemCount": map(scrapeText,xml.getElementsByTagName("albumItemCount")),
        "albumCaption": map(scrapeText,xml.getElementsByTagName("albumCaption"))
    } 
    // get the image/thumbnail info 
    var images = []; 
    var nodes = xml.getElementsByTagName("image");
    for(var i=0; i<nodes.length; i++) {
        //var itemName = nodes[i].getElementsByTagName("itemName");
        try { 
        images.push({
            "image": map(scrapeText, nodes[i].getElementsByTagName("itemName")),
            "caption": map(scrapeText, nodes[i].getElementsByTagName("itemCaption")),
            "nextImage": map(scrapeText, nodes[i].getElementsByTagName("nextImage")),
            "nextThumbnail": map(scrapeText, nodes[i].getElementsByTagName("nextThumbnail")),   
            "prevImage": map(scrapeText, nodes[i].getElementsByTagName("prevImage")),
            "prevThumbnail": map(scrapeText, nodes[i].getElementsByTagName("prevThumbnail"))
        });
        }
        catch(e) {}
    }
    rval.images = images; 
    return rval; 
}

AgileGallery = function(url) {
    this.galleryUrl=url;
    this.picasaXml='index.xml'; 
    this.thumbs=5; 
    this.images=[]; 
    this.firstimage=null;
    this.lastimage=null;
    this.image=null; 
    this.page=null;
    this.pages=null; 
    this.deferred=null;
    this.format='xml';
    bindMethods(this);
};

AgileGallery.prototype = { 
   // init
   "initialize": function() {
       var url = this.galleryUrl+this.picasaXml;
       this.loadXML(url); 
   },

   // load picasa XML file
   "loadXML": function(url) {
        log('loadXML', url); 
        if(this.deferred) this.deferred.cancel();
        // load
        var req = getXMLHttpRequest(); 
        if (req.overrideMimeType) req.overrideMimeType("text/xml");      
        req.open("GET", url, true); 
        d = sendXMLHttpRequest(req).addCallback(dataFromXMLRequest); 
        this.deferred=null;
        var self = this;
        d.addBoth(function (res) {
            self.deferred = null;
            log('loadXML d.addBoth success');
            return res;
        });
        d.addCallback(function (res) { 
            log('loadXML d.addCallback success');
            return res;
        });
        d.addCallback(this.initWithData);
        d.addErrback(function (err) {
            if(err instanceof CancelledError) {
                return;
            }
            logError(err);
            logger.debuggingBookmarklet();
        });
        return d;
   },

   // init DOM stuff
   "initWithData": function (data) { 
        this.page=1;
        this.firstimage=0;
        this.lastimage=this.thumbs;
        this.image=0;
        this.images=data.images;
        this.pages=data.images.length/this.thumbs;
 
        // set title
        $('title').innerHTML = data.albumName;
        $('count').innerHTML = data.albumItemCount;

        // load thumbs
        var content = [];
        for(var i=0; i<this.thumbs; i++) content.push(this.getThumbDOM(i));
        this.showThumbs(content);
        this.updateThumbOpacity

        // load first image in album
        this.getImage(this.image);
        $('caption').innerHTML = data.images[0].caption;
		
		// unhide hidden elements
		$('gallery').style.display="block";
   },

   // get last page of icons
   "getLastPage": function () {
        var page = this.page-1; 
        if(page == 0 || page < 1) return;
        this.page=page;
        this.getPage(page);
        this.updateThumbOpacity();
   },

   // get next page of icons
   "getNextPage": function () {
        var page = this.page+1;
        if(page == this.pages || page > this.pages) return;
        this.page=page;
        this.getPage(page);
        this.updateThumbOpacity();
   },

   // get specific page of icons
   "getPage": function(page) {
        this.firstimage = ((page*this.thumbs)-4);
        this.lastimage = this.firstimage+this.thumbs; 
        var content = [];
        for(var i=this.firstimage; i<this.lastimage; i++) content.push(this.getThumbDOM(i));
        this.showThumbs(content);
   },

   // get next image
   "getNextImage": function() {
        this.image++;
        this.getImage(this.image);
   },
 
   // get specific image
   "getImage": function(i) { 
        try {
			/* var img = A({href: "javascript:agileGallery.getNextImage()"}, 
            IMG({id: "large_photo", src: this.galleryUrl + "images/" + this.images[i].image, alt:this.images[i].caption, title:"Click to view next photo"}));
        	$('caption').innerHTML = this.images[i].caption;
        	swapDOM($('large_photo'), img); */ 
			$('large_photo').src = this.galleryUrl + "images/" + this.images[i].image;
		} catch(e) { } finally {
			this.image=i;
			if(i==(this.lastimage)) this.getNextPage();
			this.updateThumbOpacity();
		}
   },

   // update thumbnail selection
   "updateThumbOpacity": function() {
        for(var i=this.firstimage; i<this.lastimage; i++) {
            var node = 'thumb_'+i;
            if(i!=this.image) {                
                setElementClass(node, 'thumbUnSel'); 
            } else {            
                setElementClass(node, 'thumbSel'); 
            }
        }
        // set prev page nav class
        if(this.page == 1) {
            setElementClass('navPrev','thumbUnSel');
        } else {
            setElementClass('navPrev','thumbSel');
        }
        // set next page nav class
        if(this.page >= this.pages) {
            setElementClass('navNext', 'thumbUnSel');
        } else {
            setElementClass('navNext', 'thumbSel');
        }
   },

   // get the dom for the new thumbnail listing
   "getThumbDOM": function(i) {
        var imgid = 'thumb_'+i; 
        var dom = LI(null, A({href: "javascript:agileGallery.getImage('"+i+"')"},
            IMG( {id:imgid, alt: this.images[i].caption, title: "Click for larger view", src: this.galleryUrl + "thumbnails/" + this.images[i].image } )));
        return dom;
   },

   // show the thumbnails
   "showThumbs": function(dom) { 
        var newcontent = DIV({id: "thumbs"}, UL(null, dom));
        swapDOM($('thumbs'), newcontent);
   }
};

 
//agileGallery = new AgileGallery('http://localhost/agilegallery/photos/'); 
//addLoadEvent(agileGallery.initialize); 
