﻿if (typeof gigya == 'undefined' || typeof gigya.SNProxy == 'undefined') { throw ("gigya namespace if not declared. make sure gigya.SNProxy.js is included"); }

/** SNProxy Implementation **/

gigya.SNProxy.containerInfo =
{
    surface: null,
    surfaceWidth: 500,
    surfaceHeight: 500,
    supportsSocialGraph: true,
    supportsNotification: true,
    supportsActions: false,
    surfaceParams: {}, // params passed by container
    appParams: null, // pramas passed by us
    viewerHasApp: false
};


gigya.SNProxy.addImpl(gigya.SNProxy.init,
    function() {
        //gigya.SNProxy.MS.adjustHeight();
    }
);

    gigya.SNProxy.addImpl(gigya.SNProxy.onContainerReady,
    function()
    {
        this.friendsSelectorConf.maxSelection = 1;
        this.friendsSelectorConf.containerWindow = gigya.SNProxy.getMainWindow();
        this.friendsSelectorConf.relativeTo = $("divItems");

        if (this.containerInfo.appParams && this.containerInfo.appParams.mode == "msg")
        {
            var p = this.containerInfo.appParams;
            var subject = unescape(p.subject);
            var body = unescape(p.body);
            var lcid = p.lcid;
            var rid = p.rid;
            var rcptArray = p.rcpt;
            
            this.sendNotification(lcid, rid, rcptArray, subject, body);
        } else
        {
            this.MS.getItems();
        }
    }
);

gigya.SNProxy.addImpl(gigya.SNProxy.getFriends,
    function(lcid, rid, parentCB) {
        var result = this.createOKResult(lcid, rid);
        result.friends = this.createArray();

        var fArray = this.MS.viewerFriends.asArray();
        for (var i = 0; i < fArray.length; i++) {
            var f = {};
            f.SNUID = fArray[i].getId();
            f.gigyaUID = f.SNUID;
            f.name = $str(this.MS.getName(fArray[i]));
            f.photoURL = $str(fArray[i].getField(opensocial.Person.Field.THUMBNAIL_URL));
            f.profileURL = $str(fArray[i].getField(opensocial.Person.Field.PROFILE_URL));
            this.setUserDate(f, fArray[i].getField(opensocial.Person.Field.DATE_OF_BIRTH));
            result.friends[i] = f;
        }
        if (parentCB != null)
            parentCB(result)
        else
            this.getFriends_callback(result);
    }
);

gigya.SNProxy.addImpl(gigya.SNProxy.getUserInfo,
    function(lcid, rid) {
        var result = this.createOKResult(lcid, rid);
        result.userInfo = {};

        var viewer = this.MS.viewer;

        result.userInfo.SNUID = viewer.getId();
        result.userInfo.gigyaUID = viewer.getId();
        result.userInfo.name = $str(this.MS.getName(viewer));
        result.userInfo.photoURL = $str(viewer.getField(opensocial.Person.Field.THUMBNAIL_URL));
        result.userInfo.profileURL = $str(viewer.getField(opensocial.Person.Field.PROFILE_URL));
        this.setUserDate(result.userInfo, viewer.getField(opensocial.Person.Field.DATE_OF_BIRTH));

        this.getUserInfo_callback(result);
    }
);

gigya.SNProxy.addImpl(gigya.SNProxy.sendNotification,
    function(lcid, rid, recipientIDs, subject, body, callback)
    {
        var os_token = MyOpenSpace.MySpaceContainer.OSToken;
        var osContainer = opensocial.Container.get();
        var content;
        //MyOpenSpace.PostTo.Targets.PROFILE
        //MyOpenSpace.PostTo.Targets.SEND_MESSAGE
        //MyOpenSpace.PostTo.Targets.COMMENTS
        //MyOpenSpace.PostTo.Targets.BULLETINS
        //MyOpenSpace.PostTo.Targets.BLOG
        var target = MyOpenSpace.PostTo.Targets.SEND_MESSAGE;

        var person = this.MS.viewerFriends.getById(recipientIDs.split(',')[0]);
        var message = opensocial.newMessage(body);
        message.setField(opensocial.Message.Field.TYPE, target);
        message.setField(opensocial.Message.Field.TITLE, subject);

        osContainer.postTo(
		    os_token,
		    message,
		    person,
		    function(sendCount) {
		        var result = this.createOKResult(lcid, rid)
		        result.sendCount = sendCount;
		        this.sendNotification_callback(result);
		    }.bind(this)
	    );
    }
);

