// JavaScript Document
var idToIndexMap;
var idToIndexMapAll;
var videoList;
var videoXMLs;

/**
 *
 */
function VideoUtils() {
    this.idToIndexMap               = new Hashtable();
	this.idToIndexMapAll            = new Hashtable();
	
	this.videoXMLs                  = videoXMLs;
	this.videoList                  = videoList;
	this.assembleKeyXML             = vu_assembleKeyXML;
	this.queryContent               = vu_queryContent;
	this.queryContentResult         = vu_queryContentResult;
	this.parseNodeList              = vu_parseNodeList;
	this.deleteVideoIndex           = vu_deleteVideoIndex;
	this.deleteVideoIndexResult     = vu_deleteVideoIndexResult;
	this.regenerateVideoIndex       = regenerateVideoIndex;
	this.assembleVideoMetadata      = vu_assembleVideoMetadata;
	this.regenerateVideoIndexResult = regenerateVideoIndexResult;
	this.sortVideoList              = vu_sortVideoList;
	this.createVideoList            = vu_createVideoList;
	this.createPublicVideoList      = vu_createPublicVideoList;
	this.previewVideo               = vu_previewVideo;
	this.getIndexFromId             = vu_getIndexFromId;
	this.getIDFromIndex             = vu_getIDFromIndex;
	this.publish                    = vu_publish;
	this.publishResult              = vu_publishResult;
	this.loadFile                   = vu_loadFile;
	this.getPublicVideo             = vu_getPublicVideo;
	this.getPublicVideoByID         = vu_getPublicVideoByID;
	this.getPublicVideoURL          = vu_getPublicVideoURL;
	this.getPublicVideoURLByID      = vu_getPublicVideoURLByID;
	this.getPublicVideoThumbURLByID = vu_getPublicVideoThumbURLByID;
	/*this.loadFileIntoPlayer=vu_loadFileIntoPlayer;
	this.thisMovie=vu_thisMovie;*/
}

/**
 *
 */
function vu_publish(fileName,fileContent){
    //
    //
	var decodedCmdSet = "";
	decodedCmdSet = "<COMMANDS>";
	decodedCmdSet+="<COMMAND CLASS_NAME=\"com.tenduke.services.objectstorage.command.SetRegularFile\"" +
								" FILE_PATH=\"./html/" + fileName + "\"" +
								" ALLOW_OVERWRITE=\"" + "true" + "\">" +
								"<OBJECT_DATA IS_ENCODED=\"true\" ENCODING=\"BASE64\">"+
 								" 	<ODP>"+
										encode64(fileContent)+
								"   </ODP>"+
 								"</OBJECT_DATA>"+
								"</COMMAND>";
	decodedCmdSet+="</COMMANDS>";
	//
	// send request
	var publishReq = initRequest("/servlets/XMLCommandServlet", "POST");
	publishReq.setRequestHeader("Content-Type", "text/xml; charset=\"UTF-8\"");
	try {
		publishReq.send(decodedCmdSet);
	}
	catch(cmdSendE) {
		publishReq = null;
	}
	var publishIsOK = this.publishResult(publishReq);
	//
	//
	/*
	if(publishIsOK && fileName && fileName.length>4)
	    triggerVideoEmails(fileName.substring(0, fileName.indexOf(".xml")), PUBLISH_NOTIFICATION_SUBJECT, PUBLISH_NOTIFICATION_MESSAGE);
	*/
}

/**
 *
 */
function vu_publishResult(aReq){
    //
    //
    var retValue = false;
    //
	//
	if (aReq && aReq.readyState == 4) {
        if (aReq.status == 200 && aReq.responseXML!=null) {
			//
			//
			response  = aReq.responseXML.documentElement;
			var cmdElement = ((response!=null && response!=undefined) ? response.getElementsByTagName('COMMAND')[0]:null);
			var cmdMessageElement = ((response!=null && response!=undefined) ? response.getElementsByTagName('MESSAGE')[0]:null);
			var result = ((cmdElement!=null && cmdElement!=undefined) ? cmdElement.getAttribute('RESULT').toString():"FAILED");
			if(result=="OK") {
				//
				//
				retValue = true;
			}
			else if(cmdMessageElement!=null && cmdMessageElement!=undefined && cmdMessageElement.firstChild!=null) {
				alert("Sorry, your Video entry could not be published at this time. Please try later again!");
			}
        } 
        else {
			alert ( "Sorry, " + SERVICE_BRAND + " could not process your request at this time. Please try later again!");
        }
    }
    else {
		alert ( "Sorry, " + SERVICE_BRAND + " could not process your request at this time. Please try later again!");
    }
    //
    //
    return retValue;
}

