function XPHelper () {

	this.setPatchMarker = function (a_flag) {
		var sXML = '<?xml version="1.0"?>' ;
		if (a_flag)
			sXML += '<Data State="Done" />';
		else
			sXML += '<Data State="Removed" />';
		xpsp2PersistentFlag.XMLDocument.loadXML(sXML);
		xpsp2PersistentFlag.save("PatchApplied");
	}

	
	this._logMessage = function (strMessage) {
		var language = top.langManager.siteLanguage;
		var version = params.clientVersion;
		var strMsg = window.navigator.userAgent;
		var url = params.vistaSite + "/VWP/common/objects/log.asp?TYPE=SP2&ATID=NP&OFFICE=NP&VERSION=" + version + "&PRODUCT=CRUISE&CERTIFICATES=NP&CHANNEL=NP&MSG="+strMsg+"&SP2MSG=" + strMessage+"&LANGUAGE="+language+"&SCREEN="+screen.height+"X"+screen.width;
		try {
			var tmpDOM = new ActiveXObject("Msxml2.DOMDocument");
			tmpDOM.async=true;	
			tmpDOM.load(url);
			tmpDOM = null;
		}
		catch(e) {}
	}
	
	
	this._displayPatchMessage = function (a_code, a_close) {
		var args = {lang: top.langManager.siteLanguage, code: a_code}
		var strDest = "xpsp2/lang/EN/customMessage.html";
		showModalDialog(strDest, args, "dialogWidth:500px;dialogHeight:200px;status:no;menubar:no;resizable:no;scrollbar:no");
		if (a_close)
			top.parent.window.close();
	}


	this._applyDirectPatch = function() {	
		var result = 5; // default error for exception
		try {		
			var WshShell = new ActiveXObject("WScript.Shell"); // applying patch in direct (code similar to the C++ activeX)		
			result = 1; //LOCKDOWN
			WshShell.RegWrite("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Lockdown_Zones\\0\\2101", 0, "REG_DWORD");		
			result = 2; // ZONES
			WshShell.RegWrite("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\0\\2101", 0, "REG_DWORD");		
			result = 3; // banner
			WshShell.RegWrite("HKCU\\Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_LOCALMACHINE_LOCKDOWN\\iexplore.exe", 0, "REG_DWORD");		
			return 0;
		}
		catch(e) 
			{return result;}
	}


	this.applyXPSP2Patch = function () {
		if (this.isPatchApplied())
			return;
		var strDest = "xpsp2/lang/" + top.langManager.siteLanguage + "/warningMessage.html"
		var iRes = showModalDialog(strDest, null,"dialogHeight:600px;dialogWidth:700px;status:no;menubar:no;resizable:no;scroll:no");
		if(iRes != 0) {
			this._displayPatchMessage(4,false);
			this._logMessage ("XP SP2 Patch refused by user");
			return;
		}
		var oPatcher = null;
		var bIsCABPresent = false;
		try {
			oPatcher = new ActiveXObject("AutoUpdate.AutoUpdateSrv");
			this._logMessage ("Unpatched SP2 detected [Power user]"); // "ADMIN" ? 
			bIsCABPresent = true;
		}
		catch(e){
			this._logMessage ("Unpatched SP2 detected [NON Power user]"); //"NON ADMIN" MODE
		}
		var lError = 0;
		try  {	
			if (bIsCABPresent)
				lError = oPatcher.applyPatchIfNeeded();
			else
				lError = this._applyDirectPatch();
		}
		catch(e)  {
			this._displayPatchMessage(3,false);
			this._logMessage ("XP SP2 Patch failed");
			return;
		}
		switch (lError) {
			case 0:
				this._displayPatchMessage(0,true);
				this._logMessage ("XP SP2 Patch successfully applied");
				this.setPatchMarker(true);
				break;
			case 3: // partial patch only
				this._displayPatchMessage(1,true);
				this._logMessage ("XP SP2 Patch partially applied [banner remaining]");
				break;
			case 1:	//ZONES FAILURE
			case 2: // LOCKDOWN_ZONES FAILURE
			case 5: // CATCH in ACTIVEX
				this._displayPatchMessage(2,false);
				this._logMessage ("XP SP2 Patch failed");
				break;
		}
	}

	
	this.removeXPSP2Patch = function () {
		if (this.isPatchRemoved())
			return;
		var oPatcher;
		try {
			oPatcher = new ActiveXObject("AutoUpdate.AutoUpdateSrv");
			var errCode = oPatcher.RestoreRegistryKeys();
			if(errCode==0) {
				this.setPatchMarker(false);
				this._logMessage("XP SP2 Patch successfully removed");
			}
			else
				this._logMessage("XP SP2 Patch removal failed [" + errCode + "]");
		}
		catch(e) {}
		finally {
			oPatcher = null;
		}
	}

	
	this.getMarkerState = function() {
		var result = "";
		try {
			xpsp2PersistentFlag.load("PatchApplied");
			var myNode= xpsp2PersistentFlag.XMLDocument.selectSingleNode("/Data");
			if (myNode) {
				result = myNode.getAttribute("State");
			}
		}
		catch (e) {}
		return result;
	}

	
	this.isPatchApplied = function() {
		var result = ("Done"==this.getMarkerState());
		return result;	
	}

	
	this.isPatchRemoved = function() {
		var result = ("Removed"==this.getMarkerState());
		return result;	
	}
	
}