gigya.SNProxy.addImpl(gigya.SNProxy.gotoCanvas,
    function(lcid, rid, params, popup)
    {
	    if (popup)
	    {
		    var URL = this.containerInfo.canvasURL + "&appParams="+Object.toJSON(params);
		    window.open(URL, "CANVAS");
	    } else {
		    var canvas_view = new gadgets.views.View("canvas");  
		    gadgets.views.requestNavigateTo(canvas_view, params);
	    }
    }
);


/** Network Specific internal stuff **/
if (typeof gigya.SNProxy.MS == 'undefined') { gigya.SNProxy.MS = new Object(); }
gigya.SNProxy.MS.owner			= null;
gigya.SNProxy.MS.ownerID		= null;
gigya.SNProxy.MS.ownerName		= null;
gigya.SNProxy.MS.viewer			= null;
gigya.SNProxy.MS.viewerID		= null;
gigya.SNProxy.MS.viewerName		= null;
gigya.SNProxy.MS.viewerFriends	= null;
gigya.SNProxy.MS.ownerFriends	= null;
gigya.SNProxy.MS.ownerIsViewer	= false;
gigya.SNProxy.MS.viewerHasApp	= false;
gigya.SNProxy.MS.areFriends		= false;
gigya.SNProxy.MS.pageNum        = 0;
gigya.SNProxy.MS.MIN_CANVAS_H   = 530;
gigya.SNProxy.MS.ITEMS_PER_PAGE = 1; // RETURNING LASTEST POSTED ITEM

gigya.SNProxy.MS.init = function()
{
    var base = gigya.SNProxy;
    var cinfo = base.containerInfo;

    cinfo.domain = opensocial.getEnvironment().domain;

    try
    {
        cinfo.surface = gadgets.views.getCurrentView().getName();
    } catch (error)
    {
        cinfo.surface = opensocial.getEnvironment().getSurface().getName();
    }

    // get surface params (consolidate URL and view params)
    if (gadgets.util.getUrlParameters())
        for (var key in gadgets.util.getUrlParameters())
        cinfo.surfaceParams[key] = gadgets.util.getUrlParameters()[key];

    if (gadgets.views.getParams())
        for (var key in gadgets.views.getParams())
        cinfo.surfaceParams[key] = gadgets.views.getParams()[key];

    // get appParams if present
    if (typeof gadgets.util.getUrlParameters().p != "undefined")
        eval("gigya.SNProxy.containerInfo.appParams = " + gadgets.util.getUrlParameters().p);
    else if (typeof gadgets.util.getUrlParameters().appParams != "undefined")
        eval("gigya.SNProxy.containerInfo.appParams = " + gadgets.util.getUrlParameters().appParams);
    else
        cinfo.appParams = null;

    cinfo.appID = cinfo.surfaceParams.appid;
    cinfo.canvasURL = "http://profile.myspace.com/Modules/Applications/Pages/Canvas.aspx?appId=" + cinfo.appID;

    if (cinfo.appParams && cinfo.appParams.server)
        this.SERVER_DOMAIN = cinfo.appParams.server;
    else
        this.SERVER_DOMAIN = "wildfire.gigya.com";

    this.SERVER_URL = "http://" + this.SERVER_DOMAIN + "/wildfire/opensocial/ServerAPI.ashx";

    var state = cinfo.surfaceParams.installState;
    cinfo.isInstall = !gigya.SNProxy.isEmpty(state) && state == '2';
    // render LCProxy and items container
    /*
    var sb = new Array();
    sb.push('<object width="1" height="1" id="LCProxy" name="LCProxy" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" >');
    sb.push('<param name="movie" value="http://cdn.gigya.com/wildfire/swf/eventsBroadcaster.swf">');
    sb.push('<param name="AllowScriptAccess" value="always" >');
    sb.push('<embed src="http://cdn.gigya.com/wildfire/swf/eventsBroadcaster.swf" width="1" height="1" play="true" id="LCProxy" name="LCProxy" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer"></embed>');
    sb.push('</object>');
    sb.push('<div id="divItems"></div>');
    var html = sb.join('');

    var divMain = new Element("div");
    divMain.update(html);
    document.body.appendChild(divMain);
    //$(document.body).insert({ top: divMain });
    */
    
    
    
//    if (cinfo.isInstall) {
//    
//        // RONEN: Put here code for adding action  
//        var params = {};
//        params[opensocial.Activity.Field.TITLE_ID] = "MS_GIGYA_TEMPLATE"; // --> Must be the name of the template in the application settings
//        params[opensocial.Activity.Field.TEMPLATE_PARAMS] = {}; // our template doesn't require any parameters
//        var mediaItemArray = []; // we don't need to add any media items
//        params[opensocial.Activity.Field.MEDIA_ITEMS] = mediaItemArray;
//        var activity = opensocial.newActivity(params); // ask for new activity 
//        opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH,this.AddActivity_callBack.bind(this));  
//    }
//    

    $("divItems").style.width = "100%";
    //$("divItems").style.border = "1px solid red";
    //$("divItems").style.height = gadgets.window.getViewportDimensions().height;
    $("divItems").style.overflowY = "auto";
    // request user data
    MyOpenSpace.DefaultPageSize = 1000;
    var req = opensocial.newDataRequest();
    req.add(req.newFetchPersonRequest('OWNER'), 'owner');
    req.add(req.newFetchPersonRequest('VIEWER'), 'viewer');
    req.add(req.newFetchPeopleRequest('VIEWER_FRIENDS'), 'viewerFriends');
    req.add(req.newFetchPeopleRequest('OWNER_FRIENDS'), 'ownerFriends');
    req.send(base.MS.onData.bind(this));
}

