/***************************************************
 tool-global.js
 * v0.04 2007-04-18
***************************************************/
String.prototype.trim = function(){return this.replace( /(^\s*)|(\s*$)/g, "")};
String.prototype.contains = function(s,i){return i ? this.toLowerCase().indexOf(s.toLowerCase())!=-1 : this.indexOf(s)!=-1;};
String.prototype.startswith = function(s,i){return i ? this.toLowerCase().indexOf(s.toLowerCase())==0 : this.indexOf(s)==0;};
String.prototype.nospaces = function(){return this.replace( /\s/g, "")};

if( Array.prototype.filter == undefined )
{
	Array.prototype.filter = function( fCallback, oCallbackThis )
	{
        var aFiltered = new Array(), nLength = this.length, vElement;
		for( var i=0; i<nLength; i++ )
		{
			if( this[ i ] ) { vElement = this[ i ]; if( fCallback.call( oCallbackThis, vElement, i, this ) ) { aFiltered.push( vElement ); }; }
			//if( i in this ) { vElement = this[ i ]; if( fCallback.call( oCallbackThis, vElement, i, this ) ) { aFiltered.push( vElement ); }; }
		}
		return aFiltered;
	};
}

if( Array.prototype.forEach == undefined )
{
	Array.prototype.forEach = function( fCallback, oCallbackThis )
	{
		var nLength = this.length;
		for( var i=0; i<nLength; i++ )
		{
			if( this[ i ] ) { fCallback.call( oCallbackThis, this[ i ], i, this ); }
		   // if( i in this ) { fCallback.call( oCallbackThis, this[ i ], i, this ); }
		}
	}
}

if( Array.prototype.some == undefined )
{
	Array.prototype.some = function( fCallback, oCallbackThis )
	{
		var nLength = this.length;
		for( var i=0; i<nLength; i++ )
		{
			if( this[ i ] ) { if( fCallback.call( oCallbackThis, this[ i ], i, this ) ) { return true; } }
//			if( i in this ) { if( fCallback.call( oCallbackThis, this[ i ], i, this ) ) { return true; } }
		}
        return false;
	}
}

if( document.documentElement.applyElement == undefined )
{
	if( window.HTMLElement != undefined  )
	{
		window.HTMLElement.prototype.applyElement = function( eNewElement, sPosition )
		{
            switch( sPosition )
			{
				case "outside":
					eNewElement.appendChild( this.cloneNode( true ) );
					tool_fGetParentElement( this ).replaceChild( eNewElement, this );
					break;
				case "inside":
					if( this.hasChildNodes )
					{
						var aChildNodes = this.childNodes;
						var nChildNodes = aChildNodes.length;
						for( var i=0; i<nChildNodes; i++ )
						{
							eNewElement.appendChild( aChildNodes[ i ].cloneNode( true ) );	
						}
					}
					this.innerHTML = "";
					this.appendChild( eNewElement );
			}
		}
	}
}
if( !Array.prototype.indexOf )
{
	Array.prototype.indexOf = function( vValue, nIndex )
	{
		var nLength = this.length;
		if( nIndex == undefined ){ nIndex = 0; };
		if( nIndex >= nLength ) { return -1 };
		if( nIndex < 0 ) { nIndex = ( nLength + nIndex ) };
		for( var i=nIndex; i<nLength; i++ ) { if( this[ i ] === vValue ) { return i; } };
		return -1;
	}
}

Array.prototype.contains = function( vValue )
{
	return ( this.indexOf( vValue ) != -1 );
}
var tool_oNavigator = window.navigator;
var tool_sUserAgent = tool_oNavigator.userAgent.toLowerCase();
var tool_sAppVersion = tool_oNavigator.appVersion.toLowerCase();
var tool_bMac = (tool_oNavigator.platform.toLowerCase().indexOf("mac") != -1);
var tool_bSafari = tool_sUserAgent.indexOf("safari")!=-1;

