[mashup-dev] svn commit r14622 - trunk/mashup/java/modules/www/js
svn at wso2.org
svn at wso2.org
Sun Mar 9 23:08:14 PDT 2008
Author: tyrell
Date: Sun Mar 9 23:08:10 2008
New Revision: 14622
Log:
Fixing MASHUP-713
Added:
trunk/mashup/java/modules/www/js/InformationCards.js
Added: trunk/mashup/java/modules/www/js/InformationCards.js
==============================================================================
--- (empty file)
+++ trunk/mashup/java/modules/www/js/InformationCards.js Sun Mar 9 23:08:10 2008
@@ -0,0 +1,443 @@
+/*
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ *
+ * This code is licensed under the Microsoft Permissive License (Ms-PL)
+ *
+ * SEE: http://www.microsoft.com/resources/sharedsource/licensingbasics/permissivelicense.mspx
+ *
+ * or the EULA.TXT file that comes with this software.
+ */
+
+var BrowserUtility= {
+ /// <summary>
+ /// This closure exposes some low-level browser functionality.
+ /// </summary>
+ ///
+ GetElementsByClass :function(cssClass, node, tag) {
+ /// <summary>
+ /// gets all the elements of a given class and returns them as an array.
+ /// </summary>
+ ///
+ /// <param name="cssClass">the class to search for</param>
+ /// <param name="node">the node to start with. (defaults to document)</param>
+ /// <param name="tag">the tag type to scope to (defaults to all tags)</param>
+ ///
+ /// <returns>array of requested elements</returns>
+
+ var result = new Array();
+ var els = (node?node:document).getElementsByTagName(tag?tag:'*');
+ var pattern = new RegExp("(^|\\s)" + cssClass + "(\\s|$)");
+ for(each in els)
+ if(pattern.test(els[each].className))
+ result[result.length] = els[each];
+
+ return result;
+ },
+
+
+ ShowClass :function(classname) {
+ /// <summary>
+ /// Shows elements by class name
+ /// </summary>
+ ///
+ /// <param name="classname">the css class to show</param>
+ var elements = this.GetElementsByClass(classname);
+ for(each in elements)
+ elements[each].style.display = 'block';
+ },
+
+ HideClass :function(classname) {
+ /// <summary>
+ /// Hides elements by class name
+ /// </summary>
+ ///
+ /// <param name="classname">the css class to hide</param>
+ var elements = this.GetElementsByClass(classname);
+ for(each in elements)
+ elements[each].style.display = 'none';
+ },
+
+ AddEventsToElements: function (events) {
+ /// <summary>
+ /// Adds event handlers to elements
+ /// </summary>
+ ///
+ /// <param name="events">a nested collection of events and handlers:</param>
+ ///
+ /// <example><code>
+ /// BrowserUtility.AddEventsToElements( {
+ /// icSignIn : { onclick: CardKit.SignIn },
+ /// icSignUp : { onclick: CardKit.SignUp },
+ /// icProtectAccount : { onclick: CardKit.ProtectAccount },
+ /// icRecover : { onclick: CardKit.RecoverId, onmouseover: CardKit.Shhhh } );
+ /// </code></example>
+ for( element in events )
+ if( node = document.getElementById(element) )
+ for( evt in events[element] )
+ node[evt] = events[element][evt];
+ },
+
+ AddField :function(form, name, value ) {
+ /// <summary>
+ /// Adds a field to a form
+ /// </summary>
+ ///
+ /// <param name="form">the form object</param>
+ /// <param name="name">the name of the field</param>
+ /// <param name="value">the value of the field</param>
+ /// <returns>the created field</returns>
+ var p=document.createElement('input');
+ p.type = "hidden";
+ p.name = name;
+ p.value = value;
+ form.appendChild(p);
+ return p;
+ },
+
+ AddNewForm :function(url) {
+ /// <summary>
+ /// Adds a new form to the DOM
+ ///
+ /// Only does HTTP POSTs
+ /// </summary>
+ ///
+ /// <param name="url">the URL to post the form to.</param>
+ /// <returns>the created form</returns>
+ var f=document.createElement('form');
+ f.name="newform";
+ f.action = url;
+ f.setAttribute('method','post');
+ this.AppendToBody(f);
+ return f;
+ },
+
+ AppendToBody :function(element) {
+ /// <summary>
+ /// Appends an element to the body of the document.
+ /// </summary>
+ ///
+ /// <param name="element">the element to add.</param>
+ var body = document.getElementsByTagName("body").item(0);
+ body.appendChild(element);
+ },
+
+ AddObjectParameter :function( element, name , value ) {
+ /// <summary>
+ /// Adds a PARAM element to a OBJECT element
+ /// </summary>
+ ///
+ /// <param name="element">the OBJECT element to add to.</param>
+ /// <param name="name">the PARAM name</param>
+ /// <param name="value">the PARAM value</param>
+ var p = document.createElement('param');
+ p.setAttribute('name' , name );
+ p.setAttribute('value' , value );
+ element.appendChild(p);
+ },
+
+ ltrim :function(str){
+ /// <summary>
+ /// javascript helper function: trim left whitespace
+ /// </summary>
+ ///
+ /// <param name="str">the string to trim</param>
+ /// <returns>trimmed string</returns>
+ return str.replace(/^[ ]+/, '');
+ },
+
+ rtrim :function(str){
+ /// <summary>
+ /// javascript helper function: trim right whitespace
+ /// </summary>
+ ///
+ /// <param name="str">the string to trim</param>
+ /// <returns>trimmed string</returns>
+ return str.replace(/[ ]+$/, '');
+ },
+
+ trim:function(str) {
+ /// <summary>
+ /// javascript helper function: trim all whitespace
+ /// </summary>
+ ///
+ /// <param name="str">the string to trim</param>
+ /// <returns>trimmed string</returns>
+ return this.ltrim(this.rtrim(str));
+ },
+
+ Cookie: function(name) {
+ /// <summary>
+ /// Gets a cookie value
+ /// </summary>
+ ///
+ /// <param name="name">the name of the cookie to retrieve</param>
+ /// <returns>the cookie value</returns>
+ var cookies = document.cookie.split(';');
+
+ for(var i=0;i < cookies.length;i++) {
+ var p = cookies[i].split('=');
+ if( BrowserUtility.trim(p[0]) == name )
+ return BrowserUtility.trim(p[1]);
+ }
+ return null;
+ },
+
+ SetCookie: function(name,value,days) {
+ /// <summary>
+ /// Sets a cookie value
+ /// </summary>
+ ///
+ /// <param name="name">the name of the cookie to retrieve</param>
+ /// <param name="value">the value to set the cookie to</param>
+ /// <param name="days">the length of time the cookie should last.</param>
+ var expires = "";
+ if (days) {
+ var date = new Date();
+ date.setTime(date.getTime()+(days*24*60*60*1000));
+ expires = "; expires="+date.toGMTString();
+ }
+ document.cookie = name+"="+value+expires+"; path=/";
+ },
+
+ ClearCookie: function(name){
+ /// <summary>
+ /// Removes a cookie
+ /// </summary>
+ ///
+ /// <param name="name">the name of the cookie to remove</param>
+ this.SetCookie(name,"",-1);
+ },
+
+ GetAndClearCookie: function( name ){
+ /// <summary>
+ /// Gets a cookie value, and clears it
+ /// </summary>
+ ///
+ /// <param name="name">the name of the cookie to retrieve and clear</param>
+ /// <returns>the cookie value</returns>
+ var result = this.Cookie( name );
+ this.ClearCookie( name );
+ return result;
+ },
+
+ IsSecure : function(addr){
+ /// <summary>
+ /// Determines if the URL is HTTPS
+ /// </summary>
+ ///
+ /// <param name="addr">the address to check. defaults to the current document.</param>
+ /// <returns>true if the address is https:// </returns>
+ addr = addr == null ? window.location.href : addr;
+ return addr.toLowerCase().indexOf("https://" ) == 0;
+ }
+}
+
+
+var InformationCard = {
+ /// <summary>
+ /// InformationCard
+ /// This closure exposes functions to use Information Cards easier.
+ ///
+ /// </summary>
+
+ /* Constants */
+ SAML10 : "urn:oasis:names:tc:SAML:1.0:assertion" ,
+ SAML11 : "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" ,
+
+ /* claims */
+ GivenName : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname",
+ Surname : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname",
+ StreetAddress : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/streetaddress",
+ Locality : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality",
+ StateOrProvince : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/stateorprovince",
+ PostalCode : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode",
+ Country : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country",
+ HomePhone : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone",
+ OtherPhone : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/otherphone",
+ MobilePhone : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone",
+ DateOfBirth : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth",
+ Gender : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/gender",
+ PPID : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier",
+ Webpage : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/webpage",
+ Email : "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
+
+ init : function() {
+ /// <summary>
+ /// Initialization:
+ ///
+ /// Does not get called until the browser is finished loading the page.
+ /// </summary>
+ this.TokenType = this.SAML11;
+ this.RequiredClaims = { 0:this.PPID };
+ this.OptionalClaims = [];
+ this.PrivacyUrl = "";
+ this.PrivacyVersion = null;
+ this.Issuer = "";
+
+ // shows the elements in the page that enable Information Cards.
+ if( InformationCard.AreCardsSupported() ) {
+ BrowserUtility.ShowClass("InformationCardsSupported");
+ } else {
+ // Otherwise, disable the buttons
+ for( each in { icProtectAccount:0,icSignIn:0,icSignUp:0,icConfirmation:0} )
+ try{ document.getElementById(each).disabled = true; } catch(e) { }
+ BrowserUtility.ShowClass("InformationCardsNotSupported");
+ }
+ },
+
+ //
+ // default value for Information Cards being supported.
+ // allows us to short-circuit the function later.
+ //
+ _areCardsSupported : 'undefined',
+
+ AreCardsSupported : function() {
+ /// <summary>
+ /// Determines if Information Cards are supported by the browser.
+ /// </summary>
+ /// <returns>true if the browser supports Information Cards.</returns>
+
+ // short circuit after the first call by caching the value.
+ if( this._areCardsSupported != 'undefined')
+ return this._areCardsSupported;
+
+ var IEVer = -1;
+ if (navigator.appName == 'Microsoft Internet Explorer')
+ if (new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})")
+ .exec(navigator.userAgent) != null)
+ IEVer = parseFloat( RegExp.$1 );
+
+ // Look for IE 7+.
+ if( IEVer >= 7 ) {
+ var embed = document.createElement("object");
+ embed.setAttribute("type", "application/x-informationcard");
+
+ return (this._areCardsSupported = (""+embed.issuerPolicy != "undefined" && embed.isInstalled));
+ }
+ // not IE (any version)
+ if( IEVer < 0 && navigator.mimeTypes && navigator.mimeTypes.length) {
+ // check to see if there is a mimeType handler.
+ x = navigator.mimeTypes['application/x-informationcard'];
+ if (x && x.enabledPlugin)
+ return (this._areCardsSupported = true);
+
+ // check for the IdentitySelector event handler is there.
+ var event = document.createEvent("Events");
+ event.initEvent("IdentitySelectorAvailable", true, true);
+ top.dispatchEvent(event);
+
+ if( top.IdentitySelectorAvailable == true)
+ return (this._areCardsSupported = true);
+ }
+ return (this._areCardsSupported = false);
+ },
+
+ GetInformationCardObject :function() {
+ /// <summary>
+ /// Creates an Information Card object, with the values from this closure.
+ /// </summary>
+ /// <returns>the Identity Selector object</returns>
+
+ // create object
+ var obj = document.createElement('object');
+
+ // add all parameters first
+ var claims = "";
+ for(each in this.RequiredClaims)
+ claims+=" "+this.RequiredClaims[each];
+
+ BrowserUtility.AddObjectParameter( obj, "requiredClaims", claims );
+
+ if( this.TokenType )
+ BrowserUtility.AddObjectParameter( obj, "tokenType" , this.TokenType );
+
+ if( this.OptionalClaims )
+ {
+ claims = "";
+ for(each in this.OptionalClaims)
+ claims+=" "+this.OptionalClaims[each];
+
+ if( claims != "" )
+ BrowserUtility.AddObjectParameter( obj, "optionalClaims", claims);
+ }
+
+
+ if( this.PrivacyVersion && this.PrivacyUrl && this.PrivacyUrl != "" )
+ {
+ BrowserUtility.AddObjectParameter( obj, "privacyUrl" , this.PrivacyUrl);
+ BrowserUtility.AddObjectParameter( obj, "privacyVersion" , this.PrivacyVersion);
+ }
+
+ if( this.Issuer && this.Issuer != "")
+ BrowserUtility.AddObjectParameter( obj, "Issuer" , this.Issuer);
+
+ // set the type, and the it suddenly 'understands'
+ obj.setAttribute( "type", "application/x-informationcard");
+
+ // adding the object to the body activates it.
+ BrowserUtility.AppendToBody(obj);
+ return obj;
+ },
+
+ GetToken :function() {
+ /// <summary>
+ /// Calls the identity selector to get a token
+ /// returns either the token, or an error number.
+ /// </summary>
+ /// <returns>the token requested from the Identity Selector, or the error code if no token is aquired.</returns>
+
+ var xmltkn=this.GetInformationCardObject();
+
+ var result = null;
+ try {
+ result = xmltkn.value;
+ }
+ catch( e ) {
+ return e.number;
+ }
+ return result;
+ },
+
+
+ SignInWithCard :function(target,action,trouble,rememberUser, extraFieldsToSubmit ) {
+ /// <summary>
+ /// Gets the token, and forwards the user to the actionable page
+ /// </summary>
+ ///
+ /// <param name="target">the URL to post the token to.</param>
+ /// <param name="action">an action message sent to the destination page.</param>
+ /// <param name="trouble">either a URL or a javascript function to call if the get token fails.</param>
+ /// <param name="rememberUser">a helper value to tell the action page to 'remember me'</param>
+ with( InformationCard ) {
+ var card = GetToken();
+ if( (""+card).charAt(0) == '<' )
+ {
+ //got a card. let's send it in.
+ var f=BrowserUtility.AddNewForm( target ? target : window.location.href );
+ BrowserUtility.AddField( f , "action" , action ? action : "SignIn");
+ BrowserUtility.AddField( f , "xmltoken" , card );
+ BrowserUtility.AddField( f , "sourcepage" , window.location.href);
+ BrowserUtility.AddField( f , "rememberUser" , rememberUser ? rememberUser : false);
+ if( extraFieldsToSubmit )
+ for(each in extraFieldsToSubmit)
+ BrowserUtility.AddField( f , each, extraFieldsToSubmit[each] );
+ f.submit();
+ } else {
+ //error, let's go troubleshooting.
+ //want to call a function?
+ if( typeof(trouble) == "function" );
+ return trouble( card );
+
+ // post to the error page
+ var f=BrowserUtility.AddNewForm( trouble ? trouble : window.location.href );
+ BrowserUtility.AddField( f , "action" , "troubleshoot");
+ BrowserUtility.AddField( f , "errorvalue" , card );
+ BrowserUtility.AddField( f , "sourcepage" , window.location.href);
+ f.submit();
+ }
+ }
+ }
+}
+
+/* initial setup for Information Cards */
+var _ic_init = document.addEventListener?document.addEventListener("DOMContentLoaded", function(){InformationCard.init()}, false): setInterval(function(){if (/loaded|complete/.test(document.readyState)){clearInterval(_ic_init);InformationCard.init(); } }, 10);
More information about the Mashup-dev
mailing list