function initColorcubeOS()
{
	var self = new Object();	
	self.activeRequest = false;

	self.getViewerHasApp = function(callback) {
		if (self.activeRequest)
			return false;
		
		self.activeRequest = true;
		var params = {};
		params[opensocial.DataRequest.PeopleRequestFields.FILTER] = opensocial.DataRequest.FilterType.HAS_APP;
		var dr = opensocial.newDataRequest();
		dr.add(dr.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER, params), "ViewerPerson");
		dr.send(dataLoaded);

		function dataLoaded(response) {
			var result = "0";
			if (!response.hadError()) {
				var viewer = response.get("ViewerPerson").getData();
				if (viewer) result = "1";
			}
			self.activeRequest = false;
			callback(result);
		}
	};

	self.getViewerOwnerRelation = function(callback) {
		if (self.activeRequest)
			return false;
		
		self.activeRequest = true;
		var relation = "0";
		var dr = opensocial.newDataRequest();
		dr.add(dr.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER), "ViewerPerson");
		dr.send(viewerDataLoaded);
		return true;
		
		function viewerDataLoaded(response) {
			if (!response.hadError()) {
				var viewer = response.get("ViewerPerson").getData();
				if (viewer.isOwner())
					relation = "1";
			}
			isViewerOwnerFriend();
		}
		
		function isViewerOwnerFriend() {
			var allFriends = {};
			//allFriends[opensocial.DataRequest.PeopleRequestFields.FIRST] = 1;
			allFriends[opensocial.DataRequest.PeopleRequestFields.MAX] = 999;
			var dr = opensocial.newDataRequest();
			dr.add(dr.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER), "ViewerPerson");
			dr.add(dr.newFetchPeopleRequest(opensocial.DataRequest.Group.OWNER_FRIENDS, allFriends), "OwnerFriends");
			dr.send(dataLoaded);
		}
		
		function dataLoaded(response) {
			if (!response.hadError()) {
				var viewer = response.get("ViewerPerson").getData();
				var friends = response.get("OwnerFriends").getData();
				if (friends.getById(viewer.getId()))
					relation = "2";
			}
			self.activeRequest = false;
			callback(relation);
		}
	};

	self.getOwnerFriends = function(callback) {
		if (self.activeRequest)
			return false;
		
		self.activeRequest = true;
		var friendsWithApp = {};
		//friendsWithApp[opensocial.DataRequest.PeopleRequestFields.FIRST] = 1;
		friendsWithApp[opensocial.DataRequest.PeopleRequestFields.MAX] = 999;
		friendsWithApp[opensocial.DataRequest.PeopleRequestFields.FILTER] = opensocial.DataRequest.FilterType.HAS_APP;
		var dr = opensocial.newDataRequest();
		dr.add(dr.newFetchPersonRequest(opensocial.DataRequest.PersonId.OWNER), "OwnerPerson");
		dr.add(dr.newFetchPeopleRequest(opensocial.DataRequest.Group.OWNER_FRIENDS, friendsWithApp), "OwnerFriends");
		dr.send(dataLoaded);
		
		function dataLoaded(response) {
			var object = new Array();
			if (!response.hadError()) {
				var owner = response.get("OwnerPerson").getData();
				var friends = response.get("OwnerFriends").getData();
				object.push({'id':owner.getId(), 'name':cleanString(owner.getDisplayName())});
				friends.each(function(person){
					object.push({'id':person.getId(), 'name':cleanString(person.getDisplayName())});
				});
			}
			self.activeRequest = false;
			callback(object);
		}
	};

	self.getOwnerData = function(callback) {
		if (self.activeRequest)
			return false;
		
		self.activeRequest = true;
		var params = {};
		params[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] = [opensocial.Person.Field.GENDER,
																			opensocial.Person.Field.PROFILE_URL,
																			opensocial.Person.Field.CURRENT_LOCATION];
		var dr = opensocial.newDataRequest();
		dr.add(dr.newFetchPersonRequest(opensocial.DataRequest.PersonId.OWNER, params), "OwnerPerson");
		dr.send(dataLoaded);

		function dataLoaded(response) {
			var object = null;
			if (!response.hadError()) {
				var person = response.get("OwnerPerson").getData();
				object = {'id':person.getId(), 'name':cleanString(person.getDisplayName())};
				object['gender'] = person.getField(opensocial.Person.Field.GENDER).getDisplayValue();
				object['thumbnail'] = person.getField(opensocial.Person.Field.THUMBNAIL_URL);
				object['profile'] = person.getField(opensocial.Person.Field.PROFILE_URL);
				object['city'] = person.getField(opensocial.Person.Field.CURRENT_LOCATION).getField(opensocial.Address.Field.LOCALITY);
				object['state'] = person.getField(opensocial.Person.Field.CURRENT_LOCATION).getField(opensocial.Address.Field.REGION);
				object['country'] = person.getField(opensocial.Person.Field.CURRENT_LOCATION).getField(opensocial.Address.Field.COUNTRY);
			}
			self.activeRequest = false;
			callback(object);
		}
	};

	self.createActivity = function(title, content, icon, media, callback) {
		if (self.activeRequest)
			return false;
		
		self.activeRequest = true;
		var params = {};
		params[opensocial.Activity.Field.TITLE] = title;
		params[opensocial.Activity.Field.BODY] = content;
		params[opensocial.Activity.Field.STREAM_FAVICON_URL] = icon;
		params[opensocial.Activity.Field.MEDIA_ITEMS] = mountActivityMedia(media);
		var activity = opensocial.newActivity(params);
		opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH, dataLoaded);

		function dataLoaded(response) {
			var result = "0";
			if (!response.hadError()) {
				result = "1";
			}
			self.activeRequest = false;
			callback(result);
		}
	};

	self.requestServer = function(url, callback, postdata) {
		var param = new Object();
		param[gadgets.io.RequestParameters.CONTENT_TYPE] =  gadgets.io.ContentType.TEXT;
		param[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
		if (postdata) {
			param[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.NONE;
			param[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
			param[gadgets.io.RequestParameters.POST_DATA] = gadgets.io.encodeValues(postdata);
		}
		gadgets.io.makeRequest(url, dataLoaded, param);
		
		function dataLoaded(response) {
			callback(response);
		}
	};

	return self;
}

function cleanString(string)
{
	string = gadgets.util.unescapeString(string);
	//string = string.replace(/'/g, '');
	//string = string.replace(/"/g, '');
	//string = string.replace(/\\/g, '');
	return string;
}

function mountActivityMedia(media)
{
	var mediaItems = {};
	for (var i in media) {
		var object = gadgets.json.parse(media[i]);
		mediaItems[i] = opensocial.newActivityMediaItem(object.mime, object.url);
	}
	return mediaItems;
}