/**
 *
 */
function vu_getIndexFromId(id){
	for(var i=0; i<this.videoList.length; i++){
		if(this.videoList[i].getAttribute("ID")==id){
			return i;	
		}
	}
	return -1;
}

/**
 *
 */
function vu_getIDFromIndex(anIndex){
    var retValue = "";
	if(this.videoList && this.videoList.length>0 && anIndex<(this.videoList.length) && this.videoList[anIndex]) {
		retValue = this.videoList[anIndex].getAttribute("ID");
	}
	return retValue;
}

/**
 *
 */
function vu_previewVideo(index,elementId){
		if(index==-1){
			document.getElementById(elementId).innerHTML='<div class="VideoTitle"></div>';
			return;	
		}
		if(this.videoList==undefined || this.videoList==null || this.videoList.length==0){
			return;	
		}
		var id=this.videoList[index].getAttribute("ID");
		var xmlRes2 = getXMLDatabaseInOneChunk("videotests/"+id+".xml", id+".xml");
		//var node=xmlRes2.firstChild.firstChild;
		var node=getNodeByType(xmlRes2, Node.CDATA_SECTION_NODE); 
		if(node){
			var aParser = new DOMParser();
			var xmlD = aParser.parseFromString(node.nodeValue, "text/xml");
			if(xmlD){
				node=xmlD.firstChild;
			}
			else{
				alert("DOmparserFailed");	
			}
		}
		else{
			alert("cdata notFound");
		}
		var imgs=node.getElementsByTagName("img");
		var imageSrcs= new Array();
		for(var i=0; i<imgs.length; i++){
			imageSrcs.push(decode64(imgs[i].getAttribute("src")));
			imgs[i].setAttribute("src","imageSrcs_"+i);	
			
		}
		var serializer2 = new XMLSerializer();
		var str2 = serializer2.serializeToString(node);
		for(var i=0; i<imageSrcs.length; i++){
			str2=str2.split("imageSrcs_"+i).join(imageSrcs[i]);
		}
		document.getElementById(elementId).innerHTML=str2;
}

/**
 *
 */
function vu_getPublicVideoURL(anIndex){
    //
    //
    var retValue = "";
    //
    // check args and state
	if(anIndex==-1){
		return retValue;
	}
	if(this.videoList==undefined || this.videoList==null || this.videoList.length==0 || (this.videoList.length)<anIndex){
		return retValue;
	}
	//
	// resolve ID and get the data
	var anID = this.videoList[anIndex].getAttribute("ID");
    return this.getPublicVideoURLByID(anID);
}

/**
 *
 */
function vu_getPublicVideoURLByID(anID) {
    //
    //
    var retValue = "";
    //
    //
	if(!anID){
		return retValue;	
	}
	//
	//
	var xmlRes = this.loadFile(anID+".xml");
	if(xmlRes) {
	    var aNode=xmlRes.firstChild;
	    if(aNode && aNode.nodeType==Node.CDATA_SECTION_NODE){
		    var aParser = new DOMParser();
		    var xmlD = aParser.parseFromString(aNode.nodeValue, "text/xml");
		    aNode = null;
		    if(xmlD){
			    aNode=xmlD.firstChild;
		    }
	    }
	    //
	    // if aNode exists then the request has been successfull
	    if(aNode) {
	        var imgs=aNode.getElementsByTagName("img");
	        if(imgs && imgs.length>0 && imgs[0]){
		        retValue = imgs[0].getAttribute("videoSRC");
	        }
	    }
	}
	//
	// return the processing result
	return retValue;
}
/**
 *
 */
