text: //
  // http://www.cocos2d-iphone.org
  //
  // Javascript + cocos2d sprite tests
  //
  
  require("js/helpers.js");
  
  director = cc.Director.sharedDirector();
  _winSize = director.getWinSize();
  winSize = {width:_winSize[0], height:_winSize[1]};
  centerPos = cc.p( winSize.width/2, winSize.height/2 );
  
  var scenes = []
  var currentScene = 0;
  
  var nextSpriteTestAction = function () {
  	currentScene = currentScene + 1;
  	if( currentScene >= scenes.length )
  		currentScene = 0;
  
  	loadScene(currentScene);
  };
  var backSpriteTestAction = function () {
  	currentScene = currentScene -1;
  	if( currentScene < 0 )
  		currentScene = scenes.length -1;
  
  	loadScene(currentScene);
  };
  var restartSpriteTestAction = function () {
  	loadScene( currentScene );
  };
  
  var loadScene = function (sceneIdx)
  {
  	_winSize = director.getWinSize();
  	winSize = {width:_winSize[0], height:_winSize[1]};
  	centerPos = cc.p( winSize.width/2, winSize.height/2 );
  
  	var scene = new cc.Scene();
  	scene.init();
  	var layer = new scenes[ sceneIdx ]();
  
  	scene.addChild( layer );
  
  //	scene.walkSceneGraph(0);
  
  	director.replaceScene( scene );
  //    __jsc__.garbageCollect();
  }
  
  //------------------------------------------------------------------
  //
  // BaseLayer
  //
  //------------------------------------------------------------------
  var BaseLayer = function() {
  
  	//
  	// VERY IMPORTANT
  	//
  	// Only subclasses of a native classes MUST call __associateObjectWithNative
  	// Failure to do so, it will crash.
  	//
  	var parent = goog.base(this);
  	__associateObjWithNative( this, parent );
  	this.init();
  
  	this.title = function () {
  	    return "No title";
  	}
  
  	this.subtitle = function () {
  	    return "No Subtitle";
  	}
  
  }
  goog.inherits(BaseLayer, cc.Layer );
  
  //
  // Instance 'base' methods
  // XXX: Should be defined after "goog.inherits"
  //
  BaseLayer.prototype.onEnter = function() {
  	var label = cc.LabelTTF.create(this.title(), "Arial", 28);
  	this.addChild(label, 1);
  	label.setPosition( cc.p(winSize.width / 2, winSize.height - 50));
  
  	var strSubtitle = this.subtitle();
  	if (strSubtitle != "") {
  	    var l = cc.LabelTTF.create(strSubtitle, "Thonburi", 16);
  	    this.addChild(l, 1);
  	    l.setPosition( cc.p(winSize.width / 2, winSize.height - 80));
  	}
  
      // Menu
      var item1 = cc.MenuItemImage.create("b1.png", "b2.png", this, this.backCallback);
      var item2 = cc.MenuItemImage.create("r1.png", "r2.png", this, this.restartCallback);
      var item3 = cc.MenuItemImage.create("f1.png", "f2.png", this, this.nextCallback);
      var item4 = cc.MenuItemFont.create("back", function() { require("js/main.js"); }, this );
      item4.setFontSizeObj( 22 );
  
      var menu = cc.Menu.create(item1, item2, item3, item4 );
  
      menu.setPosition( cc.p(0,0) );
      item1.setPosition( cc.p(winSize.width / 2 - 100, 30));
      item2.setPosition( cc.p(winSize.width / 2, 30));
      item3.setPosition( cc.p(winSize.width / 2 + 100, 30));
      item4.setPosition( cc.p(winSize.width - 60, winSize.height - 30 ) );
  
  	this.addChild(menu, 1);
  }
  
  BaseLayer.prototype.restartCallback = function (sender) {
      cc.log("restart called");
      restartSpriteTestAction();
  }
  
  BaseLayer.prototype.nextCallback = function (sender) {
      cc.log("next called");
      nextSpriteTestAction();
  }
  
  BaseLayer.prototype.backCallback = function (sender) {
      cc.log("back called");
      backSpriteTestAction();
  }
  
  //------------------------------------------------------------------
  //
  // Sprite Touch test
  //
  //------------------------------------------------------------------
  var SpriteTouchTest = function() {
  
  	goog.base(this);
  
  	this.initialize = function() {
  		var platform = __getPlatform();
  		if( platform.substring(0,7) == 'desktop' )
  			this.setMouseEnabled( true );
  		else if( platform.substring(0,6) == 'mobile' )
  			this.setTouchEnabled( true );
  		this.addSprite( centerPos );
  	}
  
  	this.addSprite = function(pos) {
  		var sprite = this.createSprite( pos );
  		this.addChild( sprite );
  	}
  
  	this.title = function () {
  		return "Sprite: Simple action test";
  	}
  
  	this.subtitle = function () {
  		return "Tap screen to add more sprites";
  	}
  
  	this.initialize();
  }
  goog.inherits(SpriteTouchTest, BaseLayer );
  
  SpriteTouchTest.prototype.onMouseDown = function( event ) {
  	this.addSprite( event.getLocation() );
  }
  
  SpriteTouchTest.prototype.onTouchesEnded = function( touches, event ) {
  	var l = touches.length;
  	for( var i=0; i < l; i++) {
  		this.addSprite( touches[i].getLocation() );
  	}
  }
  
  
  SpriteTouchTest.prototype.createSprite = function( pos ) {
  	var idx = Math.random() * 1400 / 100;
  	idx = Math.floor( idx );
  	var x = Math.floor(idx%5) * 85;
  	var y = Math.floor(idx/5) * 121;
  
  	var sprite  = cc.Sprite.create("grossini_dance_atlas.png", cc.rect(x,y,85,121) );
  	sprite.setPosition( pos );
  
  	var rand = Math.random();
  
  	var action;
  	if( rand < 0.20 ) {
  		action = cc.ScaleBy.create(3, 2 );
  	} else if(rand < 0.40) {
  		action = cc.RotateBy.create(3, 360 );
  	} else if( rand < 0.60) {
  		action = cc.Blink.create(1, 3 );
  	} else if( rand < 0.8 ) {
  		action = cc.TintBy.create(2, 0, -255, -255 );
  	} else {
  		action = cc.FadeOut.create( 2 );
  	}
  	var action_back = action.reverse();
  	var seq = cc.Sequence.create(action, action_back);
  
  	sprite.runAction( cc.RepeatForever.create( seq ) );
  
  	return sprite;
  }
  
  
  //------------------------------------------------------------------
  //
  // Sprite Batch Touch test
  //
  //------------------------------------------------------------------
  var SpriteBatchTouchTest = function() {
  
  	goog.base(this);
  
  	this.initialize = function() {
  		this.batch = cc.SpriteBatchNode.create("grossini_dance_atlas.png", 50 );
  		this.addChild( this.batch );
  
  		var platform = __getPlatform();
  		if( platform == 'OSX' ) {
  			this.setIsMouseEnabled( true );
  		} else if( platform == 'iOS' ) {
  			this.setIsTouchEnabled( true );
  		}
  	}
  
  	this.addSprite = function(pos) {
  		var sprite = this.createSprite( pos );
  		this.batch.addChild( sprite );
  	}
  
  	this.title = function () {
  		return "SpriteBatch: Simple action test";
  	}
  
  	this.subtitle = function () {
  		return "Tap screen to add more sprites";
  	}
  
  	this.initialize();
  }
  goog.inherits( SpriteBatchTouchTest, SpriteTouchTest );
  
  //------------------------------------------------------------------
  //
  // Sprite vs. SpriteBatch Animation
  //
  //------------------------------------------------------------------
  var SpriteFrameTest = function() {
  
  	goog.base(this);
  
  	this.initialize = function() {
  		var cache = cc.SpriteFrameCache.sharedSpriteFrameCache();
  		cache.addSpriteFramesWithFile( "grossini.plist" );
  		cache.addSpriteFramesWithFile( "grossini_gray.plist", "grossini_gray.png" );
  		cache.addSpriteFramesWithFile( "grossini_blue.plist", "grossini_blue.png" );
  
  		//
  		// Animation using Sprite batch
  		//
  		// A CCSpriteBatchNode can reference one and only one texture (one .png file)
  		// Sprites that are contained in that texture can be instantiatied as CCSprites and then added to the CCSpriteBatchNode
  		// All CCSprites added to a CCSpriteBatchNode are drawn in one OpenGL ES draw call
  		// If the CCSprites are not added to a CCSpriteBatchNode then an OpenGL ES draw call will be needed for each one, which is less efficient
  		//
  		// When you animate a sprite, CCAnimation changes the frame of the sprite using setDisplayFrame: (this is why the animation must be in the same texture)
  		// When setDisplayFrame: is used in the CCAnimation it changes the frame to one specified by the CCSpriteFrames that were added to the animation,
  		// but texture id is still the same and so the sprite is still a child of the CCSpriteBatchNode,
  		// and therefore all the animation sprites are also drawn as part of the CCSpriteBatchNode
  		//
  
  		var sprite1 = cc.Sprite.createWithSpriteFrameName("grossini_dance_01.png");
  		sprite1.setPosition( cc.p( winSize.width/2-80, winSize.height/2) );
  
  		var spritebatch = cc.SpriteBatchNode.create("grossini.pvr.gz");
  		spritebatch.addChild(sprite1);
  		this.addChild( spritebatch );
  
  		var frames = []
  		for( var i = 1; i < 15; i++) {
  
  			if( i < 10 ) {
  				var name = "grossini_dance_0" + i + ".png";
  			} else {
  				var name = "grossini_dance_" + i + ".png";
  			}
  
  			var frame = cache.spriteFrameByName( name );
  			frames.push( frame );
  		}
  
  		var animation = cc.Animation.create( frames, 0.3 );
  		// 14 frames * 1sec = 14 seconds
  		sprite1.runAction( cc.RepeatForever.create( cc.Animate.create( animation ) ) );
  
  
  		//
  		// Animation using standard Sprite
  		//
  		//
  		var sprite2 = cc.Sprite.createWithSpriteFrameName( "grossini_dance_01.png" );
  		sprite2.setPosition( cc.p( winSize.width/2 + 80, winSize.height/2) );
  		this.addChild( sprite2 );
  
  		var moreFrames = []
  		for(var i = 1; i < 15; i++) {
  			if( i < 10 ) {
  				var name = "grossini_dance_gray_0" + i + ".png";
  			} else {
  				var name = "grossini_dance_gray_" + i + ".png";
  			}
  			var frame = cache.spriteFrameByName( name );
  			moreFrames.push( frame );
  		}
  		for( var i = 1; i < 5; i++) {
  			var name = "grossini_blue_0" + i + ".png";
  			var frame = cache.spriteFrameByName( name );
  			moreFrames.push( frame );
  		}
  
  
  		moreFrames.concat( frames );
  		var animMixed = cc.Animation.create( moreFrames, 0.3 );
  
  		// 32 frames * 1 seconds = 32 seconds
  		sprite2.runAction( cc.RepeatForever.create( cc.Animate.create( animMixed ) ) );
  
  		// to test issue #732, uncomment the following line
  		sprite2.setFlipX( false );
  		sprite2.setFlipY( false );
  	}
  
  	this.title = function () {
  		return "Sprite vs. SpriteBatchNode animation";
  	}
  
  	this.subtitle = function () {
  		return "Testing issue #792";
  	}
  
  	this.initialize();
  }
  goog.inherits( SpriteFrameTest, BaseLayer );
  
  //------------------------------------------------------------------
  //
  // SpriteAnchorPoint
  //
  //------------------------------------------------------------------
  var SpriteAnchorPoint = function() {
  
  	goog.base(this);
  
  	this.initialize = function() {
  		for(var i=0;i<3;i++) {
  			var sprite = cc.Sprite.create("grossini_dance_atlas.png", cc.rect(85*i, 121*1, 85, 121) );
  			sprite.setPosition( cc.p( winSize.width/4*(i+1), winSize.height/2) );
  
  			var point = cc.Sprite.create( "r1.png" );
  			point.setScale( 0.25 );
  			point.setPosition( sprite.getPosition() );
  			this.addChild( point, 10 );
  
  			if( i == 0 ) {
  				sprite.setAnchorPoint( cc.p( 0, 0) );
  			} else if( i == 1 ) {
  				sprite.setAnchorPoint( cc.p(0.5, 0.5) );
  			} else if( i == 2 ) {
  				sprite.setAnchorPoint( cc.p(1,1) );
  			}
  
  			point.setPosition( sprite.getPosition() );
  
  			var rotate = cc.RotateBy.create(10, 360);
  			var action = cc.RepeatForever.create( rotate );
  
  			sprite.runAction( action );
  			this.addChild( sprite, i );
  		}
  	}
  
  	this.title = function () {
  		return "Sprite: anchor point";
  	}
  
  	this.subtitle = function () {
  		return "Testing 3 different anchor points";
  	}
  
  	this.initialize();
  }
  goog.inherits( SpriteAnchorPoint, BaseLayer );
  
  //------------------------------------------------------------------
  //
  // SpriteBatchAnchorPoint
  //
  //------------------------------------------------------------------
  var SpriteBatchAnchorPoint = function() {
  
  	goog.base(this);
  
  	this.initialize = function() {
  		var batch = cc.SpriteBatchNode.create( "grossini_dance_atlas.png" );
  		for(var i=0;i<3;i++) {
  			var sprite = cc.Sprite.create("grossini_dance_atlas.png", cc.rect(85*i, 121*1, 85, 121) );
  			sprite.setPosition( cc.p( winSize.width/4*(i+1), winSize.height/2) );
  
  			var point = cc.Sprite.create( "r1.png" );
  			point.setScale( 0.25 );
  			point.setPosition( sprite.getPosition() );
  			this.addChild( point, 10 );
  
  			if( i == 0 ) {
  				sprite.setAnchorPoint( cc.p( 0, 0) );
  			} else if( i == 1 ) {
  				sprite.setAnchorPoint( cc.p(0.5, 0.5) );
  			} else if( i == 2 ) {
  				sprite.setAnchorPoint( cc.p(1,1) );
  			}
  
  			point.setPosition( sprite.getPosition() );
  
  			var rotate = cc.RotateBy.create(10, 360);
  			var action = cc.RepeatForever.create( rotate );
  
  			sprite.runAction( action );
  			batch.addChild( sprite, i );
  		}
  		this.addChild( batch );
  	}
  
  	this.title = function () {
  		return "Sprite Batch: anchor point";
  	}
  
  	this.subtitle = function () {
  		return "Testing 3 different anchor points";
  	}
  
  	this.initialize();
  }
  goog.inherits( SpriteBatchAnchorPoint, BaseLayer );
  
  //------------------------------------------------------------------
  //
  // SpriteOffsetAnchorFlip
  //
  //------------------------------------------------------------------
  var SpriteOffsetAnchorFlip = function() {
  
  	goog.base(this);
  
  	this.initialize = function() {
  		var cache = cc.SpriteFrameCache.sharedSpriteFrameCache();
  		cache.addSpriteFramesWithFile("grossini.plist");
  		cache.addSpriteFramesWithFile("grossini_gray.plist", "grossini_gray.png");
  
  		for(var i=0;i<3;i++) {
  			var sprite = cc.Sprite.create("grossini_dance_atlas.png", cc.rect(85*i, 121*1, 85, 121) );
  			sprite.setPosition( cc.p( winSize.width/4*(i+1), winSize.height/2) );
  
  			var point = cc.Sprite.create( "r1.png" );
  			point.setScale( 0.25 );
  			point.setPosition( sprite.getPosition() );
  			this.addChild( point, 10 );
  
  			if( i == 0 ) {
  				sprite.setAnchorPoint( cc.p( 0, 0) );
  			} else if( i == 1 ) {
  				sprite.setAnchorPoint( cc.p(0.5, 0.5) );
  			} else if( i == 2 ) {
  				sprite.setAnchorPoint( cc.p(1,1) );
  			}
  
  			point.setPosition( sprite.getPosition() );
  
  			var frames = []
  			for( var j = 1; j < 15; j++) {
  
  				if( j < 10 ) {
  					var name = "grossini_dance_0" + j + ".png";
  				} else {
  					var name = "grossini_dance_" + j + ".png";
  				}
  
  				var frame = cache.spriteFrameByName( name );
  				frames.push( frame );
  			}
  
  			var animation = cc.Animation.create( frames, 0.3 );
  			sprite.runAction( cc.RepeatForever.create( cc.Animate.create( animation ) ) );
  
  			var flip = cc.FlipY.create( true );
  			var flip_back = cc.FlipY.create( false );
  			var delay = cc.DelayTime.create( 1 );
  			var delay2 = cc.DelayTime.create( 1 );
  			var seq = cc.Sequence.create( delay, flip, delay2, flip_back );
  			sprite.runAction( cc.RepeatForever.create( seq ) );
  
  			this.addChild( sprite );
  		}
  	}
  
  	this.title = function () {
  		return "Sprite offset + anchor + flip";
  	}
  
  	this.subtitle = function () {
  		return "issue #1078";
  	}
  
  	this.initialize();
  }
  goog.inherits( SpriteOffsetAnchorFlip, BaseLayer );
  
  //------------------------------------------------------------------
  //
  // SpriteBatchOffsetAnchorFlip
  //
  //------------------------------------------------------------------
  var SpriteBatchOffsetAnchorFlip = function() {
  
  	goog.base(this);
  
  	this.initialize = function() {
  		var cache = cc.SpriteFrameCache.sharedSpriteFrameCache();
  		cache.addSpriteFramesWithFile("grossini.plist");
  		cache.addSpriteFramesWithFile("grossini_gray.plist", "grossini_gray.png");
  
  		var batch = cc.SpriteBatchNode.create("grossini.pvr.gz");
  
  		for(var i=0;i<3;i++) {
  			var sprite = cc.Sprite.createWithSpriteFrameName("grossini_dance_01.png");
  			sprite.setPosition( cc.p( winSize.width/4*(i+1), winSize.height/2) );
  
  			var point = cc.Sprite.create( "r1.png" );
  			point.setScale( 0.25 );
  			point.setPosition( sprite.getPosition() );
  			this.addChild( point, 10 );
  
  			if( i == 0 ) {
  				sprite.setAnchorPoint( cc.p( 0, 0) );
  			} else if( i == 1 ) {
  				sprite.setAnchorPoint( cc.p(0.5, 0.5) );
  			} else if( i == 2 ) {
  				sprite.setAnchorPoint( cc.p(1,1) );
  			}
  
  			point.setPosition( sprite.getPosition() );
  
  			var frames = []
  			for( var j = 1; j < 15; j++) {
  
  				if( j < 10 ) {
  					var name = "grossini_dance_0" + j + ".png";
  				} else {
  					var name = "grossini_dance_" + j + ".png";
  				}
  
  				var frame = cache.spriteFrameByName( name );
  				frames.push( frame );
  			}
  
  			var animation = cc.Animation.create( frames, 0.3 );
  			sprite.runAction( cc.RepeatForever.create( cc.Animate.create( animation ) ) );
  
  			var flip = cc.FlipY.create( true );
  			var flip_back = cc.FlipY.create( false );
  			var delay = cc.DelayTime.create( 1 );
  			var delay2 = cc.DelayTime.create( 1 );
  			var seq = cc.Sequence.create( delay, flip, delay2, flip_back );
  			sprite.runAction( cc.RepeatForever.create( seq ) );
  
  			batch.addChild( sprite );
  		}
  		this.addChild(batch);
  	}
  
  	this.title = function () {
  		return "SpriteBatch offset + anchor + flip";
  	}
  
  	this.subtitle = function () {
  		return "issue #1078";
  	}
  
  	this.initialize();
  }
  goog.inherits( SpriteBatchOffsetAnchorFlip, BaseLayer );
  
  
  //------------------------------------------------------------------
  //
  // SpriteColorOpacity
  //
  //------------------------------------------------------------------
  var SpriteColorOpacity = function() {
  
  	goog.base(this);
  
  	this.initialize = function() {
  		var sprite1 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 0, 121 * 1, 85, 121));
  		var sprite2 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 1, 121 * 1, 85, 121));
  		var sprite3 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 2, 121 * 1, 85, 121));
  		var sprite4 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 3, 121 * 1, 85, 121));
  		var sprite5 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 0, 121 * 1, 85, 121));
  		var sprite6 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 1, 121 * 1, 85, 121));
  		var sprite7 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 2, 121 * 1, 85, 121));
  		var sprite8 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 3, 121 * 1, 85, 121));
  
  		sprite1.setPosition(cc.p((winSize.width / 5) * 1, (winSize.height / 3) * 1));
  		sprite2.setPosition(cc.p((winSize.width / 5) * 2, (winSize.height / 3) * 1));
  		sprite3.setPosition(cc.p((winSize.width / 5) * 3, (winSize.height / 3) * 1));
  		sprite4.setPosition(cc.p((winSize.width / 5) * 4, (winSize.height / 3) * 1));
  		sprite5.setPosition(cc.p((winSize.width / 5) * 1, (winSize.height / 3) * 2));
  		sprite6.setPosition(cc.p((winSize.width / 5) * 2, (winSize.height / 3) * 2));
  		sprite7.setPosition(cc.p((winSize.width / 5) * 3, (winSize.height / 3) * 2));
  		sprite8.setPosition(cc.p((winSize.width / 5) * 4, (winSize.height / 3) * 2));
  
  		var action = cc.FadeIn.create(2);
  		var action_back = action.reverse();
  		var fade = cc.RepeatForever.create( cc.Sequence.create( action, action_back ) );
  
  		var tintRed = cc.TintBy.create(2, 0, -255, -255);
  	//	var tintRed = cc.RotateBy.create(2, 360 );
  		var tintRedBack = tintRed.reverse();
  		var red = cc.RepeatForever.create(cc.Sequence.create( tintRed, tintRedBack ) );
  
  		var tintGreen = cc.TintBy.create(2, -255, 0, -255);
  		var tintGreenBack = tintGreen.reverse();
  		var green = cc.RepeatForever.create(cc.Sequence.create( tintGreen, tintGreenBack ) );
  
  		var tintBlue = cc.TintBy.create(2, -255, -255, 0);
  		var tintBlueBack = tintBlue.reverse();
  		var blue = cc.RepeatForever.create(cc.Sequence.create( tintBlue, tintBlueBack ) );
  
  		sprite5.runAction(red);
  		sprite6.runAction(green);
  		sprite7.runAction(blue);
  		sprite8.runAction(fade);
  
  		// late add: test dirtyColor and dirtyPosition
  		this.addChild(sprite1);
  		this.addChild(sprite2);
  		this.addChild(sprite3);
  		this.addChild(sprite4);
  		this.addChild(sprite5);
  		this.addChild(sprite6);
  		this.addChild(sprite7);
  		this.addChild(sprite8);
  	}
  
  	//
  	// Instance methods
  	//
  	this.title = function () {
  		return "Sprite: Color & Opacity";
  	}
  
  	this.subtitle = function () {
  		return "testing opacity and color";
  	}
  
  	this.initialize();
  }
  goog.inherits(SpriteColorOpacity, BaseLayer );
  
  //------------------------------------------------------------------
  //
  // SpriteBatchColorOpacity
  //
  //------------------------------------------------------------------
  var SpriteBatchColorOpacity = function() {
  
  	goog.base(this);
  
  	this.initialize = function() {
  		var batch = cc.SpriteBatchNode.create('grossini_dance_atlas.png', 10);
  		var sprite1 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 0, 121 * 1, 85, 121));
  		var sprite2 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 1, 121 * 1, 85, 121));
  		var sprite3 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 2, 121 * 1, 85, 121));
  		var sprite4 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 3, 121 * 1, 85, 121));
  		var sprite5 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 0, 121 * 1, 85, 121));
  		var sprite6 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 1, 121 * 1, 85, 121));
  		var sprite7 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 2, 121 * 1, 85, 121));
  		var sprite8 = cc.Sprite.create('grossini_dance_atlas.png', cc.rect(85 * 3, 121 * 1, 85, 121));
  
  		sprite1.setPosition(cc.p((winSize.width / 5) * 1, (winSize.height / 3) * 1));
  		sprite2.setPosition(cc.p((winSize.width / 5) * 2, (winSize.height / 3) * 1));
  		sprite3.setPosition(cc.p((winSize.width / 5) * 3, (winSize.height / 3) * 1));
  		sprite4.setPosition(cc.p((winSize.width / 5) * 4, (winSize.height / 3) * 1));
  		sprite5.setPosition(cc.p((winSize.width / 5) * 1, (winSize.height / 3) * 2));
  		sprite6.setPosition(cc.p((winSize.width / 5) * 2, (winSize.height / 3) * 2));
  		sprite7.setPosition(cc.p((winSize.width / 5) * 3, (winSize.height / 3) * 2));
  		sprite8.setPosition(cc.p((winSize.width / 5) * 4, (winSize.height / 3) * 2));
  
  		var action = cc.FadeIn.create(2);
  		var action_back = action.reverse();
  		var fade = cc.RepeatForever.create( cc.Sequence.create( action, action_back ) );
  
  		var tintRed = cc.TintBy.create(2, 0, -255, -255);
  	//	var tintRed = cc.RotateBy.create(2, 360 );
  		var tintRedBack = tintRed.reverse();
  		var red = cc.RepeatForever.create(cc.Sequence.create( tintRed, tintRedBack ) );
  
  		var tintGreen = cc.TintBy.create(2, -255, 0, -255);
  		var tintGreenBack = tintGreen.reverse();
  		var green = cc.RepeatForever.create(cc.Sequence.create( tintGreen, tintGreenBack ) );
  
  		var tintBlue = cc.TintBy.create(2, -255, -255, 0);
  		var tintBlueBack = tintBlue.reverse();
  		var blue = cc.RepeatForever.create(cc.Sequence.create( tintBlue, tintBlueBack ) );
  
  		sprite5.runAction(red);
  		sprite6.runAction(green);
  		sprite7.runAction(blue);
  		sprite8.runAction(fade);
  
  		// late add: test dirtyColor and dirtyPosition
  		this.addChild(batch);
  		batch.addChild(sprite1);
  		batch.addChild(sprite2);
  		batch.addChild(sprite3);
  		batch.addChild(sprite4);
  		batch.addChild(sprite5);
  		batch.addChild(sprite6);
  		batch.addChild(sprite7);
  		batch.addChild(sprite8);
  	}
  
  	//
  	// Instance methods
  	//
  	this.title = function () {
  		return "Sprite Batch: Color & Opacity";
  	}
  
  	this.subtitle = function () {
  		return "testing opacity and color with batches";
  	}
  
  	this.initialize();
  }
  goog.inherits(SpriteBatchColorOpacity, BaseLayer );
  
  //
  // Order of tests
  //
  scenes.push( SpriteTouchTest ); scenes.push( SpriteBatchTouchTest );
  
  scenes.push( SpriteFrameTest );
  
  scenes.push( SpriteAnchorPoint ); scenes.push( SpriteBatchAnchorPoint );
  
  scenes.push( SpriteOffsetAnchorFlip ); scenes.push( SpriteBatchOffsetAnchorFlip );
  
  scenes.push( SpriteColorOpacity ); scenes.push( SpriteBatchColorOpacity );
  
  
  //------------------------------------------------------------------
  //
  // Main entry point
  //
  //------------------------------------------------------------------
  function run()
  {
      var scene = cc.Scene.create();
      var layer = new scenes[currentScene]();
      scene.addChild( layer );
  
      var runningScene = director.getRunningScene();
      if( runningScene == null ) {
          director.runWithScene( scene );
      } else {
          director.replaceScene( cc.TransitionFade.create(0.5, scene, cc.c3(0, 0, 0) ) );
      }
  }
  
  run();
  