<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" >
   <head>
   <title>Dojo Unified 2D Graphics</title>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <script type="text/javascript">
   // Dojo configuration
   djConfig = { 
      isDebug: true
   };
</script>
<script type="text/javascript" src="../../dojo.js"></script>
<!--<script type="text/javascript" src="../../src/gfx/vml.js"></script>-->
<!--<script type="text/javascript" src="../../src/gfx/svg.js"></script>-->
<script type="text/javascript">

dojo.require("dojo.gfx.*");
dojo.require("dojo.event.*");
dojo.require("dojo.lang.assert");

var gTestContainer = null;
var gTests = {};

function isEqual(foo, bar, prefix)
{
    var flag = true;
    if( foo != bar ) {
        dojo.debug(prefix+":"+foo + "!=" + bar + " try dig into it" );
        if( typeof(foo) == "string" ) {
            return false;
        } else if ( foo instanceof Array ) {
            for( var i = 0; i< foo.length; i++ ) {
                flag = isEqual(foo[i], bar[i], prefix+"["+i+"]") && flag;
            }
            flag = false;
        } else {
            for(var x in foo) {
                if(bar[x] != undefined ) {
                    flag = isEqual(foo[x], bar[x], prefix+"."+x) && flag;
                } else {
                    dojo.debug(prefix+":"+ x + " is undefined in bar" );
                    flag = false;
                }
            }
        }
    }
    return flag;
}


function getTestSurface(testName, testDescription, width, height) 
{
   width = width ? width : 300;
   height = height ? height : 300;

   // Create a DOM node for the surface
   var testRow = document.createElement('tr');
   var testCell = document.createElement('td');
   var testHolder = document.createElement('div');
   testHolder.id = testName + '_holder';

   testCell.appendChild(testHolder);
   testRow.appendChild(testCell);
   gTestContainer.appendChild(testRow);
   var descRow = document.createElement('tr');
   var desc = document.createElement('td');
   desc.innerHTML = testDescription;
   descRow.appendChild(desc);
   gTestContainer.appendChild(descRow);
   var surface = dojo.gfx.createSurface(testHolder, width, height);
   return surface;
}


function addTest(testName, fn)
{
   gTests[testName] = fn;
}

function runTest_nodebug(testName)
{
   try {
      var t = gTests[testName];
      if (!t) {
         return 'no test named ' + t;
      }
      t(testName);
      return null; // the success condition
   } catch (e) {
      return e.message;
   }
}

function runTest_debug(testName)
{
      var t = gTests[testName];
      if (!t) {
         return 'no test named ' + t;
      }
      t(testName);
      return null; // the success condition
}

var runTest = djConfig.isDebug ? runTest_debug : runTest_nodebug;

function attachAssert(reference, attached, prefix)
{
        dojo.debug(prefix+": check rawNode...");
		dojo.lang.assert( reference.rawNode == attached.rawNode );

		// FIXME: more generic method to compare two dictionary?
		dojo.debug(prefix+": check shape... ");
		isEqual(reference.shape, attached.shape, "shape");
		dojo.debug(prefix+": check matrix... ");
		isEqual(reference.matrix, attached.matrix, "matrix");
		dojo.debug(prefix+": check strokeStyle...");
		isEqual(reference.strokeStyle, attached.strokeStyle, "strokeStyle");
		dojo.debug(prefix+": check fillStyle...");
		isEqual(reference.fillStyle, attached.fillStyle, "fillStyle");
}