var tool_bGecko = ( tool_oNavigator.product && tool_oNavigator.product.toLowerCase() == "gecko" ) && !tool_bSafari;
var tool_bGeckoOld = tool_bGecko;
if( tool_bGecko )
{
	var tool_bFF = ( tool_sUserAgent.indexOf( "firefox" ) != -1 );
	if( tool_bFF	&& ( tool_oNavigator.productSub && ( parseInt( tool_oNavigator.productSub ) >= 20051111 ) ) )
	{
		tool_bGeckoOld = false;	
	}
}

var tool_bOpera = ( window.opera != null );
var tool_bOperaXSLT = false;
var tool_bOperaMac = false;
var tool_bOpera9	= false;
var tool_bOpera9_plus = false;
var tool_bOpera8_minus = false;

if( tool_bOpera )
{
	tool_bOperaMac = tool_bMac;
	tool_bOperaXSLT = ( window.XSLTProcessor != null );
	var tool_nOpVersion = parseFloat( tool_sAppVersion );
	tool_bOpera9	= ( tool_nOpVersion == 9 );
	tool_bOpera9_plus = ( tool_nOpVersion >= 9 );
	tool_bOpera8_minus = !tool_bOpera9_plus;
}
var tool_bIE = false;
var tool_bIE55 = false; var tool_bIE55_plus = false;
var tool_bIE6 = false; var tool_bIE6_plus = false; var tool_bIE6_minus = false;
var tool_bIE7 = false; var tool_bIE7_plus = false; 
var tool_nMSIE = tool_sUserAgent.indexOf( "msie" );
if( ( tool_nMSIE != -1 ) && ( !tool_bOpera ) )
{
	var tool_nIEVersion = parseFloat( tool_sUserAgent.slice( tool_nMSIE + 5 ) );
	tool_bIE	= true;
	tool_bIE55 = ( tool_nIEVersion == 5.5 );
	tool_bIE55_plus = ( tool_nIEVersion >= 5.5 );
	tool_bIE6 = ( tool_nIEVersion == 6 );
	tool_bIE6_plus = ( tool_nIEVersion >= 6 );
	tool_bIE7 = ( tool_nIEVersion == 7 );
	tool_bIE7_plus = ( tool_nIEVersion >= 7 );
	tool_bIE6_minus = !tool_bIE7_plus;
}

function tool_fAttachEvent( sEvent, vFunction, eElement, bKeepCase ) { tool_fBindEvent( "attachEvent", "addEventListener", sEvent, vFunction, eElement, bKeepCase );};       
function tool_fDetachEvent( sEvent, vFunction, eElement, bKeepCase ) { tool_fBindEvent( "detachEvent", "removeEventListener", sEvent, vFunction, eElement, bKeepCase );};
function tool_fBindEvent( sAttach, sListener, sEvent, vFunction, eElement, bKeepCase )
{
	eElement = ( eElement || window );
	var fFunction = null;
	if( typeof vFunction == "string" )
	{
		fFunction = window[ vFunction ];
	}
	else
	{
		fFunction = vFunction;  
	}
	if( fFunction != null )
	{
		if( !bKeepCase )
		{
			sEvent = sEvent.toLowerCase();
		}
		if( sEvent.startswith( "on" ) )
		{
			sEvent = sEvent.slice( 2 );
		}
		if( window[ sAttach ] )
		{
			eElement[ sAttach ]( "on" + sEvent, fFunction );
		}
		else
		{
			eElement[ sListener ]( sEvent, fFunction, false ); 
		}       
	}
}

function tool_fGetCookie( sName, keepValue )
{
	var sDocCookie = document.cookie;
	var xName = new RegExp( sName + "=([^\\;]*)" );
	var aMatches = sDocCookie.match( xName ); 
	if( aMatches != null )
	{
		var sValue = aMatches[ 1 ];
		if(!keepValue){
           sValue = unescape(sValue);
		}
		sValue = sValue.trim();
		return( sValue.length == 0 ) ? null : sValue;
	}
	return null;
}

function tool_fDeleteCookie( sName ) { tool_fSetCookie( sName, "", new Date() );};

