﻿if (typeof (MyOpenSpace) == "undefined") MyOpenSpace = {};

if (typeof (MyOpenSpace.Silverlight) == "undefined") MyOpenSpace.Silverlight = {};

MyOpenSpace.Silverlight = {

	bridgeObject_: null,
	os: null,
	silverlightApp: null,
	slRequest: null,
	osRequestType: { People: 0, Person: 1 },

	trace: function(msg) {
		var debugDiv = document.getElementById('message');
		if (debugDiv)
			debugDiv.innerHTML += msg + '<br>';
	},

	recur: 0,
	traceObj: function(obj) {
		MyOpenSpace.Silverlight.trace("tracing traceObj");
		for (thing in obj) {
			MyOpenSpace.Silverlight.trace("first thing");
			return;
			var spacer = "";
			for (var i = 0; i < recur; i++) {
				spacer += "__";
			}

			if (typeof obj[thing] === "object") {

				MyOpenSpace.Silverlight.trace(spacer + "[" + typeof obj[thing] + "] " + thing);
				recur += 1;
				if (recur > 7) {
					MyOpenSpace.Silverlight.trace("----- Too much recursion, aborting -----");
					recur -= 1;
					return;
				}
				traceObj(obj[thing]);
				recur -= 1;
			}
			else {
				if (typeof obj[thing] != "function")
					MyOpenSpace.Silverlight.trace(spacer + " [" + typeof obj[thing] + "] " + thing + " " + obj[thing]);
			}
		}
	},

	clear: function() {
		var debugDiv = document.getElementById('message');
		if (debugDiv)
			debugDiv.innerHTML = '';
	},

	setBridge: function(bridgeObject) {
		this.bridgeObject_ = bridgeObject;
	},

	getBridge: function(bridgeObject) {
		return this.bridgeObject_;
	},

	getSilverlightApp: function(objectId) {
		var silverlightApp = null;
		var silverlightObject = document.getElementById(objectId);

		if (!silverlightObject) {
			this.trace("ERROR! Could not access silverlight object " + objectId);
			return null;
		}

		var appContent = silverlightObject.Content;
		if (!appContent) {
			this.trace("ERROR! Could not access silverlight content.  Policy in AppManifest.xml must contain ExternalCallersFromCrossDomain=\"ScriptableOnly\"");
			return null;
		}

		try {
			silverlightApp = appContent.silverlightBridge;
		}
		catch (err) {
			this.trace("ERROR! exception accessing silverlight app" + err.description);
		}

		if (!silverlightApp) {
			this.trace("ERROR! Could not access silverlight application.");
			return null;
		}
		return silverlightApp;
	},

	// hack for Firefox, which doesnt send mouse_enter event of iframed SL object
	mouseOver: function() {
		if (MyOpenSpace.Silverlight.silverlightApp) {
			MyOpenSpace.Silverlight.silverlightApp.MouseEnter();
		}
	},

	// hack for Firefox, which doesnt send mouse_leave event of iframed SL object
	mouseOut: function() {
		if (MyOpenSpace.Silverlight.silverlightApp) {
			MyOpenSpace.Silverlight.silverlightApp.MouseLeave();
		}
	},

	requestNavigateTo: function(surfaceName, isPrimary, optParamsJson) {
		var surface = new gadgets.views.View(surfaceName, isPrimary);
		var newParams = gadgets.json.parse(optParamsJson);
		gadgets.views.requestNavigateTo(surface, newParams);
	},

	requestPermission: function(permissionJson, reason, callback) {
		var permission = gadgets.json.parse(permissionJson);
		var permArray = new Array;
		permArray[0] = permission;
		os.requestPermission(permArray, reason, callback);
	},

	addPeopleRequest: function(requestName, idSpecJson, paramsJson) {
		var requestType = this.osRequestType.People;
		var idSpec = opensocial.newIdSpec(gadgets.json.parse(idSpecJson));
		var params = gadgets.json.parse(paramsJson);
		requestName = "slreq_" + requestType + "_" + requestName;
		slRequest.add(slRequest.newFetchPeopleRequest(idSpec, params), requestName);
	},

	addPersonRequest: function(requestName, userId, paramsJson) {
		var requestType = this.osRequestType.Person;
		var params = gadgets.json.parse(paramsJson);
		requestName = "slreq_" + requestType + "_" + requestName;
		if (userId == "OWNER")
			id = opensocial.IdSpec.PersonId.OWNER;
		if (userId == "VIEWER")
			id = opensocial.IdSpec.PersonId.VIEWER;
		var req = slRequest.newFetchPersonRequest(id, params);
		slRequest.add(req, requestName);
	},

	response: function(osDataResponse) {
		if (!osDataResponse) {
			MyOpenSpace.Silverlight.trace("null data response");
			return;
		}
		var dataResponse = MyOpenSpace.Silverlight.silverlightApp.createManagedObject("DataResponse");
		if (!dataResponse)
			MyOpenSpace.Silverlight.trace("dataresponse create failed");

		dataResponse.GlobalError = osDataResponse.globalError_;
		dataResponse.ErrorMessage = osDataResponse.errorMessage_;
		for (respItem in osDataResponse.responseItems_) {
			var segments = respItem.split("_", 3);
			if (segments[0] == "slreq") {
				var requestType = parseInt(segments[1]);
				var requestName = segments[2];
				var responseItem;
				switch (requestType) {

					case MyOpenSpace.Silverlight.osRequestType.People:
						responseItem = MyOpenSpace.Silverlight.silverlightApp.createManagedObject("ResponseItem");
						if (!responseItem)
							MyOpenSpace.Silverlight.trace("responseItem is undefined");
						responseItem.RequestName = requestName;
						responseItem.ErrorCode = osDataResponse.responseItems_[respItem].getErrorCode();
						responseItem.ErrorMessage = osDataResponse.responseItems_[respItem].getErrorMessage();
						var peopleArray = osDataResponse.responseItems_[respItem].getData();
						var peopleJson = gadgets.json.stringify(peopleArray);
						responseItem.AddPersonList(peopleJson);
						dataResponse.AddResponseItem(responseItem);
						break;

					case MyOpenSpace.Silverlight.osRequestType.Person:
						responseItem = MyOpenSpace.Silverlight.silverlightApp.createManagedObject("ResponseItem");
						if (!responseItem)
							MyOpenSpace.Silverlight.trace("responseItem is undefined");
						var person = osDataResponse.responseItems_[respItem].getData();
						var personJson = gadgets.json.stringify(person);
						responseItem.AddPerson(personJson);
						responseItem.ErrorCode = osDataResponse.responseItems_[respItem].getErrorCode();
						responseItem.ErrorMessage = osDataResponse.responseItems_[respItem].getErrorMessage();
						responseItem.RequestName = requestName;
						dataResponse.AddResponseItem(responseItem);
						break;

					default:
						MyOpenSpace.Silverlight.trace("unknown request type in response: " + requestType);
						break;
				}
			}
			else
				MyOpenSpace.Silverlight.trace("unused element found: " + respItem);
		}
		MyOpenSpace.Silverlight.silverlightApp.SetDataResponse(dataResponse);
		return;

	},

	sendRequest: function() {
		slRequest.send(this.response);
		slRequest = os.newDataRequest();
	},

	startAppCommunication: function(objectId) {
	if (objectId) {
			MyOpenSpace.Silverlight.silverlightApp = this.getSilverlightApp(objectId);
			if (MyOpenSpace.Silverlight.silverlightApp) {
				os = opensocial.Container.get();
				slRequest = os.newDataRequest();
				MyOpenSpace.Silverlight.silverlightApp.StartUp(); // calls back to silverlight bridge and invoke application startup code
			}
		}
		else {
			this.trace("no object id");
		}
	},

	requestControlReady: function(objectId) {
		if (objectId) {
			MyOpenSpace.Silverlight.silverlightObjectId = objectId;
			var callback = "MyOpenSpace.Silverlight.startAppCommunication(\"" + objectId + "\")";
			setTimeout(callback, 0);
		}
		else {
			this.trace("no id" + this.silverlightObjectId);
		}
	}
};

var silverlightBridge = MyOpenSpace.Silverlight;
MyOpenSpace.Silverlight.setBridge(silverlightBridge);

