397 lines
9.0 KiB
JavaScript
397 lines
9.0 KiB
JavaScript
//------------------------------------------------------------------------------
|
|
// IPS XML HTTP REQUEST
|
|
//------------------------------------------------------------------------------
|
|
// Supports Safari, Mozilla 1.3+ (Firefox, etc) and IE 5.5+
|
|
// (c) 2005 Invision Power Services, Inc.
|
|
// http://www.invisionpower.com
|
|
//------------------------------------------------------------------------------
|
|
|
|
/*--------------------------------------------*/
|
|
// New object
|
|
/*--------------------------------------------*/
|
|
|
|
function ajax_request()
|
|
{
|
|
this.isIE = false;
|
|
this.allow_use = use_enhanced_js ? true : false;
|
|
this.xmlhandler = null;
|
|
this.error_string = '';
|
|
this.nocache = true;
|
|
this.do_request_functon = function() {};
|
|
this.loading_fired = 0;
|
|
this.centerdiv = null;
|
|
}
|
|
|
|
/*--------------------------------------------*/
|
|
// Initiate
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.xml_init = function()
|
|
{
|
|
try
|
|
{
|
|
//------------------------------------------------
|
|
// Moz, Safari, Opera
|
|
//------------------------------------------------
|
|
|
|
this.xmlhandler = new XMLHttpRequest();
|
|
this.ie = false;
|
|
this.allow_use = true;
|
|
return true;
|
|
}
|
|
catch(e)
|
|
{
|
|
try
|
|
{
|
|
//------------------------------------------------
|
|
// IE
|
|
//------------------------------------------------
|
|
|
|
this.xmlhandler = new ActiveXObject('Microsoft.XMLHTTP');
|
|
this.ie = true;
|
|
this.allow_use = true;
|
|
return true;
|
|
}
|
|
catch(e)
|
|
{
|
|
this.ie = true;
|
|
this.allow_use = false;
|
|
return false;
|
|
}
|
|
}
|
|
};
|
|
|
|
/*--------------------------------------------*/
|
|
// Actually send data
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.process = function( url, type, post )
|
|
{
|
|
//------------------------------------------------
|
|
// The 'post' variable needs to be in the following format:
|
|
//
|
|
// var=content&var2=content&var3=content
|
|
//
|
|
// All values need to be escaped with encodeURIComponent();
|
|
//------------------------------------------------
|
|
|
|
type = type == "POST" ? "POST" : "GET";
|
|
|
|
//------------------------------------------------
|
|
// Use nocache where possible...
|
|
//------------------------------------------------
|
|
|
|
if ( this.nocache == true && type == 'GET' )
|
|
{
|
|
url = this.nocache_url( url );
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// Make sure we're initialized
|
|
//------------------------------------------------
|
|
|
|
if ( ! this.xmlhandler )
|
|
{
|
|
this.xml_init();
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// Only go when ready
|
|
//------------------------------------------------
|
|
|
|
if ( ! this.readystate_not_ready() )
|
|
{
|
|
this.xmlhandler.open(type, url, true);
|
|
|
|
if ( type == "GET" )
|
|
{
|
|
this.xmlhandler.send(null);
|
|
}
|
|
else
|
|
{
|
|
if ( typeof( this.xmlhandler.setRequestHeader ) != "undefined" )
|
|
{
|
|
this.xmlhandler.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
}
|
|
|
|
this.xmlhandler.send( post );
|
|
}
|
|
|
|
if ( this.xmlhandler.readyState == 4 && this.xmlhandler.status == 200 )
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
/*--------------------------------------------*/
|
|
// retrieve text of an XML document element, including
|
|
// elements using namespaces
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.get_element_text_ns = function(prefix, local, parentElem, index)
|
|
{
|
|
var result = "";
|
|
|
|
if ( prefix && this.isIE )
|
|
{
|
|
//-------------------------------
|
|
// IE
|
|
//-------------------------------
|
|
|
|
result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
|
|
}
|
|
else
|
|
{
|
|
//-------------------------------
|
|
// Safari, Gecko
|
|
//-------------------------------
|
|
|
|
result = parentElem.getElementsByTagName(local)[index];
|
|
}
|
|
|
|
if ( result )
|
|
{
|
|
if (result.childNodes.length > 1)
|
|
{
|
|
return result.childNodes[1].nodeValue;
|
|
}
|
|
else
|
|
{
|
|
return result.firstChild.nodeValue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return "n/a";
|
|
}
|
|
};
|
|
|
|
/*--------------------------------------------*/
|
|
// Make sure URL is not cached
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.nocache_url = function (url)
|
|
{
|
|
var sep = ( -1 < url.indexOf("?") ) ? "&" : "?";
|
|
var mydate = new Date();
|
|
var newurl = url + sep + "__=" + mydate.getTime();
|
|
return newurl;
|
|
};
|
|
|
|
/*--------------------------------------------*/
|
|
// Takes an array of:
|
|
// array[ field ] = value
|
|
// and returns a nice encoded POST string
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.format_for_post = function( arrayfields )
|
|
{
|
|
var str = '';
|
|
|
|
try
|
|
{
|
|
for( var i in arrayfields )
|
|
{
|
|
str += i + '=' + this.encodeurl(arrayfields[i]) + '&';
|
|
}
|
|
}
|
|
catch(e)
|
|
{
|
|
}
|
|
|
|
return str;
|
|
};
|
|
|
|
/*--------------------------------------------*/
|
|
// Hand roll encode URL to UTF-8
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.encodeurl = function( url )
|
|
{
|
|
//-------------------------------
|
|
// Ensure we have a string
|
|
//-------------------------------
|
|
|
|
url = url.toString();
|
|
|
|
var regcheck = url.match(/[\x90-\xFF]/g);
|
|
|
|
if ( regcheck )
|
|
{
|
|
for (var i = 0; i < i.length; i++)
|
|
{
|
|
url = url.replace(regcheck[i], '%u00' + (regcheck[i].charCodeAt(0) & 0xFF).toString(16).toUpperCase());
|
|
}
|
|
}
|
|
|
|
return escape(url).replace(/\+/g, "%2B");
|
|
};
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
// Check to ensure ready state-ness
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.readystate_not_ready = function()
|
|
{
|
|
return ( this.xmlhandler.readyState && ( this.xmlhandler.readyState < 4 ) );
|
|
};
|
|
|
|
/*--------------------------------------------*/
|
|
// Check to ensure ready state-ness
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.readystate_ready_and_ok = function()
|
|
{
|
|
return ( this.xmlhandler.readyState == 4 && this.xmlhandler.status == 200 ) ? true : false;
|
|
};
|
|
|
|
/*--------------------------------------------*/
|
|
// Onready state change event handler
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.onreadystatechange = function( event )
|
|
{
|
|
//------------------------------------------------
|
|
// Make sure we're initialized
|
|
//------------------------------------------------
|
|
|
|
if ( ! this.xmlhandler )
|
|
{
|
|
this.xml_init();
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// Make sure its a function event
|
|
//------------------------------------------------
|
|
|
|
if ( typeof(event) == 'function' )
|
|
{
|
|
this.xmlhandler.onreadystatechange = event;
|
|
}
|
|
};
|
|
|
|
/*--------------------------------------------*/
|
|
// Show loading layer
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.show_loading = function( message )
|
|
{
|
|
if ( ! this.loading_fired )
|
|
{
|
|
this.loading_fired = 1;
|
|
|
|
//------------------------------------------------
|
|
// Change text?
|
|
//------------------------------------------------
|
|
|
|
if ( message )
|
|
{
|
|
document.getElementById( 'loading-layer-text' ).innerHTML = message;
|
|
}
|
|
|
|
this.centerdiv = new center_div();
|
|
this.centerdiv.divname = 'loading-layer';
|
|
this.centerdiv.move_div();
|
|
|
|
//------------------------------------------------
|
|
// Add the shadow
|
|
//------------------------------------------------
|
|
|
|
add_shadow('loading-layer-shadow', 'loading-layer-inner');
|
|
}
|
|
|
|
return;
|
|
};
|
|
|
|
/*--------------------------------------------*/
|
|
// Hide loading layer
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.hide_loading = function()
|
|
{
|
|
try
|
|
{
|
|
if ( this.centerdiv && this.centerdiv.divobj )
|
|
{
|
|
this.centerdiv.hide_div();
|
|
}
|
|
}
|
|
catch(e)
|
|
{
|
|
}
|
|
|
|
this.loading_fired = 0;
|
|
|
|
return;
|
|
};
|
|
|
|
/*--------------------------------------------*/
|
|
// Execute javascript returned from the HTML
|
|
/*--------------------------------------------*/
|
|
|
|
ajax_request.prototype.execute_javascript = function( source_code )
|
|
{
|
|
//-----------------------------------------
|
|
// INIT
|
|
//-----------------------------------------
|
|
|
|
var text_blocks = new Array();
|
|
var max_iteration = 50;
|
|
var i = 0;
|
|
|
|
//-----------------------------------------
|
|
// Got javascript?
|
|
// We force [^`] to make it match any character
|
|
// except a black-tick as JS doesn't have
|
|
// single line pattern matching.
|
|
//-----------------------------------------
|
|
|
|
while ( _match = source_code.match( new RegExp( "<script\\s+?type=['\"]text/javascript['\"]>([^`]+?)</script>", "i" ) ) )
|
|
{
|
|
i++;
|
|
|
|
if ( i >= max_iteration )
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
text_blocks[ text_blocks.length ] = _match[1];
|
|
source_code = source_code.replace( _match[0], '' );
|
|
}
|
|
}
|
|
|
|
try
|
|
{
|
|
if ( text_blocks.length )
|
|
{
|
|
for ( i = 0 ; i < text_blocks.length ; i++ )
|
|
{
|
|
eval( text_blocks[ i ] );
|
|
}
|
|
}
|
|
}
|
|
catch(error)
|
|
{
|
|
}
|
|
};
|
|
|
|
/*--------------------------------------------*/
|
|
// IPB thinks we can use fancy JS, lets see...
|
|
/*--------------------------------------------*/
|
|
|
|
try
|
|
{
|
|
if ( use_enhanced_js )
|
|
{
|
|
use_enhanced_js = ajax_request.prototype.xml_init() ? 1 : 0;
|
|
}
|
|
}
|
|
catch(error)
|
|
{
|
|
var use_enhanced_js = 0;
|
|
} |