function vu_getPublicVideoThumbURLByID(anID) {
    //
    //
    var retValue = "";
    //
    //
	if(!anID){
		return retValue;	
	}
	//
	//
	var xmlRes = this.loadFile(anID+".xml");
	if(xmlRes) {
	    var aNode=xmlRes.firstChild;
	    if(aNode && aNode.nodeType==Node.CDATA_SECTION_NODE){
		    var aParser = new DOMParser();
		    var xmlD = aParser.parseFromString(aNode.nodeValue, "text/xml");
		    aNode = null;
		    if(xmlD){
			    aNode=xmlD.firstChild;
		    }
	    }
	    //
	    // if aNode exists then the request has been successfull
	    if(aNode) {
	        var imgs=aNode.getElementsByTagName("img");
	        if(imgs && imgs.length>0 && imgs[0]){
		        retValue = imgs[0].getAttribute("src");
	        }
	    }
	}
	//
	// return the processing result
	return retValue;
}

/**
 * Gets a public video XML file content by a video display index.
 * @param anIndex The display index of the video who's public XML is wanted.
 * @return The content of the specified entry ID's public XML file.
 */
function vu_getPublicVideo(anIndex){
	if(anIndex==-1){
		return '<div class="VideoTitle">Video Title</div>';	
	}
	if(this.videoList==undefined || this.videoList==null || this.videoList.length==0 || this.videoList.length<=anIndex){
		return "";	
	}
	var anID=this.videoList[anIndex].getAttribute("ID");
	return this.getPublicVideoByID(anID);		
}

/**
 * Gets a public video XML file content by entry ID.
 * @param anID The unique ID of the video who's public XML is wanted.
 * @return The content of the specified entry ID's public XML file or <div class="VideoTitle">Sorry, video was not found</div> for errors.
 */
function vu_getPublicVideoByID(anID){
    //
    //
    var retValue = "<div class=\"VideoTitle\">Sorry, video was not found</div>";
    //
    //
	if(!anID) return retValue;	
	//
	//
	var xmlRes = this.loadFile(anID + ".xml");
	var aNode=xmlRes.firstChild;
	if(aNode && aNode.nodeType==Node.CDATA_SECTION_NODE){
		var aParser = new DOMParser();
		var xmlD = aParser.parseFromString(aNode.nodeValue, "text/xml");
		if(xmlD){
		    //
		    //
			aNode=xmlD.firstChild;
			if(aNode) {
			    //
			    //
			    var imgs=aNode.getElementsByTagName("img");
				var imageSrcs=new Array();
                for(var i=0; i<imgs.length; i++) {
                    //
                    //
					imageSrcs.push(decode64(imgs[i].getAttribute("src")));
	                imgs[i].setAttribute("src","imageSrcs_"+i);	
                }
			    //
	            // assemble return value
	            var serializer = new XMLSerializer();
	            retValue = serializer.serializeToString(aNode);
				for(var i=0; i<imageSrcs.length; i++){
					retValue=retValue.split("imageSrcs_"+i).join(imageSrcs[i]);
				}
	        }
		}
	}
	//
	// return what ever has been processed
	return retValue;
}

/** 
 *
 */
function vu_sortVideoList(){
	if(this.idToIndexMapAll){
		var keys=this.idToIndexMapAll.keys();
		for(var i=keys.length-1; i>=0; i--){
			var ind=this.getIndexFromId(keys[i]);
			if(ind!=-1){
				this.videoList[ind].parentNode.insertBefore(this.videoList[ind],this.videoList[ind].parentNode.firstChild);
			}
		}
	}
}

/** 
 *
 */
function vu_createVideoList(){
    //
    //
	var xmlRes = getXMLDatabaseInOneChunk(VIDEO_CONTAINER_PATH, VIDEO_CONTAINER_NAME);
	if(xmlRes == null){
		createContainer(VIDEO_CONTAINER_PATH,VIDEO_CONTAINER_NAME, VIDEO_CONTAINER_DISPLAY_NAME,VIDEO_CONTAINER_ID);
		 xmlRes = getXMLDatabaseInOneChunk(VIDEO_CONTAINER_PATH, VIDEO_CONTAINER_NAME);
	}
	//
	//
	this.videoList=xmlRes.getElementsByTagName("OBJECT_REF");
	//
	//
	this.queryContent();
	this.sortVideoList();
}

