diff --git a/src/messenger/webim/js/request.js b/src/messenger/webim/js/request.js new file mode 100644 index 00000000..badd050f --- /dev/null +++ b/src/messenger/webim/js/request.js @@ -0,0 +1,8 @@ +var mibewRequestedScripts=[],mibewHandlers=[],mibewHandlersDependences=[]; +function mibewMakeRequest(){mibewDoLoadScript(mibewRequestUrl+"&rnd="+Math.random(),"responseScript")} +function mibewOnResponse(a){var b=a.load,c=a.handlers,e=a.data,a=a.dependences;for(id in b)if(!(b[id]in mibewRequestedScripts))mibewRequestedScripts[id]=[],mibewRequestedScripts[id].url=b[id],mibewRequestedScripts[id].status="loading",mibewLoadScript(id);for(handler in a)handler in mibewHandlersDependences||(mibewHandlersDependences[handler]=a[handler]);for(b=0;b<c.length;b++){var d=c[b];if(mibewCanRunHandler(c[b]))window[d](e);else c[b]in mibewHandlers||(mibewHandlers[d]=function(){window[d](e)})}mibewCleanUpAfterRequest(); window.setTimeout(mibewMakeRequest,mibewRequestTimeout)} +function mibewCleanUpAfterRequest(){document.getElementsByTagName("head")[0].removeChild(document.getElementById("responseScript"))} +function mibewDoLoadScript(a,b){var c=document.createElement("script");c.setAttribute("type","text/javascript");c.setAttribute("src",a);c.setAttribute("id",b);document.getElementsByTagName("head")[0].appendChild(c);return c} +function mibewLoadScript(a){var b=mibewDoLoadScript(mibewRequestedScripts[a].url,a);b.onload=function(){mibewScriptReady(a)};b.onreadystatechange=function(){("complete"==this.readyState||"loaded"==this.readyState)&&mibewScriptReady(a)}} +function mibewScriptReady(a){mibewRequestedScripts[a].status="ready";for(handlerName in mibewHandlers)mibewCanRunHandler(handlerName)&&(mibewHandlers[handlerName](),delete mibewHandlers[handlerName])} +function mibewCanRunHandler(a){for(var a=mibewHandlersDependences[a],b=0;b<a.length;b++)if("ready"!=mibewRequestedScripts[a[b]].status)return!1;return!0}; \ No newline at end of file diff --git a/src/messenger/webim/js/source/build.xml b/src/messenger/webim/js/source/build.xml index 00935358..623b68fb 100644 --- a/src/messenger/webim/js/source/build.xml +++ b/src/messenger/webim/js/source/build.xml @@ -41,6 +41,10 @@ <arg value="invite:1"/> <arg value="--js"/> <arg value="invite.js"/> + <arg value="--module"/> + <arg value="request:1"/> + <arg value="--js"/> + <arg value="request.js"/> </java> </target> diff --git a/src/messenger/webim/js/source/request.js b/src/messenger/webim/js/source/request.js new file mode 100644 index 00000000..df376c62 --- /dev/null +++ b/src/messenger/webim/js/source/request.js @@ -0,0 +1,98 @@ +var mibewRequestedScripts = new Array(); +var mibewHandlers = new Array(); +var mibewHandlersDependences = new Array(); + +function mibewMakeRequest() +{ + mibewDoLoadScript(mibewRequestUrl + '&rnd=' + Math.random(), 'responseScript'); +} + +function mibewOnResponse(response) +{ + var load = response.load; + var handlers = response.handlers; + var data = response.data; + var dependences = response.dependences; + + for(id in load){ + if(! (load[id] in mibewRequestedScripts)){ + mibewRequestedScripts[id] = new Array(); + mibewRequestedScripts[id]['url'] = load[id]; + mibewRequestedScripts[id]['status'] = 'loading'; + mibewLoadScript(id); + } + } + + for(handler in dependences){ + if(! (handler in mibewHandlersDependences)){ + mibewHandlersDependences[handler] = dependences[handler]; + } + } + + for(var i = 0; i < handlers.length; i++){ + var handlerName = handlers[i]; + if(mibewCanRunHandler(handlers[i])){ + window[handlerName](data); + }else{ + if(! (handlers[i] in mibewHandlers)){ + mibewHandlers[handlerName] = function(){ + window[handlerName](data); + }; + } + } + } + + mibewCleanUpAfterRequest(); + + window.setTimeout(mibewMakeRequest,mibewRequestTimeout); +} + +function mibewCleanUpAfterRequest() +{ + document.getElementsByTagName('head')[0].removeChild(document.getElementById('responseScript')); +} + +function mibewDoLoadScript(url, id) +{ + var script = document.createElement('script'); + script.setAttribute('type', 'text/javascript'); + script.setAttribute('src', url); + script.setAttribute('id', id); + document.getElementsByTagName('head')[0].appendChild(script); + return script; +} + +function mibewLoadScript(id) +{ + var script = mibewDoLoadScript(mibewRequestedScripts[id]['url'], id); + script.onload = function(){ + mibewScriptReady(id); + } + script.onreadystatechange = function(){ + if (this.readyState == 'complete' || this.readyState == 'loaded') { + mibewScriptReady(id); + } + } +} + +function mibewScriptReady(id) +{ + mibewRequestedScripts[id]['status'] = 'ready'; + for(handlerName in mibewHandlers){ + if(mibewCanRunHandler(handlerName)){ + mibewHandlers[handlerName](); + delete mibewHandlers[handlerName]; + } + } +} + +function mibewCanRunHandler(handlerName) +{ + var dependences = mibewHandlersDependences[handlerName]; + for(var i = 0; i < dependences.length; i++){ + if(mibewRequestedScripts[dependences[i]]['status'] != 'ready'){ + return false; + } + } + return true; +} \ No newline at end of file diff --git a/src/messenger/webim/libs/common.php b/src/messenger/webim/libs/common.php index b29dcb93..b267a680 100644 --- a/src/messenger/webim/libs/common.php +++ b/src/messenger/webim/libs/common.php @@ -465,6 +465,14 @@ function start_html_output() header("Content-type: text/html" . (isset($charset) ? "; charset=" . $charset : "")); } +function start_js_output(){ + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Pragma: no-cache"); + header("Content-type: application/javascript; charset=utf-8"); + header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); +} + function escape_with_cdata($text) { return "<![CDATA[" . str_replace("]]>", "]]>]]><![CDATA[", $text) . "]]>"; diff --git a/src/messenger/webim/libs/request.php b/src/messenger/webim/libs/request.php new file mode 100644 index 00000000..b4af2495 --- /dev/null +++ b/src/messenger/webim/libs/request.php @@ -0,0 +1,31 @@ +<?php +/* + * This file is part of Mibew Messenger project. + * + * Copyright (c) 2005-2011 Mibew Messenger Community + * All rights reserved. The contents of this file are subject to the terms of + * the Eclipse Public License v1.0 which accompanies this distribution, and + * is available at http://www.eclipse.org/legal/epl-v10.html + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License Version 2 or later (the "GPL"), in which case + * the provisions of the GPL are applicable instead of those above. If you wish + * to allow use of your version of this file only under the terms of the GPL, and + * not to allow others to use your version of this file under the terms of the + * EPL, indicate your decision by deleting the provisions above and replace them + * with the notice and other provisions required by the GPL. + * + * Contributors: + * Dmitriy Simushev - Cross-domain javascript requests implementation + */ + +function build_js_response($response) +{ + $result = array('load' => (isset($response['load'])?$response['load']:array()), + 'handlers' => (isset($response['handlers'])?$response['handlers']:array()), + 'dependences' => (isset($response['dependences'])?$response['dependences']:array()), + 'data' => (isset($response['data'])?$response['data']:array())); + return "mibewOnResponse(" . json_encode($result) . ");"; +} + +?> diff --git a/src/messenger/webim/request.php b/src/messenger/webim/request.php new file mode 100644 index 00000000..6a4eb6ca --- /dev/null +++ b/src/messenger/webim/request.php @@ -0,0 +1,30 @@ +<?php +/* + * This file is part of Mibew Messenger project. + * + * Copyright (c) 2005-2011 Mibew Messenger Community + * All rights reserved. The contents of this file are subject to the terms of + * the Eclipse Public License v1.0 which accompanies this distribution, and + * is available at http://www.eclipse.org/legal/epl-v10.html + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License Version 2 or later (the "GPL"), in which case + * the provisions of the GPL are applicable instead of those above. If you wish + * to allow use of your version of this file only under the terms of the GPL, and + * not to allow others to use your version of this file under the terms of the + * EPL, indicate your decision by deleting the provisions above and replace them + * with the notice and other provisions required by the GPL. + * + * Contributors: + * Dmitriy Simushev - Cross-domain javascript requests implementation + */ + +require_once('libs/request.php'); + +$response = array(); + +start_js_output(); +echo build_js_response($response); + +exit; +?> \ No newline at end of file