//gigya.SNProxy.MS.AddActivity_callBack = function(response) {
//    // need to add error handling
//    debugger;
//    if (response.hadError()) {
//        //response.getErrorMessage() 
//    }
//}

gigya.SNProxy.MS.onData = function(data)
{
    if (gigya.SNProxy.getDebugLevel() > 2) debugger;

    var info = gigya.SNProxy.containerInfo;

    this.owner = data.get("owner");
    this.viewer = data.get("viewer");
    this.viewerFriends = data.get("viewerFriends");
    this.ownerFriends = data.get("ownerFriends");

    // OWNER DATA
    if (this.owner && this.owner.getData())
    {
        this.owner = this.owner.getData();
        this.ownerID = this.owner.getId();
        this.ownerName = this.getName(this.owner);
    } else
    {
        this.owner = null;
        this.ownerID = null;
        this.ownerName = null;
    }

    if (this.ownerFriends && this.ownerFriends.getData)
        this.ownerFriends = this.ownerFriends.getData();

    // VIWER DATA
    if (this.viewer && this.viewer.getData())
    {
        this.viewerHasApp = true;
        this.viewer = this.viewer.getData();
        this.viewerFriends = this.viewerFriends.getData();
        this.viewerID = this.viewer.getId();
        this.viewerName = this.getName(this.viewer);
    } else
    {
        this.viewerHasApp = false;
        this.viewerFriends = null;
        this.viewer = null;
        this.viewerID = null;
    }

    info.viewerHasApp = this.viewerHasApp;

    if (this.viewerHasApp && this.viewerFriends && this.viewerFriends.getData)
        this.viewerFriends = this.viewerFriends.getData();

    this.ownerIsViewer = (this.ownerID == this.viewerID);

    this.areFriends = this.ownerIsViewer || (this.viewerFriends != null && this.viewerFriends.getById(this.ownerID) != null)

    // create install pixel
    if (this.owner != null)
    {
        var img = new Image();
        img.src = "http://" + this.SERVER_DOMAIN + "/wildfire/WFApi.ashx?f=pu&domain=" + info.domain + "&appid=" + info.appID + "&uid=" + this.ownerID + "&install=" + info.isInstall + "&buster=" + (new Date()).getTime();
        
    }

    setTimeout("gigya.SNProxy.onContainerReady()", 500);
}


gigya.SNProxy.MS.getItems = function()
{
    this.doCmd("read", null, "GET", this.getItems_callback.bind(this));
}

gigya.SNProxy.MS.getItems_callback = function(res) 
{

    if (gigya.SNProxy.getDebugLevel() > 2) debugger;
    if (res == "" || res.data == "") {
        progress(false);
        return;
    }

    var items = eval(res.data);

    var gotMore = (items.length > this.ITEMS_PER_PAGE);

    // server return get ITEMS_PER_PAGE+1 as indicator for more
    // remove last if got more
    if (gotMore)
        items.splice(items.length - 1, 1);

    itemCount = items.length;

    var resHTML = "";
    // Build Items HTML using prototype's Template class
    items.each(
		function(item) { resHTML += item.CodeWithPixel + "<br><br>"; }
	);

    $('divItems').update(resHTML);

    setTimeout("gigya.SNProxy.MS.adjustHeight()",200);
}