function tool_fSetCookie( sName, sValue, vDate, keepValue )
{
	if( vDate == null )
	{
		var dDate = new Date();
		dDate.setDate( dDate.getDate() + 30 );
		var sExpires = ( "; expires=" + dDate.toGMTString() );
	}
	else if( vDate == "session" )
	{
		var sExpires = ( ";" );
	}
	else
	{
		var sExpires = ( "; expires=" + vDate.toGMTString() );  
	}
	if(!keepValue){
		sValue = escape(sValue);
	}
	document.cookie = [ sName, "=", sValue, sExpires, "; path=/;" ].join("");
}

function tool_fSetInnerText( eElement, sText ) { ( eElement.innerText != null ) ? ( eElement.innerText = sText ) : ( eElement.textContent = sText )};
function tool_fGetInnerText( eElement )
{ 
	var sText = ''; 
	if( eElement.innerText != null )
	{
		sText = eElement.innerText;
		if( ( sText.trim().length == 0 ) && ( tool_bSafari ) && ( eElement.hasChildNodes() ) )
		{
			var oText = eElement.firstChild;
			if( oText.nodeType == 3 )
			{
				sText = oText.nodeValue;
			}
		}
	}
	else if( eElement.textContent != null )
	{
		sText = eElement.textContent;
	}
	return sText.trim();
};


function tool_fGetElementsByClassName( eElement, sClass, sTagName )
{
	if( sTagName )
	{
		var aChildren = eElement.getElementsByTagName( sTagName );
	}
	else
	{
		var aChildren = tool_bIE55 ? eElement.all : eElement.getElementsByTagName( "*" );
	}
	var nChildren = aChildren.length;
	var eChild;
	var fHasClassName = tool_fHasClassName;
	var aClassElements = new Array();
	for( var i=0; i<nChildren; i++ )
	{
		eChild = aChildren[ i ];
		if( fHasClassName( eChild, sClass ) )
		{
			aClassElements.push( eChild	);
		}
	}
	return aClassElements;
}

function tool_fAddClassName( eElement )
{
	var sTempClass = eElement.className.trim();
	var aArguments = ( typeof arguments[ 1 ] == "string" ) ? arguments : arguments[ 1 ]; 
	var nArguments = aArguments.length;
	for( var i=1; i<nArguments; i++ )
	{
		sTempClass += ( " " + aArguments[ i ] );	
	}
	eElement.className = sTempClass;	
}

function tool_fRemoveClassName( eElement )
{
	var sTempClass = eElement.className.trim();
	var aArguments = ( typeof arguments[ 1 ] == "string" ) ? arguments : arguments[ 1 ]; 
	var nArguments = aArguments.length;
	for( var i=1; i<nArguments; i++ )
	{
		var xClass = new RegExp( ( "(^|\\b)" + aArguments[ i ] + "(\\b|$)" ), "g" );
		sTempClass = sTempClass.replace( xClass, "" ).trim();	
	}
	eElement.className = sTempClass;	
}

function tool_fHasClassName( eElement, sClass )
{
	var sClasses = eElement.className;
	if( sClasses )
	{
		var aClasses = eElement.className.trim().split( " " );
		var nClasses = aClasses.length;
		for( var i=0; i<nClasses; i++ )
		{
			if( aClasses[ i ].trim() == sClass )
			{
				return true;
			}
		}
	}
	return false;
}

function tool_fGetCurrentStyle( eElement, sProperty )
{	 
	if( eElement.currentStyle != null ) 
	{                           
		var oCurrentStyle = eElement.currentStyle;
	    var sValue = oCurrentStyle[ sProperty ];
		if( sValue == null )
		{
			sValue = oCurrentStyle[ sProperty.replace( /(\-)(.{1})/g, function(a,b,c){return c.toUpperCase()}) ];
		}
        return sValue;
	}
	else
	{
		var oDefaultView = document.defaultView;
		if( oDefaultView.getComputedStyle ) 
		{
			var oComputedStyle = oDefaultView.getComputedStyle( eElement, null );
			if( oComputedStyle )
			{
				return oComputedStyle.getPropertyValue( sProperty );
			}
		}
	}
	return null;
}

function tool_fSupportsStyleProperty( sProperty )
{
	var eCheckElement = ( document.documentElement || document.body );
	var oCurrentStyle = new Object();
	if( eCheckElement.currentStyle )
	{
		oCurrentStyle = eCheckElement.currentStyle;
	}
	else            
	{
		var oDefaultView = document.defaultView;
		if( oDefaultView && oDefaultView.getComputedStyle ) 
		{
			oCurrentStyle = oDefaultView.getComputedStyle( eCheckElement, null );
		}
	}
	return ( oCurrentStyle[ sProperty ] != undefined );
}

