2009-07-24 Jeffrey Stedfast <fejj@novell.com>
[moon.git] / test / Silverlight.js
blobdd5309a1015f7082b85b6db142bc337b32142668
1 ///////////////////////////////////////////////////////////////////////////////\r
2 //\r
3 //  Silverlight.js                      version 2.0.30523.6\r
4 //\r
5 //  This file is provided by Microsoft as a helper file for websites that\r
6 //  incorporate Silverlight Objects. This file is provided under the Microsoft\r
7 //  Public License available at \r
8 //  http://code.msdn.microsoft.com/silverlightjs/Project/License.aspx.  \r
9 //  You may not use or distribute this file or the code in this file except as \r
10 //  expressly permitted under that license.\r
11 // \r
12 //  Copyright (c) Microsoft Corporation. All rights reserved.\r
13 //\r
14 ///////////////////////////////////////////////////////////////////////////////\r
16 if (!window.Silverlight)\r
17 {\r
18     window.Silverlight = { };\r
19 }\r
21 //////////////////////////////////////////////////////////////////\r
22 //\r
23 // _silverlightCount:\r
24 //\r
25 // Counter of globalized event handlers\r
26 //\r
27 //////////////////////////////////////////////////////////////////\r
28 Silverlight._silverlightCount = 0;\r
30 //////////////////////////////////////////////////////////////////\r
31 //\r
32 // fwlinkRoot:\r
33 //\r
34 // Prefix for fwlink URL's\r
35 //\r
36 //////////////////////////////////////////////////////////////////\r
37 Silverlight.fwlinkRoot='http://go2.microsoft.com/fwlink/?LinkID=';\r
39 //////////////////////////////////////////////////////////////////\r
40 //  \r
41 // onGetSilverlight:\r
42 //\r
43 // Called by Silverlight.GetSilverlight to notify the page that a user\r
44 // has requested the Silverlight installer\r
45 //\r
46 //////////////////////////////////////////////////////////////////\r
47 Silverlight.onGetSilverlight = null;\r
49 //////////////////////////////////////////////////////////////////\r
50 //\r
51 // onSilverlightInstalled:\r
52 //\r
53 // Called by Silverlight.WaitForInstallCompletion when the page detects\r
54 // that Silverlight has been installed. The event handler is not called\r
55 // in upgrade scenarios.\r
56 //\r
57 //////////////////////////////////////////////////////////////////\r
58 Silverlight.onSilverlightInstalled = function () {window.location.reload(false);};\r
60 //////////////////////////////////////////////////////////////////\r
61 //\r
62 // isInstalled:\r
63 //\r
64 // Checks to see if the correct version is installed\r
65 //\r
66 //////////////////////////////////////////////////////////////////\r
67 Silverlight.isInstalled = function(version)\r
68 {\r
69     var isVersionSupported=false;\r
70     var container = null;\r
71     \r
72     try \r
73     {\r
74         var control = null;\r
75         \r
76         try\r
77         {\r
78             control = new ActiveXObject('AgControl.AgControl');\r
79             if ( version == null )\r
80             {\r
81                 isVersionSupported = true;\r
82             }\r
83             else if ( control.IsVersionSupported(version) )\r
84             {\r
85                 isVersionSupported = true;\r
86             }\r
87             control = null;\r
88         }\r
89         catch (e)\r
90         {\r
91             var plugin = navigator.plugins["Silverlight Plug-In"] ;\r
92             if ( plugin )\r
93             {\r
94                 if ( version === null )\r
95                 {\r
96                     isVersionSupported = true;\r
97                 }\r
98                 else\r
99                 {\r
100                     var actualVer = plugin.description;\r
101                     if ( actualVer === "1.0.30226.2")\r
102                         actualVer = "2.0.30226.2";\r
103                     var actualVerArray =actualVer.split(".");\r
104                     while ( actualVerArray.length > 3)\r
105                     {\r
106                         actualVerArray.pop();\r
107                     }\r
108                     while ( actualVerArray.length < 4)\r
109                     {\r
110                         actualVerArray.push(0);\r
111                     }\r
112                     var reqVerArray = version.split(".");\r
113                     while ( reqVerArray.length > 4)\r
114                     {\r
115                         reqVerArray.pop();\r
116                     }\r
117                     \r
118                     var requiredVersionPart ;\r
119                     var actualVersionPart\r
120                     var index = 0;\r
121                     \r
122                     \r
123                     do\r
124                     {\r
125                         requiredVersionPart = parseInt(reqVerArray[index]);\r
126                         actualVersionPart = parseInt(actualVerArray[index]);\r
127                         index++;\r
128                     }\r
129                     while (index < reqVerArray.length && requiredVersionPart === actualVersionPart);\r
130                     \r
131                     if ( requiredVersionPart <= actualVersionPart && !isNaN(requiredVersionPart) )\r
132                     {\r
133                         isVersionSupported = true;\r
134                     }\r
135                 }\r
136             }\r
137         }\r
138     }\r
139     catch (e) \r
140     {\r
141         isVersionSupported = false;\r
142     }\r
143     if (container) \r
144     {\r
145         document.body.removeChild(container);\r
146     }\r
147     \r
148     return isVersionSupported;\r
150 //////////////////////////////////////////////////////////////////\r
151 //\r
152 // WaitForInstallCompletion:\r
153 //\r
154 // Occasionally checks for Silverlight installation status. If it\r
155 // detects that Silverlight has been installed then it calls\r
156 // Silverlight.onSilverlightInstalled();. This is only supported\r
157 // if Silverlight was not previously installed on this computer.\r
158 //\r
159 //////////////////////////////////////////////////////////////////\r
160 Silverlight.WaitForInstallCompletion = function()\r
162     if ( ! Silverlight.isBrowserRestartRequired && Silverlight.onSilverlightInstalled )\r
163     {\r
164         try\r
165         {\r
166             navigator.plugins.refresh();\r
167         }\r
168         catch(e)\r
169         {\r
170         }\r
171         if ( Silverlight.isInstalled(null) )\r
172         {\r
173             Silverlight.onSilverlightInstalled();\r
174         }\r
175         else\r
176         {\r
177               setTimeout(Silverlight.WaitForInstallCompletion, 3000);\r
178         }    \r
179     }\r
181 //////////////////////////////////////////////////////////////////\r
182 //\r
183 // __startup:\r
184 //\r
185 // Performs startup tasks\r
186 //////////////////////////////////////////////////////////////////\r
187 Silverlight.__startup = function()\r
189     Silverlight.isBrowserRestartRequired = Silverlight.isInstalled(null);\r
190     if ( !Silverlight.isBrowserRestartRequired)\r
191     {\r
192         Silverlight.WaitForInstallCompletion();\r
193     }\r
194     if (window.removeEventListener) { \r
195        window.removeEventListener('load', Silverlight.__startup , false);\r
196     }\r
197     else { \r
198         window.detachEvent('onload', Silverlight.__startup );\r
199     }\r
202 if (window.addEventListener) \r
204     window.addEventListener('load', Silverlight.__startup , false);\r
206 else \r
208     window.attachEvent('onload', Silverlight.__startup );\r
211 ///////////////////////////////////////////////////////////////////////////////\r
212 // createObject:\r
213 //\r
214 // Inserts a Silverlight <object> tag or installation experience into the HTML\r
215 // DOM based on the current installed state of Silverlight. \r
216 //\r
217 /////////////////////////////////////////////////////////////////////////////////\r
219 Silverlight.createObject = function(source, parentElement, id, properties, events, initParams, userContext)\r
221     var slPluginHelper = new Object();\r
222     var slProperties = properties;\r
223     var slEvents = events;\r
224     \r
225     slPluginHelper.version = slProperties.version;\r
226     slProperties.source = source;    \r
227     slPluginHelper.alt = slProperties.alt;\r
228     \r
229     //rename properties to their tag property names. For bacwards compatibility\r
230     //with Silverlight.js version 1.0\r
231     if ( initParams )\r
232         slProperties.initParams = initParams;\r
233     if ( slProperties.isWindowless && !slProperties.windowless)\r
234         slProperties.windowless = slProperties.isWindowless;\r
235     if ( slProperties.framerate && !slProperties.maxFramerate)\r
236         slProperties.maxFramerate = slProperties.framerate;\r
237     if ( id && !slProperties.id)\r
238         slProperties.id = id;\r
239     \r
240     // remove elements which are not to be added to the instantiation tag\r
241     delete slProperties.ignoreBrowserVer;\r
242     delete slProperties.inplaceInstallPrompt;\r
243     delete slProperties.version;\r
244     delete slProperties.isWindowless;\r
245     delete slProperties.framerate;\r
246     delete slProperties.data;\r
247     delete slProperties.src;\r
248     delete slProperties.alt;\r
251     // detect that the correct version of Silverlight is installed, else display install\r
253     if (Silverlight.isInstalled(slPluginHelper.version))\r
254     {\r
255         //move unknown events to the slProperties array\r
256         for (var name in slEvents)\r
257         {\r
258             if ( slEvents[name])\r
259             {\r
260                 if ( name == "onLoad" && typeof slEvents[name] == "function" && slEvents[name].length != 1 )\r
261                 {\r
262                     var onLoadHandler = slEvents[name];\r
263                     slEvents[name]=function (sender){ return onLoadHandler(document.getElementById(id), userContext, sender)};\r
264                 }\r
265                 var handlerName = Silverlight.__getHandlerName(slEvents[name]);\r
266                 if ( handlerName != null )\r
267                 {\r
268                     slProperties[name] = handlerName;\r
269                     slEvents[name] = null;\r
270                 }\r
271                 else\r
272                 {\r
273                     throw "typeof events."+name+" must be 'function' or 'string'";\r
274                 }\r
275             }\r
276         }\r
277         slPluginHTML = Silverlight.buildHTML(slProperties);\r
278     }\r
279     //The control could not be instantiated. Show the installation prompt\r
280     else \r
281     {\r
282         slPluginHTML = Silverlight.buildPromptHTML(slPluginHelper);\r
283     }\r
285     // insert or return the HTML\r
286     if(parentElement)\r
287     {\r
288         parentElement.innerHTML = slPluginHTML;\r
289     }\r
290     else\r
291     {\r
292         return slPluginHTML;\r
293     }\r
297 ///////////////////////////////////////////////////////////////////////////////\r
298 //\r
299 //  buildHTML:\r
300 //\r
301 //  create HTML that instantiates the control\r
302 //\r
303 ///////////////////////////////////////////////////////////////////////////////\r
304 Silverlight.buildHTML = function( slProperties)\r
306     var htmlBuilder = [];\r
308     htmlBuilder.push('<object type=\"application/x-silverlight\" data="data:application/x-silverlight,"');\r
309     if ( slProperties.id != null )\r
310     {\r
311         htmlBuilder.push(' id="' + slProperties.id + '"');\r
312     }\r
313     if ( slProperties.width != null )\r
314     {\r
315         htmlBuilder.push(' width="' + slProperties.width+ '"');\r
316     }\r
317     if ( slProperties.height != null )\r
318     {\r
319         htmlBuilder.push(' height="' + slProperties.height + '"');\r
320     }\r
321     htmlBuilder.push(' >');\r
322     \r
323     delete slProperties.id;\r
324     delete slProperties.width;\r
325     delete slProperties.height;\r
326     \r
327     for (var name in slProperties)\r
328     {\r
329         if (slProperties[name])\r
330         {\r
331             htmlBuilder.push('<param name="'+Silverlight.HtmlAttributeEncode(name)+'" value="'+Silverlight.HtmlAttributeEncode(slProperties[name])+'" />');\r
332         }\r
333     }\r
334     htmlBuilder.push('<\/object>');\r
335     return htmlBuilder.join('');\r
340 //////////////////////////////////////////////////////////////////\r
341 //\r
342 // createObjectEx:\r
343 //\r
344 // takes a single parameter of all createObject \r
345 // parameters enclosed in {}\r
346 //\r
347 //////////////////////////////////////////////////////////////////\r
349 Silverlight.createObjectEx = function(params)\r
351     var parameters = params;\r
352     var html = Silverlight.createObject(parameters.source, parameters.parentElement, parameters.id, parameters.properties, parameters.events, parameters.initParams, parameters.context);\r
353     if (parameters.parentElement == null)\r
354     {\r
355         return html;\r
356     }\r
359 ///////////////////////////////////////////////////////////////////////////////////////////////\r
360 //\r
361 // buildPromptHTML\r
362 //\r
363 // Builds the HTML to prompt the user to download and install Silverlight\r
364 //\r
365 ///////////////////////////////////////////////////////////////////////////////////////////////\r
366 Silverlight.buildPromptHTML = function(slPluginHelper)\r
368     var slPluginHTML = "";\r
369     var urlRoot = Silverlight.fwlinkRoot;\r
370     var shortVer = slPluginHelper.version ;\r
371     if ( slPluginHelper.alt )\r
372     {\r
373         slPluginHTML = slPluginHelper.alt;\r
374     }\r
375     else\r
376     {\r
377         if (! shortVer )\r
378         {\r
379             shortVer="";\r
380         }\r
381         slPluginHTML = "<a href='javascript:Silverlight.getSilverlight(\"{1}\");' style='text-decoration: none;'><img src='{2}' alt='Get Microsoft Silverlight' style='border-style: none'/></a>";\r
382         slPluginHTML = slPluginHTML.replace('{1}', shortVer );\r
383         slPluginHTML = slPluginHTML.replace('{2}', urlRoot + '108181');\r
384     }\r
385     \r
386     return slPluginHTML;\r
389 ///////////////////////////////////////////////////////////////////////////////////////////////\r
390 //\r
391 // getSilverlight:\r
392 //\r
393 // Navigates the browser to the appropriate Silverlight installer\r
394 //\r
395 ///////////////////////////////////////////////////////////////////////////////////////////////\r
396 Silverlight.getSilverlight = function(version)\r
398     if (Silverlight.onGetSilverlight )\r
399     {\r
400         Silverlight.onGetSilverlight();\r
401     }\r
402     \r
403     var shortVer = "";\r
404     var reqVerArray = String(version).split(".");\r
405     if (reqVerArray.length > 1)\r
406     {\r
407         var majorNum = parseInt(reqVerArray[0] );\r
408         if ( isNaN(majorNum) || majorNum < 2 )\r
409         {\r
410             shortVer = "1.0";\r
411         }\r
412         else\r
413         {\r
414             shortVer = reqVerArray[0]+'.'+reqVerArray[1];\r
415         }\r
416     }\r
417     \r
418     var verArg = "";\r
419     \r
420     if (shortVer.match(/^\d+\056\d+$/) )\r
421     {\r
422         verArg = "&v="+shortVer;\r
423     }\r
424     \r
425     Silverlight.followFWLink("114576" + verArg);\r
429 ///////////////////////////////////////////////////////////////////////////////////////////////\r
430 //\r
431 // followFWLink:\r
432 //\r
433 // Navigates to a url based on fwlinkid\r
434 //\r
435 ///////////////////////////////////////////////////////////////////////////////////////////////\r
436 Silverlight.followFWLink = function(linkid)\r
438     top.location=Silverlight.fwlinkRoot+String(linkid);\r
441 ///////////////////////////////////////////////////////////////////////////////////////////////\r
442 //\r
443 // HtmlAttributeEncode:\r
444 //\r
445 // Encodes special characters in input strings as charcodes\r
446 //\r
447 ///////////////////////////////////////////////////////////////////////////////////////////////\r
448 Silverlight.HtmlAttributeEncode = function( strInput )\r
450       var c;\r
451       var retVal = '';\r
453     if(strInput == null)\r
454       {\r
455           return null;\r
456     }\r
457       \r
458       for(var cnt = 0; cnt < strInput.length; cnt++)\r
459       {\r
460             c = strInput.charCodeAt(cnt);\r
462             if (( ( c > 96 ) && ( c < 123 ) ) ||\r
463                   ( ( c > 64 ) && ( c < 91 ) ) ||\r
464                   ( ( c > 43 ) && ( c < 58 ) && (c!=47)) ||\r
465                   ( c == 95 ))\r
466             {\r
467                   retVal = retVal + String.fromCharCode(c);\r
468             }\r
469             else\r
470             {\r
471                   retVal = retVal + '&#' + c + ';';\r
472             }\r
473       }\r
474       \r
475       return retVal;\r
477 ///////////////////////////////////////////////////////////////////////////////\r
478 //\r
479 //  default_error_handler:\r
480 //\r
481 //  Default error handling function \r
482 //\r
483 ///////////////////////////////////////////////////////////////////////////////\r
485 Silverlight.default_error_handler = function (sender, args)\r
487     var iErrorCode;\r
488     var errorType = args.ErrorType;\r
490     iErrorCode = args.ErrorCode;\r
492     var errMsg = "\nSilverlight error message     \n" ;\r
494     errMsg += "ErrorCode: "+ iErrorCode + "\n";\r
497     errMsg += "ErrorType: " + errorType + "       \n";\r
498     errMsg += "Message: " + args.ErrorMessage + "     \n";\r
500     if (errorType == "ParserError")\r
501     {\r
502         errMsg += "XamlFile: " + args.xamlFile + "     \n";\r
503         errMsg += "Line: " + args.lineNumber + "     \n";\r
504         errMsg += "Position: " + args.charPosition + "     \n";\r
505     }\r
506     else if (errorType == "RuntimeError")\r
507     {\r
508         if (args.lineNumber != 0)\r
509         {\r
510             errMsg += "Line: " + args.lineNumber + "     \n";\r
511             errMsg += "Position: " +  args.charPosition + "     \n";\r
512         }\r
513         errMsg += "MethodName: " + args.methodName + "     \n";\r
514     }\r
515     alert (errMsg);\r
518 ///////////////////////////////////////////////////////////////////////////////////////////////\r
519 //\r
520 // __cleanup:\r
521 //\r
522 // Releases event handler resources when the page is unloaded\r
523 //\r
524 ///////////////////////////////////////////////////////////////////////////////////////////////\r
525 Silverlight.__cleanup = function ()\r
527     for (var i = Silverlight._silverlightCount - 1; i >= 0; i--) {\r
528         window['__slEvent' + i] = null;\r
529     }\r
530     Silverlight._silverlightCount = 0;\r
531     if (window.removeEventListener) { \r
532        window.removeEventListener('unload', Silverlight.__cleanup , false);\r
533     }\r
534     else { \r
535         window.detachEvent('onunload', Silverlight.__cleanup );\r
536     }\r
539 ///////////////////////////////////////////////////////////////////////////////////////////////\r
540 //\r
541 // __getHandlerName:\r
542 //\r
543 // Generates named event handlers for delegates.\r
544 //\r
545 ///////////////////////////////////////////////////////////////////////////////////////////////\r
546 Silverlight.__getHandlerName = function (handler)\r
548     var handlerName = "";\r
549     if ( typeof handler == "string")\r
550     {\r
551         handlerName = handler;\r
552     }\r
553     else if ( typeof handler == "function" )\r
554     {\r
555         if (Silverlight._silverlightCount == 0)\r
556         {\r
557             if (window.addEventListener) \r
558             {\r
559                 window.addEventListener('onunload', Silverlight.__cleanup , false);\r
560             }\r
561             else \r
562             {\r
563                 window.attachEvent('onunload', Silverlight.__cleanup );\r
564             }\r
565         }\r
566         var count = Silverlight._silverlightCount++;\r
567         handlerName = "__slEvent"+count;\r
568         \r
569         window[handlerName]=handler;\r
570     }\r
571     else\r
572     {\r
573         handlerName = null;\r
574     }\r
575     return handlerName;\r