Template:Emote! Code

From OpenSocial Directory

Jump to: navigation, search
<?xml version="1.0" encoding="UTF-8"?>
<Module>
  <ModulePrefs title="Emote!" thumbnail="http://apps.rockyou.com/images/opensocial/icons/120x60/emote120.jpg" screenshot="http://img324.rockyou.com/imagehost/8/8625/8625537/8625537_73ffc4e51204085562_m.jpg" author="RockYou!" author_email="support@rockyou.com" description="Bored, Happy, Glum? We've got an ever growing list of emoticons to show off how you feel." author_location="San Mateo, CA" author_affiliation="RockYou!" title_url="http://www.rockyou.com/" directory_title="Emote!" summary="It's your status message on steroids! Show off with a billion icons. (May be less than a billion)" icon="http://apps.rockyou.com/images/opensocial/icons/16x/emote16.gif" height="1000" >
    <Require feature="dynamic-height" />
    <Require feature="opensocial-0.7" />
    <Require feature="views" />
  </ModulePrefs>
  <Content type="html" view="profile">
    <![CDATA[
    
<!-- Generated Mon Apr 14 13:51:17 PDT 2008 -->
<script src="http://opensocial.rockyou.com/google_apps/common/js/scriptaculous/prototype.js" type="text/javascript"></script><div id='ry-canvas-debug'></div>
<div class='page_skin'>


<div id='debug'></div>

<style>
    body {
        margin: 0px;
        padding: 0px;
    }
    
    a.osocial_link {
        color:#02679C;
        text-decoration:none;    
        font-family:Verdana,Arial,sans-serif;
        font-size: 12px;
    }
    a.osocial_link:hover {
        color:#00344F;
        text-decoration:underline;
        font-family:Verdana,Arial,sans-serif;
        font-size: 12px;
    }
    div {
        font-family:Verdana,Arial,sans-serif;
    }
    table.profileEmote {
        width: 500px;
    }
    .profileEmoteDetail {
        vertical-align: top;
        padding: 0px 10px 10px;
    }
    td.profileEmoteImg {
        width: 50px;
    }
    img.profileEmoteImg {
        padding: 3px;
        background-color: #FFFFFF;
        // border: 1px solid #CCCCCC;
    }
    .profileEmoteHistory img.profileEmoteImg {
        width: 25px;
    }
    .profileEmoteHistory td.profileEmoteImg {
        width: 25px;
    }
    .profileEmoteHistory .profileEmoteLink {
        display: none;
    }
    .profileEmoteHistory .profileEmoteDetail {
        padding: 0px 0px 10px;
    }
    .profileEmoteText {
        color:#444444;
        font-size:24px;
    }
    .profileEmoteHistory .profileEmoteText {
        color:#777777;
        font-size:11px;
        font-weight: bold;
    }
    .profileEmoteDate, .profileNoteDate {
        color:#BABABA;
        font-size: 18px;
    }
    .profileEmoteHistory .profileEmoteDate, .profileEmoteLink {
        font-size: 10px;
    }
    .profileNoteDate {
        font-size: 10px;
    }
    .profileTextarea {
        width: 355px;
        height: 14px;
    }
    .profilePostbox {
        background:#F7F7F7 none repeat scroll 0%;
        border-bottom:1px solid #CCCCCC;
        border-top:1px solid #CCCCCC;
        padding:3px 8px 4px;
    }
    .profileNotesHeader, .profileNote {
        padding: 5px;
        color: #444444;
        border-bottom:1px solid #EEEEEE;
    }
    .profileNotesHeaderBlank {
        height: 0px;
        padding: 0px;
        margin-bottom: 2px;
        border-bottom:1px solid #CCCCCC;
    }
    .profileNotesHeader {
        color: #777777;
    }
</style>


<table class="profileEmote" style="background-color: #EEEEE" >
<tbody>
<tr>
    <td class="profileEmoteImg" valign="top">
    <img id='emoteImage' src="http://opensocial.rockyou.com/images/spacer.gif" class="profileEmoteImg" />
    </td>

    <td class="profileEmoteDetail">                                           
        <div class="profileEmoteText" id="emote_text"></div>
        <div class="profileEmoteDate" id="posted_time"></div>
        <div class="profileEmoteLink"><a href="javascript:goto_canvas_page('create');" class="osocial_link">Set a new Emote</a>
                </div>
        
    </td>
</tr>
</tbody>
</table>

</div>
<script type="text/javascript">
                      Array.prototype.toJSON = null;
                    </script>
                    <script type="text/javascript">
    var viewer_id;
    var owner_id;
    var url_params = gadgets.util.getUrlParameters();
    viewer_id = url_params["gadgetViewer"];
    owner_id = url_params["gadgetOwner"];
    function goto_canvas_page(page_name)
    {
        var all_views = gadgets.views.getSupportedViews();
        var canvas_view = all_views["canvas"];
        var params = { "pagename" : encodeURIComponent(page_name) };
        gadgets.views.requestNavigateTo(canvas_view, params);
    }
    
function ry_debug(intext)
            {
                document.getElementById('ry-canvas-debug').innerHTML += '<br>'+intext;


            }

    // Define console.log to be empty if firebug is not available
    if (typeof(console) == 'undefined') 
        console = new Object();
    if (typeof(console.log) == 'undefined') 
        console.log = function() { };
        
    // redefine encodeURIComponent to more closely match PHP's rawurlencode
    var origEncodeURIComponent = encodeURIComponent;

    encodeURIComponent = function(str) {
        var escaped_str = origEncodeURIComponent(str);
        escaped_str = escaped_str.replace("'", "%27");
        return escaped_str;
    };            


    function i18n_template(template, params)
    {
        // use prototype's template processing
        var t = new Template(template);
        return t.evaluate(params);
    }
    
    function genericJSONRequest(path, callback, opt_param_str)
    {
        var params = {};
        params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
        params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
        params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.GET;
        var url = "http://opensocial.rockyou.com/" + path;
        // console.log(url);

        if (opt_param_str != "undefined" && opt_param_str)
            url = url + "?" + opt_param_str;

        gadgets.io.makeRequest(url, function(response)
        {
            if (typeof response.data == "undefined")
            {
                alert("JSON Error: NO Data");
                if (response.errors)
                {
                    alert("Errors from server " + response.errors);
                }
                return;
            }
            // console.log(response);
            data = response.data;
            if (data.success == false)
                alert("Debug: JSON call failed, error_code=" + data.error_code + ", error_message " + data.error_message);
            else
                callback(data);
        }, params);
        }

        function genericJSONPost(path, callback, opt_param_str)
        {
            var params = {};
            params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
            params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
            params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
            var url = "http://opensocial.rockyou.com/" + path;

            if (opt_param_str != "undefined" && opt_param_str)
                params[gadgets.io.RequestParameters.POST_DATA] = opt_param_str;

            gadgets.io.makeRequest(url, function(response)
            {
                if (typeof response.data == "undefined")
                {
                    alert("JSON Error: NO Data");
                    if (response.errors)
                    {
                        alert("Errors from server " + response.errors);
                    }
                    return;
                }
                // console.log(response);
                data = response.data;
                if (data.success == false)
                    alert("Debug: JSON call failed, error_code=" + data.error_code + ", error_message " + data.error_message);
                else
                    callback(data);
            }, params);
        }

        function postToActivityStream(text, callback, priority, body) {
            priority = (typeof(priority) != "undefined") ? priority : opensocial.CreateActivityPriority.LOW;
            callback = (typeof(callback) != "undefined") ? callback : defaultActivityCallback;

            var params = {};
            params[opensocial.Activity.Field.TITLE] = text;
            params[opensocial.Activity.Field.BODY] = body;
            var activity = opensocial.newActivity(params);
            opensocial.requestCreateActivity(activity, priority, callback);
        }

        function defaultActivityCallback(data) {
            //output(data);
        }

        function ry_debug_response(content, error)
        {
            ry_debug(content);
            debugger;
        }
        
        // js equivalent of /includes/trackevent.php
        function createTrackEventUrl(event, url, value) 
        {
          if (event == ""){
            return url;
          }
          link = "http://opensocial.rockyou.com/events/track.php?event=" + event;
          if ((typeof(value)!="undefined") && (value != ""))
            link = link + "&value="+value;
          if (url != "")
            link = link + "&url=" + encodeURIComponent(url);
          return link;
        }

        // app install tracking   
        function set_install()
        {
           // if viewer is not owner we dont even check if this is the first time after installation
           if ( owner_id != viewer_id ){
               return;
           }
           // query appdata for the install date
           req = opensocial.newDataRequest();
           req.add(req.newFetchPersonAppDataRequest("VIEWER","install_date"), "app_data");
           req.send(handle_install);
        }

        function handle_install(data)
        {
           // debugger;
           var do_update = false;
           if (data.get("app_data").hadError())
           {
               do_update = true;
           }
           else
           {
               var viewer_data = data.get("app_data").getData();
               if ( (viewer_data[viewer_id] == undefined) || (viewer_data[viewer_id].install_date == undefined) ) {
                   do_update = true;
               }
           }
           if (do_update)
           {
               genericJSONRequest("google_apps/server/RYAppInstall.php",do_nothing_callback);
               // set installation date
               var curr_date = new Date();
               var data = curr_date.toUTCString();
               req = opensocial.newDataRequest();
               req.add(req.newUpdatePersonAppDataRequest("VIEWER", "install_date", data), "app_data");   
               req.send(do_nothing);
           } 
        }
        
        function do_nothing_callback(data){
        }
        
        function do_nothing(data){
        }
        
        
        ////////////////// 
        
            
    var profile_page = {
    
        // member variables ------------------------------------------------------------------------
        
        owner_name : "",

        // page methods ----------------------------------------------------------------------------
        
        init : function() 
        {        
            this.loadContainerData();
        },

        loadEmote : function()
        {
            genericJSONRequest("google_apps/emote_example/server/getEmotes.php", this.loadEmoteData.bind(this));
        },
        
        loadEmoteData : function(response)
        {
            var data = response.return_data;
            
            if (data != "no_rows")
            {
                var emote_row = data[0];            
                this.selectEmotion(emote_row["icon"], emote_row["desc"], emote_row["posted_str"]);
            }
            else
            {
                this.selectEmotion("http://www.rockyou.com/images/ryemote/vista/cool.jpg", "ready to Emote!", "recently");            
            }
        },

        loadContainerData : function()
        {
            req = opensocial.newDataRequest();
            req.add(req.newFetchPersonRequest('OWNER'), 'owner');
            req.send(this.handleContainerData.bind(this));
        },

        handleContainerData : function(data) 
        {        
            // owner data
            if (data.get("owner").hadError())
            {
                alert("no data");
                var disp_name = "User";
            }
            else
            {
                var owner_data = data.get("owner").getData();
                // var_dump(owner_data);
                this.owner_name = owner_data.getDisplayName();
                var owner_id = owner_data.getId();
                this.loadEmote();
            }
        },

        selectEmotion : function(icon, desc, posted_str)
        {
            document.getElementById('emote_text').innerHTML = i18n_template('<span id="emotename">#{name}</span> is <span style="font-weight:bold" id="emoteText">#{emote_text}</span>', { name : this.owner_name, emote_text : desc });
            document.getElementById('emoteImage').src = icon;
            if (typeof(posted_str) == "undefined" || posted_str.length == 0)
                posted_str = "several seconds";
            document.getElementById('posted_time').innerHTML = i18n_template('Updated #{posted} ago', { posted : posted_str });
            
            // set appropriate page height
              gadgets.window.adjustHeight();
        }    
    }
    
gadgets.util.registerOnLoadHandler(profile_page.init.bind(profile_page));
</script>
    
    ]]>
  </Content>

  <Content type="html" view="canvas">
    <![CDATA[
<!-- Generated Mon Apr 14 13:51:17 PDT 2008 -->
<div id='ry-canvas-debug'></div>
<script src="http://opensocial.rockyou.com/google_apps/common/js/scriptaculous/prototype.js" type="text/javascript"></script>
<link href="http://opensocial.rockyou.com/google_apps/common/friendselector.css?v=20080403" rel="stylesheet" type="text/css"><script type="text/javascript">
                      Array.prototype.toJSON = null;
                    </script>
                    <div id='canvas-create-id' style='display: none;'>

    <link href="http://www.rockyou.com/google_apps/emote_example/view/style/common.css" rel="stylesheet" type="text/css">
    <link href="http://www.rockyou.com/google_apps/emote_example/view/style/view.css" rel="stylesheet" type="text/css">  

    <div id="main_body">
    <br />
    
    
  <div id="nav_links">
    <a class="owner-only" href="javascript:goto_canvas_page('create');" style="display:none;font-family:Verdana,arial,sans-serif;font-weight:bold;color:#444444;">Emote Again!</a><span class="owner-only" style="display:none;">  |  </span>
    <a href="javascript:goto_canvas_page('history');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;">Past Emotes</a>  |  
    <a href="javascript:goto_canvas_page('friends');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;">Friends' Emotes</a>
  </div>
  
  <div style="border-bottom:medium solid #E7E7E7;width:750px;">
  </div>


    <br />
    
    <table>
    <tr>
        <td> 
        <div style="width:750px;">
          <b class="gray_rounded">
          <b class="gray_rounded1"><b></b></b>
          <b class="gray_rounded2"><b></b></b>
          <b class="gray_rounded3"></b>
          <b class="gray_rounded4"></b>
          <b class="gray_rounded5"></b></b>

          <div class="gray_roundedfg">
        <table class="emotebox" cellspacing="10">
        <tr>
            <td id="currEmotion" rowspan="2">
                <center>
              <img src="http://www.rockyou.com/google_apps/emote_example/view/img/missing.gif" id="currEmoImg" class="emoImg"/><br/>
                 </center>
            </td>

            <td class="emoteInput">
              <span class="emoText">I am </span><input type="text" style="width: 330px" class="emoText" id="currEmoText" value="Happy!" /><br>
              <span style="font-size: 14px;float: left;margin-top: 5px;">Choose an emotion below to show how you're feeling!</span>
            </td>
            <td class="emoteInput">
                    <input type="hidden" id="emotionid" value="">
                    <input type="hidden" id="emoset" value="">
                    <input type="submit" id="submitEmotion" class="submitbtn" onClick="thispage.SubmitEmote()" value="Emote!" alt="Click me when you're finished!" />
            </td>
          </tr>

        </table>
        </div>

          <b class="gray_rounded">
          <b class="gray_rounded5"></b>
          <b class="gray_rounded4"></b>
          <b class="gray_rounded3"></b>
          <b class="gray_rounded2"><b></b></b>
          <b class="gray_rounded1"><b></b></b></b>

        </div>
        </td>
    </tr>
    </table>

    <div>
    <br/>
    <table>
    <tr>
        <td>

                <div style="width:750px;">
                  <b class="gray_rounded">
                  <b class="gray_rounded1"><b></b></b>
                  <b class="gray_rounded2"><b></b></b>
                  <b class="gray_rounded3"></b>
                  <b class="gray_rounded4"></b>
                  <b class="gray_rounded5"></b></b>
                
                  <div class="gray_roundedfg">
                <div class="title-text">Choose an emotion set! (Click to select)</div>

                <div id='emotionsets' style="width:700px; height:90px">Choose a Set</div>
                
                <div> </div>
                  </div>
                
                  <b class="gray_rounded">
                  <b class="gray_rounded5"></b>
                  <b class="gray_rounded4"></b>
                  <b class="gray_rounded3"></b>
                  <b class="gray_rounded2"><b></b></b>

                  <b class="gray_rounded1"><b></b></b></b>
                </div>
        </td>
    </tr>
    <tr>    
        <td>
              <br/>
                <div style="width:750px;">
                  <b class="gray_rounded">
                  <b class="gray_rounded1"><b></b></b>

                  <b class="gray_rounded2"><b></b></b>
                  <b class="gray_rounded3"></b>
                  <b class="gray_rounded4"></b>
                  <b class="gray_rounded5"></b></b>
                
                  <div class="gray_roundedfg">
                <div class="title-text">Choose an emotion! (Click to select)</div>
                <div id="emotionset" style="width:700px; height:1000px">Emote Set</div>
                <div> </div>

                  </div>
                
                  <b class="gray_rounded">
                  <b class="gray_rounded5"></b>
                  <b class="gray_rounded4"></b>
                  <b class="gray_rounded3"></b>
                  <b class="gray_rounded2"><b></b></b>
                  <b class="gray_rounded1"><b></b></b></b>
                </div>
        </td>

    </tr>
    </table>
        
    </div>
    
</div>
    
</div>
<div id='canvas-history-id' style='display: none;'>

    <link href="http://www.rockyou.com/google_apps/emote_example/view/style/common.css" rel="stylesheet" type="text/css" />
    <link href="http://www.rockyou.com/google_apps/emote_example/view/style/view.css" rel="stylesheet" type="text/css" />  

    <div id="main_body">

    
  <div id="nav_links">
    <a class="owner-only" href="javascript:goto_canvas_page('create');" style="display:none;font-family:Verdana,arial,sans-serif;font-weight:bold;">Emote Again!</a><span class="owner-only" style="display:none;">  |  </span>
    <a href="javascript:goto_canvas_page('history');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;color:#444444;">Past Emotes</a>  |  
    <a href="javascript:goto_canvas_page('friends');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;">Friends' Emotes</a>
  </div>
  
  <div style="border-bottom:medium solid #E7E7E7;width:620px;">
  </div>


        <br />
        <div class="title-text" id="history_title"></div>
        <br />
        
        <div id="history_boxes" class="panel">
            <span>Please wait while this page loads...</span>
        </div>
            
    </div>
    
</div>
<div id='canvas-friends-id' style='display: none;'>

    <link href="http://www.rockyou.com/google_apps/emote_example/view/style/common.css" rel="stylesheet" type="text/css" />
    <link href="http://www.rockyou.com/google_apps/emote_example/view/style/view.css" rel="stylesheet" type="text/css" />  
	<div style="width:620px">
	<div id="msg" style="display:none; padding:10px; text-align:center; background-color: #D9E6F7; font-size:16; margin:20px; color:#444444; margin-top:0px; -webkit-border-radius: 10px;-moz-border-radius: 10px;border-radius: 10px;">
        You've just Emoted!  Your most recent Emote will appear on your profile page.  Check out your friends' Emotes below!    </div>

    
  <div id="nav_links">
    <a class="owner-only" href="javascript:goto_canvas_page('create');" style="display:none;font-family:Verdana,arial,sans-serif;font-weight:bold;">Emote Again!</a><span class="owner-only" style="display:none;">  |  </span>
    <a href="javascript:goto_canvas_page('history');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;">Past Emotes</a>  |  
    <a href="javascript:goto_canvas_page('friends');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;color:#444444;">Friends' Emotes</a>
  </div>
  
  <div style="border-bottom:medium solid #E7E7E7;width:620px;">
  </div>


    <br />
    <div class="title-text" id="friends_title"></div>
    <br />
    
    <div id="friends_boxes" class="panel">
        <span>Please wait while this page loads...</span>
    </div>
    </div>
            
</div>
<div id='canvas-friendselector-id' style='display: none;'>

    
  <div id="nav_links">
    <a class="owner-only" href="javascript:goto_canvas_page('create');" style="display:none;font-family:Verdana,arial,sans-serif;font-weight:bold;">Emote Again!</a><span class="owner-only" style="display:none;">  |  </span>
    <a href="javascript:goto_canvas_page('history');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;">Past Emotes</a>  |  
    <a href="javascript:goto_canvas_page('friends');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;">Friends' Emotes</a>
  </div>
  
  <div style="border-bottom:medium solid #E7E7E7;width:620px;">
  </div>



    <br />
<h2>Choose friends to share how you feel!</h2>
    <br />
<input type="submit" value='Share with your friends!' onclick='thispage.FS.submit();'></input> <br /><br />
<div id='div-friendselector'></div><br /><br />
<input type="submit" value='Share with your friends!' onclick='thispage.FS.submit();'></input>



</div>
<script type="text/javascript">
    var thispage;
    var viewer_id;
    var owner_id;
    function ry_init()
    {
        var url_params = gadgets.util.getUrlParameters();
        viewer_id = url_params["gadgetViewer"];
        owner_id = url_params["gadgetOwner"];
        var default_page = "history";
        if (viewer_id == owner_id) {
            $$('.owner-only').invoke('show');
        set_install();
            default_page = "create";
        } else {
            $$('.viewer-only').invoke('show');
        }
        var prefs = gadgets.views.getParams();
        var page_params = {};
        if (typeof(prefs["pagename"]) == "undefined")
        {
          curr_page = default_page;
        }
        else {
          var page_url = prefs['pagename'];
          var page_url_parts = page_url.split("?");
          var curr_page = page_url_parts[0];
          curr_page = curr_page.replace(/.php/i, "");
          if (page_url_parts.length > 1) page_params = page_url_parts[1].toQueryParams(); // map of query parameters
        }
        
        switch (curr_page)
        {
            case "create":
              create_page.init(page_params);
              thispage = create_page;
              document.getElementById('canvas-create-id').style.display='';
                break;
            case "history":
              history_page.init(page_params);
              thispage = history_page;
              document.getElementById('canvas-history-id').style.display='';
                break;
            case "friends":
              friends_page.init(page_params);
              thispage = friends_page;
              document.getElementById('canvas-friends-id').style.display='';
                break;
            case "friendselector":
              friendselector.init(page_params);
              thispage = friendselector;
              document.getElementById('canvas-friendselector-id').style.display='';
                break;
            default:
                 if (viewer_id == owner_id) {
              create_page.init(page_params);
              thispage = create_page;
              document.getElementById('canvas-create-id').style.display='';
                 } else {
              history_page.init(page_params);
              thispage = history_page;
              document.getElementById('canvas-history-id').style.display='';
                 }
                break;
        }
    }
    
    function goto_canvas_page(page_name)
    {
        var all_views = gadgets.views.getSupportedViews();
        var canvas_view = all_views["canvas"];
        var params = { "pagename" : encodeURIComponent(page_name) };
        gadgets.views.requestNavigateTo(canvas_view, params);
    }
    
    function goto_profile_page()
    {
        var all_views = gadgets.views.getSupportedViews();
        var profile_view = all_views["profile"];
        gadgets.views.requestNavigateTo(profile_view, {});
    }
function ry_debug(intext)
            {
                document.getElementById('ry-canvas-debug').innerHTML += '<br>'+intext;


            }

    // Define console.log to be empty if firebug is not available
    if (typeof(console) == 'undefined') 
        console = new Object();
    if (typeof(console.log) == 'undefined') 
        console.log = function() { };
        
    // redefine encodeURIComponent to more closely match PHP's rawurlencode
    var origEncodeURIComponent = encodeURIComponent;

    encodeURIComponent = function(str) {
        var escaped_str = origEncodeURIComponent(str);
        escaped_str = escaped_str.replace("'", "%27");
        return escaped_str;
    };            


    function i18n_template(template, params)
    {
        // use prototype's template processing
        var t = new Template(template);
        return t.evaluate(params);
    }
    
    function genericJSONRequest(path, callback, opt_param_str)
    {
        var params = {};
        params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
        params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
        params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.GET;
        var url = "http://opensocial.rockyou.com/" + path;
        // console.log(url);

        if (opt_param_str != "undefined" && opt_param_str)
            url = url + "?" + opt_param_str;

        gadgets.io.makeRequest(url, function(response)
        {
            if (typeof response.data == "undefined")
            {
                alert("JSON Error: NO Data");
                if (response.errors)
                {
                    alert("Errors from server " + response.errors);
                }
                return;
            }
            // console.log(response);
            data = response.data;
            if (data.success == false)
                alert("Debug: JSON call failed, error_code=" + data.error_code + ", error_message " + data.error_message);
            else
                callback(data);
        }, params);
        }

        function genericJSONPost(path, callback, opt_param_str)
        {
            var params = {};
            params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
            params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
            params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
            var url = "http://opensocial.rockyou.com/" + path;

            if (opt_param_str != "undefined" && opt_param_str)
                params[gadgets.io.RequestParameters.POST_DATA] = opt_param_str;

            gadgets.io.makeRequest(url, function(response)
            {
                if (typeof response.data == "undefined")
                {
                    alert("JSON Error: NO Data");
                    if (response.errors)
                    {
                        alert("Errors from server " + response.errors);
                    }
                    return;
                }
                // console.log(response);
                data = response.data;
                if (data.success == false)
                    alert("Debug: JSON call failed, error_code=" + data.error_code + ", error_message " + data.error_message);
                else
                    callback(data);
            }, params);
        }

        function postToActivityStream(text, callback, priority, body) {
            priority = (typeof(priority) != "undefined") ? priority : opensocial.CreateActivityPriority.LOW;
            callback = (typeof(callback) != "undefined") ? callback : defaultActivityCallback;

            var params = {};
            params[opensocial.Activity.Field.TITLE] = text;
            params[opensocial.Activity.Field.BODY] = body;
            var activity = opensocial.newActivity(params);
            opensocial.requestCreateActivity(activity, priority, callback);
        }

        function defaultActivityCallback(data) {
            //output(data);
        }

        function ry_debug_response(content, error)
        {
            ry_debug(content);
            debugger;
        }
        
        // js equivalent of /includes/trackevent.php
        function createTrackEventUrl(event, url, value) 
        {
          if (event == ""){
            return url;
          }
          link = "http://opensocial.rockyou.com/events/track.php?event=" + event;
          if ((typeof(value)!="undefined") && (value != ""))
            link = link + "&value="+value;
          if (url != "")
            link = link + "&url=" + encodeURIComponent(url);
          return link;
        }

        // app install tracking   
        function set_install()
        {
           // if viewer is not owner we dont even check if this is the first time after installation
           if ( owner_id != viewer_id ){
               return;
           }
           // query appdata for the install date
           req = opensocial.newDataRequest();
           req.add(req.newFetchPersonAppDataRequest("VIEWER","install_date"), "app_data");
           req.send(handle_install);
        }

        function handle_install(data)
        {
           // debugger;
           var do_update = false;
           if (data.get("app_data").hadError())
           {
               do_update = true;
           }
           else
           {
               var viewer_data = data.get("app_data").getData();
               if ( (viewer_data[viewer_id] == undefined) || (viewer_data[viewer_id].install_date == undefined) ) {
                   do_update = true;
               }
           }
           if (do_update)
           {
               genericJSONRequest("google_apps/server/RYAppInstall.php",do_nothing_callback);
               // set installation date
               var curr_date = new Date();
               var data = curr_date.toUTCString();
               req = opensocial.newDataRequest();
               req.add(req.newUpdatePersonAppDataRequest("VIEWER", "install_date", data), "app_data");   
               req.send(do_nothing);
           } 
        }
        
        function do_nothing_callback(data){
        }
        
        function do_nothing(data){
        }
        
        
        ////////////////// 
        
                    
function ry_CreateActivity(title,body){
                var params = {};          
                params[opensocial.Activity.Field.TITLE]= title;
                params[opensocial.Activity.Field.BODY]= body;
                var actObj = opensocial.newActivity(params);  
                opensocial.requestCreateActivity(actObj, opensocial.CreateActivityPriority.HIGH,ry_CreteActivity_cb);
            };

            
function ry_CreateActivity_cb(data)
            {
            }             
function ry_SendNotification() {};            
function ry_SendEmails() {};            
function ry_SendInvitation() {};        
    var create_page = {
    
        // page variables --------------------------------------------------------------------------
    
        create_user_name : null,
        create_viewer_id : null,
        emote_icon : null,
        emote_text : null,

        
        // page methods ----------------------------------------------------------------------------
        
        init : function(page_params)
        {
        
            // this page is for gadget owners only
            if (viewer_id != owner_id)
            {
                javascript:goto_canvas_page('history');                return;
            }
            // set appropriate page height
              gadgets.window.adjustHeight(1500);
            
            // console.log(page_params);
            
            
            // console.log(viewer_id);
            // console.log(owner_id);
                        
            
            
            // lookup viewer info
            this.loadContainerData();
            
            
            // load emotion sets pane
            genericJSONRequest("google_apps/emote_example/server/getEmotionSets.php", this.setEmoteSets.bind(this));

        },
        
        loadContainerData : function()
        {
            req = opensocial.newDataRequest();
            
            // get info on viewer
            req.add(req.newFetchPersonRequest('VIEWER'), 'viewer');
            
            // console.log(this);

            // req.send(create_page.handleContainerData);
            req.send(this.handleContainerData.bind(this));
        },
        
        handleContainerData : function(data)
        {
            // console.log(data);
            // viewer data
            if (data.get("viewer").hadError())
            {
                alert("no data");
            }
            else
            {
                var viewer_data = data.get("viewer").getData();
                this.create_user_name = viewer_data.getDisplayName();
                this.create_viewer_id = viewer_data.getId();

                // load most recent emote
                // console.log(this);
                this.create_loadEmote();
            }
        },

        create_loadEmote : function()
        {
            genericJSONRequest("google_apps/emote_example/server/getEmotes.php", this.create_loadEmoteData.bind(this));
        },
        
        create_loadEmoteData : function(response)
        {
            // console.log(response);
            var content = response.return_data;
            
            if (content == "no_rows")
            {
                this.setEmoteSet("VistaIcons");
                this.selectEmotion("Vista_cool", '', "http://www.rockyou.com/images/ryemote/vista/cool.jpg", "ready to Emote!");
            }
            else
            {
                var emote_row = content[0];
                this.setEmoteSet(emote_row["emoteset"]);
                this.selectEmotion(emote_row["name"], '', emote_row["icon"], emote_row["desc"]);
            }
        },
        
        getEmoteDataObj : function(emoteSet, name, icon, desc)
        {
            var emote_data = new Object();
            emote_data.emoteSet = emoteSet;
            emote_data.name = name;
            emote_data.icon = icon;
            emote_data.desc = desc;
            
            return emote_data;
        },
        
        saveEmoteData : function(emoteSet, name, icon, desc, redirect)
        {
            var param_str = "emotionid="+name+"&text="+encodeURIComponent(desc)+"&sender="+encodeURIComponent(this.create_user_name)+"&senderid="+encodeURIComponent(this.create_viewer_id);
            genericJSONRequest("google_apps/emote_example/server/saveEmote.php?"+param_str, this.emoteSaved.bind(this));
        },
        
        emoteSaved : function()
        {

            var stream_title = " just Emoted!";
            var stream_body = "<table><tr>";
            stream_body += "<td><img src=\"" + this.emote_icon + "\" style=\"border: 1px solid #CCCCCC;padding: 3px;background-color: #FFFFFF;height:50px;width:50px;\" /></td>";
            stream_body += "<td style=\"vertical-align:center;\"><span style=\"font-family:arial,sans-serif;color:#444444;font-size:24px;\"> " + this.create_user_name + " is </span><span style=\"font-family:arial,sans-serif;color:#444444;font-size:24px;font-weight:bold;\">" + this.emote_text + "</span></td>";
            stream_body += "</tr></table>";

            // alert(stream_body);

            postToActivityStream(stream_title, this.emoteNotifyDone.bind(this), opensocial.CreateActivityPriority.HIGH, stream_body);
            
        },
        
        emoteNotifyDone : function()
        {
            goto_canvas_page('friends?msg=emoteSaved');
        },
        
        setEmoteSet : function(setname)
        {
            document.getElementById('emoset').value = setname;
            genericJSONRequest("google_apps/emote_example/server/getEmotions.php?set="+setname, this.setEmoteList.bind(this));
        },

        selectEmotion : function(name, name2, icon, desc)
        {
            document.getElementById('currEmoText').value = desc;
            document.getElementById('currEmoImg').src = icon;
            document.getElementById('emotionid').value = name;
        },

        SubmitEmote : function()
        {
            var setname = document.getElementById('emoset').value;
            this.emote_text = document.getElementById('currEmoText').value;
            this.emote_icon = document.getElementById('currEmoImg').src;
            var name = document.getElementById('emotionid').value;
            this.saveEmoteData(setname, name, this.emote_icon, this.emote_text, true);
        },

        setEmoteList : function(response)
        {
            ihtml = "";
            
            var emotes = response.return_data;
            // console.log(response);
            
            for (emote1 in emotes)
            {
                emote = emotes[emote1];
                    ihtml += "<div class=\"emotionbox\" id=\"" + emote[0] + "\" onClick=\"thispage.selectEmotion('" + emote[0] + "', '" + emote[2] + "', '" + emote[5] + "', '" + emote[4] + "')\"><img src=\"" + emote[5] + "\" /><br><span class=\"boxnames\">" + emote[4] + "</span><br></div>";        
            }
            
            document.getElementById('emotionset').innerHTML = ihtml;
        },

        setEmoteSets : function(response)
        {
            // console.log(response);
            var ihtml = "<table cellpadding='2px'><tr>";
            var emotes = response.return_data;

            // var_dump(emotes);    
            
            for (row = 0; row < emotes.length ; row ++)
            {
                    ihtml += "<td>";
                    ihtml += "<div class=\"setbox\" id=\"" + emotes[row][0] + "\" onClick=\"thispage.setEmoteSet('" + emotes[row][0] + "')\"><img width=\"50\" src=\"" + emotes[row][3] + "\" /><br><span class=\"boxnames\">" + emotes[row][1] + "</span></div>";
                    ihtml += "</td>";    
            }
            
            ihtml += "</tr></table>";
            
            document.getElementById('emotionsets').innerHTML = ihtml;

            
        }
        
    }


    var history_page = {
    
        // page variables --------------------------------------------------------------------------
    
        history_user_name : "",
        history_owner_id : "",
        
        // page methods ----------------------------------------------------------------------------

        init : function() 
        {
            // set appropriate page height
              gadgets.window.adjustHeight(900);

            this.loadContainerData();
        },
        
        loadContainerData : function()
        {
            // loop up name of owner
            req = opensocial.newDataRequest();
            req.add(req.newFetchPersonRequest('OWNER'), 'owner');
            req.send(this.handleContainerData.bind(this));
        },
        
        handleContainerData : function(data)
        {
            // owner data
            if (data.get("owner").hadError())
            {
                alert("no data");
                var disp_name = "User";
            }
            else
            {
                var owner_data = data.get("owner").getData();
                // var_dump(owner_data);
                var disp_name = owner_data.getDisplayName()
                this.history_owner_id = owner_data.getId();
            }

            // save name for display
            this.history_user_name = disp_name;                                        
            
            // update UI
            
            document.getElementById('history_title').innerHTML = i18n_template("<span class="title-text">#{name}</span>'s recent Emotes:", { name : disp_name });
            
            
            // query RY for emote rows and setup UI        
            if (typeof(this.history_owner_id ) != undefined)
                this.loadEmotes();
        },
        
        loadEmotes : function()
        {
            genericJSONRequest("google_apps/emote_example/server/getEmotes.php?limit=20&ids="+this.history_owner_id, this.loadEmoteData.bind(this));
        },

        loadEmoteData : function(response)
        {
            emote_rows = response.return_data;
            
            // console.log(emote_rows);
            // console.log(content);
            
            if (emote_rows != "no_rows")
            {
                var history_markup = "<table>";
                var i;
                var emote;
                for(i=0;i<emote_rows.length;i++) {
                    emote = emote_rows[i];
                    var uid = emote["uid"];
                    var disp_name = this.history_user_name;
                    var icon = emote["icon"];
                    if (icon == "")
                        icon = "http://www.rockyou.com/images/ryemote/vista/cool.jpg";
                    if ((i%2) == 0)
                    {
                        history_markup += "        <tr>\n";                
                    }
                    history_markup += "        <td class=\"emote\">\n";
                    history_markup += "        <div>\n";
                    history_markup += "        <table cellspacing=\"0\">\n";
                    history_markup += "        <tr>\n";
                    history_markup += "            <td valign=\"top\">\n";
                    history_markup += "              <img src=\"" + icon + "\" class=\"emoteImg\"/>\n";
                    history_markup += "            </td>\n";
                    history_markup += "            <td class=\"emoteDetail\">\n";
                    history_markup += "              <div class=\"emoteText\">";
                    history_markup += i18n_template("#{name} is <strong>#{text}</strong>", { name : this.history_user_name, text : emote["desc"] });
                    history_markup += "                </div>\n";
                    history_markup += "              <div class=\"emoteDate\">" + i18n_template("Posted #{period} ago", { period : emote["posted_str"] }) + "</div>\n";
                    history_markup += "            </td>\n";
                    history_markup += "          </tr>\n";
                    history_markup += "        </table>\n";
                    history_markup += "        </div>\n";        
                    history_markup += "        </td>\n";
                    if ((i%2) == 1)
                    {
                        history_markup += "        </tr>\n";
                    }
                }        
                history_markup += "</table>";
            }
            else
            {
                var history_markup = "No Emotes yet!";
            }
            
            document.getElementById('history_boxes').innerHTML = history_markup;
        }
    }
    


    var friends_page = {
    
        // page variables --------------------------------------------------------------------------
    
        user_name : "",
        owner_id : "",
        friends_lookup : "",
        
        // page methods ----------------------------------------------------------------------------

        init : function(params) 
        {
            // set appropriate page height
              gadgets.window.adjustHeight(1500);
            this.loadContainerData();
			if(params.msg && params.msg=='emoteSaved') {
				document.getElementById('msg').style.display='';
			}
        },
        
        loadContainerData : function()
        {
            req = opensocial.newDataRequest();
            
            // get info on friends of owner
            var params = {};
            params[opensocial.DataRequest.PeopleRequestFields.MAX] = 1000;
            req.add(req.newFetchPeopleRequest(opensocial.DataRequest.Group.OWNER_FRIENDS, params), 'friends');

            // also get info on owner        
            req.add(req.newFetchPersonRequest('OWNER'), 'owner');

            req.send(this.handleContainerData.bind(this));
        },
        
        handleContainerData : function(data)
        {
            // owner data
            if (data.get("owner").hadError())
            {
                alert("no data");
                var disp_name = "User";
            }
            else
            {
                var owner_data = data.get("owner").getData();
                var disp_name = owner_data.getDisplayName();
                this.owner_id = owner_data.getId();
            }

            // save name for display
            this.user_name = disp_name;
            
            // update UI
            document.getElementById('friends_title').innerHTML = i18n_template('Recent Emotes from friends of #{name}:', { 'name' : this.user_name });
            // document.getElementById('friends_owner_name').innerHTML = "Recent Emotes from friends of {name}:" + this.user_name;
            
            // friends info
            this.friends_lookup = new Array();
            var friend_ids = new Array();
            if (data.get("friends").hadError())
            {
                alert("no data");
            }
            else
            {
                var friends_data = data.get("friends").getData();
                var scope = this;
                friends_data.each(function(friend_data)
                    {
                        var id = friend_data.getId();
                        // strip leading 0s off of id
                        if (typeof(id) == "string")
                            id = id.replace(/^0+/, "");
                        // console.log(id);
                        var disp_name = friend_data.getDisplayName();
                        friend_ids.push(id);
                        scope.friends_lookup[id] = disp_name;
                    }
                );
            }
            
            // add owner to name lookup
            this.friends_lookup[this.owner_id] = this.user_name;
            
            // alert(owner_id);
            // friend_ids.push(this.owner_id);
            
            // query RY for emote rows and setup UI        
            this.loadEmotes(friend_ids);
        },
        
        loadEmotes : function(friend_ids)
        {
            var param_str = "limit=20";
            if (friend_ids.length > 0)
            {
                param_str += "&ids=" + friend_ids.join(",");
            }
            
            // alert(param_str);

            // first get name of user
            genericJSONPost("google_apps/emote_example/server/getEmotes.php", this.loadEmoteData.bind(this), param_str);
        },
        		
        loadEmoteData : function(response)
        {
            emote_rows = response.return_data;
            
            // console.log(emote_rows);
            // console.log(content);
            
            if (emote_rows != "no_rows")
            {
                var history_markup = "<table>";
                var i;
                var emote;
                for(i=0;i<emote_rows.length;i++) {
                    emote = emote_rows[i];
                    var uid = emote["uid"];
                    var disp_name = this.friends_lookup[uid];
                    var icon = emote["icon"];
                    if (icon == "")
                        icon = "http://www.rockyou.com/images/ryemote/vista/cool.jpg";
                    if ((i%2) == 0)
                    {
                        history_markup += "        <tr>\n";                
                    }
                    history_markup += "        <td class=\"emote\">\n";
                    history_markup += "        <div>\n";
                    history_markup += "        <table cellspacing=\"0\">\n";
                    history_markup += "        <tr>\n";
                    history_markup += "            <td valign=\"top\">\n";
                    history_markup += "              <img src=\"" + icon + "\" class=\"emoteImg\"/>\n";
                    history_markup += "            </td>\n";
                    history_markup += "            <td class=\"emoteDetail\">\n";
                    history_markup += "              <div class=\"emoteText\">";
                    history_markup += i18n_template("#{name} is <strong>#{text}</strong>", { name : disp_name, text : emote["desc"] });
                    history_markup += "                </div>\n";
                    history_markup += "              <div class=\"emoteDate\">" + i18n_template("Posted #{period} ago", { period : emote["posted_str"] }) + "</div>\n";
                    history_markup += "            </td>\n";
                    history_markup += "          </tr>\n";
                    history_markup += "        </table>\n";
                    history_markup += "        </div>\n";        
                    history_markup += "        </td>\n";
                    if ((i%2) == 1)
                    {
                        history_markup += "        </tr>\n";
                    }
                }        
                history_markup += "</table>";
            }
            else
            {
                var history_markup = "No Emotes yet!";
            }
            
            document.getElementById('friends_boxes').innerHTML = history_markup;
        }
    }

eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('8 177(99,145,81){2.139=200;2.22=40;2.101=186;2.153=45;2.152=31;2.99=99;2.167=145;2.122=81;2.12=114 113();2.96=114 113();2.9=114 113();2.25="42";2.76=0;2.16=0;2.62=0;2.74=0;2.37=1;2.72=31;2.134="";2.118=31;2.141=31;2.175=8(81){2.58=81};2.180=8(81){2.30=81};2.191=8(87){2.96=87.188(",")};2.168=8(4){6 65=2.96.57(4);3(65>=0){2.96.109(65,1);32 45}24 32 31};2.112=8(92){6 27={};27["4"]=92.160(89.156.138.190);3(2.168(27["4"]))32;27["126"]=92.171();6 100=185(92.171());27["68"]=100.172(0,1).184()+100.172(1,10).187();3(100.19>11)27["68"]+="..";27["82"]=92.160(89.156.138.176);2.12.61(27)};2.94=8(104){6 73=89.179();6 47={};47[89.115.116.181]=2.62;3(104)47[89.115.116.137]=2.139;24 47[89.115.116.137]=2.22;3(2.118)73.132(73.131(\'118\',47),\'102\');24 73.132(73.131(\'189\',47),\'102\');3(104)73.154(2.146.103(2));24 73.154(2.144.103(2))};2.144=8(90){3(90.147()){3(43(2.30)=="8")2.30(31);32}6 69=90.135(\'102\').143();6 91=69.150();3(91==0){3(43(2.30)=="8")2.30(31);32}2.74=69.182();69.140(2.112.103(2));2.62+=91;2.16=2.12.19;3(2.62>=2.74)2.72=45;3(2.72||(2.22<=2.16)){2.37=1;2.128()}3(!2.72){3(2.22>2.16){2.94(31);32}24{2.94(45);32}}24{3(43(2.30)=="8")2.30(45)}};2.146=8(90){3(90.147()){3(43(2.30)=="8")2.30(31);32}6 69=90.135(\'102\').143();6 91=69.150();3(91==0){3(43(2.30)=="8")2.30(31);32}69.140(2.112.103(2));2.62+=91;2.16=2.12.19;3((2.62<2.74)&&(2.62<2.101)){2.94(45)}24 3((2.62>=2.74)||(2.62>=2.101)){2.72=45;3(15.34(\'117\'))15.34(\'117\').54=2.16;3(15.34(\'119\'))15.34(\'119\').54=2.111();3(43(2.30)=="8")2.30(45)}};2.128=8(){6 17=(2.37-1)*2.22;6 29=((2.16-17)>=2.22)?(17+2.22):2.16;3(2.152)32;6 55=15.35("13");55.39(\'4\',\'224\');6 41=15.35("13");41.18=\'51-41-158\';55.33(41);41=15.35("13");41.39(\'4\',\'225\');41.18=\'51-41-108\';55.33(41);41=15.35("13");41.18=\'51-41-163\';55.33(41);6 56=15.35("13");56.39(\'4\',\'221\');56.18=\'51-220\';6 21=15.35("13");21.18=\'51-110-216\';21.54="<36 66=\'"+2.48(\'155\',\'\')+"\'>217 149</36> | <36 66=\'"+2.48(\'148\',\'\')+"\'>192 149</36> ";56.33(21);21=15.35("13");21.18=\'51-110\';21.39(\'133\',\'218\');3(2.153){21.54="<106><105 4=\'98\'></105></106>&93;60&93;<106><105 4=\'117\'>"+2.16+"</105></106>&93;219"}24 21.54="&93;";56.33(21);21=15.35("13");21.18=\'51-110\';21.39(\'4\',\'119\');21.39(\'133\',\'227\');21.54=2.111();56.33(21);21=15.35("13");21.39(\'4\',\'233\');21.18=\'51-110-235\';56.33(21);6 53;52(6 44=17;44<29;44++){53=15.35("13");53.39("4","121"+2.12[44].4);53.18="23-28";53.39("234",2.48("151","\\\'"+2.12[44].4+"\\\'"));53.39("232",2.48("123","\\\'"+2.12[44].4+"\\\',45"));53.39("228",2.48("123","\\\'"+2.12[44].4+"\\\',31"));53.54="<13 64=\\"23-28-229\\"></13><13 64=\\"23-28-108\\"></13><13 64=\\"23-28-230\\"></13>"+"<13 64=\\"23-28-215\\">"+"<82 214=\\""+2.12[44].82+"\\"/>"+"<173 95=\\"199:201;202:198;197-193:194;\\">"+2.12[44].68+"<161><195 4=\\"162"+2.12[44].4+"\\" 196=\\"203\\"></173>"+"<13 4=\\"124"+2.12[44].4+"\\" 64=\\"23-28-204\\">"+2.12[44].126+"</13>"+"<13 95=\\"169:159\\"></13>"+"</13>"+"<13 64=\\"23-28-211\\"></13><13 64=\\"23-28-108\\" /></13><13 64=\\"23-28-161\\"></13>";56.33(53)}21=15.35("13");21.39(\'95\',\'169: 159;\');56.33(21);55.33(56);6 38=15.35("13");38.18=\'51-38-158\';55.33(38);38=15.35("13");38.39(\'4\',\'212\');38.18=\'51-38-108\';55.33(38);38=15.35("13");38.18=\'51-38-163\';55.33(38);6 14=15.34(2.167);127(14.107){14.207(14.107)}14.33(55);14.54+="";2.97()};2.111=8(){6 49="";6 70=5;6 71;3(2.72)71=120.164(2.16/2.22);24 71=120.164(2.74/2.22);83=120.208((2.37-1)/70);130=(((83+1)*70)<71)?83+1:0;3(83>0)49+="<36 66=\'"+2.48(\'80\',(83-1)*70+1)+"\'> &165;&165; </36> ";6 75=0;52(6 7=1;7<=70;7++){75=83*70+7;3(75>71)20;3(75!=2.37)49+=" <36 66=\'"+2.48(\'80\',75)+"\'>"+75+"</36> ";24 49+=" "+75+" "}3(130>0)49+=" <36 66=\'"+2.48(\'80\',130*70+1)+"\'> &166;&166; </36>";3(2.37>1)49+="  <36 66=\'"+2.48(\'80\',2.37-1)+"\'>206</36> ";3((2.37>1)&&(2.37<71))49+="|";3(2.37<71)49+="  <36 66=\'"+2.48(\'80\',2.37+1)+"\'>205</36> ";3(49.209()=="1")49="&93;";32 49};2.48=8(53,47){6 86="210:"+2.99+"."+53+"(";3(43(47)!="213")86+=47;24 52(6 7=0;7<47.19;7++){86+=47[7];3(7<(47.19-1))86+=","}86+=");";32 86};2.67=8(4,46){6 14=15.34(\'121\'+4);15.34(\'162\'+4).46=46;6 60=15.34(\'124\'+4);3(46){60.18=60.18.77("23-28","23-79");3(14)14.18=14.18.77("23-28","23-79");14=14.107;127(14){14.18=14.18.77("23-28","23-79");14=14.157}}24{60.18=60.18.77("23-79","23-28");3(14)14.18=14.18.77("23-79","23-28");14=14.107;127(14){14.18=14.18.77("23-79","23-28");14=14.157}}};2.97=8(){6 17=(2.37-1)*2.22;6 29=((2.16-17)>=2.22)?(17+2.22):2.16;78(2.25){26"63":52(6 7=17;7<29;7++)2.67(2.12[7].4,45);20;26"42":52(6 7=17;7<29;7++)3(2.9.57(2.12[7].4)>=0)2.67(2.12[7].4,45);24 2.67(2.12[7].4,31);20;26"59":52(6 7=17;7<29;7++)3(2.9.57(2.12[7].4)>=0)2.67(2.12[7].4,31);24 2.67(2.12[7].4,45);20}3(15.34(\'98\'))15.34(\'98\').54=2.76};2.123=8(4,136){6 60=15.34(\'124\'+4);3(136)60.95.142="226";24 60.95.142="129"};2.151=8(4){6 14=15.34(\'121\'+4);46=(14.18=="23-28");3(46){78(2.25){26"42":3((2.9.19+1)==2.16){2.25="63";2.9.19=0;20}2.9.61(4);20;26"59":2.9.109(2.9.57(4),1);3(2.9.19==0)2.25="63";20}}24{78(2.25){26"63":3(2.16==1){2.25="42";2.9.19=0;20}2.25="59";2.9.19=0;2.9.61(4);20;26"42":2.9.109(2.9.57(4),1);20;26"59":3((2.9.19+1)==2.16){2.25="42";2.9.19=0;20}2.9.61(4);20}}2.67(4,46);2.88();3(15.34(\'98\'))15.34(\'98\').54=2.76;3(43(2.58)=="8")2.58({"4":4,"46":46})};2.155=8(){2.25="63";2.9.19=0;2.88();2.97();3(43(2.58)=="8")2.58({"4":"104","46":""})};2.148=8(){2.25="42";2.9.19=0;2.88();2.97();3(43(2.58)=="8")2.58({"4":"129","46":""})};2.223=8(){6 65=0;6 17=(2.37-1)*2.22;6 29=((2.16-17)>=2.22)?(17+2.22):2.16;78(2.25){26"63":3(2.16==(29-17)){2.25="42";2.9.19=0;20}2.25="59";52(6 7=17;7<29;7++){3(2.9.57(2.12[7].4)<0)2.9.61(2.12[7].4)}20;26"42":3(2.76==(29-17)){2.9.19=0;20}52(6 7=17;7<29;7++){65=2.9.57(2.12[7].4);3(65>=0)2.9.109(65,1)}20;26"59":52(6 7=17;7<29;7++){3(2.9.57(2.12[7].4)<0)2.9.61(2.12[7].4)}3(2.9.19==2.16){2.25="42";2.9.19=0}20}2.88();2.97();3(43(2.58)=="8")2.58({"4":"129","46":""})};2.88=8(){78(2.25){26"63":2.76=2.16;20;26"42":2.76=2.9.19;20;26"59":2.76=2.16-2.9.19;20}};2.222=8(84){6 27=[];6 17=(84-1)*2.22;6 29=((2.16-17)>=2.22)?(17+2.22):2.16;27=2.12.231(17,29);32 27};2.178=8(4,68,82){6 27={};27["4"]=4;27["68"]=68;27["126"]=68;27["82"]=82;2.12.61(27);2.16=2.12.19;2.9.61(4);2.88();2.96.61(4);2.134=4};2.183=8(){6 50={};3((2.141)&&(2.74>2.101+2.22)){3(2.25=="63"){50["125"]="59";50["85"]=""}24{50["125"]=2.25;50["85"]=2.9.170()}}24{50["125"]="42";78(2.25){26"63":50["85"]=2.12[0].4;52(6 7=1;7<2.12.19;7++)50["85"]+=","+2.12[7].4;20;26"59":6 87="";52(6 7=0;7<2.12.19;7++){3(2.9.57(2.12[7].4)<0){87+=","+2.12[7].4}}3(87.19>0)50["85"]=87.174(1);20;26"42":50["85"]=2.9.170();20}}3(43(2.122)=="8")2.122(50)};2.80=8(84){3((84==1)&&(!2.72)){2.94(31);32}6 17=(84-1)*2.22;6 29=((2.16-17)>=2.22)?(17+2.22):2.16;3(29>17){2.37=84;2.128()}24{3(43(2.30)=="8")2.30(31);32}}}',10,236,'||this|if|id||var|i|function|selectedItems|||aFriends|div|e|document|counter|from|className|length|break|navSelect|UIPageSize|friend|else|selectionMode|case|ret|inactive|to|optPageCallBack|false|return|appendChild|getElementById|createElement|a|UIcurPage|mainfooter|setAttribute||mainheader|INC|typeof|k|true|checked|params|GenerateFunctionLinks|sHTML|selectionObj|fs|for|f|innerHTML|box|body|indexOf|optClickCallBack|EXC|of|push|offset|ALL|class|ind|href|toggleSelection|name|vFriends|NAV_SIZE|LastPage|bDataReady|req|totalSize|j|selectedTotal|replace|switch|active|gotoPage|cb|img|prevBlock|page|ID_LIST|sLink|list|updateTotalSelected|opensocial|dataResponse|curPagesize|item|nbsp|FetchPage|style|excludeList|SetPageChecks|numberOfSelected|objName|str|MAX_DOWNLOAD_ATTEMPT|Friends|bind|all|span|strong|firstChild|m|splice|navigation|GenerateNavigation|ExtractFriendData|Array|new|DataRequest|PeopleRequestFields|numberOfTotal|VIEWER_FRIENDS|fs_navigation_pages|Math|fs_friend_|submitCallBack|namePopup|fs_of_|SELECTION_MODE|full_name|while|GeneratePageHTML|none|nextBlock|newFetchPeopleRequest|add|align|preSelectId|get|toggle|MAX|Field|CONTAINER_MAX|each|OVER_DRIVE|display|getData|FetchFriends_cb|loc|FetchAll_cb|hadError|unSelectAll|All|size|addFriend|bDownloadOnly|bToggleText|send|selectAll|Person|nextSibling|l|both|getField|br|cb_|r|ceil|lt|gt|location|filter|clear|toString|getDisplayName|substring|p|substr|setClickCallBack|THUMBNAIL_URL|FriendSelector|preSelect|newDataRequest|setPageLoadCallBack|FIRST|getTotalSize|submit|toUpperCase|String|1000|toLowerCase|split|OWNER_FRIENDS|ID|setExcludeList|Unselect|space|nowrap|input|type|white|hidden|height||45px|overflow|checkbox|namepopup|Next|Previous|removeChild|floor|strip|javascript|bl|fs_mainfooter_m_id|array|src|content|left|Select|center|Selected|mainbody|fs_mainbody_id|returnFriends|unSelectPage|fs_box_0|fs_mainheader_m_id|block|right|onmouseout|tl|tr|slice|onmouseover|fs_navigation_seperator_id|onClick|seperator'.split('|'),0,{}))
            var friendselector = {
                FS : null,
                m_text : null,
                m_sender_name : null,
                m_sender_id : null,
                init : function(params) {
                    this.m_text = params.text;
                    
                    // set appropriate page height
                      gadgets.window.adjustHeight(1000);
                    
                    req = opensocial.newDataRequest();
                    
                    // get info on viewer
                    req.add(req.newFetchPersonRequest('VIEWER'), 'viewer');
                    
                    // console.log(this);

                    // req.send(create_page.handleContainerData);
                    req.send(this.handle_container_data.bind(this));
                },
                handle_container_data : function(resp) {
                    if (resp.get("viewer").hadError())
                    {
                        this.m_sender_name = "Someone";
                    }
                    else
                    {
                        var viewer_data = resp.get("viewer").getData();
                        this.m_sender_name = viewer_data.getDisplayName();
                        this.m_sender_id = viewer_data.getId();
                    }
                    this.load_friend_selector();
                },
                load_friend_selector : function() {
                    var page = this;
                    this.FS = new FriendSelector("thispage.FS", "div-friendselector",
                        function(response){
                            var param_str = "text="+encodeURI(page.m_text)+"&friends="+response["ID_LIST"]+"&sender="+encodeURI(page.m_sender_name)+"&senderid="+page.m_sender_id;
                            genericJSONPost("google_apps/emote_example/server/processFriendSelector.php", page.process_done.bind(page), param_str);
                        }
                    );
                    this.FS.gotoPage(1);                
                },
                process_done : function(resp) {
                    goto_canvas_page('friends?msg=emoteSaved');
                }
            }
gadgets.util.registerOnLoadHandler(ry_init);
</script>
    ]]>
  </Content>
</Module>
Personal tools
communication