function tool_fGetId( eElement )
{
	var sId = eElement.id.trim();
	if( sId == "" )
	{
		sId = eElement.uniqueID;
		eElement.id = sId;
	}
	if( sId == null )
	{
		sId = tool_fGetRandomIdentifier();
        eElement.id = sId;
	}
	return sId;
}

function tool_fGetRandomIdentifier()
{
	var oDate = new Date(); 
	return ( "id" + oDate.getTime() + ( Math.random() * ( 1 + Math.random() ) ) ).replace( /\./g, "" );
}

function tool_fGetEvent( e ){ return ( e || window.event ); };

function tool_fGetSrcElement( oEvent )
{
	oEvent = ( oEvent || window.event );
	var eSrcElement = ( oEvent.srcElement || oEvent.target );
	while( eSrcElement.nodeType != 1 )
	{
		eSrcElement = eSrcElement.parentNode;	
	}
    return eSrcElement;
}

function tool_fEventCancel( e )
{
	var oEvent = tool_fGetEvent( e );
	oEvent.returnValue = false;
	return false;
}

function tool_fGetParentElement( eElement )
{
	var eParElement = eElement.parentNode;
	while( eParElement != null &&  eParElement.nodeType != 1 )
	{
		eParElement = eParElement.parentNode;	
	}
    return eParElement;
}

function tool_fRemoveElement( vElement )
{
	var eElement = ( typeof vElement == "string" ) ? document.getElementById( vElement ) : vElement;
	if( eElement )
	{
		tool_fGetParentElement( eElement ).removeChild( eElement ); 
	}
}

function tool_fGetAttributeFromHeirarchy( eElement, sAttribute )
{
	var sValue;
	while( eElement != null )
	{
		sValue = eElement.getAttribute( sAttribute );
		if( sValue == null )
		{
			sValue = eElement[ sAttribute ];
		}
		if( sValue != null )
		{
			break;
		}
		eElement = tool_fGetParentElement( eElement );   
	}
	return [ eElement, sValue ];
}

function tool_fGetParentByProperty( eElement, eOuterElement, sProperty, sValue, bParent )
{	
	sValue = sValue.toLowerCase();
	var xValue = new RegExp( "(^|\\s)" + sValue + "(\\s|$)" );
	if( bParent ) { eElement = tool_fGetParentElement( eElement ) };
	while( !xValue.test( eElement[ sProperty ].toLowerCase() ) )
	{	
		eElement = tool_fGetParentElement( eElement );
		if( ( eElement == eOuterElement ) || ( eElement == null ) ) { return null };	
	}
	return eElement;
}

function tool_fGetParentByTagName( eElement, sTagName, eOuterElement, bParent )
{                       
	return tool_fGetParentByProperty( eElement, ( eOuterElement || document.body ), "tagName", sTagName, bParent );	
}

function tool_fGetParentByClassName( eElement, sClass, eOuterElement, bParent )
{
	return tool_fGetParentByProperty( eElement, ( eOuterElement || document.body ), "className", sClass, bParent );	
}

function tool_getMouseX( oEvent )
{
	return ( tool_bIE ? ( event.clientX + document.body.scrollLeft ) : oEvent.pageX );	
}

function tool_getMouseY( oEvent )
{
	return ( tool_bIE ? ( event.clientY + document.body.scrollTop  ) : oEvent.pageY );	
}