/** 
 *
 */
function vu_createPublicVideoList(){
	//
	//
	var retValue=-1;
	this.queryContent(6);
	videoXMLs=new Array();
	var keys=this.idToIndexMap.keys();
	var videoListString='<OBJECT_MAP PATH="kentish_resource_root/containers/video.xml" NAME="video.xml" DISLAY_NAME_ENCODING="Base64" DISLAY_NAME="SW5ib3g=">'+
	'<ICON PATH="" NAME=""/>'+
	'<ACL/>'+
	'<META_DATA/>'+
	'<OBJECT_REFS>';
	for(var i=0; i<keys.length; i++){
		var file=this.loadFile(keys[i]+".xml");
		if(file){
			videoXMLs.push(file);
			var nodes=file.getElementsByTagName("div");
			var dname="title";
			for(var j=0; j<nodes.length; j++){
				if(nodes[j].getAttribute("class")=="videoTitle"){
					dname=nodes[j].nodeValue;
					break;
				}
			}
		
			videoListString+='<OBJECT_REF PATH="videotests/'+keys[i]+'.xml"'+
		    	' NAME="'+keys[i]+'.xml"'+ 
		    	' DISLAY_NAME_ENCODING="Base64"'+
		    	' DISLAY_NAME="'+encode64(dname)+'"'+
		    	' TARGET_TYPE="OBJECT_TYPE_XML_FILE"'+
		    	' MIME_TYPE="text/xml"'+
		    	' ID="'+keys[i]+'">'+
				'<META_DATA/>'+
			'</OBJECT_REF>';
		}
	}
	videoListString+='</OBJECT_REFS>'+
					'</OBJECT_MAP>';
	//
	//
	var aParser = new DOMParser();	
	var xmlD = aParser.parseFromString(videoListString, "text/xml");
	if(xmlD){
		this.videoList=xmlD.getElementsByTagName("OBJECT_REF");
		retValue=0;
	}
			
	return retValue;
}

/**
 * @return true success
 */
function vu_loadFile(fileName) {
    //
    //
    var retValue = null;
    //
    //
    var req = initRequest("/html/"+fileName, "GET");
    req.setRequestHeader("Content-Type", "text/plain; charset=\"UTF-8\"");
    req.send("");
    response = ((req.responseXML!=null && req.responseXML!=undefined) ?
req.responseXML.documentElement : null);
    //
    //
    if(response){
		retValue= response;
    }
    //
    //
    return retValue;
}
/**
 *
 */
function vu_assembleVideoMetadata(anAssetID,delta) {
	//
	//
	//
	//
	if(delta==undefined || delta==null){
		delta=1;	
	}
	var retValue = "<PARAMS>";
	//
	//
	if(this.idToIndexMapAll && this.idToIndexMapAll.getEntry(anAssetID)){
		retValue += "<PARAM NAME=\"DISPLAY_INDEX\" VALUE=\"" + (Number(this.idToIndexMapAll.getEntry(anAssetID))+delta) + "\" />";
	}
	else{
		retValue += "<PARAM NAME=\"DISPLAY_INDEX\" VALUE=\"" + 0 + "\" />";
	}
	//
	//
	retValue += "</PARAMS>";
	return retValue
}

/**
 *
 */