gigya.SNProxy.MS.adjustHeight = function()
{

    var dim = Element.getDimensions($('divItems'))
    var height = dim.height + 12;
    if (gigya.SNProxy.containerInfo.surface == "canvas" && height < this.MIN_CANVAS_H)
        height = this.MIN_CANVAS_H;
    try
    {
        opensocial.Container.get().resizePanel(height);
    } catch (error)
    {
        try
        {
            gadgets.window.adjustHeight();
        } catch (error) { }
    }

    //$("divItems").style.height = height - 12 + "px";
}

gigya.SNProxy.MS.progress = function(show)
{
}

gigya.SNProxy.MS.getName = function( person )
{
   var name = "";
   try{
        name = person.getDisplayName();
   }catch( e ){
        // this is a complete hack
        try{
            name = person.getFieldOld( opensocial.Person.Field.NAME );
        }catch( e ){}          
   }
   return name;
} 

gigya.SNProxy.MS.getPerson = function(ID)
{
	var person = null;
	if (ID==ownerID)
	{
		person = owner;
	}
	else if (ID==viewerID)
	{
		person = viewer;
	}
	else
	{
		if (viewerHasApp) person = viewerFriends.getById(ID);
		if (person==null) person = ownerFriends.getById(ID);
	}
	return person;
}

gigya.SNProxy.MS.doCmd = function(cmd, query, method, callback) {
    if (query == null) query = {};
    query.start = this.pageNum * this.ITEMS_PER_PAGE;
    query.count = this.ITEMS_PER_PAGE + 1;
    query.buster = (new Date()).getTime();
    query.vid = this.viewerID;
    query.oid = this.ownerID
    query.mode = gigya.SNProxy.containerInfo.surface;
    query.domain = gigya.SNProxy.containerInfo.domain;
    query.network = gigya.SNProxy.containerInfo.domain;
    query.appID = gigya.SNProxy.containerInfo.appID;


    var queryStr = "cmd=" + cmd;

    for (var key in query) {
        var val = query[key];

        if (key == "code" || key == "body")
            val = Base64.encode(query[key] + "");

        if (key == "q")
            val = Base64.encode(query[key] + "");

        queryStr += "&" + encodeURIComponent(key) + "=" + encodeURIComponent(val);
    }
    var URL = this.SERVER_URL;
    var params = { 'refreshInterval': 0 };
    params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.HTML;

    if (gigya.SNProxy.containerInfo.domain != "hi5.com")
        params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;

    params[gadgets.io.RequestParameters.METHOD] = method;

    if (method == "GET") {
        URL += "?" + queryStr;
    } else {
        params[gadgets.io.RequestParameters.POST_DATA] = queryStr;
    }

    gadgets.io.makeRequest(
		URL,
		function(res) {
		    if (gigya.SNProxy.getDebugLevel() > 2) debugger;
		    if (!res.data) {
		        gigya.SNProxy.error(res.errorCode + ":" + res.errorMessage);
		    }
		    else {
		        callback(res);
		    }
		}
		, params
	);
}

var Base64 = {

    // private property
    _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode: function(input)
    {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Base64._utf8_encode(input);

        while (i < input.length)
        {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2))
            {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3))
            {
                enc4 = 64;
            }

            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    },

    // public method for decoding
    decode: function(input)
    {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length)
        {

            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output = output + String.fromCharCode(chr1);

            if (enc3 != 64)
            {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64)
            {
                output = output + String.fromCharCode(chr3);
            }

        }

        output = Base64._utf8_decode(output);

        return output;

    },

    // private method for UTF-8 encoding
    _utf8_encode: function(string)
    {
        string = string.replace(/\r\n/g, "\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++)
        {

            var c = string.charCodeAt(n);

            if (c < 128)
            {
                utftext += String.fromCharCode(c);
            }
            else if ((c > 127) && (c < 2048))
            {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else
            {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode: function(utftext)
    {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while (i < utftext.length)
        {

            c = utftext.charCodeAt(i);

            if (c < 128)
            {
                string += String.fromCharCode(c);
                i++;
            }
            else if ((c > 191) && (c < 224))
            {
                c2 = utftext.charCodeAt(i + 1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else
            {
                c2 = utftext.charCodeAt(i + 1);
                c3 = utftext.charCodeAt(i + 2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }
};

gadgets.util.registerOnLoadHandler(gigya.SNProxy.MS.init.bind(gigya.SNProxy.MS));