function tool_keepInWindow( eElement, nLeftPos, nTopPos )
{
	var nMinSpace = 5;
	var eDocBody = document.documentElement;

	var nWindowLeftEdge = eDocBody.scrollLeft;
	var nWindowTopEdge  = eDocBody.scrollTop;
	var nWindowWidth    = eDocBody.clientWidth;
	var nWindowHeight   = eDocBody.clientHeight;
	var nWindowRightEdge  = ( nWindowLeftEdge + nWindowWidth ) - nMinSpace;
	var nWindowBottomEdge = ( nWindowTopEdge + nWindowHeight ) - nMinSpace;
	
	var nElementRightEdge = nLeftPos + eElement.offsetWidth;
	var nElementBottomEdge = nTopPos + eElement.offsetHeight;;
	
	if( nElementRightEdge > nWindowRightEdge )
	{
		nLeftPos -= ( nElementRightEdge - nWindowRightEdge );
		nLeftPos = Math.max( nMinSpace, nLeftPos );
	}

	if( nElementBottomEdge > nWindowBottomEdge )
	{
		nTopPos -= ( nElementBottomEdge - nWindowBottomEdge );
		nTopPos = Math.max( nMinSpace, nTopPos );
	}
	
	nLeftPos = Math.max( nWindowLeftEdge + nMinSpace, nLeftPos );
	nTopPos = Math.max( nWindowTopEdge + nMinSpace, nTopPos ); 
	
	eElement.style.left = ( nLeftPos + "px" );
	eElement.style.top  = ( nTopPos  + "px" );
}



function tool_fIsLeftButton( oEvent )
{
	return oEvent.button == ( tool_bIE ? 1 : 0 );
}

function tool_fGetElementLeft( eElement )   { return tool_fGetElementLeftTop( eElement, "offsetLeft", "clientLeft" ); };
function tool_fGetElementTop( eElement )    { return tool_fGetElementLeftTop( eElement, "offsetTop", "clientTop" ); };
function tool_fGetElementRight( eElement )  { return ( tool_fGetElementLeft( eElement ) + eElement.offsetWidth );  };
function tool_fGetElementBottom( eElement ) { return ( tool_fGetElementTop( eElement )  + eElement.offsetHeight ); };
function tool_fGetElementCentre( eElement ) { return ( tool_fGetElementLeft( eElement ) + ( eElement.offsetWidth / 2 ) ); };
function tool_fGetElementMiddle( eElement ) { return ( tool_fGetElementTop( eElement )  + ( eElement.offsetHeight / 2 ) ); };
function tool_fGetElementLeftTop( eElement, sOffset, sClient )
{
	var nPos = eElement[ sOffset ];
	var eParElement = eElement.offsetParent;
	var sTagName, nClient;
	while( eParElement != null )
	{
		if( ( ( sTagName = eParElement.tagName.toLowerCase() ) != "table" ) && ( eParElement != document.documentElement ) )
		{
			if( ( nClient = eParElement[ sClient ] ) != null ) { nPos += nClient; }
		}
		nPos += eParElement[ sOffset ];
		eParElement = eParElement.offsetParent;
	}                                                                                                                
	return nPos;
}

function tool_fGetScrollTop() { return ( (tool_bGecko || tool_bSafari ) ? window.pageYOffset : tool_bIE6_plus ? ( document.documentElement.scrollTop == 0 ) ? document.body.scrollTop : document.documentElement.scrollTop : document.body.scrollTop ); };
function tool_fGetScrollLeft(){ return ( (tool_bGecko || tool_bSafari ) ? window.pageXOffset : tool_bIE6_plus ? ( document.documentElement.scrollLeft == 0 ) ? document.body.scrollLeft : document.documentElement.scrollLeft : document.body.scrollLeft ); };
function tool_fGetClientWidth() { return ( ( tool_bIE55 || tool_bOpera ) ? document.body.clientWidth : tool_bSafari ? window.innerWidth : ( document.documentElement.clientWidth == 0 ) ? document.body.clientWidth : document.documentElement.clientWidth ); };
function tool_fGetClientHeight() { return ( ( tool_bIE55 || tool_bOpera ) ? document.body.clientHeight  : tool_bSafari ? window.innerHeight : ( document.documentElement.clientHeight == 0 ) ? document.body.clientHeight : document.documentElement.clientHeight ); };


function tool_fGetFirstElementByTagName( eParent, sTagName )
{
	return eParent.getElementsByTagName( sTagName )[ 0 ];
}

function tool_fGetFirstElementByClassName( eParent, sClass, sTagName )
{
	return tool_fGetElementsByClassName( eParent, sClass, sTagName )[ 0 ];
}