function regenerateVideoIndex(anAssetID) {
	//
	//
	var entryMetadata = this.assembleVideoMetadata(anAssetID,1);
	var encodedEntryMetadata = encode64(entryMetadata);
	//
	//
	var decodedCmdSet = "";
	decodedCmdSet = "<COMMANDS>";
	//var keys=idToIndexMapAll.keys();
	if(this.idToIndexMapAll){
		var keys=this.idToIndexMapAll.keys();
		for(var i=0; i<keys.length; i++){
					decodedCmdSet+="<COMMAND CLASS_NAME=\"com.tenduke.services.xmldb.parameter.TransactionalSetEntry\"" +
									" KEY=\"" + encode64(keys[i]) + "\"" +
									" SECONDARY_KEY=\"" + "SEC_KEY_ALL_PARAM_NAMES" + "\"" +
									" DATABASE_NAME=\"" + SERVICE_BRAND + VIDEO_BIN_DB_POSTFIX + "\"" +
									" INSERT_MODE=\"false\"" +
									" ALLOW_DUPLICATES=\"false\">" +
								encode64(this.assembleVideoMetadata(keys[i],1)) +
							"</COMMAND>";
		}
	}
	decodedCmdSet+="<COMMAND CLASS_NAME=\"com.tenduke.services.xmldb.parameter.TransactionalSetEntry\"" +
								" KEY=\"" + encode64(anAssetID) + "\"" +
								" SECONDARY_KEY=\"" + "SEC_KEY_ALL_PARAM_NAMES" + "\"" +
								" DATABASE_NAME=\"" + SERVICE_BRAND + VIDEO_BIN_DB_POSTFIX + "\"" +
								" INSERT_MODE=\"false\"" +
								" ALLOW_DUPLICATES=\"false\">" +
							encodedEntryMetadata +
						"</COMMAND>";
	
	decodedCmdSet+="</COMMANDS>";
	//
	// from general.js
	commandRequest(decodedCmdSet, regenerateVideoIndexResult);
}

/**
 *
 */
function regenerateVideoIndexResult(req) {
	if (req!=null && req!=undefined && req.readyState == 4) {
        if (req.status == 200 && req.responseXML!=null) {
			//
			//
			response  = req.responseXML.documentElement;
			var cmdElement = ((response!=null && response!=undefined) ? response.getElementsByTagName('COMMAND')[0]:null);
			var cmdMessageElement = ((response!=null && response!=undefined) ? response.getElementsByTagName('MESSAGE')[0]:null);
			var result = ((cmdElement!=null && cmdElement!=undefined) ? cmdElement.getAttribute('RESULT').toString():"FAILED");
			if(result=="OK") {
				//
				//
			}
			else if(cmdMessageElement!=null && cmdMessageElement!=undefined && cmdMessageElement.firstChild!=null) {
				alert("Sorry, your Video entry could not be published at this time. Please try later again!");
			}
        } 
        else {
			alert ( "Sorry, " + SERVICE_BRAND + " could not process your request at this time. Please try later again!");
        }
    }
    else {
		alert ( "Sorry, " + SERVICE_BRAND + " could not process your request at this time. Please try later again!");
    }
}

/** 
 *
 */
function vu_deleteVideoIndex(anAssetID){
    //
    //
	var decodedCmdSet="<COMMANDS>";
		decodedCmdSet+="<COMMAND CLASS_NAME=\"com.tenduke.services.xmldb.parameter.TransactionalDeleteEntry\"" +
								" KEY=\"" + encode64(anAssetID) + "\"" +
								" DATABASE_NAME=\"" + SERVICE_BRAND + VIDEO_BIN_DB_POSTFIX + "\"/>";
		
		if(this.idToIndexMapAll){
		    //
		    //
			var keys=this.idToIndexMapAll.keys();
			for(var i=Number(this.idToIndexMapAll.getEntry(anAssetID))+1; i<keys.length; i++){
			    //
			    //
			    decodedCmdSet+="<COMMAND CLASS_NAME=\"com.tenduke.services.xmldb.parameter.TransactionalSetEntry\"" +
							    " KEY=\"" + encode64(keys[i]) + "\"" +
							    " SECONDARY_KEY=\"" + "SEC_KEY_ALL_PARAM_NAMES" + "\"" +
							    " DATABASE_NAME=\"" + SERVICE_BRAND + VIDEO_BIN_DB_POSTFIX + "\"" +
							    " INSERT_MODE=\"false\"" +
							    " ALLOW_DUPLICATES=\"false\">" +
						    encode64(this.assembleVideoMetadata(keys[i],-1)) +
					    "</COMMAND>";
			}
		}
	decodedCmdSet+="</COMMANDS>";		
	//
	// from general.js
	commandRequest(decodedCmdSet, this.deleteVideoIndexResult);
}

/** 
 *
 */
