blob: 8907ce4a65f4593580dbac40bc7b8f86276ebb3e [file] [log] [blame]
/*
* Copyright 2012 Research In Motion Limited.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*global objJSExt */
function JNEXT_() {
var self = this;
var m_bFirstRequire = true;
self.m_arEvents = {};
self.onPageLoad = function() {
};
self.attachToDOM = function() {
// Make sure JNEXT onPageLoad is called when page load
// completes without damaging existing onLoad handlers
var prevOnLoad = window.onload;
if( typeof window.onload != 'function') {
window.onload = self.onPageLoad;
} else {
window.onload = function() {
if(prevOnLoad) {
prevOnLoad();
}
self.onPageLoad();
};
}
// Unobtrusively add the JNEXT plugin or ActiveX to the DOM
var objBody = document.getElementsByTagName("body")[0];
var objDiv = document.createElement('div');
var strHTML;
if(window.ActiveXObject) {
strHTML = '<object id="objJSExt" width="0" height="0" classid="CLSID:C802F39D-BF85-427a-A334-77E501DB62E9" codebase="jnext.ocx"></object>';
strHTML += '<script language="JavaScript" for="objJSExt" EVENT="Js2nEvent( strEvent )">JNEXT.processEvent(strEvent)</script>';
} else {
var strAddSrc = "";
if(navigator.userAgent.indexOf("Safari") != -1 && navigator.userAgent.indexOf("Windows") != -1) {
// This hack required on Safari for Windows
strAddSrc = 'src="./jnext/safari.foo"';
}
strHTML = '<embed id="objJSExt" ' + strAddSrc + ' type="application/jnext-scriptable-plugin" width="0" height="0">';
}
objDiv.innerHTML = strHTML;
objBody.appendChild(objDiv);
};
self.getosname = function() {
return objJSExt.sendCmd("osname");
};
self.require = function(strLibrary) {
// Load a required JNEXT plugin
var strCmd;
var strVal;
var arParams;
if(m_bFirstRequire) {
strCmd = "userAgent " + navigator.userAgent;
strVal = objJSExt.sendCmd(strCmd);
arParams = strVal.split(" ");
if(arParams[0] != "Ok") {
alert("userAgent " + strVal);
return false;
}
self.m_bFirstRequire = false;
}
strCmd = "Require " + strLibrary;
strVal = objJSExt.sendCmd(strCmd);
arParams = strVal.split(" ");
if(arParams[0] != "Ok") {
alert("Require " + strVal);
return false;
}
return true;
};
self.createObject = function(strObjName) {
// Create an instance of a native object
var strCmd;
var strVal;
var arParams;
strVal = objJSExt.sendCmd("CreateObject " + strObjName);
arParams = strVal.split(" ");
if(arParams[0] != "Ok") {
alert("CreateObject: " + strVal);
return "";
}
return arParams[1];
};
self.invoke = function(strObjId, strMethod, strParams) {
// Invoke a method of a given instance of a native object
var strCmd = "InvokeMethod " + strObjId + " " + strMethod;
if( typeof (strParams) != "undefined") {
strCmd += " " + strParams;
}
return objJSExt.sendCmd(strCmd);
};
self.registerEvents = function(objNotify) {
var strId = objNotify.getId();
self.m_arEvents[strId] = objNotify;
};
self.unregisterEvents = function(objNotify) {
var strId = objNotify.getId();
delete self.m_arEvents[strId];
};
self.processEvent = function(strNativeEvt) {
// Process an event received from native code. The event
// contains the target JavaScript object id and the
// relevant parameters.
var arParams = strNativeEvt.split(" ");
var strObjId = arParams[0];
var strEvent = strNativeEvt.substring(strObjId.length + 1);
var objNotify = self.m_arEvents[strObjId];
if( typeof (objNotify) == 'undefined') {
alert("Warning: No object with Id " + strId + " found for event " + strEvent);
return;
}
// This will now be handled by the appropriate JavaScript
// JNEXT extension object
objNotify.onEvent(strEvent);
};
self.ajaxGet = function(strUrl, id) {
var req = false;
if(window.ActiveXObject) {
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
req = new ActiveXObject("Microsoft.XMLHTTP");
} catch (ex) {
}
}
} else if(window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else {
return false;
}
req.onreadystatechange = function() {
if(req.readyState == 4 && (req.status == 200 || window.location.href.indexOf("http") == -1)) {
self.onAjaxRecv(req.responseText);
}
};
req.open('GET', strUrl, true);
req.send(null);
};
self.onAjaxRecv = function(strContent) {
alert(strContent);
};
self.attachToDOM();
}
window.JNEXT = new JNEXT_();
module.exports = JNEXT;