<?xml version="1.0" encoding="UTF-8" ?>

<!-- 
Copyright (C) 2009 Vipadia Limited.  All Rights Reserved. 
Vipadia and ClackPoint are trademarks of Vipadia Limited.
-->

<Module>
  <ModulePrefs title="ClackPoint" 
               description="ClackPoint provides live audio, video and text chat for your social network. Users can call in either directly from the web page, or by using a telephone and entering a PIN.  See http://clackpoint.com/gadgets/ for details. While in beta ClackPoint is free but limitations may apply. Terms and conditions at http://clackpoint.com/terms-and-conditions/"
               thumbnail="http://files.clackpoint.com/images/thumbnail.png"
               screenshot="http://files.clackpoint.com/images/screenshot.png"

               author="Vipadia Limited"
               author_email="beta+friendconnect@clackpoint.com"
               author_location="Cambridge, UK"
               author_affiliation="Vipadia Limited"

               scrolling="true" 
               title_url="http://clackpoint.com/gadgets/"
               >

    <Require feature="opensocial-0.7" />
    <Require feature="dynamic-height" />
    <Require feature="analytics" />
    <Require feature="flash" />
    <Require feature="views" />
    <Require feature="skins" />

  </ModulePrefs>
  
  <Content type="html"> 
    <![CDATA[
        <script type="text/javascript" 
                src="http://files.clackpoint.com/plugins/swfobject.js"></script>
        <script type="text/javascript">
        if (!console) // in case no firebug
        {
            var console = {};
            console.log = function(text){return};
        }
        
        /* opensocial 0.7 compatibility */
        if (!opensocial.IdSpec) opensocial.IdSpec = opensocial.DataRequest;

        if (!VIPADIA) 
        { 
            var VIPADIA = {}; 
            VIPADIA.DEBUG = false;
        }

        dbg = function(msg)
        {
            if (VIPADIA.DEBUG) console.log(msg);
        }

        formatHex = function(i)
        {
            var s = i.toString(16);
            return ((s.length < 2) ? "0"+s : s);
        }

        rgb2hex = function(s)
        {
            if (s.charAt(0) == 'r')
            {
                var re = /rgb\(\s*([\d]{1,3})\s*,\s*([\d]{1,3})\s*,\s*([\d]{1,3})\s*\)/;
                var rgb = re.exec(s);

                var r = parseInt(rgb[1], 10);
                var g = parseInt(rgb[2], 10); 
                var b = parseInt(rgb[3], 10);
                var ret = "0X"+ formatHex(r) + formatHex(g) + formatHex(b);
            }
            else if (s.charAt(0) == '#')
            {
                var re = /#([\da-fA-F]{6})/;
                var rgb = re.exec(s);
                var ret = "0X" + rgb[1];
            }
            return ret;
        }

        VIPADIA.ClackPoint = function() 
        {
            var req = opensocial.newDataRequest();
            var nickname_ = "";
            var photo_ = "";
            return me = 
            {
                fetchCode: function(roomnumber, nickname, photo) 
                {
                    dbg("+ fetchCode: roomnumber:"+roomnumber
                        +" nickname:"+nickname+" photo:"+photo);
                        
                    nickname_ = nickname;
                    photo_ = photo;
                    var sitename = owner.getDisplayName();

                    var params = {};
                    params[gadgets.io.RequestParameters.METHOD] = 
                        gadgets.io.MethodType.POST;
                    params[gadgets.io.RequestParameters.AUTHORIZATION] = 
                        gadgets.io.AuthorizationType.SIGNED;
                    params[gadgets.io.RequestParameters.CONTENT_TYPE] = 
                        gadgets.io.ContentType.TEXT;
                    
                    params[gadgets.io.RequestParameters.POST_DATA] =
                        "nickname="+encodeURIComponent(nickname)
                        +"&photo="+photo
                        +"&sitename="+sitename

                    var url = "http://social.clackpoint.com/request-code/1/";
                    gadgets.io.makeRequest(url, me.loadAirphone, params);
               },
                                   
               loadAirphone: function(retval)
               {
                    dbg("+ loadAirphone: retval:"+retval);

                    if (!retval.data) 
                    {
                        dbg("  errors:"+retval.errors);                    
                        dbg("  text:"+retval.text);                    
                        dbg("  oauthApprovalUrl:"+retval.oauthApprovalUrl);                    
                        dbg("  oauthError:"+retval.oauthError);                    
                        dbg("  oauthErrorTexterrors:"+retval.oauthErrorText);
                        dbg("  data:"+retval.data);                    
                        return;
                    }

                    var view = gadgets.views.getCurrentView().getName();
                    var mode = (view == "canvas") ? "default" : "opensocial";
                    
                    var params = gadgets.views.getParams();
                    var bg_color = "";
                    var fg_color = "";
                    var link_color = "";
                    if ('skin' in params)
                    {
                        if ('ENDCAP_BG_COLOR' in params['skin'])
                            bg_color = params['skin']['ENDCAP_BG_COLOR'].replace(/^#/, '0X');
                        if ('CONTENT_TEXT_COLOR' in params['skin'])
                            fg_color = params['skin']['CONTENT_TEXT_COLOR'].replace(/^#/, '0X');
                        if ('CONTENT_LINK_COLOR' in params['skin'])
                            link_color = params['skin']['CONTENT_LINK_COLOR'].replace(/^#/, '0X');
                    }

                    var code = retval.data;
                    var url = "http://files.clackpoint.com/ClackPointSocial.swf"
                              +"?mode="+mode
                              +"&data_url=http://social.clackpoint.com/slides/"
                              +"&config_url=http://social.clackpoint.com/airphone-config/"
                              +"&bg_color="+bg_color
                              +"&font_color="+fg_color
                              +"&anchor_color="+link_color
                              +"&confno="+code
                              +"&photo="+photo_
                              +"&nickname="+nickname_
                              ;
                    
                    if (VIPADIA.DEBUG) url += "&chaff="+Math.random();

                    dbg("  url: '"+url+"'");
                    
                    var flashvars = {};
                    var params = {};
                    params.quality = "best";
                    params.wmode = "window";
                    params.bgcolor = "#FFFFFF";
                    var attributes = {};
                    attributes.id = "airphone-embed";
                    swfobject.embedSWF(
                        url, "airphone", "100%", "100%", "9.0.0", 
                        "http://files.clackpoint.com/plugins/expressInstall.swf", 
                        flashvars, params, attributes);

                    dbg("- loadAirphone");
                },
    
                onGetContext: function(resp) 
                {
                    dbg("+ onGetContext: resp:"+resp);

                    var o = resp.get("owner");
                    if (o.getErrorCode())
                    {
                        dbg("  owner error: "+o.getErrorMessage()
                            +" ("+o.getErrorCode()+")");
                        return;
                    }
                    owner = resp.get("owner").getData();
                    var oid = owner.getId();

                    var v = resp.get("viewer");
                    var nickname = "Guest";
                    var photo = 
                        "http://www.google.com/friendconnect/static/images/NoPictureDark.png";
                    if (!v.getErrorCode())
                    {
                        viewer = v.getData();
                        if (viewer.getId() != "_anonymous") 
                        {   // user *is* real and logged-in
                            nickname = viewer.getDisplayName();
                            photo = viewer.getField(opensocial.Person.Field.THUMBNAIL_URL);
                        }
                        dbg(" nickname:"+nickname+" photo:"+photo);
                    }
                    else
                        dbg("  viewer error: "+v.getErrorMessage()
                            +" ("+v.getErrorCode()+")");
                                    
                    me.fetchCode(oid, nickname, photo);
                    gadgets.window.adjustHeight();

                    dbg("- onGetContext");
                },

                getContext: function()
                {
                    req.add(req.newFetchPersonRequest(
                        opensocial.IdSpec.PersonId.OWNER), "owner");
                    req.add(req.newFetchPersonRequest(
                        opensocial.IdSpec.PersonId.VIEWER), "viewer");
                    req.send(me.onGetContext);
                },

                init: function()
                {
                    dbg("+ init");
                    me.getContext();
                    gadgets.window.adjustHeight();
                    dbg("- init");
                }
            };
        };

        gadgets.util.registerOnLoadHandler(function() 
            {
                dbg("+ registerOnLoadHandler");
                
                var params = gadgets.views.getParams();
                var bg_color = "";
                var font_color = "";
                if ('skin' in params)
                {
                    if ('ENDCAP_BG_COLOR' in params['skin'])
                        bg_color = params['skin']['ENDCAP_BG_COLOR'];
                    if ('CONTENT_TEXT_COLOR' in params['skin'])
                        font_color = params['skin']['CONTENT_TEXT_COLOR'];
                }

                document.getElementById("gadget").style.background = bg_color;
                document.getElementById("gadget").style.color = font_color;

                VIPADIA.ClackPoint().init();
                dbg("- registerOnLoadHandler");
            }
        );
    </script>
    
    <!-- callbacks from the ClackPoint Flash client -->
    <script type="text/javascript">
        member_enter = function()
        {
            dbg("+ member_enter");
            if (!viewer) return;

            text = viewer.getDisplayName()+" has called in to "
                   +owner.getDisplayName()+"'s ClackPoint room";

            var params = {};  
            params[opensocial.Activity.Field.TITLE] = text;

            var activity = opensocial.newActivity(params); 
            opensocial.requestCreateActivity(
                activity, opensocial.CreateActivityPriority.HIGH, onCreateActivity);

            dbg("- member_enter");
        }

        onCreateActivity = function(status) 
        {
            dbg("+ onCreateActivity: status:"+status);
            if (status.hadError())
                dbg("onCreateActivity: error!  status:"+status);
            dbg("- onCreateActivity");
        }
    </script>

    <style type="text/css">
        #airphone { padding: 0; margin: 0;
                    font-size: 10pt; font-family: Verdana,Lucida,Arial,sans-serif; 
                    line-height: 1.5;
                    text-align: center;
                    height: 500px;
                    }
    </style>
    
    <div id="gadget">
		<div id="airphone">
			<a href="http://www.adobe.com/go/getflashplayer" target="_blank">
				<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif"
                     alt="Get Adobe Flash player" />
			</a>
		</div>

        <script>
            _IG_Analytics("UA-7508653-5", "/friendconnect-1.1");
        </script>    
    </div>
    ]]>
    </Content>
</Module>
