crossbrowdy
Version:
A Multimedia JavaScript framework to create real cross-platform and hybrid game engines, games, emulators, multimedia libraries and apps.
253 lines (224 loc) • 9.99 kB
JavaScript
window['slcanvas'] = {};
slcanvas_onSilverlightLoad = function(sender, args) {
var control = sender.getHost();
control.loaded = true;
// Stub-in the getContext method
control.getContext = function(context) {
return control.Content.HTMLCanvasElement.getContext(context);
};
// Run the "onload" code (if present)
if (control.action) {
control.action.call(control, control);
}
}
// Standard onError method
slcanvas_onSilverlightError = function(sender, args) {
var appSource = "";
if (sender != null && sender != 0) {
appSource = sender.getHost().Source;
}
var errorType = args.ErrorType;
var iErrorCode = args.ErrorCode;
if (errorType == "ImageError" || errorType == "MediaError") {
return;
}
var errMsg = "Unhandled Error in Silverlight Application " + appSource + "\n";
errMsg += "Code: " + iErrorCode + " \n";
errMsg += "Category: " + errorType + " \n";
errMsg += "Message: " + args.ErrorMessage + " \n";
if (errorType == "ParserError") {
errMsg += "File: " + args.xamlFile + " \n";
errMsg += "Line: " + args.lineNumber + " \n";
errMsg += "Position: " + args.charPosition + " \n";
}
else if (errorType == "RuntimeError") {
if (args.lineNumber != 0) {
errMsg += "Line: " + args.lineNumber + " \n";
errMsg += "Position: " + args.charPosition + " \n";
}
errMsg += "MethodName: " + args.methodName + " \n";
}
throw new Error(errMsg);
}
slcanvas.canvasHtmlStart =
'<object data="data:application/x-silverlight-2," type="application/x-silverlight-2"';
slcanvas.canvasHtmlEnd =
'>' +
'<param name="source" value="SCRIPT_PATH' + CB_Configuration[CB_BASE_NAME].SLCANVAS_PATH + 'ClientBin/SLCanvas.xap"/>' +
'<param name="onLoad" value="slcanvas_onSilverlightLoad"/>' +
'<param name="onError" value="slcanvas_onSilverlightError"/>' +
'<param name="background" value="Transparent"/>' +
'<param name="windowless" value="true"/>' +
'<param name="minRuntimeVersion" value="3.0.40624.0"/>' +
'<param name="autoUpgrade" value="true"/>' +
'<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration:none" target="_blank">' +
//'<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/>' +
'<img src="SCRIPT_PATH' + CB_Configuration[CB_BASE_NAME].SLCANVAS_PATH + 'Silverlight.png" alt="Get Microsoft Silverlight" style="border-style:none"/>' +
'</a>' +
'</object>';
// Method that inserts a <canvas> into the page
slcanvas.writeCanvasDiv = function(id, width, height, action) {
document.write('<div class="canvas">' + slcanvas.canvasHtmlStart + ' id="' + id + '" width="' + width + '" height="' + height + '"' + slcanvas.canvasHtmlEnd + "</div>");
document.getElementById(id).action = action;
}
// Method that inserts a <canvas> into the page
slcanvas.writeCanvas = function(id, width, height, action) {
var canvasTag = document.createElement('canvas');
canvasTag.setAttribute('id', id);
canvasTag.setAttribute('width', width);
canvasTag.setAttribute('height', height);
canvasTag.setAttribute('renderMethod', 'Silverlight');
var tmp = document.createElement('div');
tmp.appendChild(canvasTag);
document.write(tmp.innerHTML);
canvasTag = document.getElementById(id);
slcanvas.setupSilverlightOnCanvasTag(canvasTag, id, action);
}
// Method that creats a <canvas> instance and returns it
slcanvas.createCanvasDiv = function(width, height, action) {
var div = document.createElement("div");
try
{
div.innerHTML = slcanvas.canvasHtmlStart + " width='" + width + "' height='" + height + "'" + slcanvas.canvasHtmlEnd.replace(/SCRIPT_PATH/g, CB_scriptPath);
var obj = div.firstChild;
obj.action = action;
return obj;
} catch (e) {}
return div;
}
// auto-load canvas for renderMethod="Silverlight" attributed <canvas> tags
slcanvas.getBrowserNativelySupportsCanvas = function() {
if (slcanvas.__supportsCanvas !== undefined) return slcanvas.__supportsCanvas;
var testCanvas = document.createElement('canvas');
slcanvas.__supportsCanvas = !(!(testCanvas['getContext']));
return slcanvas.__supportsCanvas;
}
slcanvas.getBrowserCanSupportSlCanvas = function() {
// todo
return true;
}
slcanvas.autoLoad = function() {
var canvasTags = document.getElementsByTagName('canvas');
for (var i = 0; i < canvasTags.length; i++) {
var canvasTag = canvasTags[i];
var renderMethodAttrib = canvasTag.getAttribute('renderMethod');
if (renderMethodAttrib) {
renderMethodAttrib = renderMethodAttrib.toLowerCase();
var saction = canvasTag.getAttribute('onload');
if (renderMethodAttrib == 'silverlight' ||
(renderMethodAttrib == 'auto' &&
!slcanvas.getBrowserNativelySupportsCanvas() &&
slcanvas.getBrowserCanSupportSlCanvas())) {
var id = slcanvas.getScriptId(canvasTag, canvasTag.getAttribute('id'));
var action = null;
if (saction && saction.length > 0) action = eval(id + '_onload = function(canvasEl) {' + saction + ';}');
if (window[id + '_onload']) window[id + '_onload'] = undefined;
slcanvas.setupSilverlightOnCanvasTag(canvasTag, id, action);
} else if (slcanvas.getBrowserNativelySupportsCanvas() && (renderMethodAttrib == 'auto' || renderMethodAttrib == 'native')) {
if (saction && saction.length > 0) action = eval(id + '_onload = function(canvasEl) {' + saction + ';}');
if (window[id + '_onload']) window[id + '_onload'] = undefined;
action.call(canvasTag);
}
}
}
}
slcanvas.runAutoLoad = function() {
var loadfpre = window.onload;
var loadf = function() {
if (loadfpre) loadfpre.call();
slcanvas.autoLoad();
};
window.onload = loadf;
}
slcanvas.getScriptId = function(tagEl, scriptid) {
if (!scriptid || scriptid.length == 0) {
scriptid = tagEl.getAttribute('id');
if (!scriptid || scriptid.length == 0) {
var n = 1;
scriptid = 'slcanvas';
while (document.getElementById('scriptid' + n.toString())) n++;
scriptid = scriptid + n.toString();
}
}
return scriptid;
};
slcanvas.getContainerId = function(tagEl, scriptid) {
scriptid = slcanvas.getScriptId(tagEl, scriptid);
var ret = scriptid + '_container';
if (document.getElementById(ret)) {
var n = 1;
while (document.getElementById(ret + n.toString())) n++;
ret += n;
}
return ret;
};
slcanvas.setupSilverlightOnCanvasTag = function(canvasTag, id, action) {
var isSetup = canvasTag.getAttribute('slIsSetup');
if (isSetup == 'true') return;
canvasTag = slcanvas.makeContainerElement(canvasTag);
id = slcanvas.getScriptId(canvasTag, id);
var containerId = slcanvas.getContainerId(canvasTag, id);
canvasTag.setAttribute('id', containerId);
var width = canvasTag.getAttribute('width');
if (!width) width = 300;
var height = canvasTag.getAttribute('height');
if (!height) height = 150;
canvasTag.innerHTML = slcanvas.canvasHtmlStart + ' id="' + id + '" width="' + width + '" height="' + height + '"' + slcanvas.canvasHtmlEnd;
canvasTag.setAttribute('slIsSetup', 'true');
if (action) {
var renderer = document.getElementById(id);
renderer.action = action;
if (renderer['loaded']) renderer.action.call(renderer, renderer);
}
}
slcanvas.makeContainerElement = function(el) {
if (!el) return null;
var innerHTML = el.innerHTML;
try {
el.innerHTML = innerHTML;
if (!slcanvas.getBrowserNativelySupportsCanvas()) return el;
} catch (error) { }
// capture attribs
var oattribs = el.attributes;
var attribs = {};
var len = oattribs.length;
for (var a = 0; a < len; a++) {
attribs[oattribs.item(a).nodeName] = oattribs.item(a).nodeValue;
}
// find the end-canvas tag
var endCanvas = el.nextSibling;
while (endCanvas) {
if (endCanvas.tagName && endCanvas.tagName.toLowerCase() == '/canvas') break;
endCanvas = endCanvas.nextSibling;
}
// find the appropriate tag to prepend or append
var nextSibling = (endCanvas ? endCanvas.nextSibling : el.nextSibling);
var parentEl = el.parentElement ? el.parentElement : el.parentNode;
// drop the existing tag
var endTagPrevSib = endCanvas ? endCanvas.previousSibling : null;
if (endCanvas) parentEl.removeChild(endCanvas);
while (endTagPrevSib && endTagPrevSib != el) {
var prevup = endTagPrevSib.previousSibling;
parentEl.removeChild(endTagPrevSib);
endTagPrevSib = prevup;
}
parentEl.removeChild(el);
// create the new tag
var containerTag = 'canvas';
if (slcanvas.getBrowserNativelySupportsCanvas()) containerTag = 'div';
el = document.createElement(containerTag);
for (var a in attribs) {
var attrib = document.createAttribute(a);
attrib.value = attribs[a];
try {
el.attributes.setNamedItem(attrib);
} catch (error) { } // IE6 will pull in extra junk that can't be set
}
//el.innerHTML = innerHTML;
// add new tag
if (nextSibling) parentEl.insertBefore(el, nextSibling);
else parentEl.appendChild(el);
return el;
};
slcanvas.runAutoLoad();
slcanvas.autoLoad();