dojo.addOnLoad(function() 
{
	gTestContainer = dojo.byId('testcontainer');
	var rect = { x: 0, y: 0, width: 100, height: 100 };

	addTest('attach', function(testName){
		var surface = getTestSurface(testName, 'Attach to an typical shape, skewed rect with color fill, color stroke');
		var ref = surface.createRect(rect)
			.setShape({ width: 75 })
			.setFill([255, 0, 0, 0.5])
			.setStroke({ color: "blue", width: 1 })
			.setTransform({ dx: 50, dy: 50, xx: 1, xy: 0.5, yx: 0.7, yy: 1.1 })
			;
		// now attach it!
		var ar = dojo.gfx.attachNode(ref.rawNode);
        attachAssert(ref, ar, testName);
	});

	addTest('attach2', function(testName){
		var surface = getTestSurface(testName, 'Attach to an line, with null fill, color stroke');
		var ref = surface.createRect(rect)
            .setStroke({color: "red", width: 1})
            .setTransform({ dx:70, dy: 100 })
			;
        surface.createRect(rect)
            .setFill([0, 255, 0, 0.6])
            .setTransform({ dx:50, dy:80 })
            ;
		// now attach it!
		var ar = dojo.gfx.attachNode(ref.rawNode);
        attachAssert(ref, ar, testName);
	});

	addTest('attach3', function(testName){
		var surface = getTestSurface(testName, 'Attach to an circle, with color fill, null stroke');
		var circle = { cx: 130, cy: 130, r: 50 };
		var ref = surface.createCircle(circle)
            .setFill([0, 255, 0, 0.7])
            .setTransform({ dx: 20, dy: 20 })
            ;
		
		// now attach it!
		var ar = dojo.gfx.attachNode(ref.rawNode);
        attachAssert(ref, ar, testName);
	});

	addTest('attach_line', function(testName){
		var surface = getTestSurface(testName, 'Attach to an line, with color fill, color stroke');
		var line = { x1: 0, y1:0, x2:80, y2:80 };
		var ref = surface.createLine(line)
            .setFill([0, 255, 0, 0.7])
            .setStroke({color:[0, 0, 255, 0.7], width:3} )
            .setTransform({ dx: 20, dy: 20 })
            ;
		
		// now attach it!
		var ar = dojo.gfx.attachNode(ref.rawNode);
        attachAssert(ref, ar, testName);
	});

	addTest('attach_image', function(testName){
		var surface = getTestSurface(testName, 'Attach to an image, with color fill, color stroke');
        var image = {
            width: 96, height: 96,
            src: "http://dojotoolkit.org/img/viewcvs.png"
        };
		var ref = surface.createImage(image)
            .setFill([0, 255, 0, 0.7])
            .setStroke({color:[0, 0, 255, 0.7], width:3} )
            .setTransform({ dx: 20, dy: 20 })
            ;
		
		// now attach it!
		var ar = dojo.gfx.attachNode(ref.rawNode);
        attachAssert(ref, ar, testName);
	});

	addTest('attach_path', function(testName){
		var surface = getTestSurface(testName, 'Attach to an path, with null fill, color stroke');
		var ref = surface.createPath()
			.moveTo(10, 20).lineTo(80, 150)
			.setAbsoluteMode(false).lineTo(40, 0)
			.setAbsoluteMode(true).lineTo(180, 100)
			.setAbsoluteMode(true).curveTo(10, -80, -150, -10, -90, -10)
			.closePath()
            .setStroke({color:[0, 0, 255, 0.7], width:1} )
            .setTransform({ dx: 120, dy: 120 })
            ;
		
		// now attach it!
		var ar = dojo.gfx.attachNode(ref.rawNode);
        attachAssert(ref, ar, testName);
	});

	addTest('attach_polyline', function(testName){
		var surface = getTestSurface(testName, 'Attach to polyline, with color stroke, color fill');
		var points = [ {x:70, y:15}, {x:40, y:70}, {x:100, y:80}, {x:130, y:-20}];
		var ref = surface.createPolyline(points)
            .setFill([0, 255, 0, 0.7])
            .setStroke({color:[255, 0, 0, 0.7], width:1})
            .setTransform({ dx: 50, dy: 20 })
            ;
		
		// now attach it!
		var ar = dojo.gfx.attachNode(ref.rawNode);
        attachAssert(ref, ar, testName);
	});

	addTest('attach_gradient', function(testName) {
		var surface = getTestSurface(testName, 'attach gradient fill');
		var lg = {
			type: "linear",
			x1: 0, y1: 0, x2: 75, y2: 50,
			colors: [
				{ offset:   0, color: "#F60" },
				{ offset: 0.5, color: "#FAF" },
				{ offset:   1, color: "#FF6" }
			]
		};

		var ref = surface.createRect(rect)
            .setFill(lg)
            .setTransform({ dx: 40, dy: 100 });

		// now attach it!
		var ar = dojo.gfx.attachNode(ref.rawNode);
        attachAssert(ref, ar, testName);
	});

	addTest('attach_pattern', function(testName) {
		var surface = getTestSurface(testName, 'attach pattern fill');
        var pattern = {
            type: "pattern",
            x: 0, y: 0, width: 120, height: 96,
            src: "http://dojotoolkit.org/img/viewcvs.png"
        };

	    var ellipse = {cx: 150, cy: 100, rx: 150, ry: 100};
		var ref = surface.createEllipse(ellipse)
            .setStroke({color: "blue", width: 1 })
            .setFill(pattern)
            ;

		// now attach it!
		var ar = dojo.gfx.attachNode(ref.rawNode);
        attachAssert(ref, ar, testName);
    });

	addTest('attach_radial', function(testName) {
		var surface = getTestSurface(testName, 'attach radial gradient fill');
		var rg = {
			type: "radial",
			cx: 100, cy: 100, r: 100,
			colors: [
				{ offset:   0, color: "red" },
				{ offset: 0.5, color: "green" },
				{ offset:   1, color: "blue" }
			]
		};

	    var circle = {cx: 100, cy: 100, r: 100 };
		var ref = surface.createCircle(circle)
            .setStroke({color: "blue", width: 1 })
            .setFill(rg)
			.setTransform({dx: 40, dy: 30})
            ;

		// now attach it!
		var ar = dojo.gfx.attachNode(ref.rawNode);
        attachAssert(ref, ar, testName);
    });

	var gTestsToRun = [
		'attach',
		'attach2',
		'attach3',
        'attach_line',
        'attach_polyline',
        'attach_image',
        'attach_path',
        'attach_gradient',
        'attach_radial',
        'attach_pattern'
    ];

	for (var i = 0; i < gTestsToRun.length; ++i) {
		var testName = gTestsToRun[i];
		var err = runTest(testName);
		if (err) {
			getTestSurface(testName, testName + ' FAILED (' + err + ')');
		}
	}
}); // end onload
</script>
<style>
   td { border: 1px solid black; text-align: left; vertical-align: top; }
   v:group { text-align: left; }
</style>
   </head>
   <body>
   <table>
   <tbody id="testcontainer">
   </tbody>
   </table>
   </body>
   </html>