Update of /cvsroot/mantisbt/mantisbt/javascript
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18902/javascript
Added Files:
addLoadEvent.js dynamic_filters.js xmlhttprequest.js
Log Message:
added contribution for 0004315: Show filter without reloading whole page
added config $g_dhtml_filters defaulting to OFF
--- NEW FILE: dynamic_filters.js ---
/*
* Mantis - a php based bugtracking system
* Copyright (C) 2000 - 2002 Kenzaburo Ito -
kenito-J7RQz27tXwtAfugRpC6u6w@xxxxxxxxxxxxxxxx
* Copyright (C) 2002 - 2004 Mantis Team -
mantisbt-dev-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@xxxxxxxxxxxxxxxx
* This program is distributed under the terms and conditions of the GPL
* See the README and LICENSE files for details
*
* --------------------------------------------------------
* $Id: dynamic_filters.js,v 1.1 2004/12/12 14:10:38 thraxisp Exp $
* --------------------------------------------------------
*/
/*
// +----------------------------------------------------------------------+
// | Orginial Code Care Of: |
// +----------------------------------------------------------------------+
// | Copyright (c) 2004 Bitflux GmbH |
// +----------------------------------------------------------------------+
// | 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. |
// +----------------------------------------------------------------------+
// | Author: Bitflux GmbH <devel-zfZwwz/hh/hyDzI6CaY1VQ@xxxxxxxxxxxxxxxx>
|
// | http://blog.bitflux.ch/p1735.html |
// +----------------------------------------------------------------------+
//
//
// +----------------------------------------------------------------------+
// | Heavily Modified by Jeff Minard (07/09/04) |
// +----------------------------------------------------------------------+
// | Same stuff as above, yo! |
// +----------------------------------------------------------------------+
// | Author: Jeff Minard <jeff-js-1MmlY/ymX0P9RPGrWp62eA@xxxxxxxxxxxxxxxx>
|
// | http://www.creatimation.net |
// | http://www.creatimation.net/journal/live-request |
// +----------------------------------------------------------------------+
//
// +----------------------------------------------------------------------+
// | What is this nonsense?? (07/09/04) |
// +----------------------------------------------------------------------+
// | This is a script that, by using XMLHttpRequest javascript objects |
// | you can quickly add some very click live interactive feed back to |
// | your pages that reuire server side interaction. |
// | |
// | For instance, you use this to emulate a "live searching" feature |
// | wherein users type in key phrases, and once they have stopped typing |
// | the script will automatically search and retrive *without* a page |
// | reload.
// | |
// | In another instance, I use this to product live comments by passing |
// | the text to a Textile class that parses it to valid HTML. After |
// | parsing, the html is returned and displayed on the page as the |
// | user types. |
// +----------------------------------------------------------------------+
//
//
// +----------------------------------------------------------------------+
// | Modified by Lee O'Mara <lomara-O8glSrxzjJo@xxxxxxxxxxxxxxxx>
12/08/2004 |
// +----------------------------------------------------------------------+
// | Hacked apart Jeff's script for use in Mantis. |
// | |
// | This script gets filters from the server and displays them without |
// | reloading the page. |
// | |
// | The script tries to follow the notion of "unobtrusive javascript". |
// | There are no event handlers in the HTML code. The events are added |
// | on pageload(based on specific id names). |
// +----------------------------------------------------------------------+
//
//
*/
var processURI = './return_dynamic_filters.php';
var liveReq = false;
// on !IE we only have to initialize it once
if (window.XMLHttpRequest) {
liveReq = new XMLHttpRequest();
}
/**
* Build the XMLHttpRequest and send it
*/
function liveReqDoReq() {
if (liveReq && liveReq.readyState < 4) {
liveReq.abort();
}
if (window.XMLHttpRequest) {
// branch for IE/Windows ActiveX version
} else if (window.ActiveXObject) {
liveReq = new ActiveXObject("Microsoft.XMLHTTP");
}
name = this.id;
liveReq.onreadystatechange = function(){liveReqProcessReqChange(name);};
liveReq.open("GET", processURI + "?filter_target=" + this.id);
// show "Loading..." while waiting
document.getElementById(this.id+'_target').innerHTML = string_loading;
liveReq.send(null);
return false;
}
/**
* Processes the results of the XMLHttpRequest
*/
function liveReqProcessReqChange(name) {
if (liveReq.readyState == 4) {
document.getElementById(name+'_target').innerHTML =
liveReq.responseText;
replaceWithContent(name);
}
}
/**
* Strip the tag, leave the content.
*/
function replaceWithContent(id){
tag = document.getElementById(id);
if (!tag) return false;
t_parent = tag.parentNode;
if (!t_parent) return false;
for(var i=0; i <tag.childNodes.length; i++){
child = tag.childNodes[i].cloneNode(true);
t_parent.insertBefore(child, tag);
}
t_parent.removeChild(tag);
}
/**
* Initialise the filter links
*/
function labelInit(){
// keep browsers that don't support DOM or
// XMLHttpRequest from getting in trouble
if (document.getElementById && (window.XMLHttpRequest ||
window.ActiveXObject)) {
t_form = document.getElementById("filters_form");
if (!t_form) return false;
t_links = t_form.getElementsByTagName("a");
if (!t_links) return false;
for(var i=0; i < t_links.length; i++){
var t_link = t_links[i];
if (t_link.id.substring((t_link.id.length - 7),
t_link.id.length) == "_filter"){
// only attach event handler if a target is
found
if
(document.getElementById(t_link.id+'_target')){
// setup the event handler
t_link.onclick = liveReqDoReq;
} else {
alert("missing target for:" +t_link.id);
}
}
}
}
}
addLoadEvent(labelInit);
--- NEW FILE: addLoadEvent.js ---
/*
* Mantis - a php based bugtracking system
* Copyright (C) 2000 - 2002 Kenzaburo Ito -
kenito-J7RQz27tXwtAfugRpC6u6w@xxxxxxxxxxxxxxxx
* Copyright (C) 2002 - 2004 Mantis Team -
mantisbt-dev-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@xxxxxxxxxxxxxxxx
* This program is distributed under the terms and conditions of the GPL
* See the README and LICENSE files for details
*
* --------------------------------------------------------
* $Id: addLoadEvent.js,v 1.1 2004/12/12 14:10:38 thraxisp Exp $
* --------------------------------------------------------
*/
/*
Care Of:
Simon Willison
http://simon.incutio.com/archive/2004/05/26/addLoadEvent
Thnx Dude!
******** USEAGE ********************************
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
addLoadEvent(function() {
// more code to run on page load
});
*/
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
oldonload();
func();
}
}
}
--- NEW FILE: xmlhttprequest.js ---
/*
* Mantis - a php based bugtracking system
* Copyright (C) 2000 - 2002 Kenzaburo Ito -
kenito-J7RQz27tXwtAfugRpC6u6w@xxxxxxxxxxxxxxxx
* Copyright (C) 2002 - 2004 Mantis Team -
mantisbt-dev-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@xxxxxxxxxxxxxxxx
* This program is distributed under the terms and conditions of the GPL
* See the README and LICENSE files for details
*
* --------------------------------------------------------
* $Id: xmlhttprequest.js,v 1.1 2004/12/12 14:10:38 thraxisp Exp $
* --------------------------------------------------------
*/
/*
Cross-Browser XMLHttpRequest v1.1
=================================
Emulate Gecko 'XMLHttpRequest()' functionality in IE and Opera. Opera requires
the Sun Java Runtime Environment <http://www.java.com/>.
by Andrew Gregory
http://www.scss.com.au/family/andrew/webdesign/xmlhttprequest/
This work is licensed under the Creative Commons Attribution License. To view a
copy of this license, visit http://creativecommons.org/licenses/by/1.0/ or send
a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305,
USA.
Not Supported in Opera
----------------------
* user/password authentication
* responseXML data member
Not Fully Supported in Opera
----------------------------
* async requests
* abort()
* getAllResponseHeaders(), getAllResponseHeader(header)
*/
/*
* commented out (30/07/2004) because it was causing subsequent request to
freeze
// IE support
if (window.ActiveXObject && !window.XMLHttpRequest) {
window.XMLHttpRequest = function() {
return new ActiveXObject((navigator.userAgent.toLowerCase().indexOf('msie
5') != -1) ? 'Microsoft.XMLHTTP' : 'Msxml2.XMLHTTP');
};
}
*/
// Gecko support
/* ;-) */
// Opera support
if (window.opera && !window.XMLHttpRequest) {
window.XMLHttpRequest = function() {
this.readyState = 0; //
0=uninitialized,1=loading,2=loaded,3=interactive,4=complete
this.status = 0; // HTTP status codes
this.statusText = '';
this._headers = [];
this._aborted = false;
this._async = true;
this.abort = function() {
this._aborted = true;
};
this.getAllResponseHeaders = function() {
return this.getAllResponseHeader('*');
};
this.getAllResponseHeader = function(header) {
var ret = '';
for (var i = 0; i < this._headers.length; i++) {
if (header == '*' || this._headers[i].h == header) {
ret += this._headers[i].h + ': ' + this._headers[i].v + '\n';
}
}
return ret;
};
this.setRequestHeader = function(header, value) {
this._headers[this._headers.length] = {h:header, v:value};
};
this.open = function(method, url, async, user, password) {
this.method = method;
this.url = url;
this._async = true;
this._aborted = false;
if (arguments.length >= 3) {
this._async = async;
}
if (arguments.length > 3) {
// user/password support requires a custom Authenticator class
opera.postError('XMLHttpRequest.open() - user/password not supported');
}
this._headers = [];
this.readyState = 1;
if (this.onreadystatechange) {
this.onreadystatechange();
}
};
this.send = function(data) {
if (!navigator.javaEnabled()) {
alert("XMLHttpRequest.send() - Java must be installed and enabled.");
return;
}
if (this._async) {
setTimeout(this._sendasync, 0, this, data);
// this is not really asynchronous and won't execute until the current
// execution context ends
} else {
this._sendsync(data);
}
}
this._sendasync = function(req, data) {
if (!req._aborted) {
req._sendsync(data);
}
};
this._sendsync = function(data) {
this.readyState = 2;
if (this.onreadystatechange) {
this.onreadystatechange();
}
// open connection
var url = new java.net.URL(new java.net.URL(window.location.href),
this.url);
var conn = url.openConnection();
for (var i = 0; i < this._headers.length; i++) {
conn.setRequestProperty(this._headers[i].h, this._headers[i].v);
}
this._headers = [];
if (this.method == 'POST') {
// POST data
conn.setDoOutput(true);
var wr = new java.io.OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();
wr.close();
}
// read response headers
// NOTE: the getHeaderField() methods always return nulls for me :(
var gotContentEncoding = false;
var gotContentLength = false;
var gotContentType = false;
var gotDate = false;
var gotExpiration = false;
var gotLastModified = false;
for (var i = 0; ; i++) {
var hdrName = conn.getHeaderFieldKey(i);
var hdrValue = conn.getHeaderField(i);
if (hdrName == null && hdrValue == null) {
break;
}
if (hdrName != null) {
this._headers[this._headers.length] = {h:hdrName, v:hdrValue};
switch (hdrName.toLowerCase()) {
case 'content-encoding': gotContentEncoding = true; break;
case 'content-length' : gotContentLength = true; break;
case 'content-type' : gotContentType = true; break;
case 'date' : gotDate = true; break;
case 'expires' : gotExpiration = true; break;
case 'last-modified' : gotLastModified = true; break;
}
}
}
// try to fill in any missing header information
var val;
val = conn.getContentEncoding();
if (val != null && !gotContentEncoding)
this._headers[this._headers.length] = {h:'Content-encoding', v:val};
val = conn.getContentLength();
if (val != -1 && !gotContentLength) this._headers[this._headers.length] =
{h:'Content-length', v:val};
val = conn.getContentType();
if (val != null && !gotContentType) this._headers[this._headers.length] =
{h:'Content-type', v:val};
val = conn.getDate();
if (val != 0 && !gotDate) this._headers[this._headers.length] =
{h:'Date', v:(new Date(val)).toUTCString()};
val = conn.getExpiration();
if (val != 0 && !gotExpiration) this._headers[this._headers.length] =
{h:'Expires', v:(new Date(val)).toUTCString()};
val = conn.getLastModified();
if (val != 0 && !gotLastModified) this._headers[this._headers.length] =
{h:'Last-modified', v:(new Date(val)).toUTCString()};
// read response data
var reqdata = '';
var stream = conn.getInputStream();
if (stream) {
var reader = new java.io.BufferedReader(new
java.io.InputStreamReader(stream));
var line;
while ((line = reader.readLine()) != null) {
if (this.readyState == 2) {
this.readyState = 3;
if (this.onreadystatechange) {
this.onreadystatechange();
}
}
reqdata += line + '\n';
}
reader.close();
this.status = 200;
this.statusText = 'OK';
this.responseText = reqdata;
this.readyState = 4;
if (this.onreadystatechange) {
this.onreadystatechange();
}
if (this.onload) {
this.onload();
}
} else {
// error
this.status = 404;
this.statusText = 'Not Found';
this.responseText = '';
this.readyState = 4;
if (this.onreadystatechange) {
this.onreadystatechange();
}
if (this.onerror) {
this.onerror();
}
}
};
};
}
// ActiveXObject emulation
if (!window.ActiveXObject && window.XMLHttpRequest) {
window.ActiveXObject = function(type) {
switch (type.toLowerCase()) {
case 'microsoft.xmlhttp':
case 'msxml2.xmlhttp':
return new XMLHttpRequest();
}
return null;
};
}
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://productguide.itmanagersjournal.com/
|