/***************************************************************************\ * eGroupWare - API * * http://www.egroupware.org * * Written by: * * - Raphael Derosso Pereira * * sponsored by Thyamad - http://www.thyamad.com * * ------------------------------------------------------------------------- * * Javascript connector (XMLHTTP object interfacing) * * ------------------------------------------------------------------------- * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \***************************************************************************/ function cConnector() { /* Public Attributes */ this.requests = new Array(); this.progressContents = new Array(); this.visible = false; var _this = this; this.nReqs = 0; /* Private Attributes */ this._progressBox = null; this._progressHolder = document.createElement('span'); /* Removed display of connecting status this.setProgressBox('loading_box',true); this.setProgressContent(1,GLOBALS['messages']['jsapi']['connector_1']); this.setProgressContent(2,GLOBALS['messages']['jsapi']['connector_2']); this.setProgressContent(3,GLOBALS['messages']['jsapi']['connector_3']);*/ this._progressHolder.style.visibility = 'hidden'; // this._progressHolder.style.backgroundColor = '#db7e22'; } cConnector.prototype.newRequest = function (id, target, method, handler, data) { var _this = this; if (this.requests[id] && this.requests[id] != null) { // TODO: Study better ways to do this... return; this.requests[id].abort(); delete this.requests[id]; setTimeout(function() { _this.newRequest(id, target, method, handler, data); }, 100); return; } this.nReqs++; document.body.style.cursor = 'progress'; var oxmlhttp = null; try { oxmlhttp = new XMLHttpRequest(); oxmlhttp.overrideMimeType('text/xml'); } catch (e) { try { oxmlhttp = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e1) { try { oxmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e2) { oxmlhttp = null; } } } if (!oxmlhttp) { return false; } this.requests[id] = oxmlhttp; var _this = this; var sub_handler = function () { try { _this._setProgressState(oxmlhttp.readyState); if (oxmlhttp.readyState == 4 )//&& oxmlhttp.channel.status == 0) { if (!oxmlhttp || !oxmlhttp.status) { return; } if (dynapi.debug) { dynapi.debug.print('\nServer Message Arrived:\n\n'+oxmlhttp.responseText+'\n\n'); } switch (oxmlhttp.status) { case 200: if (typeof(handler) == 'function') { handler(oxmlhttp.responseText); } delete _this.requests[id]; _this.nReqs--; if (!_this.nReqs) document.body.style.cursor = ''; break; case 404: alert('Page Not Found!'); break; default: //alert('Some problem while accessing the server. The status is '+oxmlhttp.status); } } } catch (e) { _this.nReqs--; if (!_this.nReqs) document.body.style.cursor = ''; delete _this.requests[id]; // TODO: Handle of special exceptions must be made by API // Exception 0x80040111 => trying to access a component without permission to do so if (e && typeof(e) == 'object' && e.result && e.result == 0x80040111) { return; } showMessage(e); } } try { if (method == '' || method == 'GET') { if (typeof(handler) == 'function') { oxmlhttp.onreadystatechange = sub_handler; } oxmlhttp.open("GET",target,true); oxmlhttp.send(null); } else if (method == 'POST') { if (typeof(handler) == 'function') { oxmlhttp.onreadystatechange = sub_handler; } oxmlhttp.open("POST",target, true); // oxmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); // viniciuscb commented here, messages should be in xmlrpc oxmlhttp.setRequestHeader('Content-Type','text/xml'); oxmlhttp.send(data); //oxmlhttp.setRequestHeader('Content-Type','multipart/form-data; boundary=-----------------------------1156053686807595044986274307'); //oxmlhttp.setRequestHeader('Accept', 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'); } } catch(e) { showMessage(e); } return true; } cConnector.prototype.cancelRequest = function (id) { if (!this.requests[id]) { return false; } this.requests[id].abort(); } cConnector.prototype.setProgressContent = function (state, content) { switch (state) { case 0: case 'UNINITIALIZED': this.progressContents[0] = content; break; case 1: case 'LOADING': this.progressContents[1] = content; break; case 2: case 'LOADED': this.progressContents[2] = content; break; case 3: case 'INTERACTIVE': this.progressContents[3] = content; break; case 4: case 'COMPLETED': this.progressContents[4] = content; break; default: throw('INVALID STATE!'); } } cConnector.prototype.setProgressHolder = function (holder) { var objHolder; if (typeof(holder) == 'string') { objHolder = Element(holder); } else if (typeof(holder) == 'object') { objHolder = holder; } else { return false; } objHolder.appendChild(this._progressHolder); } cConnector.prototype.setProgressBox = function (box, auto) { var objBox; if (typeof(box) == 'string') { objBox = Element(box); } else if (typeof(box) == 'object') { objBox = box; } else { return false; } this._progressBox = objBox; this._progressBoxAuto = auto ? true : false; objBox.appendChild(this._progressHolder); } cConnector.prototype.setVisible = function (visible) { this.visible = visible; if (!visible) { this._progressHolder.style.visibility = 'hidden'; } } /****************************************************************************\ * Private Methods * \****************************************************************************/ cConnector.prototype._setProgressState = function (state) { switch (state) { case 0: case 4: if (this._progressBox != null) { this._progressBox.style.visibility = 'hidden'; this._progressBox.style.zIndex = '-1'; } this._progressHolder.style.visibility = 'hidden'; this._progressHolder.style.zIndex = '-1'; break; default: if (this.visible) { if (this._progressBox != null) { if (this._progressBoxAuto) { if (is_ie) { this._progressBox.style.top = parseInt(document.body.offsetHeight)/2 + 'px'; this._progressBox.style.left = parseInt(document.body.offsetWidth)/2 + 'px'; } else { this._progressBox.style.top = parseInt(window.innerHeight)/2 + parseInt(window.pageYOffset) - this._progressBox.style.height/2 + 'px'; this._progressBox.style.left = parseInt(window.innerWidth)/2 + parseInt(window.pageXOffset) - this._progressBox.style.width/2 + 'px'; } } this._progressBox.style.visibility = 'inherit'; this._progressBox.style.zIndex = 1000000; } this._progressHolder.style.visibility = 'inherit'; this._progressHolder.style.zIndex = '100'; this._progressHolder.innerHTML = this.progressContents[state] ? this.progressContents[state] : ''; } } } var Connector; dynapi.onLoad(function(){ Connector = new cConnector(); Connector.setVisible(true); });