function vu_deleteVideoIndexResult(req){
	if (req!=null && req!=undefined && req.readyState == 4) {
        if (req.status == 200 && req.responseXML!=null) {
			//
			//
			response  = req.responseXML.documentElement;
			var cmdElement = ((response!=null && response!=undefined) ? response.getElementsByTagName('COMMAND')[0]:null);
			var cmdMessageElement = ((response!=null && response!=undefined) ? response.getElementsByTagName('MESSAGE')[0]:null);
			var result = ((cmdElement!=null && cmdElement!=undefined) ? cmdElement.getAttribute('RESULT').toString():"FAILED");
			if(result=="OK") {
				//
				//
			}
			else if(cmdMessageElement!=null && cmdMessageElement!=undefined && cmdMessageElement.firstChild!=null) {
				alert("Sorry, your Video entry could not be unpublished at this time. Please try later again!");
			}
        } 
        else {
			alert ( "Sorry, " + SERVICE_BRAND + " could not process your request at this time. Please try later again!");
        }
    }
    else {
		alert ( "Sorry, " + SERVICE_BRAND + " could not process your request at this time. Please try later again!");
    }
	
}

/**
 * @return true success
 */
function vu_queryContent(max_items) {
	//
	//
	if(!max_items){
		max_items=1500;
	}
	var decodedCmdSet = "";
	decodedCmdSet = "<COMMANDS>" +
						"<COMMAND CLASS_NAME=\"com.tenduke.services.xmldb.parameter.TransactionalGetEntries\"" +
								" KEY=\"\"" +
								" SECONDARY_KEY=\"DISPLAY_INDEX\"" +
								" DATABASE_NAME=\"" + SERVICE_BRAND + VIDEO_BIN_DB_POSTFIX + "\"" +
								" READ_OFFSET=\"" + 0 + "\"" + 
								" MAX_ITEMS=\"" + max_items + "\"" + 
								" QUERY_METHOD=\"ITERATE_BY_SECONDARY_KEY\">" + 
							encode64(this.assembleKeyXML()) + 
						"</COMMAND>" +
					"</COMMANDS>";
	//
	//
	var req = initRequest("/servlets/XMLCommandServlet", "POST");
    req.setRequestHeader("Content-Type", "text/xml; charset=\"UTF-8\"");
    //
    //
    try {
		req.send(decodedCmdSet);
	}
	catch(cmdSendE) {
		return false;
	}
	//
	//
	this.queryContentResult(req);
}

/**
 *
 */
function vu_queryContentResult(req) {
	//
	//
	if (req!=null && req!=undefined && req.readyState == 4) {
        if (req.status == 200 && req.responseXML!=null) {
			//
			//
			response  = req.responseXML.documentElement;
			if(response==null || response==undefined) return;
			//
			//
			var cmdElement = response.getElementsByTagName('COMMAND')[0];
			var cmdMessageElement = response.getElementsByTagName('OBJECT_RESPONSE')[0];
			var result = ((cmdElement!=null && cmdElement!=undefined) ? cmdElement.getAttribute('RESULT').toString():"FAILED");
			if(result=="OK" || result=="REQUIRES_AUTHENTICATION") {
				//
				//
				var aNodeList = cmdMessageElement.getElementsByTagName('PARAMS');
				this.parseNodeList(aNodeList);
			}
			else if(cmdMessageElement!=null && cmdMessageElement!=undefined && cmdMessageElement.firstChild!=null) {
				alert("1 Sorry, the public database does not contain the data you requested. Please try later again!");
			}
        } 
        else {
			alert("2 Sorry, the public database does not contain the data you requested. Please try later again!");
        }
    }
    else {
		alert("3 Sorry, the public database does not contain the data you requested. Please try later again!");
    }
}

/**
 *
 */
function vu_assembleKeyXML() {
	//
	//
	var retValue = "<PARAMS>";
	retValue += "<PARAM NAME=\"DISPLAY_INDEX\" VALUE=\"\" />";
	retValue += "</PARAMS>";
	return retValue;
}

