<?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="raymond@rockyou.com" description="Offer your members a way to show how they're feeling, with an ever-growing list of emoticons." 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"><Icon>http://apps.rockyou.com/images/opensocial/icons/16x/emote16.gif</Icon>
                <Require feature="dynamic-height"/>            
                <Require feature="opensocial-0.7"/>
                <Require feature="views"/>
            
                <Require feature="skins"/>
            <ning:screenshot xmlns:ning="http://developer.ning.com/opensocial/" view="profile">http://apps.rockyou.com/images/opensocial/ryemote/ning_main.jpg</ning:screenshot><ning:screenshot xmlns:ning="http://developer.ning.com/opensocial/" view="ning.main">http://apps.rockyou.com/images/opensocial/ryemote/ning_profile.jpg</ning:screenshot></ModulePrefs>  <Content type="html" view="profile">
    <![CDATA[
    
<!-- Generated Thu Sep 2 7:23:08 PDT 2010 -->
    <!-- Begin comScore Tag -->
    <script src='http://b.scorecardresearch.com/beacon.js'></script>
    <script>
        COMSCORE.beacon({c1:7,c2:"5859724",c3:"1",c4:"",c5:"",c6:"",c15:""});
    </script>
    <noscript>
        <img src="http://b.scorecardresearch.com/p?c1=7&c2=5859724&c3=1&c4=&c5=&c6=&c15=&cj=1" />
    </noscript>
    <!-- End comScore Tag --><script src='http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js' type='text/javascript'></script>
<div id='ry-canvas-debug' style='display:none;'></div>
    <script type="text/javascript">
        document.write('<style type="text/css">');
        document.write('.page_skin {');
        bgColor = gadgets.skins.getProperty(gadgets.skins.Property.BG_COLOR);
        bgImg = gadgets.skins.getProperty(gadgets.skins.Property.BG_IMAGE);
        bgPos = gadgets.skins.getProperty(gadgets.skins.Property.BG_POSITION);
        bgRepeat = gadgets.skins.getProperty(gadgets.skins.Property.BG_REPEAT);
        txtColor = gadgets.skins.getProperty(gadgets.skins.Property.FONT_COLOR);
        linkColor = gadgets.skins.getProperty(gadgets.skins.Property.ANCHOR_COLOR);
        
        if(!bgColor) {
            bgColor = "transparent";
        }
        if (bgImg) {
            document.write('background-image: url('+bgImg+');\n');
        }
        if (bgColor) {
            document.write('background-color:' + bgColor + ';\n');
        }
        if (bgPos) {
            document.write('background-position:' + bgPos + ';\n');
        }
        if (bgRepeat) {
            document.write('background-repeat:' + bgRepeat + ';\n');
        }
        document.write('}\n');
        if (txtColor) {
            document.write('.profile_text {color: '+txtColor+';}\n');
        }
        if (linkColor) {
            document.write('.profile_link {color: '+linkColor+';}\n');
        }
        document.write('</style>');            
        document.getElementsByTagName('body')[0].style.margin = 0;
    </script>                <div class='page_skin'>

            <div id='ry_error_box' style='display: none;font-family: Verdana,Arial,Helvetica,sans-serif;font-size: 16px;background-color: #FFFFE6; border: 1px solid #CCCCCC; margin:7px; padding: 7px; text-align: center;'>
                The site is currently experiencing some issues - please try again in a few minutes!
            </div>
            <script>
    if(typeof linkColor == 'undefined')
    {
        linkColor = "#02679C";
    }
    if(typeof txtColor == 'undefined')
    {
        dateTextColor = "#BABABA";
        emoteTextColor = "#444444";
    }
    else
    {
        dateTextColor = txtColor;
        emoteTextColor = txtColor;
    }
    if(typeof bgColor == 'undefined')
    {
        bgColor = "#EEEEEE";
    }
    
    document.write(
    "<style>"+
    "a.osocial_link {color:"+ linkColor +"}"+
    ".profileEmoteDate {color:"+dateTextColor+"}"+
    ".profileEmoteText {color:"+emoteTextColor+"}"+
    "table.profileEmote {background-color:"+bgColor+"}"+
    "</style>");
</script>


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

<style>
    body {
        margin: 0px;
        padding: 0px;
    }
    
    a.osocial_link {
        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 {
        font-size:24px;
    }
    .profileEmoteHistory .profileEmoteText {
        color:#777777;
        font-size:11px;
        font-weight: bold;
    }
    .profileEmoteDate
        font-size: 18px;
    }
    .profileEmoteHistory .profileEmoteDate, .profileEmoteLink {
        font-size: 10px;
    }
    .profileNoteDate {
        color:#BABABA;
        font-size: 18px;
    }
    .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="width:100%" >
<tbody>
<tr>
    <td class="profileEmoteImg" valign="top">
    <img id='emoteImage' src="http://os.eq.rockyou.com/images/spacer.gif" class="profileEmoteImg" />
    </td>

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

</div>
<script type="text/javascript">
    var viewer_id;
    var owner_id;
    var viewer_data;
    var owner_data;
    var pre_init_tries = 0;
function pre_init_request() {
    var req = opensocial.newDataRequest();
    var viewer_id_spec = 'VIEWER'; 
    var owner_id_spec = 'OWNER'; 
    req.add(req.newFetchPersonRequest(viewer_id_spec), "viewer");
    req.add(req.newFetchPersonRequest(owner_id_spec), "owner");
    req.send(pre_init);
}

function pre_init(data)
{
    var retry = false;
    if (typeof(data) == "undefined")
    {
        retry = true;
    }
    else
    {
        if (typeof(data.get('viewer')) == 'undefined' || data.get('viewer').hadError())
        {
            viewer_id = '';
            var error_code = data.get('viewer').getErrorCode();
            if (typeof(console) != 'undefined')
            {
                console.log(error_code);
            }
            retry = (error_code == opensocial.ResponseItem.Error.INTERNAL_ERROR || error_code == opensocial.ResponseItem.Error.BAD_REQUEST);
        }
        else
        {
            viewer_data = data.get("viewer").getData();
            viewer_id = viewer_data.getId();
        }
        if (typeof(data.get('owner')) == 'undefined' || data.get('owner').hadError())
        {
            retry = true;
            owner_id = '';
        }
        else
        {
            owner_data = data.get('owner').getData();
            owner_id = owner_data.getId();
        }
    }

    pre_init_tries++;
    if (retry)
    {
        if (pre_init_tries < 2)
        {
            pre_init_request();
            return;
        }
        else
        {
            // display_ui_error_box("Oops, there are currently some issues - please try again in a few minutes!");
        }
    }

    // implement owner vs. viewer content hiding
    if (viewer_id == owner_id) {
        $$('.owner-only').invoke('show');
    } else {
        $$('.viewer-only').invoke('show');
    }
            profile_page.init();
}


    function goto_canvas_page(page_name, etcode)
    {
        var all_views = gadgets.views.getSupportedViews();
        var canvas_view = all_views["canvas"];
        var params = {};
        params["pagename"] = encodeURIComponent(page_name);
        if (typeof(etcode) == "string")
        {
            if (etcode.length > 0)
                params["_rye"] = encodeURIComponent(etcode);
        }
        gadgets.views.requestNavigateTo(canvas_view, params);
    }
    
    
function ry_debug(intext)
            {
                document.getElementById('ry-canvas-debug').style.display = 'block';
                document.getElementById('ry-canvas-debug').innerHTML += '<br>'+intext;


            }

    /**
     * singleton DIV element that is used by the escapeStringHtml() function (it is
     * never actually attached to anything and is not visible)
     */
    var escapeDiv;

    /**
     * escape all potential html special chars, including single and double quotes
     * @param mixed unsafeText pass in anything... 
     * @param boolean escapeQuotes optional if true quote characters are escaped; default true
     * @return string escaped version of str, or some escaped string representation of str if it wasn't a string
     *
     * NOTE: adapted from the String.escapeHTML method in the prototype javascript library (http://www.prototypejs.org/api/string/escapeHTML)
     *       General strategy is that we use the browser's own DOM handling to escape the text for us.
     */
    function escapeStringHtml(unsafeText, escapeQuotes)
    {
        // no text? no problem, return default "null" text
        if (!unsafeText)
            return "null";
            
        if (typeof escapeQuotes == "undefined")
            escapeQuotes = true;
        
        // check that singleton div element is available
        if (!escapeDiv)
            escapeDiv = document.createElement("div");
        
        // make sure the singleton div is empty        
        while(escapeDiv.hasChildNodes())
            escapeDiv.removeChild(escapeDiv.firstChild);

        // general strategery is that the browser will automatically escape the text inside of the
        // div, which we set in a "safe" way
        var textObj = document.createTextNode(unsafeText);
        escapeDiv.appendChild(textObj);
        
        var htmlEscapedText = escapeDiv.innerHTML;
        
        if (escapeQuotes)
        {
            // convert quote chars to html entities to protect against js injection when using dynamic text for 
            // html element property values
            htmlEscapedText = htmlEscapedText.replace(/\"/g, "&#34;");
            htmlEscapedText = htmlEscapedText.replace(/\'/g, "&#39;");
        }

        return htmlEscapedText;
    }

    /**
     * escapes the following chars with their html entity equivalents: ' " < >
     * this method is intended to be used as a "lowest common denominator" check for strings
     * should already have been escaped properly (for example, returned values from API
     * calls)
     * @param mixed unsafeText pass in anything... 
     * @return string escaped version of str, or some escaped string representation of str if it wasn't a string
     */
    function escapeStringXss(unsafeText)
    {
        // no text? no problem, return default "null" text
        if (!unsafeText)
            return "null";
        
        if (typeof unsafeText != "string")
            unsafeText = String(unsafeText);

        // escape quotes
        htmlEscapedText = unsafeText.replace(/\"/g, "&#34;");
        htmlEscapedText = htmlEscapedText.replace(/\'/g, "&#39;");
        
        // escape < >
        htmlEscapedText = htmlEscapedText.replace(/</g, "&lt;");
        htmlEscapedText = htmlEscapedText.replace(/>/g, "&gt;");

        return htmlEscapedText;
    }
    
    /*
    * @desc truncate the string after position n and add "..."
    * @param str: input string
    * @param n: integer that indicates position to truncate
    * @return: string see example
    * @example: ellipsis("swift fox jumped over lazy dog", 8) produces "swift fo..."
    */
    function ellipsis(str, n)
    {
        var newStr = str.length > n+2 ? str.substring(0, n) + "..." : str;
        return newStr;
    }

    function get_app_status(response)
    {
        var serverUnderMaintenance = response && response.error_code == "maintenance";
            
        var message = "";
        if(serverUnderMaintenance)
        {
            message = response.error_message;
        }
        var appStatus = {};
        appStatus["isDown"] = serverUnderMaintenance;
        appStatus["downtimeMessage"] = message;

        return appStatus;
    }
    
    function display_downtime_curtain(msg)
    {
    
        if (appInfo.container == "facebook.com" ||  gadgets.views.getCurrentView().isOnlyVisibleGadget())
        {
            var elem = document.getElementById("canvas_downtime_curtain");
            if (elem)
            {
                elem.style.display = "block";
                if (msg && msg.length > 0)
                    elem.innerHTML = escapeStringHtml(msg);
            }
        }
    }


    var appInfo = 
        {
            "displayTitle" : "Emote",
            "ryAppId" : "10001",
            "container" : "ning.com",
            "version" :  "100"
        };



    // 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 show_profile_failure()
    {
        document.getElementById('profile_curtain').innerHTML = "";
    }
    
    function hide_profile_curtain(opacity)
    {
        if (opacity < 0.1)
        {
            document.getElementById('profile_curtain').style.display = "none";
            return;
        }
        
        document.getElementById("profile_curtain").style.opacity=opacity;
        document.getElementById("profile_curtain").style.filter="alpha(opacity="+(opacity*100)+")";
        
        var nextOpacity = opacity - 0.5;
        var nextStmt = "hide_profile_curtain("+nextOpacity+")";
        
        setTimeout(nextStmt, 200);
    }

    /**
     * @desc width of the current view
     */    
    function get_app_width()
    {
        var width = 0;
        
        if (typeof(window.innerWidth) == 'undefined')
        {
            // IE
            width = document.body.clientWidth;
            if (typeof(width) == 'undefined' || width == 0)
            {
                width = document.documentElement.clientWidth;
            }
        }
        else
        {
            // everything but IE :-)
            width = window.innerWidth;
        }
        
        return width;
    }

    function i18n_template(template, params)
    {
        // use prototype's template processing
        var t = new Template(template);
        return t.evaluate(params);
    }
    
    function display_ui_error_box(msg)
    {
        var elem = document.getElementById("ry_error_box");
        if (typeof(elem) != "undefined")
        {
            elem.style.display = "";
            if (typeof(msg) != "undefined" && msg.length > 0)
                elem.innerHTML = msg;
        }
    }

    var Serialize = Class.create({
      initialize: function() {
          this.serialIndex = 0;
          this.serialQueue = new Array();
      },
      register: function(f, opt_cb) {
          this.serialQueue.splice(this.serialIndex,0,f);
          if (typeof opt_cb == "function")
            this.serialQueue.splice(this.serialIndex+1,0,opt_cb);
      },
      queue: function(f, opt_cb) {
          this.serialQueue.push(f);
          if (typeof opt_cb == "function")
            this.serialQueue.push(opt_cb);
      },  
      process: function() {
          if (this.serialIndex < this.serialQueue.length)
          {
              var f = this.serialQueue[this.serialIndex];
              this.serialIndex++;
              f();
          }
      }  
    });
    var sObj = new Serialize();  
    
    var m_callbacks = new Array();
    var requestCounter = 0;

    function directJSONRequest(path, callback, opt_param_str)
    {
        var s_tag = document.createElement("script");
        s_tag.type ="text/javascript";
        s_tag.charset ="utf-8";

        var url = "http://os.eq.rockyou.com/"+path;
        var key = "req"+requestCounter;
        requestCounter++;

        var d = new Date();
        var nocache = d.getTime();

        var prefs = new gadgets.Prefs();
        // Yiqi returns "shindig" in their opensocial.getEnvironment().getDomain()
        var lang_code = (opensocial.getEnvironment().getDomain()=="myspace.cn" || opensocial.getEnvironment().getDomain()=="shindig")?"zh":prefs.getLang();

        url += ((url.indexOf("?") >=0) ? "&" : "?") 
            + ((typeof(opt_param_str) == "string" && opt_param_str.length > 0) ? opt_param_str+"&" : "")
            + "key="+encodeURIComponent(key) + "&lang="+encodeURIComponent(lang_code) 
            + "&ryappid=" + encodeURIComponent(appInfo.ryAppId) + "&ryc="+ encodeURIComponent(appInfo.container)
            + "&version="+encodeURIComponent(appInfo.version) + "&nocache="+nocache; 

        m_callbacks[key] = callback;

        s_tag.src = url;

        document.getElementsByTagName("head")[0].appendChild(s_tag);
    }

    function processDirectJSON(data)
    {
        var resp = data.evalJSON(true);

        var key = resp.key;

        var appStatus = get_app_status(resp);
        if(appStatus.isDown)
        {
            display_downtime_curtain(appStatus.downtimeMessage);
        }
        else if (typeof(m_callbacks[key]) != "undefined" && m_callbacks[key] != null)
        {
            var callback = m_callbacks[key];
            callback(resp);
        }
    }

    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://os.eq.rockyou.com/" + path;
        // console.log(url);
        
        var lvip = (typeof(viewer_ip) != "undefined") ? viewer_ip : "";

        var prefs = new gadgets.Prefs();
        // Yiqi returns "shindig" in their opensocial.getEnvironment().getDomain()
        var lang_code = (opensocial.getEnvironment().getDomain()=="myspace.cn" || opensocial.getEnvironment().getDomain()=="shindig")?"zh":prefs.getLang();

        var d = new Date();
        var nocache = d.getTime();

        url += (url.indexOf("?") >=0 ? "&" : "?") 
            + ((typeof(opt_param_str) == "string" && opt_param_str.length > 0) ? opt_param_str+"&" : "")
            + "vip="+lvip + "&lang="+encodeURIComponent(lang_code) 
            + "&version="+encodeURIComponent(appInfo.version) + "&nocache="+nocache ;

        gadgets.io.makeRequest(url, function(response)
        {
            if (typeof response.data == "undefined")
            {
                display_ui_error_box("JSON Error: NO Data");
                if (response.errors)
                {
                    display_ui_error_box("Errors from server " + response.errors);
                }
                return;
            }
            // console.log(response);
            data = response.data;
            var appStatus = get_app_status(data);
            if(appStatus.isDown)
            {
                display_downtime_curtain(appStatus.downtimeMessage);
            }
            else if (data.success == false)
                display_ui_error_box("Debug: JSON call failed, error_code=" + data.error_code + ", error_message " + data.error_message);
            else
                if (typeof data.client_side != "undefined")
                {
                    var i;
                    for (i=0;i<data.client_side.length;i++)
                    {
                        eval(data.client_side[i]);
                    }
                    var f = function () {callback(data)};            
                    sObj.queue(f);
                    sObj.process();
                }
                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://os.eq.rockyou.com/" + path;

            var lvip = (typeof(vip) != "undefined") ? vip : "";

            var prefs = new gadgets.Prefs();
            // Yiqi returns "shindig" in their opensocial.getEnvironment().getDomain()
            var lang_code = (opensocial.getEnvironment().getDomain()=="myspace.cn" || opensocial.getEnvironment().getDomain()=="shindig")?"zh":prefs.getLang();

            var d = new Date();
            var nocache = d.getTime();

            var param_str = (opt_param_str  && opt_param_str.length > 0 ? opt_param_str : "")
                +"&vip="+lvip + "&lang="+encodeURIComponent(lang_code) + "&version="+encodeURIComponent(appInfo.version) + "&nocache="+nocache;

            params[gadgets.io.RequestParameters.POST_DATA] = param_str;

            gadgets.io.makeRequest(url, function(response)
            {
                if (typeof response.data == "undefined")
                {
                    display_ui_error_box("JSON Error: NO Data");
                    if (response.errors)
                    {
                        display_ui_error_box("Errors from server " + response.errors);
                    }
                    return;
                }
                // console.log(response);
                data = response.data;
                var appStatus = get_app_status(data);
                if(appStatus.isDown)
                {
                    display_downtime_curtain(appStatus.downtimeMessage);
                }
                if (data.success == false)
                    display_ui_error_box("Debug: JSON call failed, error_code=" + data.error_code + ", error_message " + data.error_message);
                else
                    if (typeof data.client_side != "undefined")
                    {
                        var i;
                        for (i=0;i<data.client_side.length;i++)
                        {
                            eval(data.client_side[i]);
                        }
                        var f = function () {callback(data)};            
                        sObj.queue(f);
                        sObj.process();
                    }
                    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://os.eq.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 && response.return_data)? response.return_data:"no_rows";
            
            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!", "Updated 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");
                display_ui_error_box("Unable to obtain owner data, please try again later.")
                  gadgets.window.adjustHeight();
;
                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>&nbsp;is <span style="font-weight:bold" id="emoteText">#{emote_text}</span>', { name : this.owner_name, emote_text : desc });
            if (typeof(posted_str) == "undefined" || posted_str.length == 0)
                posted_str = "several seconds";
            document.getElementById('posted_time').innerHTML = 
                posted_str == "Updated recently"? "Updated recently": i18n_template('Updated&nbsp;#{posted}&nbsp;ago', { posted : posted_str });
            document.getElementById('emoteImage').src = icon;
            
            // set appropriate page height
            this.adjustGagdetHeight();
        },
        adjustGagdetHeight: function()
        {
            // wait for the picture finish loading before adjusting the height
            if(document.getElementById('emoteImage').complete)
            {
                  gadgets.window.adjustHeight();
            }
            else
            {
                setTimeout(this.adjustGagdetHeight.bind(this), 10);
            }
        }
    }
    
gadgets.util.registerOnLoadHandler(pre_init_request);
</script>
    
    ]]>
  </Content>
  <Content type="html" view="canvas">
    <![CDATA[
<!-- Generated Thu Sep 2 7:23:08 PDT 2010 -->
<a name='ry_canvaspage_top'></a>
<div id='ry-canvas-debug' style='display:none;'></div>
<script src='http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js' type='text/javascript'></script>
<script src="http://os.eq.rockyou.com/google_apps/server/whoami.php?CXNID=1000017.0NXC" type="text/javascript"></script>
<link href="http://cdn.rockyou.com/apps/opensocial/css/friendselector3.css?v=200904151110" rel="stylesheet" type="text/css">
<link href="http://apps.rockyou.com/opensocial/css/canvas.css?v=200901271519" rel="stylesheet" type="text/css">
                <script type="text/javascript">
                bgColor = gadgets.skins.getProperty(gadgets.skins.Property.BG_COLOR);
                bgImg = gadgets.skins.getProperty(gadgets.skins.Property.BG_IMAGE);
                bgPos = gadgets.skins.getProperty(gadgets.skins.Property.BG_POSITION);
                bgRepeat = gadgets.skins.getProperty(gadgets.skins.Property.BG_REPEAT);
                txtColor = gadgets.skins.getProperty(gadgets.skins.Property.ANCHOR_COLOR);
                linkColor = gadgets.skins.getProperty(gadgets.skins.Property.FONT_COLOR);

                document.write('<style type="text/css">');
                document.write('body {');
                if(!bgColor) {
                    bgColor = "transparent";
                }
                if (bgImg) {
                    document.write('background-image: url('+bgImg+');\n');
                }
                if (bgColor) {
                    document.write('background-color:' + bgColor + ';\n');
                }
                if (bgPos) {
                    document.write('background-position:' + bgPos + ';\n');
                }
                if (bgRepeat) {
                    document.write('background-repeat:' + bgRepeat + ';\n');
                }
                if (txtColor) {
                    document.write('color: '+txtColor+';\n');
                }
                document.write('}\n');
                if (linkColor) {
                    document.write('body a {color: '+linkColor+';}\n');
                }
                document.write('</style>');            
                </script>
    <div id="canvas_downtime_curtain" style='display:none;width:100%;height:100%;font-family:Verdana,sans-serif;font-size:20px;margin-top:20px;text-align:center;'></div>
    <div id="canvas_curtain" class="canvas_curtain" style='display:none;'><img src="http://cdn.rockyou.com/opensocial/common/imgs/profile-curtain-loader.gif"></div>
                
            <div id='ry_error_box' style='display: none;font-family: Verdana,Arial,Helvetica,sans-serif;font-size: 16px;background-color: #FFFFE6; border: 1px solid #CCCCCC; margin:7px; padding: 7px; text-align: center;'>
                The site is currently experiencing some issues - please try again in a few minutes!
            </div>
            <style>
* {font-family:"lucida grande", tahoma, verdana, arial, sans-serif;font-size:11px;padding:0px;margin:0px;}
body {padding:0px 10px; border: none ;}
.text {font-size: 10px; }
.title-text {font-size: 12px; font-weight: bold; color: #444444;}
.navButton {font-size: 11px; color:white; background: #375c91; height:22px;}
.nav-link {font-weight:bold;}
.nav-text {font-weight:bold; color:#444444;}
a {
    text-decoration: none;
    color:#3B5998;
}
img {
    border: 0px none;
}
ul.drag {
    list-style-type: none;
    margin: 0px;
    padding: 0px;
    width: 530px;
}
li.drag {
    position: relative;
    float: left;
    margin: 0px 10px 10px 0px;
    width: 120px;
    height: 140px;
    border: 1px solid #AFAFAF;
    text-align: center;
    background-color: #fff;
    z-index:100000;
}
li.drag > div {padding:10px;position:relative;}
input.nameEdit {
    font-size: 10px;
    width: 100px;
    position: absolute; 
    top: 115; 
    left: 10;
    z-index:1000000;
}
.availFriend {cursor:pointer}
.profile_pic_small {width:50px;}
.profile_pic_big {width:100px;}
.profile_pic_big_container {overflow:hidden;width:100px;height:100px;margin-left:auto;margin-right:auto;margin-top:0px;}
#selected_friends {width:540px;overflow:hidden;background:#f2f2f2;border:1px solid #ccc}
#selected_friends > div {padding:10px}
.remove_button {z-index:20;position:absolute;top:0px;left:100px;width:20px;height:15px;background:#AFAFAF;color:white;text-align:center;border:0px;cursor:pointer;font-weight:bold}
.instructions li {font-size:10px}
.gray_rounded{display:block}
.gray_rounded *{
  display:block;
  height:1px;
  overflow:hidden;
  font-size:.01em;
  background:#e7e7e7}
.gray_rounded1{
  margin-left:3px;
  margin-right:3px;
  padding-left:1px;
  padding-right:1px;
  border-left:1px solid #f4f4f4;
  border-right:1px solid #f4f4f4;
  background:#ededed}
.gray_rounded2{
  margin-left:1px;
  margin-right:1px;
  padding-right:1px;
  padding-left:1px;
  border-left:1px solid #fcfcfc;
  border-right:1px solid #fcfcfc;
  background:#ebebeb}
.gray_rounded3{
  margin-left:1px;
  margin-right:1px;
  border-left:1px solid #ebebeb;
  border-right:1px solid #ebebeb;}
.gray_rounded4{
  border-left:1px solid #f4f4f4;
  border-right:1px solid #f4f4f4}
.gray_rounded5{
  border-left:1px solid #ededed;
  border-right:1px solid #ededed}
.gray_roundedfg{
    padding-left: 10px;
    padding-right: 10px;
  background:#e7e7e7
}
input.submitbtn {
    font-size: 18px; 
    color:white; 
    background: #375C91 url(http://apps.rockyou.com/images/opensocial/ryemote/wink.gif) no-repeat scroll right 50%; 
    height:45px;
    padding:0px 35px 0px 10px;
    border-width: 1px;
}
input.disabled_submitbtn {
    font-size: 18px; 
    color:white; 
    background: #AFAFAF url(http://apps.rockyou.com/images/opensocial/ryemote/ajax-loader.gif) no-repeat scroll 90% 50%; 
    height:45px;
    width:120px;
    padding:10px 35px 10px 10px;
    border-width: 1px;
}
input.smallbtn {
    font-size: 14px; 
    color:white; 
    background: #375C91; 
    height:25px;
    padding:0px 10px 0px 10px;
}
.featuredEmoteText {font-size: 10px; #444444; }
.featuredTitle {font-size: 12px; font-weight: bold; font-style: italic; color: #444444; }
.featuredEmoImg {
        border: 1px solid #CCCCCC;
        padding: 1px;
        background-color: #FFFFFF;
        width: 50px;
}

table.emotebox {
        /*background-color:#E7E7E7;*/
}

.emotebox td {
    vertical-align: top;
    text-align: left;
}

.emotebox td.emoteInput {
        vertical-align: middle;
        text-align: left;
}

.emoImg {
        border: 1px solid #CCCCCC;
        padding: 3px;
        background-color: #FFFFFF;
}

.emoText {
        text-align:left;
        font-size: 24px;
        color: #444444;
}

.emoteprofilelink {
        text-decoration: none;
}

input.emoText {
        border: 1px solid #bdc7d8;
        padding: 2px;
        width: 250px;
}

.notefullbox {
    background: #FFFFFF; 
    border-style: solid; 
    border-width: 1px; 
    border-color: #000000; 
    width: 400px; 
    height: 120px; 
    text-align: center;    
}

td.emoteCell {
    border: 1px solid #CCCCCC;
    background-color: #FFFFFF;
}

.emote {
    width: 285px;
    padding: 9px;
    border: 1px solid #E0E0E0;
    background-color: #FFFFFF;
}

.emoteImg {
    background-color: #FFFFFF;
    width: 50px;
}

.emoteText {
    color: #444444;
}

.emoteDetail {
    padding:0px 10px 10px;
    vertical-align:top;
}

.emoteDate {
    color:#888888;
    font-size: 10px;
}

.emoteLink {
    font-size: 10px;
}

.emoteLink a {
    font-size: 10px;
}

.panel {
    background:#F7F7F7;
    margin:0px;
    padding:5px;
    border-top: 1px solid #D8DFEA;
    border-bottom: 1px solid #D8DFEA;
    width:600px;
}.boxnames {font-family:"lucida grande", tahoma, verdana, arial, sans-serif;font-size:11px;padding:0px;margin:0px;font-weight:bold;}
.boxdesc {font-family:"lucida grande", tahoma, verdana, arial, sans-serif;font-size:11px;padding:0px;margin:0px;}
.recentnotetitle {font-family:"lucida grande", tahoma, verdana, arial, sans-serif;font-size:11px;padding:0px;margin:0px;font-weight:bold;font-style:italic;}             
.emotefulldisplay {
    background: #FFFFFF; 
    border-style: solid; 
    border-width: 1px; 
    border-color: #000000; 
    width: 400px; 
    height: 120px; 
    text-align: center;
}
.emotesmalldisplay {
    background: #FFFFFF; 
    border-style: solid; 
    border-width: 1px; 
    border-color: #000000; 
    width: 200px; 
    height: 120px; 
    text-align: center;
}
.emotefullownerdisplay {
    background: #FFFFFF; 
    border-style: solid; 
    border-width: 1px; 
    border-color: #000000; 
    width: 400px; 
    height: 120px; 
    text-align: center;
}
.emotionbox, .selectedemotionbox {
		width: 100px;
		height: 100px;
    border-style: solid; 
    border-width: 1px; 
		background-color: #FFFFFF;
    text-align: center;
    float: left;
    cursor: pointer;
    margin: 2px;
    padding: 3px;
    overflow: hidden;
}
.emotionbox {
    border-color: #CCCCCC;
}
.selectedemotionbox {
		background-color: #F58F00;
    border-color: #0062A8;
}
.emotionbox img, .selectedemotionbox img{
    border-style: solid; 
		border-width: 1px;
		border-color: #FFFFFF;
		padding: 3px;
		background-color: #FFFFFF;
		margin: 3px;
		max-width: 50px;
		_width: expression(Math.min(parseInt(this.offsetWidth), 50 ) + "px"); 
}
.selectedemotionbox img{
		border-color: #0062A8;
}
.setbox, .selectedsetbox {
    border-style: solid; 
    border-width: 1px; 
    border-color: #CCCCCC;
		background-color: #FFFFFF;
    width: 80px; 
    height: 80px; 
    text-align: center;
    vertical-align: middle;
    cursor: pointer;
}
.selectedsetbox {
		background-color: #F58F00;
    border-color: #0062A8;
}
.setbox img, .selectedsetbox img{
    border-style: solid; 
		border-width: 1px;
		border-color: #FFFFFF;
		padding: 3px;
		background-color: #FFFFFF;
		margin: 3px;
		max-width: 50px;
		_width: expression(Math.min(parseInt(this.offsetWidth), 50 ) + "px"); 
}
.selectedsetbox img{
    border-style: solid; 
		border-width: 1px;
		border-color: #0062A8;
}
body.view {
		padding: 0px;
		background-color: #E7E7E7;
}</style>

<div id='canvas-create-id' style='display: none;'>

    <div id="main_body">
    <br />
    
    

    <table>
    <tr>
        <td>

                <div style="width:710px;">
                  <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" id="nav_links">
                    <a class="owner-only" href="javascript:goto_canvas_page('');" style="display:none;font-family:Verdana,arial,sans-serif;font-weight:bold;color:#444444;">Emote Again!</a><span class="owner-only" style="display:none;">&nbsp;&nbsp;|&nbsp;&nbsp;</span>
                    <a href="javascript:goto_canvas_page('history');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;">Past Emotes</a>&nbsp;&nbsp;|&nbsp;&nbsp;
                    <a href="javascript:goto_canvas_page('friends');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;">Friends' Emotes</a>
                  </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>


    <br />
    
    <table>
    <tr>
        <td> 
        <div style="width:710px;">
          <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" style="padding:0px">
        <table class="emotebox" cellspacing="10" width="100%">
        <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&nbsp;</span><input type="text" style="width: 330" 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:710px;">
                  <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:690px; overflow:auto;">Choose a Set</div>
                
                <div>&nbsp;</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:710px;">
                  <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" style="width:710px;float:left;padding:0px;">
                  <div style="padding:0px 10px;">
                    <div class="title-text">Choose an emotion! (Click to select)</div>
                    <div id="emotionset" style="width:660px;height:1000px;">Emote Set</div>
                    <div style="clear:both">&nbsp;</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;'>

    <div id="main_body">

    

    <table>
    <tr>
        <td>

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


        <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;'>

	<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>

    

    <table>
    <tr>
        <td>

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


    <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;'>

    

    <table>
    <tr>
        <td>

                <div style="width:620px;">
                  <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" id="nav_links">
                    <a class="owner-only" href="javascript:goto_canvas_page('');" style="display:none;font-family:Verdana,arial,sans-serif;font-weight:bold;">Emote Again!</a><span class="owner-only" style="display:none;">&nbsp;&nbsp;|&nbsp;&nbsp;</span>
                    <a href="javascript:goto_canvas_page('history');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;">Past Emotes</a>&nbsp;&nbsp;|&nbsp;&nbsp;
                    <a href="javascript:goto_canvas_page('friends');" style="font-family:Verdana,arial,sans-serif;font-weight:bold;">Friends' Emotes</a>
                  </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>



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



</div>
<div id='canvas-myspace_preview-id' style='display: none;'>
                <img style='' src='http://apps.rockyou.com/images/opensocial/ryemote/preview.PNG' />                </div>
<script type="text/javascript">
    function ry_init()
    {
       set_install();
        var default_page = "history";
        if (viewer_id == owner_id) {
            $$('.owner-only').invoke('show');
            default_page = "create";
        } else {
            $$('.viewer-only').invoke('show');
        }
        var prefs = gadgets.views.getParams();
                
    var event = prefs['_rye'];
    if (typeof(event) != 'undefined' && event) 
    {
        directJSONRequest('google_apps/server/RYOpenSocialDirectTrack.php?event=' + encodeURIComponent(event), function(data) { } );
    }
                        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;
            case "myspace_preview":
              init_static_page(page_params);
              document.getElementById('canvas-myspace_preview-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, etcode)
    {
        var all_views = gadgets.views.getSupportedViews();
        var canvas_view = all_views["canvas"];
        var params = {};
        params["pagename"] = encodeURIComponent(page_name);
        if (typeof(etcode) == "string")
        {
            if (etcode.length > 0)
                params["_rye"] = encodeURIComponent(etcode);
        }
        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 scroll_page_top()
    {
    }    
            
            function ry_debug(intext)
            {
                document.getElementById('ry-canvas-debug').style.display = 'block';
                document.getElementById('ry-canvas-debug').innerHTML += '<br>'+intext;


            }

    /**
     * singleton DIV element that is used by the escapeStringHtml() function (it is
     * never actually attached to anything and is not visible)
     */
    var escapeDiv;

    /**
     * escape all potential html special chars, including single and double quotes
     * @param mixed unsafeText pass in anything... 
     * @param boolean escapeQuotes optional if true quote characters are escaped; default true
     * @return string escaped version of str, or some escaped string representation of str if it wasn't a string
     *
     * NOTE: adapted from the String.escapeHTML method in the prototype javascript library (http://www.prototypejs.org/api/string/escapeHTML)
     *       General strategy is that we use the browser's own DOM handling to escape the text for us.
     */
    function escapeStringHtml(unsafeText, escapeQuotes)
    {
        // no text? no problem, return default "null" text
        if (!unsafeText)
            return "null";
            
        if (typeof escapeQuotes == "undefined")
            escapeQuotes = true;
        
        // check that singleton div element is available
        if (!escapeDiv)
            escapeDiv = document.createElement("div");
        
        // make sure the singleton div is empty        
        while(escapeDiv.hasChildNodes())
            escapeDiv.removeChild(escapeDiv.firstChild);

        // general strategery is that the browser will automatically escape the text inside of the
        // div, which we set in a "safe" way
        var textObj = document.createTextNode(unsafeText);
        escapeDiv.appendChild(textObj);
        
        var htmlEscapedText = escapeDiv.innerHTML;
        
        if (escapeQuotes)
        {
            // convert quote chars to html entities to protect against js injection when using dynamic text for 
            // html element property values
            htmlEscapedText = htmlEscapedText.replace(/\"/g, "&#34;");
            htmlEscapedText = htmlEscapedText.replace(/\'/g, "&#39;");
        }

        return htmlEscapedText;
    }

    /**
     * escapes the following chars with their html entity equivalents: ' " < >
     * this method is intended to be used as a "lowest common denominator" check for strings
     * should already have been escaped properly (for example, returned values from API
     * calls)
     * @param mixed unsafeText pass in anything... 
     * @return string escaped version of str, or some escaped string representation of str if it wasn't a string
     */
    function escapeStringXss(unsafeText)
    {
        // no text? no problem, return default "null" text
        if (!unsafeText)
            return "null";
        
        if (typeof unsafeText != "string")
            unsafeText = String(unsafeText);

        // escape quotes
        htmlEscapedText = unsafeText.replace(/\"/g, "&#34;");
        htmlEscapedText = htmlEscapedText.replace(/\'/g, "&#39;");
        
        // escape < >
        htmlEscapedText = htmlEscapedText.replace(/</g, "&lt;");
        htmlEscapedText = htmlEscapedText.replace(/>/g, "&gt;");

        return htmlEscapedText;
    }
    
    /*
    * @desc truncate the string after position n and add "..."
    * @param str: input string
    * @param n: integer that indicates position to truncate
    * @return: string see example
    * @example: ellipsis("swift fox jumped over lazy dog", 8) produces "swift fo..."
    */
    function ellipsis(str, n)
    {
        var newStr = str.length > n+2 ? str.substring(0, n) + "..." : str;
        return newStr;
    }

    function get_app_status(response)
    {
        var serverUnderMaintenance = response && response.error_code == "maintenance";
            
        var message = "";
        if(serverUnderMaintenance)
        {
            message = response.error_message;
        }
        var appStatus = {};
        appStatus["isDown"] = serverUnderMaintenance;
        appStatus["downtimeMessage"] = message;

        return appStatus;
    }
    
    function display_downtime_curtain(msg)
    {
    
        if (appInfo.container == "facebook.com" ||  gadgets.views.getCurrentView().isOnlyVisibleGadget())
        {
            var elem = document.getElementById("canvas_downtime_curtain");
            if (elem)
            {
                elem.style.display = "block";
                if (msg && msg.length > 0)
                    elem.innerHTML = escapeStringHtml(msg);
            }
        }
    }


    var appInfo = 
        {
            "displayTitle" : "Emote",
            "ryAppId" : "10001",
            "container" : "ning.com",
            "version" :  "100"
        };



    // 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 show_profile_failure()
    {
        document.getElementById('profile_curtain').innerHTML = "";
    }
    
    function hide_profile_curtain(opacity)
    {
        if (opacity < 0.1)
        {
            document.getElementById('profile_curtain').style.display = "none";
            return;
        }
        
        document.getElementById("profile_curtain").style.opacity=opacity;
        document.getElementById("profile_curtain").style.filter="alpha(opacity="+(opacity*100)+")";
        
        var nextOpacity = opacity - 0.5;
        var nextStmt = "hide_profile_curtain("+nextOpacity+")";
        
        setTimeout(nextStmt, 200);
    }

    /**
     * @desc width of the current view
     */    
    function get_app_width()
    {
        var width = 0;
        
        if (typeof(window.innerWidth) == 'undefined')
        {
            // IE
            width = document.body.clientWidth;
            if (typeof(width) == 'undefined' || width == 0)
            {
                width = document.documentElement.clientWidth;
            }
        }
        else
        {
            // everything but IE :-)
            width = window.innerWidth;
        }
        
        return width;
    }

    function i18n_template(template, params)
    {
        // use prototype's template processing
        var t = new Template(template);
        return t.evaluate(params);
    }
    
    function display_ui_error_box(msg)
    {
        var elem = document.getElementById("ry_error_box");
        if (typeof(elem) != "undefined")
        {
            elem.style.display = "";
            if (typeof(msg) != "undefined" && msg.length > 0)
                elem.innerHTML = msg;
        }
    }

    var Serialize = Class.create({
      initialize: function() {
          this.serialIndex = 0;
          this.serialQueue = new Array();
      },
      register: function(f, opt_cb) {
          this.serialQueue.splice(this.serialIndex,0,f);
          if (typeof opt_cb == "function")
            this.serialQueue.splice(this.serialIndex+1,0,opt_cb);
      },
      queue: function(f, opt_cb) {
          this.serialQueue.push(f);
          if (typeof opt_cb == "function")
            this.serialQueue.push(opt_cb);
      },  
      process: function() {
          if (this.serialIndex < this.serialQueue.length)
          {
              var f = this.serialQueue[this.serialIndex];
              this.serialIndex++;
              f();
          }
      }  
    });
    var sObj = new Serialize();  
    
    var m_callbacks = new Array();
    var requestCounter = 0;

    function directJSONRequest(path, callback, opt_param_str)
    {
        var s_tag = document.createElement("script");
        s_tag.type ="text/javascript";
        s_tag.charset ="utf-8";

        var url = "http://os.eq.rockyou.com/"+path;
        var key = "req"+requestCounter;
        requestCounter++;

        var d = new Date();
        var nocache = d.getTime();

        var prefs = new gadgets.Prefs();
        // Yiqi returns "shindig" in their opensocial.getEnvironment().getDomain()
        var lang_code = (opensocial.getEnvironment().getDomain()=="myspace.cn" || opensocial.getEnvironment().getDomain()=="shindig")?"zh":prefs.getLang();

        url += ((url.indexOf("?") >=0) ? "&" : "?") 
            + ((typeof(opt_param_str) == "string" && opt_param_str.length > 0) ? opt_param_str+"&" : "")
            + "key="+encodeURIComponent(key) + "&lang="+encodeURIComponent(lang_code) 
            + "&ryappid=" + encodeURIComponent(appInfo.ryAppId) + "&ryc="+ encodeURIComponent(appInfo.container)
            + "&version="+encodeURIComponent(appInfo.version) + "&nocache="+nocache; 

        m_callbacks[key] = callback;

        s_tag.src = url;

        document.getElementsByTagName("head")[0].appendChild(s_tag);
    }

    function processDirectJSON(data)
    {
        var resp = data.evalJSON(true);

        var key = resp.key;

        var appStatus = get_app_status(resp);
        if(appStatus.isDown)
        {
            display_downtime_curtain(appStatus.downtimeMessage);
        }
        else if (typeof(m_callbacks[key]) != "undefined" && m_callbacks[key] != null)
        {
            var callback = m_callbacks[key];
            callback(resp);
        }
    }

    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://os.eq.rockyou.com/" + path;
        // console.log(url);
        
        var lvip = (typeof(viewer_ip) != "undefined") ? viewer_ip : "";

        var prefs = new gadgets.Prefs();
        // Yiqi returns "shindig" in their opensocial.getEnvironment().getDomain()
        var lang_code = (opensocial.getEnvironment().getDomain()=="myspace.cn" || opensocial.getEnvironment().getDomain()=="shindig")?"zh":prefs.getLang();

        var d = new Date();
        var nocache = d.getTime();

        url += (url.indexOf("?") >=0 ? "&" : "?") 
            + ((typeof(opt_param_str) == "string" && opt_param_str.length > 0) ? opt_param_str+"&" : "")
            + "vip="+lvip + "&lang="+encodeURIComponent(lang_code) 
            + "&version="+encodeURIComponent(appInfo.version) + "&nocache="+nocache ;

        gadgets.io.makeRequest(url, function(response)
        {
            if (typeof response.data == "undefined")
            {
                display_ui_error_box("JSON Error: NO Data");
                if (response.errors)
                {
                    display_ui_error_box("Errors from server " + response.errors);
                }
                return;
            }
            // console.log(response);
            data = response.data;
            var appStatus = get_app_status(data);
            if(appStatus.isDown)
            {
                display_downtime_curtain(appStatus.downtimeMessage);
            }
            else if (data.success == false)
                display_ui_error_box("Debug: JSON call failed, error_code=" + data.error_code + ", error_message " + data.error_message);
            else
                if (typeof data.client_side != "undefined")
                {
                    var i;
                    for (i=0;i<data.client_side.length;i++)
                    {
                        eval(data.client_side[i]);
                    }
                    var f = function () {callback(data)};            
                    sObj.queue(f);
                    sObj.process();
                }
                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://os.eq.rockyou.com/" + path;

            var lvip = (typeof(vip) != "undefined") ? vip : "";

            var prefs = new gadgets.Prefs();
            // Yiqi returns "shindig" in their opensocial.getEnvironment().getDomain()
            var lang_code = (opensocial.getEnvironment().getDomain()=="myspace.cn" || opensocial.getEnvironment().getDomain()=="shindig")?"zh":prefs.getLang();

            var d = new Date();
            var nocache = d.getTime();

            var param_str = (opt_param_str  && opt_param_str.length > 0 ? opt_param_str : "")
                +"&vip="+lvip + "&lang="+encodeURIComponent(lang_code) + "&version="+encodeURIComponent(appInfo.version) + "&nocache="+nocache;

            params[gadgets.io.RequestParameters.POST_DATA] = param_str;

            gadgets.io.makeRequest(url, function(response)
            {
                if (typeof response.data == "undefined")
                {
                    display_ui_error_box("JSON Error: NO Data");
                    if (response.errors)
                    {
                        display_ui_error_box("Errors from server " + response.errors);
                    }
                    return;
                }
                // console.log(response);
                data = response.data;
                var appStatus = get_app_status(data);
                if(appStatus.isDown)
                {
                    display_downtime_curtain(appStatus.downtimeMessage);
                }
                if (data.success == false)
                    display_ui_error_box("Debug: JSON call failed, error_code=" + data.error_code + ", error_message " + data.error_message);
                else
                    if (typeof data.client_side != "undefined")
                    {
                        var i;
                        for (i=0;i<data.client_side.length;i++)
                        {
                            eval(data.client_side[i]);
                        }
                        var f = function () {callback(data)};            
                        sObj.queue(f);
                        sObj.process();
                    }
                    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://os.eq.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){
                debugger;
                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_CreateActivity_cb);
            };

            function ry_CreateActivity_cb(data)
            {
                directJSONRequest('google_apps/server/RYOpenSocialDirectTrack.php?event=ning--as', function(data) {sObj.process();} );
            } 
                    
    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
            directJSONRequest("google_apps/emote_example/server/getEmotionSetsDirect.php?container=ning.com", this.setEmoteSets.bind(this));

        },
        
        dispose : function()
        {
            var btn = document.getElementById('submitEmotion');
            btn.disabled = false;
            btn.setAttribute('class', 'submitbtn');
            btn.setAttribute('className', 'submitbtn');
            
            document.getElementById('emotionset').innerHTML = 'Emote Set';
            document.getElementById('emotionsets').innerHTML = 'Choose a Set';
        },
        
        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"]);
                this.emote_text = emote_row["desc"];
                this.emote_icon = emote_row["icon"];
            }
        },
        
        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", this.emoteSaved.bind(this), param_str, true);
        },
        
        emoteSaved : function()
        {        
    goto_canvas_page('friends?msg=emoteSaved');
            
        },
        
        emoteNotifyDone : function()
        {
            goto_canvas_page('friends?msg=emoteSaved');
        },
        
        setEmoteSet : function(setname)
        {
            document.getElementById('emoset').value = setname;
            directJSONRequest("google_apps/emote_example/server/getEmotionsDirect.php?container=ning.com&set="+setname, this.setEmoteList.bind(this));
        },

        HTMLDecode: function (text)
        {
            var temp = document.createElement("div");
            temp.innerHTML = text;
            var output = temp.innerText || temp.textContent;
            temp = null;
            return output;
        },

        selectEmotion : function(name, name2, icon, desc)
        {
            document.getElementById('currEmoText').value = this.HTMLDecode(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;
            var btn = document.getElementById('submitEmotion');
            btn.disabled = true;
            btn.setAttribute('class', 'disabled_submitbtn');
            btn.setAttribute('className', 'disabled_submitbtn');
            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>";
            
            // IE workaround to get rid of vertical scrollbar
            document.getElementById('emotionsets').innerHTML = ihtml;
            if(document.getElementById('emotionsets').scrollWidth > document.getElementById('emotionsets').offsetWidth)
            {
                document.getElementById('emotionsets').style.height = (document.getElementById('emotionsets').offsetHeight + 20)+'px';
            }

            
        }
        
    }


    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();
        },
        
        dispose : function()
        {
            document.getElementById('history_boxes').innerHTML = '<span>Please wait while this page loads...</span>';
        },

        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
            
            var text = "<span class=&quot;title-text&quot;>#{name}</span>'s recent Emotes:";
            document.getElementById('history_title').innerHTML = i18n_template(text, { 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}&nbsp;is&nbsp;<strong>#{text}</strong>", { name : this.history_user_name, text : emote["desc"] });
                    history_markup += "                </div>\n";
                    history_markup += "              <div class=\"emoteDate\">" + i18n_template("Posted&nbsp;#{period}&nbsp;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='';
                
                
			}
        },
        
        
        dispose : function()
        {
            document.getElementById('friends_boxes').innerHTML = '<span>Please wait while this page loads...</span>';
            document.getElementById('msg').style.display='none';
        },

        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}&nbsp;is&nbsp;<strong>#{text}</strong>", { name : disp_name, text : emote["desc"] });
                    history_markup += "                </div>\n";
                    history_markup += "              <div class=\"emoteDate\">" + i18n_template("Posted&nbsp;#{period}&nbsp;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;
        }
    }


function FriendSelector(objName,loc,cb){this.CONTAINER_MAX=200;this.UIPageSize=40;this.FirstPageDownloadSize=40;this.MAX_DOWNLOAD_ATTEMPT=1000;this.bToggleText=true;this.bToggleSelectAll=true;this.bDownloadOnly=false;this.objName=objName;this.location=loc;this.submitCallBack=cb;this.aFriends=new Array();this.aFriendsReal=new Array();this.friendLetters=new Array();this.AppFriends=0;this.totalAppFriends=0;this.excludeList=new Array();this.selectedItems=new Array();this.selectionMode="INC";this.selectedTotal=0;this.counter=0;this.offset=0;this.totalSize=0;this.UIcurPage=1;this.bDataReady=false;this.preSelectId="";this.VIEWER_FRIENDS=false;this.OVER_DRIVE=false;this.FILTER="ALL";this.os_api_version="0.7";this.sort=true;this.setClickCallBack=function(cb)
{this.optClickCallBack=cb;};this.setPageLoadCallBack=function(cb)
{this.optPageCallBack=cb;};this.setFirstPageLoadCallBack=function(cb)
{this.optFirstPageCallBack=cb;};this.setExcludeList=function(list)
{this.excludeList=list.split(",");};this.setPreSelectList=function(list)
{this.selectionMode="INC";this.selectedItems=list.split(",");this.updateTotalSelected();};this.filter=function(id)
{var ind=this.excludeList.indexOf(id);if(ind>=0){this.excludeList.splice(ind,1);return true;}
else
return false;};this.friendComp=function(a,b)
{var aName=a["full_name"]?a["full_name"].toLowerCase():"";var bName=b["full_name"]?b["full_name"].toLowerCase():"";if(aName<bName)
{return-1;}
if(bName<aName)
{return 1;}
else
{return 0;}};this.ExtractFriendData=function(item)
{var ret={};ret["data"]=item;var id=item.getField(opensocial.Person.Field.ID)+"";var start=id.indexOf(":")>=0?id.indexOf(":")+1:0;var end=id.length;var idWithoutDomain=id.substring(start,end);ret["id"]=idWithoutDomain;if(this.excludeList.length>0&&this.filter(ret["id"]))return;ret["full_name"]=item.getDisplayName();var str=String(item.getDisplayName());ret["name"]=str.substring(0,1).toUpperCase()+str.substring(1,10).toLowerCase();if(str.length>11)
ret["name"]+="..";ret["img"]=item.getField(opensocial.Person.Field.THUMBNAIL_URL);this.aFriends.push(ret);};this.FetchAppFriends=function()
{var req=opensocial.newDataRequest();var params={};params[opensocial.DataRequest.PeopleRequestFields.FIRST]=this.AppFriends;params[opensocial.DataRequest.PeopleRequestFields.MAX]=this.CONTAINER_MAX;var isFriendster=opensocial.getEnvironment().getDomain()=="friendster.com";if(isFriendster)
{params[opensocial.DataRequest.PeopleRequestFields.FILTER]=[opensocial.DataRequest.FilterType.HAS_APP];}
else
{params[opensocial.DataRequest.PeopleRequestFields.FILTER]=opensocial.DataRequest.FilterType.HAS_APP;}
var idSpec;if(this.VIEWER_FRIENDS)
idSpec=(this.os_api_version=="0.7"?"VIEWER_FRIENDS":opensocial.newIdSpec({'userId':'VIEWER','groupId':'FRIENDS'}));else
idSpec=(this.os_api_version=="0.7"?"OWNER_FRIENDS":opensocial.newIdSpec({'userId':'OWNER','groupId':'FRIENDS'}));req.add(req.newFetchPeopleRequest(idSpec,params),'appFriends');req.send(this.FetchAppFriends_cb.bind(this));};this.ExtractId=function(item)
{this.excludeList.push(item.getField(opensocial.Person.Field.ID));};this.FetchAppFriends_cb=function(dataResponse)
{if(dataResponse.hadError()){this.FetchPage(false);return;}
var vFriends=dataResponse.get('appFriends').getData();this.totalAppFriends=vFriends.getTotalSize();var curPagesize=vFriends.size();if(curPagesize==0){this.FetchPage(false);return;}
this.AppFriends+=curPagesize;vFriends.each(this.ExtractId.bind(this));if((this.AppFriends<this.totalAppFriends)&&(this.AppFriends<this.MAX_DOWNLOAD_ATTEMPT))
this.FetchAppFriends();else
this.FetchPage(false);};this.FetchPage=function(all)
{var req=opensocial.newDataRequest();var download_size=this.UIPageSize;if(this.FirstPageDownloadSize>this.UIPageSize)
download_size=this.FirstPageDownloadSize;var params={};params[opensocial.DataRequest.PeopleRequestFields.FIRST]=this.offset;if(all)
params[opensocial.DataRequest.PeopleRequestFields.MAX]=this.CONTAINER_MAX;else
params[opensocial.DataRequest.PeopleRequestFields.MAX]=download_size;if(this.FILTER=="HAS_APP")
{if(opensocial.getEnvironment().getDomain()=="friendster.com")
{params[opensocial.DataRequest.PeopleRequestFields.FILTER]=[opensocial.DataRequest.FilterType.HAS_APP];}
else
{params[opensocial.DataRequest.PeopleRequestFields.FILTER]=opensocial.DataRequest.FilterType.HAS_APP;}}
var idSpec;if(this.VIEWER_FRIENDS)
idSpec=(this.os_api_version=="0.7"?"VIEWER_FRIENDS":opensocial.newIdSpec({'userId':'VIEWER','groupId':'FRIENDS'}));else
idSpec=(this.os_api_version=="0.7"?"OWNER_FRIENDS":opensocial.newIdSpec({'userId':'OWNER','groupId':'FRIENDS'}));req.add(req.newFetchPeopleRequest(idSpec,params),'Friends');if(all)
req.send(this.FetchAll_cb.bind(this));else
req.send(this.FetchFriends_cb.bind(this));};this.FetchFriends_cb=function(dataResponse)
{if(dataResponse.hadError()){if(typeof(this.optPageCallBack)=="function")
this.optPageCallBack(false);return;}
var vFriends=dataResponse.get('Friends').getData();var curPagesize=vFriends.size();if(curPagesize==0){if(typeof(this.optPageCallBack)=="function")
this.optPageCallBack(false);return;}
this.totalSize=vFriends.getTotalSize();vFriends.each(this.ExtractFriendData.bind(this));if(this.sort)
{this.aFriends.sort(this.friendComp);}
this.aFriendsReal=new Array();for(var i=0;i<this.aFriends.length;i++)
{this.aFriendsReal[this.aFriendsReal.length]=this.aFriends[i];var letter=this.aFriends[i]["full_name"]?this.aFriends[i]["full_name"].charAt(0).toLowerCase():"";if(this.friendLetters.indexOf(letter)==-1)
{if(letter>'z'||letter<'a')
letter='#';if(this.friendLetters.indexOf(letter)==-1)
this.friendLetters[this.friendLetters.length]=letter;}}
if(this.sort)
{this.aFriendsReal.sort(this.friendComp);}
this.friendLetters.sort();this.offset+=curPagesize;this.counter=this.aFriends.length;if(this.offset>=this.totalSize)
this.bDataReady=true;if(this.bDataReady||(this.UIPageSize<=this.counter)){this.UIcurPage=1;this.GeneratePageHTML();if(typeof(this.optFirstPageCallBack)=="function")
this.optFirstPageCallBack(true);}
if(!this.bDataReady){if(this.UIPageSize>this.counter){this.FetchPage(false);return;}
else{this.FetchPage(true);return;}}
else
{if(typeof(this.optPageCallBack)=="function")
this.optPageCallBack(true);}};this.FetchAll_cb=function(dataResponse)
{if(dataResponse.hadError()){if(typeof(this.optPageCallBack)=="function")
this.optPageCallBack(false);return;}
var vFriends=dataResponse.get('Friends').getData();var curPagesize=vFriends.size();if(curPagesize==0){if(typeof(this.optPageCallBack)=="function")
this.optPageCallBack(false);return;}
vFriends.each(this.ExtractFriendData.bind(this));if(this.sort)
{this.aFriends.sort(this.friendComp);}
this.aFriendsReal=new Array();for(var i=0;i<this.aFriends.length;i++)
{this.aFriendsReal[this.aFriendsReal.length]=this.aFriends[i];var letter=this.aFriends[i]["full_name"]?this.aFriends[i]["full_name"].charAt(0).toLowerCase():"";if(this.friendLetters.indexOf(letter)==-1)
{if(letter>'z'||letter<'a')
letter='#';if(this.friendLetters.indexOf(letter)==-1)
this.friendLetters[this.friendLetters.length]=letter;}}
if(this.sort)
{this.aFriendsReal.sort(this.friendComp);}
this.friendLetters.sort();this.offset+=curPagesize;this.counter=this.aFriends.length;if((this.offset<this.totalSize)&&(this.offset<this.MAX_DOWNLOAD_ATTEMPT)){this.FetchPage(true);}
else if((this.offset>=this.totalSize)||(this.offset>=this.MAX_DOWNLOAD_ATTEMPT)){this.bDataReady=true;if(document.getElementById('numberOfTotal'))
document.getElementById('numberOfTotal').innerHTML=this.counter;if(document.getElementById('fs_navigation_pages'))
document.getElementById('fs_navigation_pages').innerHTML=this.GenerateNavigation();if(typeof(this.optPageCallBack)=="function")
this.optPageCallBack(true);}};this.friendFilter=function(filterBy)
{this.UIcurPage=1;var input=document.getElementById('fs_friendFinderInput_id');if(!filterBy)filterBy=input.value;filterBy=filterBy.toLowerCase();this.aFriends=new Array();for(var i=0;i<this.aFriendsReal.length;i++)
{var friend=this.aFriendsReal[i];var name=friend["full_name"]?friend["full_name"].toLowerCase():"";if(name.indexOf(filterBy)!=-1)
{this.aFriends[this.aFriends.length]=friend;}}
if(this.sort)
{this.aFriends.sort(this.friendComp);}
this.counter=this.aFriends.length;this.FilterGeneratePageHTML();};this.friendFilterLetter=function(filterBy)
{this.UIcurPage=1;if(!filterBy)
{return;}
this.aFriends=new Array();for(var i=0;i<this.aFriendsReal.length;i++)
{var friend=this.aFriendsReal[i];var name=friend["full_name"]?friend["full_name"].toLowerCase():"";var letter=name.charAt(0);if((letter<'a'||letter>'z')&&filterBy=='#')
{this.aFriends[this.aFriends.length]=friend;}
else if(letter==filterBy)
{this.aFriends[this.aFriends.length]=friend;}
else if(filterBy=="all_friends")
{this.aFriends[this.aFriends.length]=friend;}}
if(this.sort)
{this.aFriends.sort(this.friendComp);}
this.counter=this.aFriends.length;this.FilterGeneratePageHTML();}
this.FilterGeneratePageHTML=function()
{var from=(this.UIcurPage-1)*this.UIPageSize;var to=((this.counter-from)>=this.UIPageSize)?(from+this.UIPageSize):this.counter;if(this.bDownloadOnly)return;var body=document.createElement("div");body.setAttribute('id','fs_mainbody_id');body.className='fs2-mainbody';var friendFinder=document.createElement("div");friendFinder.setAttribute('id','fs_friendFinder_id');body.appendChild(friendFinder);var friendFinderEl=document.createElement('div');friendFinderEl.className='fs-navigation-left';friendFinderEl.innerHTML='Name: <input type="text" id="fs_friendFinderInput_id" onkeyup="'+this.GenerateFunctionLinks('friendFilter','')+'"/></form>';friendFinder.appendChild(friendFinderEl);friendFinderEl=document.createElement('div');friendFinderEl.style.marginLeft="300px";friendFinderEl.style.padding="5px 0px";friendFinderEl.innerHTML='<a href="'+this.GenerateFunctionLinks('friendFilterLetter','\'all_friends\'')+'">All Friends</a>&nbsp;|&nbsp;';for(var i=0;i<this.friendLetters.length;i++)
{friendFinderEl.innerHTML+='<a href="'+this.GenerateFunctionLinks('friendFilterLetter','\''+this.friendLetters[i]
+'\'')+'">'+this.friendLetters[i].toUpperCase()+'</a>&nbsp;';}
friendFinder.appendChild(friendFinderEl);var navBar=document.createElement("div");navBar.className='fs-navigation-bar';var navSelect=document.createElement("div");navSelect.className='fs-navigation-left';if(this.bToggleSelectAll){navSelect.innerHTML="<a href='"+this.GenerateFunctionLinks('selectAll','')+"'>Select All</a> | <a href='"+this.GenerateFunctionLinks('unSelectAll','')+"'>Unselect All</a> ";}
else
navSelect.innerHTML="&nbsp;";navBar.appendChild(navSelect);navSelect=document.createElement("div");navSelect.className='fs-navigation';navSelect.setAttribute('align','center');if(this.bToggleText){navSelect.innerHTML="<strong><span id='numberOfSelected'></span></strong>&nbsp;/&nbsp;<strong><span id='numberOfTotal'>"+this.counter+"</span></strong>&nbsp;Selected";}
else
navSelect.innerHTML="&nbsp;";navBar.appendChild(navSelect);navSelect=document.createElement("div");navSelect.className='fs2-navigation';navSelect.setAttribute('id','fs_navigation_pages');navSelect.style.textAlign='right';navSelect.style.marginRight='10px';navSelect.innerHTML=this.GenerateNavigation();navBar.appendChild(navSelect);body.appendChild(navBar);var friendsContainer=document.createElement("div");friendsContainer.className="friends-container";var f;for(var k=from;k<to;k++){f=document.createElement("div");f.setAttribute("id","fs_friend_"+this.aFriends[k].id);f.className="friend-inactive";if(navigator.userAgent.indexOf('MISE')!=-1)
{f.onclick=this.GenerateFunctionLinks("addFriend","\'"+this.aFriends[k].id+"\'");f.onmouseover=this.GenerateFunctionLinks("namePopup","\'"+this.aFriends[k].id+"\',true");f.onmouseout=this.GenerateFunctionLinks("namePopup","\'"+this.aFriends[k].id+"\',false");}
else
{f.setAttribute("onClick",this.GenerateFunctionLinks("addFriend","\'"+this.aFriends[k].id+"\'"));f.setAttribute("onmouseover",this.GenerateFunctionLinks("namePopup","\'"+this.aFriends[k].id+"\',true"));f.setAttribute("onmouseout",this.GenerateFunctionLinks("namePopup","\'"+this.aFriends[k].id+"\',false"));}
f.innerHTML="<div class=\"friend-inactive-tl\"></div><div class=\"friend-inactive-m\"></div><div class=\"friend-inactive-tr\"></div>"+"<div class=\"friend-inactive-content\">"+"<img src=\""+this.aFriends[k].img+"\"/>"+"<p style=\"height:45px;overflow:hidden;white-space:nowrap;\">"+this.aFriends[k].name+"<br><input id=\"cb_"+this.aFriends[k].id+"\" type=\"checkbox\"></p>"+"<div id=\"fs_of_"+this.aFriends[k].id+"\" class=\"friend-inactive-namepopup\">"+this.aFriends[k].full_name+"</div>"+"<div style=\"clear:both\"></div>"+"</div>"+"<div class=\"friend-inactive-bl\"></div><div class=\"friend-inactive-m\" /></div><div class=\"friend-inactive-br\"></div>";body.appendChild(f);}
body.appendChild(friendsContainer);navSelect=document.createElement("div");navSelect.style.clear="both";body.appendChild(navSelect);var box=document.getElementById('fs_box_0');var children=box.childNodes;for(var i=0;i<children.length;i++)
{var child=children[i];if(child.id=='fs_mainbody_id')
{box.replaceChild(body,child);break;}}
this.SetPageChecks();};this.GeneratePageHTML=function()
{var from=(this.UIcurPage-1)*this.UIPageSize;var to=((this.counter-from)>=this.UIPageSize)?(from+this.UIPageSize):this.counter;if(this.bDownloadOnly)return;var box=document.createElement("div");box.setAttribute('id','fs_box_0');var mainheader=document.createElement("div");mainheader.className='fs2-mainheader-l';mainheader.innerHTML="<div class=\"spacer17x16\"></div>";box.appendChild(mainheader);mainheader=document.createElement("div");mainheader.className='fs2-mainheader-r';mainheader.innerHTML="<div class=\"spacer17x16\"></div>";box.appendChild(mainheader);mainheader=document.createElement("div");mainheader.setAttribute('id','fs_mainheader_m_id');mainheader.className='fs2-mainheader-m';mainheader.innerHTML="<div class=\"spacer17x16\"></div>";box.appendChild(mainheader);var body=document.createElement("div");body.setAttribute('id','fs_mainbody_id');body.className='fs2-mainbody';var friendFinder=document.createElement("div");friendFinder.setAttribute('id','fs_friendFinder_id');body.appendChild(friendFinder);var friendFinderEl=document.createElement('div');friendFinderEl.className='fs-navigation-left';friendFinderEl.innerHTML='Name: <input type="text" id="fs_friendFinderInput_id" onkeyup="'+this.GenerateFunctionLinks('friendFilter','')+'"/></form>';friendFinder.appendChild(friendFinderEl);friendFinderEl=document.createElement('div');friendFinderEl.style.marginLeft="300px";friendFinderEl.style.padding="5px 0px";friendFinderEl.innerHTML='<a href="'+this.GenerateFunctionLinks('friendFilterLetter','\'all_friends\'')+'">All Friends</a>&nbsp;|&nbsp;';for(var i=0;i<this.friendLetters.length;i++)
{friendFinderEl.innerHTML+='<a href="'+this.GenerateFunctionLinks('friendFilterLetter','\''+this.friendLetters[i]
+'\'')+'">'+this.friendLetters[i].toUpperCase()+'</a>&nbsp;';}
friendFinder.appendChild(friendFinderEl);var navBar=document.createElement("div");navBar.className='fs-navigation-bar';var navSelect=document.createElement("div");navSelect.className='fs-navigation-left';if(this.bToggleSelectAll){navSelect.innerHTML="<a href='"+this.GenerateFunctionLinks('selectAll','')+"'>Select All</a> | <a href='"+this.GenerateFunctionLinks('unSelectAll','')+"'>Unselect All</a> ";}
else
navSelect.innerHTML="&nbsp;";navBar.appendChild(navSelect);navSelect=document.createElement("div");navSelect.className='fs-navigation';navSelect.setAttribute('align','center');if(this.bToggleText){navSelect.innerHTML="<strong><span id='numberOfSelected'></span></strong>&nbsp;/&nbsp;<strong><span id='numberOfTotal'>"+this.counter+"</span></strong>&nbsp;Selected";}
else
navSelect.innerHTML="&nbsp;";navBar.appendChild(navSelect);navSelect=document.createElement("div");navSelect.className='fs2-navigation';navSelect.setAttribute('id','fs_navigation_pages');navSelect.style.textAlign='right';navSelect.style.marginRight='10px';navSelect.innerHTML=this.GenerateNavigation();navBar.appendChild(navSelect);body.appendChild(navBar);var friendsContainer=document.createElement("div");friendsContainer.className="friends-container";var f;for(var k=from;k<to;k++){f=document.createElement("div");body.appendChild(f);f.setAttribute("id","fs_friend_"+this.aFriends[k].id);f.className="friend-inactive";f.setAttribute("onClick",this.GenerateFunctionLinks("addFriend","\'"+this.aFriends[k].id+"\'"));f.setAttribute("onmouseover",this.GenerateFunctionLinks("namePopup","\'"+this.aFriends[k].id+"\',true"));f.setAttribute("onmouseout",this.GenerateFunctionLinks("namePopup","\'"+this.aFriends[k].id+"\',false"));f.innerHTML="<div class=\"friend-inactive-tl\"></div><div class=\"friend-inactive-m\"></div><div class=\"friend-inactive-tr\"></div>"+"<div class=\"friend-inactive-content\">"+"<img src=\""+this.aFriends[k].img+"\"/>"+"<p style=\"height:45px;overflow:hidden;white-space:nowrap;\">"+this.aFriends[k].name+"<br><input id=\"cb_"+this.aFriends[k].id+"\" type=\"checkbox\"></p>"+"<div id=\"fs_of_"+this.aFriends[k].id+"\" class=\"friend-inactive-namepopup\">"+this.aFriends[k].full_name+"</div>"+"<div style=\"clear:both\"></div>"+"</div>"+"<div class=\"friend-inactive-bl\"></div><div class=\"friend-inactive-m\" /></div><div class=\"friend-inactive-br\"></div>";}
body.appendChild(friendsContainer);navSelect=document.createElement("div");navSelect.style.clear="both";body.appendChild(navSelect);box.appendChild(body);var mainfooter=document.createElement("div");mainfooter.className='fs2-mainfooter-l';mainfooter.innerHTML="<div class=\"spacer17x16\"></div>";box.appendChild(mainfooter);mainfooter=document.createElement("div");mainfooter.className='fs2-mainfooter-r';mainfooter.innerHTML="<div class=\"spacer17x16\"></div>";box.appendChild(mainfooter);mainfooter=document.createElement("div");mainfooter.setAttribute('id','fs2_mainfooter_m_id');mainfooter.className='fs2-mainfooter-m';mainfooter.innerHTML="<div class=\"spacer17x16\"></div>";box.appendChild(mainfooter);var e=document.getElementById(this.location);while(e.firstChild){e.removeChild(e.firstChild);}
e.appendChild(box);e.innerHTML+="";this.SetPageChecks();};this.GenerateNavigation=function()
{var sHTML="";var NAV_SIZE=5;var LastPage;if(this.bDataReady)
LastPage=Math.ceil(this.counter/this.UIPageSize);else
LastPage=Math.ceil(this.totalSize/this.UIPageSize);prevBlock=Math.floor((this.UIcurPage-1)/NAV_SIZE);nextBlock=(((prevBlock+1)*NAV_SIZE)<LastPage)?prevBlock+1:0;if(prevBlock>0)
sHTML+="<a href='"+this.GenerateFunctionLinks('gotoPage',(prevBlock-1)*NAV_SIZE+1)+"'> &lt;&lt; </a> ";var j=0;for(var i=1;i<=NAV_SIZE;i++){j=prevBlock*NAV_SIZE+i;if(j>LastPage)
break;if(j!=this.UIcurPage)
sHTML+=" <a href='"+this.GenerateFunctionLinks('gotoPage',j)+"'>"+j+"</a> ";else
sHTML+=" "+j+" ";}
if(nextBlock>0)
sHTML+=" <a href='"+this.GenerateFunctionLinks('gotoPage',nextBlock*NAV_SIZE+1)+"'> &gt;&gt; </a>";if(this.UIcurPage>1)
sHTML+="  <a href='"+this.GenerateFunctionLinks('gotoPage',this.UIcurPage-1)+"'>Previous</a> ";if((this.UIcurPage>1)&&(this.UIcurPage<LastPage))
sHTML+="|";if(this.UIcurPage<LastPage)
sHTML+="  <a href='"+this.GenerateFunctionLinks('gotoPage',this.UIcurPage+1)+"'>Next</a> ";if(sHTML.strip()=="1")
sHTML="&nbsp;";return sHTML;};this.GenerateFunctionLinks=function(f,params)
{var sLink="javascript:"+this.objName+"."+f+"(";if(typeof(params)!="array")
sLink+=params;else
for(var i=0;i<params.length;i++){sLink+=params[i];if(i<(params.length-1))
sLink+=",";}
sLink+=");";return sLink;};this.toggleSelection=function(id,checked)
{var e=document.getElementById('fs_friend_'+id);var checkBox=document.getElementById('cb_'+id);if(!checkBox)
return;checkBox.checked=checked;var of=document.getElementById('fs_of_'+id);if(checked){of.className=of.className.replace("friend-inactive","friend-active");if(e)e.className=e.className.replace("friend-inactive","friend-active");e=e.firstChild;while(e){e.className=e.className.replace("friend-inactive","friend-active");e=e.nextSibling;}}
else
{of.className=of.className.replace("friend-active","friend-inactive");if(e)e.className=e.className.replace("friend-active","friend-inactive");e=e.firstChild;while(e){e.className=e.className.replace("friend-active","friend-inactive");e=e.nextSibling;}}};this.SetPageChecks=function()
{var from=(this.UIcurPage-1)*this.UIPageSize;var to=((this.counter-from)>=this.UIPageSize)?(from+this.UIPageSize):this.counter;switch(this.selectionMode){case"ALL":for(var i=from;i<to;i++)
this.toggleSelection(this.aFriends[i].id,true);break;case"INC":for(var i=from;i<to;i++)
if(this.selectedItems.indexOf(this.aFriends[i].id)>=0)
this.toggleSelection(this.aFriends[i].id,true);else
this.toggleSelection(this.aFriends[i].id,false);break;case"EXC":for(var i=from;i<to;i++)
if(this.selectedItems.indexOf(this.aFriends[i].id)>=0)
this.toggleSelection(this.aFriends[i].id,false);else
this.toggleSelection(this.aFriends[i].id,true);break;}
if(document.getElementById('numberOfSelected'))
document.getElementById('numberOfSelected').innerHTML=this.selectedTotal;};this.namePopup=function(id,toggle)
{var of=document.getElementById('fs_of_'+id);if(toggle)
of.style.display="block";else
of.style.display="none";};this.addFriend=function(id)
{var e=document.getElementById('fs_friend_'+id);checked=(e.className=="friend-inactive");if(checked)
{switch(this.selectionMode){case"INC":if((this.selectedItems.length+1)==this.counter){this.selectionMode="ALL";this.selectedItems.length=0;break;}
this.selectedItems.push(id);break;case"EXC":this.selectedItems.splice(this.selectedItems.indexOf(id),1);if(this.selectedItems.length==0)
this.selectionMode="ALL";break;}}
else
{switch(this.selectionMode){case"ALL":if(this.counter==1){this.selectionMode="INC";this.selectedItems.length=0;break;}
this.selectionMode="EXC";this.selectedItems.length=0;this.selectedItems.push(id);break;case"INC":this.selectedItems.splice(this.selectedItems.indexOf(id),1);break;case"EXC":if((this.selectedItems.length+1)==this.counter){this.selectionMode="INC";this.selectedItems.length=0;break;}
this.selectedItems.push(id);break;}}
this.toggleSelection(id,checked);this.updateTotalSelected();if(document.getElementById('numberOfSelected'))
document.getElementById('numberOfSelected').innerHTML=this.selectedTotal;if(typeof(this.optClickCallBack)=="function")
this.optClickCallBack({"id":id,"checked":checked});};this.selectAll=function()
{this.selectionMode="ALL";this.selectedItems.length=0;this.updateTotalSelected();this.SetPageChecks();if(typeof(this.optClickCallBack)=="function")
this.optClickCallBack({"id":"all","checked":""});};this.unSelectAll=function()
{this.selectionMode="INC";this.selectedItems.length=0;this.updateTotalSelected();this.SetPageChecks();if(typeof(this.optClickCallBack)=="function")
this.optClickCallBack({"id":"none","checked":""});};this.unSelectPage=function()
{var ind=0;var from=(this.UIcurPage-1)*this.UIPageSize;var to=((this.counter-from)>=this.UIPageSize)?(from+this.UIPageSize):this.counter;switch(this.selectionMode){case"ALL":if(this.counter==(to-from)){this.selectionMode="INC";this.selectedItems.length=0;break;}
this.selectionMode="EXC";for(var i=from;i<to;i++){if(this.selectedItems.indexOf(this.aFriends[i].id)<0)
this.selectedItems.push(this.aFriends[i].id);}
break;case"INC":if(this.selectedTotal==(to-from)){this.selectedItems.length=0;break;}
for(var i=from;i<to;i++){ind=this.selectedItems.indexOf(this.aFriends[i].id);if(ind>=0)
this.selectedItems.splice(ind,1);}
break;case"EXC":for(var i=from;i<to;i++){if(this.selectedItems.indexOf(this.aFriends[i].id)<0)
this.selectedItems.push(this.aFriends[i].id);}
if(this.selectedItems.length==this.counter){this.selectionMode="INC";this.selectedItems.length=0;}
break;}
this.updateTotalSelected();this.SetPageChecks();if(typeof(this.optClickCallBack)=="function")
this.optClickCallBack({"id":"none","checked":""});};this.updateTotalSelected=function()
{switch(this.selectionMode){case"ALL":this.selectedTotal=this.counter;break;case"INC":this.selectedTotal=this.selectedItems.length;break;case"EXC":this.selectedTotal=this.counter-this.selectedItems.length;break;}};this.returnFriends=function(page)
{var ret=[];var from=(page-1)*this.UIPageSize;var to=((this.counter-from)>=this.UIPageSize)?(from+this.UIPageSize):this.counter;ret=this.aFriends.slice(from,to);return ret;};this.returnPersonObject=function(id)
{for(var i=0;i<this.counter;i++)
if(this.aFriends[i].id==id){return this.aFriends[i].data;}};this.preSelect=function(id,name,img)
{var ret={};ret["id"]=id;ret["name"]=name;ret["full_name"]=name;ret["img"]=img;this.aFriends.push(ret);this.counter=this.aFriends.length;this.selectedItems.push(id);this.updateTotalSelected();this.excludeList.push(id);this.preSelectId=id;};this.submit=function()
{var selectionObj={};if((this.OVER_DRIVE)&&(this.totalSize>this.MAX_DOWNLOAD_ATTEMPT+this.UIPageSize))
{if(this.selectionMode=="ALL"){selectionObj["SELECTION_MODE"]="EXC";selectionObj["ID_LIST"]="";}
else{selectionObj["SELECTION_MODE"]=this.selectionMode;selectionObj["ID_LIST"]=this.selectedItems.toString();}}
else
{selectionObj["SELECTION_MODE"]="INC";switch(this.selectionMode){case"ALL":selectionObj["ID_LIST"]=this.aFriends[0].id;for(var i=1;i<this.aFriends.length;i++)
selectionObj["ID_LIST"]+=","+this.aFriends[i].id;break;case"EXC":var list="";for(var i=0;i<this.aFriends.length;i++){if(this.selectedItems.indexOf(this.aFriends[i].id)<0){list+=","+this.aFriends[i].id;}}
if(list.length>0)
selectionObj["ID_LIST"]=list.substr(1);break;case"INC":selectionObj["ID_LIST"]=this.selectedItems.toString();break;}}
if(typeof(this.submitCallBack)=="function")
this.submitCallBack(selectionObj);};this.removePerson=function(id)
{for(var i=0;i<this.counter;i++)
if(this.aFriends[i].id==id){this.aFriends.splice(i,1);this.counter=this.aFriends.length;return;}};this.gotoPage=function(page)
{if((page==1)&&(!this.bDataReady)){if(this.FILTER=="HAS_NOT_APP")
this.FetchAppFriends();else
this.FetchPage(false);return;}
var from=(page-1)*this.UIPageSize;var to=((this.counter-from)>=this.UIPageSize)?(from+this.UIPageSize):this.counter;if(to>from){this.UIcurPage=page;this.FilterGeneratePageHTML();}
else
{if(typeof(this.optPageCallBack)=="function")
this.optPageCallBack(false);return;}};}            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));
                },
                send_viral_message : function(selectionJSON)
                {
                    var container = opensocial.getEnvironment().getDomain();
                    if(container == "myspace.cn")
                    {
                        // TODO: temporary special case for myspace.cn
                        var toid = selectionJSON.ID_LIST.split(",");
                        var title = 'Share your emotion!';
                        var body = '';
                        var param_str = "toid="+toid+"&title="+encodeURIComponent(title)+"&text="+encodeURIComponent(body)+"&sender="+encodeURIComponent(this.create_user_name)+"&senderid="+encodeURIComponent(this.create_viewer_id);
                        var message = opensocial.newMessage(body);
                        opensocial.requestShareApp(toid,message, thispage.process_done.bind(thispage));
                    }
                    else
                    {
                        var param_str = "text="+encodeURI(thispage.m_text)+"&friends="+selectionJSON["ID_LIST"]+"&sender="+encodeURI(thispage.m_sender_name)+"&senderid="+thispage.m_sender_id;
                        genericJSONPost("google_apps/emote_example/server/processFriendSelector.php", thispage.process_done.bind(thispage), param_str);
                    } 
                }
                ,
                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",  this.send_viral_message.bind(this));
                    this.FS.gotoPage(1);                
                },
                process_done : function(resp) {
                    goto_canvas_page('friends');
                }
            }

    function init_static_page()
    {
        // do nothing
    }


            
    var thispage;
    var viewer_id;
    var owner_id;
    var viewer_data;
    var owner_data;

    function pre_init_request()
    {
        req = opensocial.newDataRequest();
        var viewer_id_spec = 'VIEWER';
        var owner_id_spec = 'OWNER';
        req.add(req.newFetchPersonRequest(viewer_id_spec), "viewer");
        req.add(req.newFetchPersonRequest(owner_id_spec), "owner");
        req.send(pre_init);
        
    }
    
    function pre_init(data)
    {
        viewer_data = data.get('viewer').getData();
        owner_data = data.get('owner').getData();
        viewer_id = viewer_data.getId();
        owner_id = owner_data.getId();
        
        ry_init();
    }
    
    function load_app_feeds()
    {
        genericJSONRequest('google_apps/server/getAppFeeds.php', load_app_feeds_cb);
    }
    
    function load_app_feeds_cb(response)
    {
        var feed_data = response.return_data;
        if(feed_data && feed_data != 'no_rows')
        {
            // render feed data 
            document.getElementById('RYAppFeed').innerHTML = 'hello';
            //var emote = emote_data[0];
            //current_emote = emote.desc;
        }
        
    }
    
            gadgets.util.registerOnLoadHandler(pre_init_request);
</script>

<iframe src='http://os.eq.rockyou.com/google_apps/server/ning_ga.html?a=emote' style='height:1px;width:1px;border:0px;'></iframe>

            <script type='text/javascript'>
            
            var gaTrackerUrl = 'http://os.eq.rockyou.com/google_apps/server/tracker.html?b=1';
            
            </script>
            
            <div id='trackerDiv'><iframe id='trackerIframe' src='http://os.eq.rockyou.com/google_apps/server/tracker.html?b=1' style='height:1px;width:1px;border:0px;'></iframe></div>
    ]]>
  </Content>
</Module>
