/** ajax.js This file contains a collection of JavaScript functions used to run queries on the server without loading a complete page. Part of KMS, (C) 2014 Frederik Keim **/ // // Global variablees // var _readyStateHooks = new Array(); // // add a global ready state hook // function addReadyStateHook( hook ) { if ( !inArray( hook, _readyStateHooks ) ) { _readyStateHooks[_readyStateHooks.length] = hook; } } // // Remove a global ready state hook // function removeReadyStateHook( hook ) { arrayRemove( hook, _readyStateHooks ); } // // Create and return a new XML-HTTP request object (browser // dependant) // function newXMLHttpRequest() { var xmlreq = false; if( window.XMLHttpRequest ) { xmlreq = new XMLHttpRequest(); } else if( window.ActiveXObject ) { try { xmlreq = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e1) { try { xmlreq = new ActiveXObject( "Microsoft.XMLHTTP" ); } catch(e2) { alert( "Fatal error: Your browser does not support XML HTTP requests!" ); } } } return xmlreq; } // // Returns a function that processes the return value of the XML-HTTP request // depending on its HTTP status code // function getReadyStateHandler ( req, responseHandler, target, reqAction ) { return function() { if( req.readyState == 4 ) { if( req.status == 200 ) { // req.responseText contains response in plain text // req.responseXml contains XML or parsed DOM tree, RTFM! if ( target != null ) { if ( typeof target == 'string' ) { target = document.getElementById(target); target.responseHandler = function( responseText ) { this.innerHTML = responseText; }; } target.responseHandler( req.responseText ); update( target, reqAction ); if ( typeof responseHandler == 'function' ) { responseHandler( target ); } } else { responseHandler( req.responseText ); } } else if ( req.status == 401 ) { window.ignoreMods = true; window.location.href = window.baseUrl+"logout.php?sid="+window.sid; } else if( req.status == 403 ) { // http status 403, do something about that... } else { if ( target != null ) { var errorString = 'Error: HTTP status '+req.status+' in action '+reqAction; // alert( errorString ); update( target, errorString+req.responseText, reqAction ); } } } } } // // Sends a XML-HTTP request to action.php, sets its response handler // function and returns the request object // function action( reqAction, target, getParams, postParams, responseHandler ) { if ( target === undefined ) target = activeId; var async = true;// ( sync == undefined || sync == false ) ? true : false; var req = newXMLHttpRequest(); var handlerFunction = getReadyStateHandler( req, responseHandler, target, reqAction ); var project = ( window['projectCode'] != undefined ) ? "&project=" + window['projectCode'] : ""; var projectLang = ( window['projectLang'] != undefined ) ? "&projectlang=" + window['projectLang'] : ""; var reqUrl = "action.php?action="+reqAction+project+projectLang; if ( getParams != undefined ) reqUrl += '&' + getParams; if ( postParams == undefined ) var postParams = ''; req.onreadystatechange = handlerFunction; req.open( "POST", reqUrl, true ); req.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded; charset=utf-8" ); // req.setRequestHeader( "Content-length", postParams.length ); // req.setRequestHeader( "Connection", "close" ); req.send( postParams ); return req; } // // Run an action with GET parameters only and with a specified // response handler function // function raction( name, param, responseHandler ) { req = action( name, null, param ); req.onreadystatechange = function() { if ( req.readyState == 4 && req.status == 200 ) eval( responseHandler+"( req.responseText );" ); } } // // Returns the content of the file behind URL as plain text // (if it is on the same domain or the server has CORS enabled) // function remoteFileGet( URL, responseHandler ) { var req = newXMLHttpRequest(); req.onreadystatechange = getReadyStateHandler( req, responseHandler ); req.open( "GET", URL, true ); req.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded; charset=utf-8" ); req.setRequestHeader( "Content-length", 0 ); req.setRequestHeader( "Connection", "close" ); req.send(); return req; } // // Writes the HTML content of "content" into the DOM element "target", // calls the ready state hook functions and the report and system tray // update routines // function update( target, actionName ) { for ( var i = 0; i < _readyStateHooks.length; i++ ) { eval( _readyStateHooks[i]+"( target );" ); } if ( self.updateReport ) updateReport( actionName ); if ( self.updateSysTray ) updateSysTray(); } // // Checks if a script file can be accessed on the server and loads // if it possible. Otherwise alerts an error. // function requireScript( url, responseHandler ) { var test = newXMLHttpRequest(); var done = false; test.onreadystatechange = function() { if ( !done && test.status > 0 ) { done = true; if ( test.status == 200 ) loadScript( url, responseHandler ); else alert( 'Error: no such JavaScript file: ' + url ); } }; test.open( "GET", url ); test.send( null ); } // // Adds a JavaScript file at runtime to the DOM tree // function loadScript( url, responseHandler ) { if ( responseHandler == undefined ) var responseHandler = ''; var head = document.getElementsByTagName("head")[0]; var scriptId = url.replace( /[\/\.:]/g, '' ); if ( document.getElementById( scriptId ) ) return; eval("var oldScript = document.getElementById('"+scriptId+"')"); if ( oldScript != null ) { oldScript.parentNode.removeChild( oldScript ); delete oldScript; } var done = false; var script = document.createElement( 'script' ); script.src = url; script.type = "text/javascript"; script.id = scriptId; script.responseHandler = responseHandler; script.onload = script.onreadystatechange = function() { if ( !done && ( !this.readyState || this.readyState === "loaded" || this.readyState === "complete") ) { done = true; eval( this.responseHandler ); // Handle memory leak in IE script.onload = script.onreadystatechange = null; if ( head && script.parentNode ) { head.removeChild( script ); } } }; head.appendChild( script ); return script; } // // Adds a CSS style sheet to the DOM tree at runtim // function loadCSS( url, sheetId ) { if ( sheetId == undefined ) var sheetId = url.replace( /[\/\.]/g, '' ); if ( document.getElementById( sheetId ) ) return; var sheet = document.createElement( "link" ); sheet.rel = "stylesheet"; sheet.href = url; sheet.id = sheetId; document.getElementsByTagName("head")[0].appendChild( sheet ); } function logout() { var xmlhttp; if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", baseUrl, true, "logout", "logout"); xmlhttp.send(""); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4) { location.reload(true); } } } else if (window.ActiveXObject) { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); document.execCommand("ClearAuthenticationCache"); location.reload(true); } return false; }