var D = function(id) { return document.getElementById(id); };
var S;
var DOM = document;

function SetupObjects(sender) {
    window.main = sender;
	main.content.findName('cRoot').addEventListener('MouseMove', delegate(this, OnMouseMove));
	main.content.findName('cRoot').addEventListener('MouseLeftButtonUp', delegate(this, OnMouseUp));
	main.content.findName('rInner').addEventListener('MouseLeftButtonDown', delegate(this, OnCanvasMouseDown));

	var d = GetWindowDimensions( );
	main.content.findName('cRoot').width = d.width;
	main.content.findName('cRoot').height = d.height;

	main.content.findName('rInner').width = d.width;
	main.content.findName('rInner').height = d.height;
	
	D('ddlAssemblies').onchange = function(evt) {
	    PopulateTypeList( );
	};
	
	D('ddlTypes').onchange = function(evt) {
	    if(D('ddlTypes').options[D('ddlTypes').selectedIndex].value > 0) {
	        ShowGraph( );
	    }
	};

	MouseWheel.Setup(MouseWheel.HandleMouseWheel, 'cScale');
}


function ConvertDataToGraph(data) {
    var gData = new Object( );
    var assemblyName = data.assembly.substring(0, data.assembly.indexOf(','));
    gData.name = data.type + ', ' + assemblyName;
    gData.children = new Array( );
    gData.fillColor = Color.Gray;
    
    var mBranch = new Object( ) ;
    mBranch.name = 'Methods';
    mBranch.children = new Array( ) ;
    mBranch.fillColor = Color.Orange;
    gData.children.push(mBranch);
    
    for(var n in data.methods) {
        var child = new Object( );
        child.name = data.methods[n];
        child.fillColor = Color.Red;
        mBranch.children.push(child);
    }
    
    var pBranch = new Object( ) ;
    pBranch.name = 'Properties';
    pBranch.children = new Array( ) ;
    pBranch.fillColor = Color.Purple;
    gData.children.push(pBranch);
    
    for(var n in data.properties) {
        var child = new Object( );
        child.name = data.properties[n];
        child.fillColor = Color.Green;
        pBranch.children.push(child);
    }
    
    var eBranch = new Object( ) ;
    eBranch.name = 'Events';
    eBranch.fillColor = Color.Blue;
    eBranch.children = new Array( ) ;
    gData.children.push(eBranch);
        
    for(var n in data.events) {
        var child = new Object( );
        child.name = data.events[n];
        child.fillColor = Color.Yellow;
        eBranch.children.push(child);
    }
    
    return gData;
}

function ShowGraph( ) {
    var msg = '<ReflectingGraphMessage>';
    msg += '<Method>GetTypeMembers</Method>';
    msg += '<assemblyName>' + D('ddlAssemblies').options[D('ddlAssemblies').selectedIndex].value + '</assemblyName>';
    msg += '<typeName>' + D('ddlTypes').options[D('ddlTypes').selectedIndex].text + '</typeName>';
    msg += '</ReflectingGraphMessage>';
    
    var xmlhttp = new XMLHttpRequest( ) ;
    xmlhttp.open('POST', Configuration.ServiceEndpoint, true);
    xmlhttp.onreadystatechange = function( ) {
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            main.content.findName('cInner').children.clear( );
            
            var data;
            eval('data=' + xmlhttp.responseText);
            
            var gData = ConvertDataToGraph(data);
            Graph.Create(gData, 'cInner', {xPos:'50px', yPos:'50px'});
        }
    };
    
    xmlhttp.send(msg);
}

function PopulateTypeList( ) {
    var msg = '<ReflectingGraphMessage>';
    msg += '<Method>GetTypes</Method>';
    msg += '<assemblyName>' + D('ddlAssemblies').options[D('ddlAssemblies').selectedIndex].value + '</assemblyName>';
    msg += '</ReflectingGraphMessage>';

    var xmlhttp = new XMLHttpRequest( ) ;
    xmlhttp.open('POST', Configuration.ServiceEndpoint, true);
    xmlhttp.onreadystatechange = function( ) {
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            var data;
            eval('data=' + xmlhttp.responseText);
            
            D('ddlTypes').options.length = 0;
            
            var i = 0;
            for(var n in data.types) {
                D('ddlTypes').options[i++] = new Option(data.types[n], i);
            }
        }
    };
    xmlhttp.send(msg);
}


function OnMouseUp(sender, ea) {
	if(window.selected) {
		sender.releaseMouseCapture( );
	}
	else {
		window.mouseDownX = -1;
		window.mouseDownY = -1;
	}
	window.selected = new Object( );
	window.moving = false;
}

function OnMouseDown(sender, ea) {
	window.selected = new Object( );
	window.selected.obj = sender;
	window.selected.id = parseInt(sender.Name.substring(7, sender.Name.length));
	window.selected.childList = window.ObjectRegistry[window.selected.id];
	window.selected.objText = sender.getHost( ).content.findName('TextBlock' + window.selected.id);
	window.selected.objLine = sender.getHost( ).content.findName('Line' + window.selected.id);
	window.selected.x = ea.getPosition(null).x;
	window.selected.y = ea.getPosition(null).y;
	window.selected.status = true;
	sender.captureMouse( );
}

function OnMouseMove(sender, ea) {
	var x = ea.getPosition(null).x;
	var y = ea.getPosition(null).y;
	var cScale = main.content.findName("cScale");
	var sX = cScale.scaleX;
	var sY = cScale.scaleY;

	if(window.selected && window.selected.status) {
		var cTranslate = sender.findName("cTranslate");
		x -= cTranslate.X;
		y -= cTranslate.Y;

		window.selected.x = x;
		window.selected.y = y;

		var wI = Configuration.ItemWidth * sX;
		var hI = Configuration.ItemHeight * sY;

		var whI = Configuration.ItemWidth / 2;
		var hhI = Configuration.ItemHeight / 2;

		window.selected.obj['Canvas.Left'] = x / sX;
		window.selected.obj['Canvas.Top'] = y / sY;

		window.selected.objText['Canvas.Left'] = (x + wI) / sX;
		window.selected.objText['Canvas.Top'] = (y + hI) / sY;

		if(window.selected.objLine) {
			window.selected.objLine['X1'] = (x + whI) / sX;
			window.selected.objLine['Y1'] = (y + hhI) / sY;
		}

		for(var i in window.selected.childList) {
			var l = sender.getHost( ).content.findName('Line' + window.selected.childList[i]);
			l['X2'] = (x + whI) / sX;
			l['Y2'] = (y + hhI) / sY;
		}
	}
	else if(window.moving) {
        var cTranslate = main.content.findName("cTranslate");
        cTranslate.X = (x) - window.mouseDownX;
        cTranslate.Y = (y) - window.mouseDownY;
	}
}

function OnCanvasMouseDown(sender, ea) {
	sender.captureMouse( );
	window.moving = true;
	var cScale = main.content.findName("cScale");
	var sX = cScale.scaleX;
	var sY = cScale.scaleY;
    var cTranslate = sender.findName("cTranslate");
    window.mouseDownX = ea.getPosition(null).X - (cTranslate.X);
    window.mouseDownY = ea.getPosition(null).Y - (cTranslate.Y);
}

window.onload = function(evt) {
	Silverlight.Initialize(SetupObjects);
};