    //http://family.go.com/dcsjson/iris.do
	dojo.require("dojo.fx");
	dojo.require("dojo.fx.easing");
    dojo.require('com.family.widget.iris.Slide');
    
    dojo.provide("com.family.widget.iris.Teri");

    dojo.declare(
    	"com.family.widget.iris.Teri", // Declare this JS class
    	null, // Superclasses
    	{
    		constructor: function(irisWrap, irisNav, animSpeed, slideLength, publishKey, prefSlideEffects){
    			this.irisFeed = "/dcsjson/iris.do?publishKey=" + publishKey;
    			//this.irisFeed = "http://family.go.com/js/iris_data.js";
	            this.animSpeed = animSpeed;
	            this.slideDuration = slideLength;
	            this.irisWrap = dojo.byId(irisWrap);
	            this.irisNav = dojo.byId(irisNav);
	            this.prefSlideEffects = prefSlideEffects;
	            this.getIris();
    		},
    		getIris: function(){
    			dojo.xhrGet({
    	            url: this.irisFeed,
    	            headers : {"Accept" : "application/*+json"},
    	            handleAs : "json",
    	            load : dojo.hitch(this, this.makeIris),
    	            error : function(response, ioArgs) {
    	            	dojo.style("irisBorder", "display", "none");
    	                console.log("failed xhrGet", response, ioArgs);
    	            }
    	       })
    		},
    		makeIris: function(response, ioArgs){
    			//console.log(response);
    			var irisData         = response['iris']['slides'];
    			try{
	    			if(irisData.length < 1){
	    				dojo.style("irisBorder", {display:"none"});
	    				return;
	    			}
	    		}catch(ex){
	    				dojo.style("irisBorder", {display:"none"});
    			}
    			//available slide animation properties
                slideActions = {
    					"leftToRight":{
    						"left": {"start": -600, "end": 0,"unit": "px"},
    						"opacity": {"start": 0,"end": 1}
    					},
    					"rightToLeft":{
    						"left": {"start": 600, "end": 0,"unit": "px"},
    						"opacity": {"start": 0,"end": 1}
    					},
                		"topToBottom":{
    						"opacity": {"start": 0,"end": 1},
    						"top": {"start": -100, "end": 0,"unit": "px"}
    					},
                		"bottomToTop":{
    						"opacity": {"start": 0,"end": 1},
    						"top": {"start": 246, "end": 0,"unit": "px"}
    					},
                		"slideAppearDown":{
    						"top": {"start": -40, "end": 0,"unit": "px"},
    						"left": {"start": -20, "end": 0,"unit": "px"},
    						"opacity": {"start": 0,"end": 1},
    						"width": {"start": 800, "end": 600,"unit": "px"}
    					},
                		"slideButtonIn":{
    						"width": {"start": 800, "end": 600,"unit": "px"},
    						"opacity": {"start": 0,"end": 1}
    					},
    					"fadeIn":{
    						"opacity": {"start": 0,"end": 1}
    					},
    					"fadeOut":{
    						"opacity": {"start": 1,"end": 0}
    					}
                };
                slideEasings = [	"backIn",		//0
									"backInOut",	//1
									"backOut",		//2
									"bounceIn",		//3
									"bounceInOut",	//4
									"bounceOut",	//5
									"circIn",		//6
									"circInOut",	//7
									"circOut",		//8
									"cubicIn",		//9
									"cubicInOut",	//10
									"cubicOut",		//11
									"elasticIn",	//12
									"elasticInOut",	//13
									"elasticOut",	//14
									"expoIn",		//15
									"expoInOut",	//16
									"expoOut",		//17
									"linear",		//18
									"quadIn",		//19
									"quadInOut",	//20
									"quadOut",		//21
									"quartIn",		//22
									"quartInOut",	//23
									"quartOut",		//24
									"quintIn",		//25
									"quintInOut",	//26
									"quintOut",		//27
									"sineIn",		//28
									"sineInOut",	//29
									"sineOut"		//30
									];

                // If effects were passed in, we assign them here
                slideEffects = [];
                dojo.forEach(this.prefSlideEffects, function(efct, index, arr){
                	if(efct.length == 4){
                		slideEffects.push(efct);
                	}
                });

                // Initialize placeholders
                var totalSlides = irisData.length - 1;
                var slides            = [];
                var slideDots        = [];
                var slideImageCache = [];
                var ActiveSlidePosition = 0;
                var ThisSlidePosition = 0;
                var NextSlidePosition = 1;
                var animSpeed = this.animSpeed;
                var firstPass = true;
                
                //Create DOM objects
                var irisDiv         = dojo.byId('irisWrap');
                var irisNav         = dojo.byId('irisNav');
                var irisImgLarge     = dojo.doc.createElement('img');
                dojo.addClass(irisImgLarge, "irisImgFrame");
                irisImgLarge.width     = 600;
                irisImgLarge.height = 246;
                irisDiv.appendChild(irisImgLarge);
                var textWrap        = dojo.doc.createElement('div');
                dojo.addClass(textWrap, "textWrap");
                var button            = dojo.doc.createElement('a');
                var buttonEm          = dojo.doc.createElement('em');
                dojo.attr(button, "className", "tsgobtn" );
                button.appendChild(buttonEm);
                textWrap.appendChild(button);
                irisDiv.appendChild(textWrap);
                var irisNavEl     = dojo.doc.createElement('ul');
                dojo.addClass(irisNavEl, "thumbs");
                irisNav.appendChild(irisNavEl);
                
                //create slide objects 
                dojo.forEach(irisData, function(slide, index, arr){
                    slides.push(
                    		new com.family.widget.iris.Slide(
                    				slide.title, 
                    				slide.description, 
                    				slide.blurb, 
                    				slide.url, 
                    				slide.thumb, 
                    				slide.large, 
                    				slide.themeColor)
                    		);
                });
                
                //add slide pager navigation and dots
                dojo.forEach(slides, function(slideObj, index, arr){
                	//add basic effects for unspecified slides
                    if(slideEffects[index] == undefined){
                    	slideEffects[index] = ["fadeOut",28,"fadeIn",28];
                    }
                	this._dotEl = dojo.doc.createElement('li');
                    dojo.addClass(this._dotEl, "thumb"+(index+1));
                    this._slideDot = dojo.doc.createElement('span');
                    this._dotEl.appendChild(this._slideDot); 
                    slideDots.push(this._slideDot);
                    irisNavEl.appendChild(this._dotEl);
                });
                
                //attach mouse events
                dojo.forEach(slideDots, function(slideDot, index, arr){
                    dojo.connect(slideDot, "onmouseover", function(){
                        dojo.attr(slideDot, "className", "on " + slides[index].getThemeColor());
                    });
                    
                    dojo.connect(slideDot, "onmouseout", function(){
                    	//console.log(ActiveSlidePosition == index);
                        if(ActiveSlidePosition != index) {
                            dojo.attr(slideDot, "class", "");
                        }
                    });
                    
                    dojo.connect(slideDot, "onclick", function(){
                    	//console.log("click ThisSlidePosition" ,ThisSlidePosition);
                    	//console.log("click ActiveSlidePosition", ActiveSlidePosition);
                        clearInterval(slideLoop);
                        resetSlideClasses();
                        dojo.attr(irisDiv, "className", slides[index].getThemeColor());
                        dojo.attr(slideDot, "className", "on " + slides[index].getThemeColor());
                        irisImgLarge.src    = slides[index].getImageLarge();
                        runEffects();
                        irisImgLarge.alt    = slides[index].getTitle();
                        dojo.attr(button, "href", slides[index].getUrl());
                        dojo.attr(button, "name", "&lid=slide" + ( index + 1 ) + "&lpos=iris_GetHatched" );                
                        ThisSlidePosition = index;
                        ActiveSlidePosition = index-1;
                        updateActiveSlidePostion(index);
                        updateThisSlidePosition(index);
                        slideLoop = setInterval(getNextSlide, 5000);
                    });
                });

                //setup the initial slide
                dojo.attr(irisDiv, "className", slides[ThisSlidePosition].getThemeColor());
                irisImgLarge.src    = slides[ThisSlidePosition].getImageLarge();
                irisImgLarge.alt    = slides[ThisSlidePosition].getTitle();
                dojo.attr(button, "href", slides[ThisSlidePosition].getUrl());
                dojo.attr(button, "name", "&lid=slide1&lpos=iris_GetHatched" );
                dojo.attr(button, "innerHTML", "<i></i><span>" + slides[ThisSlidePosition].getBlurb() + " &#187;</span><em></em>");
                
                //start the slideshow
                getNextSlide();
                var slideLoop = setInterval(getNextSlide, this.slideDuration);

                
                function resetSlideClasses(){
                	dojo.forEach(slideDots, function(slideDot, index, arr){dojo.attr(slideDot, "className", "")});
                }
                
                function cacheNextImage(imageToCache){
                	if(!slideImageCache[imageToCache]){
                		try{
	                		//console.log("Caching ",slides[imageToCache].getImageLarge());
	                		slideImageCache[imageToCache] = dojo.query(dojo.create('img', { src: slides[imageToCache].getImageLarge() }, "irisCached")).onload(function(e){/*console.log('OK', e.target)*/ });
                		}catch(ex){
                			//console.log("create error ", e);
                		}
                	}
                }
                function updateActiveSlidePostion(pos){
                	if(ActiveSlidePosition < totalSlides){
                		ActiveSlidePosition++;
                	}else{
                		ActiveSlidePosition = 0;
                	}
                	//console.log("ActiveSlidePosition is:", ActiveSlidePosition);
                }
                function updateThisSlidePosition(curPos){
                	//console.log("ThisSlidePosition was:", ThisSlidePosition);
                	//console.log("NextSlidePosition was:", NextSlidePosition);
                	if(curPos < totalSlides){
                    	ThisSlidePosition = curPos + 1;
                    } else {
                    	ThisSlidePosition = 0;
                    }
                	if(ThisSlidePosition < totalSlides){
                		NextSlidePosition = ThisSlidePosition + 1;
                    } else {
                    	NextSlidePosition = 0;
                    }
                	//console.log("ThisSlidePosition is:", ThisSlidePosition);
                	//console.log("NextSlidePosition is:", NextSlidePosition);
                	//console.log(ThisSlidePosition-NextSlidePosition);
                }
                
                function runEffects(timing, props, ease, props2, ease2){
                	if(!firstPass){
	                	var slideAnimation = dojo.animateProperty({
	                		node: irisDiv,
	                		duration: timing,
	                		easing : dojo.fx.easing[ease],
	                		properties: props,
	                		onEnd: function() {
	                			if(props2 != undefined && ease2 != undefined){
		                			irisImgLarge.src    = slides[ThisSlidePosition].getImageLarge();
		                            irisImgLarge.alt    = slides[ThisSlidePosition].getTitle();
		                            dojo.attr(button, "href", slides[ThisSlidePosition].getUrl());
		                            dojo.attr(button, "innerHTML", "<i></i><span>" + slides[ThisSlidePosition].getBlurb() + " &#187;</span><em></em>");
		                            dojo.attr(button, "name", "&lid=slide" + ( ThisSlidePosition + 1 ) + "&lpos=iris_GetHatched" );
		                			runEffects(timing, props2, ease2);
		                            resetSlideClasses();
		                            dojo.attr(irisDiv, "className", slides[ThisSlidePosition].getThemeColor());
		                            dojo.attr(slideDots[ThisSlidePosition], "className", "on " + slides[ThisSlidePosition].getThemeColor());
		                            updateActiveSlidePostion(ThisSlidePosition);
		                            updateThisSlidePosition(ThisSlidePosition);
	                			}
	                		}
						});
	                	var slidePlay = dojo.fx['chain']([slideAnimation]).play();
                	}else{
                		firstPass =  false;
                		dojo.attr(slideDots[ThisSlidePosition], "className", "on " + slides[ThisSlidePosition].getThemeColor());
                		updateThisSlidePosition(ThisSlidePosition);
                	}
                }
                	
                function getNextSlide() {
                	cacheNextImage(NextSlidePosition);
                	runEffects(	animSpeed,
                				slideActions[slideEffects[ThisSlidePosition][0]],
                				slideEffects[ThisSlidePosition][1],
                				slideActions[slideEffects[ThisSlidePosition][2]],
                				slideEffects[ThisSlidePosition][3]
                	);
                	
                }

    	    }
}
);

