// JavaScript Document

/**
 * Increments a transactional counter.
 * 
 * @param anIncrement the amount to increment to the current count
 * @param aNumberType NUM_TYPE_BYTE=0 | NUM_TYPE_DOUBLE=1 | NUM_TYPE_FLOAT = 2 | NUM_TYPE_INT = 3 | NUM_TYPE_LONG = 4 | NUM_TYPE_SHORT = 5
 * @param aPrimaryKey a value for the entry's primary key in the database (semantics: counter ID)
 * @param aDatabase the name of the database to store the entry in.
 * 
 * @return true if request was sent successfully
 */
function incrementCounter(anIncrement, aNumberType, aPrimaryKey, aDatabase){
    //
    //
    var retValue = false;
    //
	// create a transactional counter command       
	var decodedCmdSet = "";
	decodedCmdSet = "<COMMANDS>" +
						"<COMMAND CLASS_NAME=\"com.tenduke.services.xmldb.number.TransactionalIncrementCounter\"" +
								" KEY=\"" + aPrimaryKey + "\"" +
								" INCREMENT=\"" + anIncrement + "\"" +
								" NUMBER_TYPE=\"" + aNumberType + "\"" +
								" DATABASE_NAME=\"" + aDatabase + "\">" +
						"</COMMAND>" +
					"</COMMANDS>";
	//
	// send request
	var dbReq = initRequest("/servlets/XMLCommandServlet", "POST");
	dbReq.setRequestHeader("Content-Type", "text/xml; charset=\"UTF-8\"");
	try {
		dbReq.send(decodedCmdSet);
		retValue = true;
	}
	catch(cmdSendE) {
		dbReq = null;
	}
	//
	//
	return retValue;
}

/**
 * Gets the value of a counter.
 * 
 * @param aNumberType NUM_TYPE_BYTE=0 | NUM_TYPE_DOUBLE=1 | NUM_TYPE_FLOAT = 2 | NUM_TYPE_INT = 3 | NUM_TYPE_LONG = 4 | NUM_TYPE_SHORT = 5
 * @param aPrimaryKey a value for the entry's primary key in the database
 * @param aDatabase the name of the database to store the entry in.
 * 
 * @return Value of counter (value=0 if counter does not exists or value is actually).
 */
function getCounterValue(aNumberType, aPrimaryKey, aDatabase) {
    //
    //
    var retValue = 0;
    //
	// create a transactional counter command       
	var decodedCmdSet = "";
	decodedCmdSet = "<COMMANDS>" +
						"<COMMAND CLASS_NAME=\"com.tenduke.services.xmldb.number.TransactionalGetEntries\"" +
								" KEY=\"" + aPrimaryKey + "\"" +
								" SECONDARY_KEY=\"\"" +
								" DATABASE_NAME=\"" + aDatabase + "\"" +
								" READ_OFFSET=\"0\"" + 
								" MAX_ITEMS=\"1\"" + 
								" NUMBER_TYPE=\"" + aNumberType + "\"" +
								" QUERY_METHOD=\"PRIMARY\" />" +
					"</COMMANDS>";
	//
	// send request
	var dbReq = initRequest("/servlets/XMLCommandServlet", "POST");
	dbReq.setRequestHeader("Content-Type", "text/xml; charset=\"UTF-8\"");
	try {
		dbReq.send(decodedCmdSet);
	}
	catch(cmdSendE) {
		dbReq = null;
	}
	//
	//
	if (dbReq && dbReq.readyState == 4) {
        if (dbReq.status == 200 && dbReq.responseXML!=null) {
			//
			//
			response  = dbReq.responseXML.documentElement;
			if(response==null || response==undefined) return;
			//
			//
			var cmdElement = response.getElementsByTagName('COMMAND')[0];
			var objectResponse = response.getElementsByTagName('OBJECT_RESPONSE')[0];
			var result = ((cmdElement!=null && cmdElement!=undefined) ? cmdElement.getAttribute('RESULT').toString():"FAILED");
			if(result=="OK") {
				//
				//
				var aNodeList = objectResponse.getElementsByTagName('DATA');
				if(aNodeList && aNodeList.length>0) {
					dataNode = aNodeList[0];
					if(dataNode && dataNode.firstChild && dataNode.firstChild.nodeType==Node.TEXT_NODE) {
						var dataValue = dataNode.firstChild.nodeValue;
						retValue = parseInt(dataValue);
					}
				}
			}
        }
    }
	//
	//
	return retValue;
}

