﻿// Copyright (c) Microsoft Corporation.  All rights reserved. 
// Use of this code is governed by the Terms of Use located at: http://dev.live.com/contactscontrol/gadgettou.aspx
// and http://dev.live.com/spacescontrol/gadgettou.aspx

registerNamespace("Microsoft.Live.Contacts");
Microsoft.Live.Contacts.baseURL="https://dev.msn.com/scripts/contacts/v0.2/";
if(!document.getElementsByTagNameNS){
document.getElementsByTagNameNS=function(ns,tag){
return this.getElementsByTagName(tag);};};
Microsoft.Live.Platform.using(["intlAPI","channelAPI"]);
Microsoft.Live.Platform.load(Microsoft.Live.Contacts.baseURL+"markets.js");
function hescq(p_str){
return p_str.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\"/g,"&quot;").replace(/\'/g,"&apos;");}
Microsoft.Live.Contacts.mainPageLoad=function(){
var ns="http://dev.live.com";
var site;
var sites=document.getElementsByTagNameNS(ns,"contactscontrol");
if((null===sites)||("undefined"===typeof sites)||(sites.length==0)){
sites=[];
var tmp=document.getElementsByTagName("*");
for(k=0;k<tmp.length;k++){
if(tmp[k].tagName.toLowerCase().indexOf(":contactscontrol")>0){
sites.push(tmp[k]);}}
if(sites.length==0){
return;}}
var nsname=null;
if("undefined"===typeof sites[0].prefix||null===sites[0].prefix){
if(document.namespaces){
for(var j=0;j<document.namespaces.length;j++){
if(document.namespaces[j].urn==ns){
nsname=document.namespaces[j].name+":";
break;}}}else{
nsname="devlive:";}}
Microsoft.Live.Platform.using(["channelAPI","intlAPI","writeAPI"],function(){
Microsoft.Live.Platform.load(Microsoft.Live.Contacts.baseURL+"markets.js",function(){
this.port=document.createElement("div");
this.port.id=Microsoft.Live.Platform.uniqueID("hport");
this.port.style.width="0px";
this.port.style.height="0px";
this.port.style.visibility="hidden";
this.port.style.display="none";
document.body.appendChild(this.port);
Microsoft.Live.Channels.Mux.register_iframe(this.port.id);
for(var i=0;i<sites.length;i++){
site=sites[i];
if("undefined"===typeof sites[0].prefix||null===sites[0].prefix){
site.getAttributeNS=function(p_ns,p_attr){
if((ns==p_ns)&&(nsname)){
return this.getAttribute(nsname+p_attr);}
if(document.namespaces){
for(var j=0;j<document.namespaces.length;j++){
if(document.namespaces[j].urn==p_ns){
return this.getAttribute(document.namespaces[j].name+":"+p_attr);}}}
return this.getAttribute(p_attr);};};
try{
var frm=document.createElement("iframe");
var view=site.getAttributeNS(ns,"view")||site.getAttribute("view")||"list";
var market=getMarket(site);
market=Microsoft.Live.Intl.computeMarket({appPref:market});
var channelURL=site.getAttributeNS(ns,"channelEndpointURL");
if((null===channelURL)||("undefined"===typeof channelURL)){
channelURL="channel.htm";}
channelURL=Microsoft.Live.Platform.expandURL("",channelURL);
frm.id=Microsoft.Live.Platform.uniqueID("contactscontrol");
frm.name=frm.id;
frm.frameBorder="0";
frm.scrolling="no";
frm.style.width="100%";
frm.style.height="100%";
frm.style.border="none";
if(view!="tile"&&view!="tilelist"){
view="list";}
if(view=="list"){
site._markets=Microsoft.Live.Contacts.listView.supportedMarkets;}else{
site._markets=Microsoft.Live.Contacts.tileView.supportedMarkets;}
site.supportedMarkets=function(){
return this._markets;}
site.supportedMarket=function(market){
if(this.supportedMarkets()[market]){
return market;}
var s=Microsoft.Live.Intl.getLanguage(market);
if(!this.supportedMarkets()[s]){
market="en";}
return market;}
var commonParams="#contextID="+encodeURIComponent(frm.id)+
"&domain="+encodeURIComponent(window.location.hostname)+
"&market="+encodeURIComponent(site.supportedMarket(market))+
"&channelEndpoint="+encodeURIComponent(channelURL)+
"&view="+encodeURIComponent(view);
var throwPrivacyURLError=false;
if(view=="list"){
var privacyURL=site.getAttributeNS(ns,"privacyStatementURL");
if((null===privacyURL)||("undefined"===typeof privacyURL)||(privacyURL.length==0)){
throwPrivacyError=true;}
privacyURL=Microsoft.Live.Platform.expandURL("",privacyURL);
var dataDesired=site.getAttributeNS(ns,"dataDesired");
frm.src=Microsoft.Live.Contacts.baseURL+"ContactSelector.html"+
commonParams+
"&policyUrl="+encodeURIComponent(privacyURL)+
"&columns="+encodeURIComponent(dataDesired);}else if(view=="tile"||view=="tilelist"){
var msg=site.getAttributeNS(ns,"message")||site.getAttribute("message");
if(("undefined"==typeof msg)||(!msg)){
msg=document.location.href;}
frm.src=Microsoft.Live.Contacts.baseURL+"PresenceIndicator.html"+
commonParams+
"&message="+encodeURIComponent(msg);}
frm.setAttribute("class","ContactsControl");
site.appendChild(frm);
Microsoft.Live.Intl.loadStrings({market:site.supportedMarket(market),
baseURL:Microsoft.Live.Contacts.baseURL,
filename:"contacts_strings.js",
onCompletion:function(){
if(throwPrivacyURLError){
loadError(site,frm,L_PrivacyStatementURLRequired_TEXT);}
checkURL(channelURL,function(status){
switch(status){
case "OK":break;
case "INACCESSIBLE":
var temp;
loadError(site,frm,L_URLInaccessible_TEXT.replace("%1","channelEndpointURL").replace("%2",hesc(channelURL)));
break;
case "HOST_MISMATCH":
loadError(site,frm,L_URLHostMismatch_TEXT.replace("%1","channelEndpointURL"));
break;
default:
loadError(site,frm,status);
break;}});
var callback=site.getAttributeNS(ns,"onData");
if(callback&&("undefined"==typeof window[callback])){
loadError(site,frm,L_FunctionNotFound_TEXT.replace("%1",callback));}
site.msgDispatch=msgDispatch;
Microsoft.Live.Channels.Mux.register_recver(frm.id,
Microsoft.Live.Contacts.baseURL+"msnchannel.htm",
function(srcname,srcurl,msg){msgDispatch(site,srcname,srcurl,msg);});
if(view=="list"){
site.write=new Microsoft.Live.Contacts.Write(channelURL,Microsoft.Live.Contacts.baseURL+"msnchannel.htm",frm.id);
site.createContacts=site.write.createContacts;
site.deleteContacts=site.write.deleteContacts;
site.commitContacts=site.write.commitContacts;
site.abortContacts=site.write.abortContacts;
site._languages=Microsoft.Live.Contacts.listView.supportedLanguages;}else{
site._languages=Microsoft.Live.Contacts.tileView.supportedLanguages;}}});}catch(e){
loadError(site,frm,e);}};});});
function supportedMarket(market){
if(Microsoft.Live.Contacts.listView.supportedMarkets[market]){
return market;}
var s=Microsoft.Live.Intl.getLanguage(market);
if(!Microsoft.Live.Contacts.listView.supportedMarkets[s]){
market="en";}
return market;}
function getMarket(obj){
var market=obj.getAttributeNS(ns,"market")||obj.getAttribute("market");
return market;}
function loadError(obj,frm,msg){
if(frm&&frm.parentNode){
frm.parentNode.removeChild(frm);
frm=null;}
var errorbox=document.createElement("P");
obj.appendChild(errorbox);
var market=Microsoft.Live.Intl.computeMarket({appPrefs:getMarket(obj)});
Microsoft.Live.Intl.loadStrings({
market:supportedMarket(market),
baseURL:Microsoft.Live.Contacts.baseURL,
filename:"contacts_strings.js",
onCompletion:function(){
msg=L_ErrorInContactsControl_TEXT.replace("%1",obj.id).replace("%2",msg);
errorbox.innerHTML=msg;
notify(obj,"onError",msg);}});}
function notify(obj,eventname){
var proc=obj.getAttributeNS(ns,eventname);
if(proc){
if(window[proc]){
if(arguments.length>2){
window[proc](arguments[2]);}else{
window[proc]();}}else{
eval(proc);}}}
function msgDispatch(obj,srcname,srcurl,msg){
var proc;
var args=msg.split(",");
if(!args){return;};
var cmd=args[0];
switch(cmd){
case "SIGN_IN":
notify(obj,"onSignin");
break;
case "SIGN_OUT":
notify(obj,"onSignout");
break;
case "COMMIT_RESULT":
var p_description=[];
if(args[1]!==""){
var errors=args[1].split("#");
for(var i=0;i<errors.length;i++){
p_description.push({});
var m=errors[i].split("&");
for(var k=0;k<m.length;k++){
p_description[i][decodeURIComponent(m[k].split("=")[0])]=decodeURIComponent(m[k].split("=")[1]);}}}
site.write.callBack(p_description);
break;
case "ERROR":
if(args.length>1){
notify(obj,"onError",decodeURIComponent(args[1]));}else{
notify(obj,"onError");}
break;
case "DATA":
proc=obj.getAttributeNS(ns,"onData");
if(proc){
var contacts=[];
for(var i=1;i<args.length;i++){
props=args[i].split("&");
if(props&&(props.length>0)&&(props[0].length>0)){
var item=new Object();
for(var j=0;j<props.length;j++){
var pair=props[j].split("=");
item[decodeURIComponent(pair[0])]=decodeURIComponent(pair[1]);}
contacts.push(item);}}
if(window[proc]){
window[proc](contacts);}else{
eval(proc);}};
break;}};
function checkURL(p_url,p_completion){
try{
var parts=p_url.split("/");
if((parts.length<=3)||(window.location.host!=parts[2])||(window.location.protocol!=parts[0])){
throw "HOST_MISMATCH";}
var x=new XMLHttpRequest();
try{
x.open("HEAD",p_url);}catch(e){
throw "INACCESSIBLE"}
x.onreadystatechange=function(){
if(x.readyState==4){
if(p_completion){
p_completion(x.status==200?"OK":"INACCESSIBLE");}}};
x.send("");}catch(e){
if(p_completion){
p_completion(e);}}};};
Microsoft.Live.Platform.addEvent(window,"load",Microsoft.Live.Contacts.mainPageLoad);