/**
 *
 */
 function vu_parseNodeList(paramsList) {
	//
	//
	this.idToIndexMap.clear();
	this.idToIndexMapAll.clear();
	if(paramsList!=null && paramsList!=undefined) {
		//
		//
		for(var i=0; i<paramsList.length; i++) {
			var aNode = paramsList[i];
			if(aNode!=null) {		
				//
				//		
				var id="";
				var index="";
				var keys=aNode.getElementsByTagName('KEY');
				if(keys.length<1){
					alert("no primary keys found");	
				}
				id=decode64(keys[0].getAttribute('VALUE').toString());
				var params=aNode.getElementsByTagName("PARAM");
				for(var j=0; j<params.length;j++){
					if(params[j].getAttribute('NAME').toString()=="DISPLAY_INDEX"){	
						index=params[j].getAttribute('VALUE').toString();	
					}
				}
				this.idToIndexMapAll.putEntry(id,index);
				if(i<6){
					this.idToIndexMap.putEntry(id,index);
				}
			}
		}
	}
}

/** 
 *
 */
function triggerVideoEmails(anEntryID, aSubject, aMessage) {
    //
    //
    var startIndex = 0;
    var maxCount = 100;
    var numAccepted = 0;
    //
    //
    var emailArray = queryRegisteredEmails(0, maxCount);
    //
    //
    while(emailArray && emailArray.length>0) {
        //
        // assemble email request
		var decodedCmdSet = "";
		decodedCmdSet =  "<COMMANDS>";
		decodedCmdSet += "<COMMAND CLASS_NAME=\"com.tenduke.services.messaging.SendEmail\" CONTENT_TYPE=\"text/html\" >";
		//
		// the email command contains the email spec that defines the message
	    var emailSpec = "<EMAIL_SPECIFICATION>";
	    emailSpec += "<RECIPIENTS>";
	    for(i=0; i<emailArray.length; i++) {
	        if(validateEmail(emailArray[i])) {
	            emailSpec += "<RECIPIENT>" + encode64(emailArray[i]) + "</RECIPIENT>";
	            numAccepted++;
	        }
	    }
	    emailSpec += "</RECIPIENTS>";
	    emailSpec += "<SUBJECT>" + encode64(aSubject) + "</SUBJECT>";
	    emailSpec += "<BODY>" + encode64(aMessage) + "</BODY>";
	    emailSpec += "</EMAIL_SPECIFICATION>";
	    //
	    // the email spec must be base64 encoded
		decodedCmdSet += encode64(emailSpec);
		decodedCmdSet += "</COMMAND>";
		decodedCmdSet += "</COMMANDS>";
		//
		// send async request
		var emailReq = initRequest("/servlets/XMLCommandServlet", "POST");
		emailReq.setRequestHeader("Content-Type", "text/xml; charset=\"UTF-8\"");
		try {
			emailReq.send(decodedCmdSet);
		}
		catch(cmdSendE) {
			emailReq = null;
		}
        //
        // Get next result set
        if(emailArray.length<maxCount)
            break;
        //
        //
        startIndex += emailArray.length;
        emailArray = queryRegisteredEmails(startIndex, maxCount);
    }
    //
    //
    alert("Email sent to " + numAccepted + " recipients.");
}

/**
 *
 */
function queryRegisteredEmails(startIndex, maxCount) {
    //
    //
    var retValue = new Array();
    //
	// create a transactional counter command       
	var decodedCmdSet = "";
	decodedCmdSet = "<COMMANDS>" +
						"<COMMAND CLASS_NAME=\"com.tenduke.services.xmldb.number.TransactionalGetEntries\"" +
								" KEY=\"*\"" +
								" SECONDARY_KEY=\"\"" +
								" DATABASE_NAME=\"" + SERVICE_BRAND + VIDEO_NEWS_EMAILS_DB_POSTFIX + "\"" +
								" READ_OFFSET=\"" + startIndex + "\"" + 
								" MAX_ITEMS=\"" + maxCount + "\"" + 
								" NUMBER_TYPE=\"" + NUM_TYPE_LONG + "\"" +
								" QUERY_METHOD=\"ITERATE_BY_PRIMARY_KEY\" />" +
					"</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) {
		//
		//
		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) {
			    var i=0; 
			    for(i=0; i<aNodeList.length; i++) {
				    dataNode = aNodeList[i];
				    if(dataNode && dataNode.getAttribute("KEY")) {
					    retValue.push(decode64(dataNode.getAttribute("KEY")));
				    }
				}
			}
		}
    }
	//
	//
	return retValue;
}