/**
 * 
 */
function averageCounter(aNewValue, aNumberType, aPrimaryKey, aDatabase) {
    //
    //
    var retValue = false;
	//
	//
	var decodedCmdSet = "";
	decodedCmdSet = "<COMMANDS>" +
						"<COMMAND CLASS_NAME=\"com.tenduke.services.xmldb.number.TransactionalAverageCounter\"" +
								" DATABASE_NAME=\"" + aDatabase + "\"" +
								" KEY=\"" + aPrimaryKey + "\"" +
								" NEW_VALUE=\"" + aNewValue + "\"" +
								" NUMBER_TYPE=\"" + aNumberType + "\" />" +
					"</COMMANDS>";
	//
	// send request
	var dbReq = initRequest("/servlets/XMLCommandServlet", "POST");
	dbReq.setRequestHeader("Content-Type", "text/xml; charset=\"UTF-8\"");
	try {
		dbReq.send(decodedCmdSet);
	}
	catch(cmdSendE) {
		dbReq = null;
	}
	//
	//
	if (dbReq && dbReq.readyState == 4 && dbReq.status == 200 && dbReq.responseXML!=null) {
		//
		//
		response  = dbReq.responseXML.documentElement;
		if(response==null || response==undefined) return;
		//
		//
		var cmdElement = response.getElementsByTagName('COMMAND')[0];
		var result = (cmdElement ? cmdElement.getAttribute('RESULT').toString():"FAILED");
		if(result=="OK") {
			//
			//
			retValue = true;
		}
    }
	//
	//
	return retValue;
}

/**
 * Gets the value of an average counter.
 * 
 * @param aNumberType NUM_TYPE_BYTE=0 | NUM_TYPE_DOUBLE=1 | NUM_TYPE_FLOAT = 2 | NUM_TYPE_INT = 3 | NUM_TYPE_LONG = 4 | NUM_TYPE_SHORT = 5
 * @param aPrimaryKey a value for the entry's primary key in the database
 * @param aDatabase the name of the database to store the entry in.
 * 
 * @return Value of average counter as a string or null if query fails.
 */
function getAverageValue(aNumberType, aPrimaryKey, aDatabase) {
    //
    //
    var retValue = null;
    //
	//
	var decodedCmdSet = "";
	decodedCmdSet = "<COMMANDS>" +
						"<COMMAND CLASS_NAME=\"com.tenduke.services.xmldb.number.TransactionalGetAverage\"" +
								" KEY=\"" + aPrimaryKey + "\"" +
								" SECONDARY_KEY=\"\"" +
								" DATABASE_NAME=\"" + aDatabase + "\"" +
								" READ_OFFSET=\"0\"" +
								" MAX_ITEMS=\"1\"" +
								" NUMBER_TYPE=\"" + aNumberType + "\"" +
								" QUERY_METHOD=\"PRIMARY\" />" +
					"</COMMANDS>";
	//
	// send request
	var dbReq = initRequest("/servlets/XMLCommandServlet", "POST");
	dbReq.setRequestHeader("Content-Type", "text/xml; charset=\"UTF-8\"");
	try {
		dbReq.send(decodedCmdSet);
	}
	catch(cmdSendE) {
		dbReq = null;
	}
	//
	//
	if (dbReq && dbReq.readyState == 4) {
        if (dbReq.status == 200 && dbReq.responseXML!=null) {
			//
			//
			response  = dbReq.responseXML.documentElement;
			if(response==null || response==undefined) return;
			//
			//
			var cmdElement = response.getElementsByTagName('COMMAND')[0];
			var objectResponse = response.getElementsByTagName('OBJECT_RESPONSE')[0];
			var result = ((cmdElement!=null && cmdElement!=undefined) ? cmdElement.getAttribute('RESULT').toString():"FAILED");
			if(result=="OK") {
				//
				//
				var aNodeList = objectResponse.getElementsByTagName('DATA');
				if(aNodeList && aNodeList.length>0) {
					dataNode = aNodeList[0];
					if(dataNode && dataNode.firstChild && dataNode.firstChild.nodeType==Node.TEXT_NODE) {
						retValue = dataNode.firstChild.nodeValue;
					}
				}
			}
        }
    }
	//
	//
	return retValue;
}