function tool_fGetElementsByClassName( eParent, sClass, sTagName )
{
	if( sTagName )
	{
		var aChildren = eParent.getElementsByTagName( sTagName );
	}
	else
	{
		var aChildren = tool_bIE55 ? eParent.all : eParent.getElementsByTagName( "*" );
	}
	var nChildren = aChildren.length;
	var eChild;
	var fHasClassName = tool_fHasClassName;
	var aClassElements = new Array();
	for( var i=0; i<nChildren; i++ )
	{
		eChild = aChildren[ i ];
		if( fHasClassName( eChild, sClass ) )
		{
			aClassElements.push( eChild	);
		}
	}
	return aClassElements;
}

function tool_fGetFirstPreviousElementByClassNameMoz( eElement, sClass )
{
	var rElement = document.createRange();
	rElement.selectNode( eElement );
	var rPrevious = document.createRange();
	var aAll = tool_fGetElementsByClassName( document.body, sClass );
    var nAll = aAll.length - 1;
	for( var i=nAll; i>=0; i-- )
	{
		ePrevious = aAll[ i ];
		rPrevious.selectNode( ePrevious );
		if( rPrevious.compareBoundaryPoints( Range.END_TO_START, rElement ) == -1 )
		{
			return ePrevious;
		}
	}
	return null;
}

function tool_fGetFirstPreviousElementByClassNameIE( eElement, sClass )
{
    var nElementIndex = eElement.sourceIndex;
	var aAll = tool_fGetElementsByClassName( document.body, sClass );
    var nAll = aAll.length - 1;
	for( var i=nAll; i>=0; i-- )
	{
		ePrevious = aAll[ i ];
		if( ePrevious.sourceIndex < nElementIndex )
		{
			return ePrevious;
		}
	}
	return null;
}

var tool_fGetFirstPreviousElementByClassName = tool_bIE ? tool_fGetFirstPreviousElementByClassNameIE : tool_fGetFirstPreviousElementByClassNameMoz;

///////////////////////////////////////////////

var tool_bHTTP = null;
var tool_nHTTPTimeout = 0;

function tool_fCanHttp()
{
	var bHTTP = window.tool_bHTTP;
	if( typeof bHTTP != "boolean" )
	{
		var oHTTP;
		var fGetBrowserHTTP;
		bHTTP = true;
		if( window.XMLHttpRequest != null )
		{
			try
			{
				oHTTP = new XMLHttpRequest();
				fGetBrowserHTTP = tool_fGetHTTPGecko;
			}
			catch( e )
			{
				bHTTP = false;
			}
		}
		else if( tool_bIE )
		{
			try
			{
				oHTTP = new ActiveXObject( "Msxml2.XMLHTTP" );
				fGetBrowserHTTP = tool_fGetHTTPIeNew;
			} 
			catch( e )
			{
				try
				{
					oHTTP = new ActiveXObject( "Microsoft.XMLHTTP" );
					fGetBrowserHTTP = tool_fGetHTTPIeOld;
				}
				catch ( f )
				{
					bHTTP = false;
				}
			}
		}
		window.tool_bHTTP = bHTTP;
		if( bHTTP )
		{
			window.tool_fGetBrowserHTTP = fGetBrowserHTTP;	
		}
	}
	return bHTTP;
}

function tool_fGetHTTPIeNew() { return new ActiveXObject( "Msxml2.XMLHTTP" ); };
function tool_fGetHTTPIeOld() { return new ActiveXObject( "Microsoft.XMLHTTP" ); };
function tool_fGetHTTPGecko() { return new XMLHttpRequest(); };
function tool_fGetHTTP()      { return window.tool_fGetBrowserHTTP(); };

function XmlDom() {
	if (window.ActiveXObject) {
		var msActiveXSigs = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XmlDom"];
		for (var i=0; i<msActiveXSigs.length; i++) {
			try {
				var xmlDom = new ActiveXObject(msActiveXSigs[i]);
				return xmlDom;
			} catch (e) {}
		}
		throw new Error ("XML DOM object missing, unable to load vote");
	} else if (document.implementation && document.implementation.createDocument) {
		function FakeDocument() {
			this.documentElement = null;
			this.loadXML = function(str) { 
				var e = document.createElement("dummy");
				e.innerHTML = str.replace(/(((?:<|\&lt;)!\[\CDATA\[)|(\]\](?:>|\&gt;))|((?:<|\&lt;)\?xml.*\?(?:>|\&gt;)))/gi, "");
				this.documentElement = e.getElementsByTagName("*")[0];
				this.getElementsByTagName = function() {
					return this.documentElement
							.getElementsByTagName.apply(this.documentElement, arguments);
				}
			}
		}
		return new FakeDocument();
	} else {
		throw new Error("Your browser does not support the XML Dom object, unable to load vote");
	}
}

/*
 * These functions are to mirror functionality from IE in FF such that 
 * 
 */
if (document.implementation && document.implementation.createDocument) {
	/* add functionality to Document to mirror loadXML in IE */
	Document.prototype.loadXML = function (xml) {
		var parser = new DOMParser();
		var xmlDom = parser.parseFromString(xml, "text/xml");
		
		/* ensure the Document is empty */
		while (this.firstChild) {
			this.removeChild(this.firstChild);
		}
		
		/* populate with new data */
		for (var i=0; i<xmlDom.childNodes.length; i++) {
			var newNode = this.importNode(xmlDom.childNodes[i], true);
			this.appendChild(newNode);
		}
		
	}
}

function tool_fSendHTTP( sURL, bAsync, vPostString, fCall )
{
	var oHttp = tool_fGetHTTP();
	
		/*
		 * In order to correctly cache these requests using Akamai rules
		 * we need to send the request to a differnt URL for each variation
		 * of competition request type and ID. As such the URL the request submits
		 * to is made up of /comp-frontend/comp/COMPETITION_REQUEST_TYPE/COMPETITION_ID
		 * 
		 * The request type is the root node of vPostString and the ID is found from the
		 * competitionid node of vPostString. 
		 */
	var xmlDom = new XmlDom();
	xmlDom.loadXML(vPostString);
	var competitionRequestType = xmlDom.documentElement.nodeName;
	var competitionIdString = xmlDom.getElementsByTagName("competitionid")[0].firstChild.nodeValue;
	sURL += "/" + competitionRequestType + "/" + competitionIdString + "/";
	
	if( bAsync )
	{
		if( fCall != null )
		{
			var aArguments = new Array();
			var nReceived = arguments.length;
			var nExpected = arguments.callee.length;
			for( var i=nExpected; i<nReceived; i++ )
			{
				aArguments.push( arguments[ i ] );	
			}
            oHttp.onreadystatechange = function()
			{	   
				if( oHttp.readyState == 4 )
				{
					if( oHttp.status == 0 || oHttp.status == 200 )
					{
						fCall.apply( oHttp, aArguments ); 
					}
				}
			}
		}
	}
    oHttp.open( ( vPostString ? "POST" : "GET" ), sURL, bAsync );
    try { oHttp.send( vPostString ) }
	catch(e) { 
		
		alert(e)
		
		return false; }
	return oHttp;
}

function tool_fSendHTTPSync( sURL ) { return tool_fSendHTTP( sURL, false ); };
function tool_fSendHTTPASync( sURL, vPostString, fCall ) { return tool_fSendHTTP( sURL, true, vPostString, fCall ) };

function tool_fHTTPAbort( sElementId )
{
	var oElementHttp = tool_fGetElementHttp( sElementId );
	if( !oElementHttp.bHttpComplete )
	{
		var oHttp = oElementHttp.oHttp;
		if( oHttp && oHttp.abort )
		{	 
			oHttp.abort();
			oElementHttp.onError( sElementId );	
		}
	}
}

var tool_aElementHttps = new Array();

function tool_fSetElementHttp( sElementId, oElementHttp ) { window.tool_aElementHttps[ sElementId ] = oElementHttp; };
function tool_fGetElementHttp( sElementId ) { return window.tool_aElementHttps[ sElementId ]; };

function tool_fSetHTTPResponseHTML( eElement, sURL, bAsync, vPostString, fOnSingleComplete, fOnSingleError, fOnSeriesComplete )
{
	tool_fSetHTTPResponseContent( "html", eElement, sURL, bAsync, vPostString, fOnSingleComplete, fOnSingleError, fOnSeriesComplete );
}

function tool_fSetHTTPResponseText( eElement, sURL, bAsync, vPostString, fOnSingleComplete, fOnSingleError, fOnSeriesComplete )
{
	tool_fSetHTTPResponseContent( "text", eElement, sURL, bAsync, vPostString, fOnSingleComplete, fOnSingleError, fOnSeriesComplete );
}

function tool_fSetHTTPResponseContent( sType, eElement, sURL, bAsync, vPostString, fOnSingleComplete, fOnSingleError, fOnSeriesComplete )
{						
	var oElementHttp = new Object();
    var sElementId = tool_fGetId( eElement );
    tool_fSetElementHttp( sElementId, oElementHttp );
	
	var oHttp = tool_fGetHTTP();
    oHttp.onreadystatechange = function()
	{	   
		if( oHttp.readyState == 4 )
		{
			clearTimeout( oElementHttp.oHttpTimeout	);
			if( oHttp.status == 0 || oHttp.status == 200 )
			{
				oElementHttp.bHttpComplete = true;
				switch( sType )
				{
					case "html":
						eElement.innerHTML = oHttp.responseText;
						break;
					case "text":
						tool_fSetInnerText( eElement, oHttp.responseText );
						break;
				}
				if( fOnSingleComplete != null )
				{
					fOnSingleComplete( sElementId );	
				}
				if( fOnSeriesComplete != null )
				{
					fOnSeriesComplete();	
				}
			}
			else
			{
				if( fOnSingleError != null )
				{
					fOnSingleError( sElementId );	
				}
			}
		}
	}
	oElementHttp.oHttp = oHttp;
	oElementHttp.bHttpComplete = false;
	oElementHttp.onError = ( fOnSingleError || new Function() );
	oElementHttp.oHttpTimeout = ( tool_nHTTPTimeout ) ? ( setTimeout( "tool_fHTTPAbort( '" + sElementId + "' )", tool_nHTTPTimeout ) ) : null;
    oHttp.open( ( vPostString ? "POST" : "GET" ), sURL, bAsync ); 
    try
	{
		oHttp.send( vPostString );
	}
	catch( e )
	{			  
		if( fOnSingleError != null )
		{
			clearTimeout( oElementHttp.oHttpTimeout	);
			fOnSingleError( sElementId, e );	
		}
	}
}
		
function tool_fCreateXMLDocFromString( sXML )
{
	var oDOMParser = new DOMParser();
	return oDOMParser.parseFromString( sXML, "text/xml" );
}

function tool_fCreateXMLDocFromStringIE( sXML )
{
	var oXMLDoc = new ActiveXObject( "Msxml2.DOMDocument.3.0" );
	oXMLDoc.async = false;
	oXMLDoc.loadXML( sXML );
	if( oXMLDoc.parseError.errorCode != 0 )
	{
		var oError = oXMLDoc.parseError;
	}
	else
	{
	}
	return oXMLDoc;
}

function tool_fCreateXMLDocFromStringOpera( sXML )
{
	var oDOMParser = document.implementation.createLSParser(document.implementation.MODE_SYNCHRONOUS,null );
	var oInput = document.implementation.createLSInput();
	oInput.encoding = "utf-8";
	oInput.stringData = sXML;
	return oDOMParser.parse( oInput );
}

if( tool_bIE ) { tool_fCreateXMLDocFromString = tool_fCreateXMLDocFromStringIE; };
if( tool_bOpera ) { tool_fCreateXMLDocFromString = tool_fCreateXMLDocFromStringOpera; };

function tool_fGetNodeText( oNode )
{ 
    var sText = ( oNode.textContent || oNode.text || oNode.innerText || "" );
    if (!sText && oNode.firstChild ) { sText = ( oNode.firstChild.nodeValue || "" ) };
    return sText.trim();
}

function tool_fScrollIntoView( eElement )
{
	var nScrollLeft = tool_fGetScrollLeft();
	eElement.scrollIntoView( true );
	window.scrollTo( nScrollLeft, tool_fGetScrollTop() );
}

		
		
		
