/*------------------------------------------------------------------------------
 * JavaScript zMsg Library
 * Version 1.0.1
 * by Jeffrey Wu
 * Copyright (c) 2006-2007 Insight Interactive. All Rights Reserved.
 *
 * This program using the zxml.js libaray functions.  Please include it 
 * into the main page.
 *------------------------------------------------------------------------------
 */  
 
/**
 * Static class for handling message creation.
 * @class
 */                     
function zMsg() {
} 

zMsg.ARR_ID = new Array();
zMsg.ARR_Status = new Array();
zMsg.ARR_Display_Begin_Date = new Array();
zMsg.ARR_Display_Begin_Time = new Array();
zMsg.ARR_Display_End_Date = new Array();
zMsg.ARR_Display_End_Time = new Array();
zMsg.ARR_Default_Tag = new Array();
zMsg.ARR_Lastupdate = new Array();
zMsg.ARR_Lastupdate_Time = new Array();
zMsg.ARR_Affected_Date = new Array();
zMsg.ARR_Affected_Time = new Array();
zMsg.ARR_Affected_Areas = new Array();
zMsg.ARR_Display_Affected_Areas = new Array();
zMsg.ARR_Affected_Services = new Array();
zMsg.ARR_Headline = new Array();
zMsg.ARR_Additional_Info = new Array();

zMsg.recID=''; 
zMsg.recStatus=''; 
zMsg.recDisplay_Begin_Date=''; 
zMsg.recDisplay_Begin_Time=''; 
zMsg.recDisplay_End_Date=''; 
zMsg.recDisplay_End_Time=''; 
zMsg.recDefault_Tag=''; 
zMsg.recLastupdate=''; 
zMsg.recLastupdate_Time=''; 
zMsg.recAffected_Date='';
zMsg.recAffected_Time=''; 
zMsg.recAffected_Areas=''; 
zMsg.recDisplay_Affected_Areas=''; 
zMsg.recAffected_Services='';
zMsg.recHeadline=''; 
zMsg.recAdditional_Info='';

zMsg.currHeadendName='';

/**
 * Read the text from XML node.
 * @param oNode The XML node.
 */
zMsg.getText = function (oNode) {
	var txt='';
	if (typeof oNode.text == 'undefined') {
		if (typeof oNode.firstChild == 'object') {
			try {
				txt=oNode.firstChild.nodeValue;
			} catch (oError) {
				//alert('Get text failed:' + oError.description);
			}
		}
	} else {
		txt = oNode.text;
	}
	return txt;
};

/**
 * Read the message from XML node into global array.
 * @param oNode The XML node.
 */
zMsg.readMessage = function (oNode) {
	var oCurrentChild;
	//alert(oNode.getAttribute("status"))
	zMsg.recStatus = oNode.getAttribute("status");
	
	zMsg.recID = oNode.getAttribute("id");
	zMsg.recLastupdate = oNode.getAttribute("lastupdate");
	zMsg.recLastupdate_Time = oNode.getAttribute("lastupdatetime");
	oCurrentChild = oNode.firstChild;
	do {
		switch (oCurrentChild.tagName) {
			case "display_begin_date":
				zMsg.recDisplay_Begin_Date=zMsg.getText(oCurrentChild);
			break;
			case "display_begin_time":
				zMsg.recDisplay_Begin_Time=zMsg.getText(oCurrentChild);
			break;
			case "display_end_date":
				zMsg.recDisplay_End_Date=zMsg.getText(oCurrentChild);
			break;
			case "display_end_time":
				zMsg.recDisplay_End_Time=zMsg.getText(oCurrentChild);
			break;
			case "affected_date":
				zMsg.recAffected_Date=zMsg.getText(oCurrentChild);
			break;
			case "affected_time":
				zMsg.recAffected_Time=zMsg.getText(oCurrentChild);
			break;
			case "affected_areas":
				zMsg.recAffected_Areas=zMsg.getText(oCurrentChild);
			break;
			case "display_affected_areas":
				zMsg.recDisplay_Affected_Areas=zMsg.getText(oCurrentChild);
			break;
			case "affected_services":
				zMsg.recAffected_Services=zMsg.getText(oCurrentChild);
			break;
			case "default_tag":
				zMsg.recDefault_Tag=zMsg.getText(oCurrentChild);
			break;
			case "headline":
				zMsg.recHeadline=zMsg.getText(oCurrentChild);
			break;
			case "additional_info":
				zMsg.recAdditional_Info=zMsg.getText(oCurrentChild);
			break;
		}
	} while (oCurrentChild = oCurrentChild.nextSibling);
};

/**
 * Read the message from XML node into global array.
 * @param idx The index of global array to store the data set.
 * @return idx An increamented index.
 */
zMsg.saveMessage = function (idx) {
	zMsg.ARR_ID[idx] = zMsg.recID;
	zMsg.ARR_Status[idx] = zMsg.recStatus;
	zMsg.ARR_Display_Begin_Date[idx] = zMsg.recDisplay_Begin_Date;
	zMsg.ARR_Display_Begin_Time[idx] = zMsg.recDisplay_Begin_Time;
	zMsg.ARR_Display_End_Date[idx] = zMsg.recDisplay_End_Date;
	zMsg.ARR_Display_End_Time[idx] = zMsg.recDisplay_End_Time;
	zMsg.ARR_Default_Tag[idx] = zMsg.recDefault_Tag;
	zMsg.ARR_Lastupdate[idx] = zMsg.recLastupdate;
	zMsg.ARR_Lastupdate_Time[idx] = zMsg.recLastupdate_Time;
	zMsg.ARR_Affected_Date[idx] = zMsg.recAffected_Date;
	zMsg.ARR_Affected_Time[idx] = zMsg.recAffected_Time;
	zMsg.ARR_Affected_Areas[idx] = zMsg.recAffected_Areas;
	zMsg.ARR_Display_Affected_Areas[idx] = zMsg.recDisplay_Affected_Areas;
	zMsg.ARR_Affected_Services[idx] = zMsg.recAffected_Services;
	zMsg.ARR_Headline[idx] = zMsg.recHeadline;
	zMsg.ARR_Additional_Info[idx] = zMsg.recAdditional_Info;
	idx++;
	return idx;
};


zMsg.getMessages = function(url) { 
	var oRoot;
    var aSpecialMessages;
	var xmlDom_Message;
	var iSpecialMessages;

    xmlHttp=zXmlHttp.createRequest();
    if (xmlHttp==null)
    {
    alert ("Browser does not support HTTP Request");
    return;
    } 

	if (url != "") {
		xmlHttp.open("GET",url,false);
		xmlHttp.send(null);
		
		oRoot=xmlHttp.responseXML;
		aSpecialMessages = oRoot.getElementsByTagName("message");

		iSpecialMessages = 0;
		for (var i=0; i < aSpecialMessages.length; i++) {
			zMsg.readMessage(aSpecialMessages[i]);
		
			if (zMsg.recStatus=="Enabled") {
				iSpecialMessages=zMsg.saveMessage(iSpecialMessages);
			}
		}
		
    }
};

/**
 * Load enabled messages to message array.
 * @param filename The XML file location.
 */
zMsg.loadMessages = function (filename) {
	var oRoot;
    var aSpecialMessages;
	var xmlDom_Message;
	var iSpecialMessages;

    xmlDom_Message=zXmlDom.createDocument();
    
    if (xmlDom_Message==null)   {
		alert("MSXML is not installed.");
		return;
	}
  
	if (filename!="") {
		xmlDom_Message.async=false;
		xmlDom_Message.load(filename);
		oRoot=xmlDom_Message.documentElement;
		aSpecialMessages = oRoot.getElementsByTagName("message");
		iSpecialMessages = 0;
		for (var i=0; i < aSpecialMessages.length; i++) {
			zMsg.readMessage(aSpecialMessages[i]);
		
			if (zMsg.recStatus=="Enabled") {
				iSpecialMessages=zMsg.saveMessage(iSpecialMessages);
			}
		}
	}

};

/**
 * Convert string to date.
 * @param begin date time.
 * @param end date time.
 */
function str2date (str_datetime) {
	var re_date = /^(\d+)\/(\d+)\/(\d+)\s+(\d+)\:(\d+)\:(\d+)\s+([aApP]M)$/;
	var m; // m for match
	if ((m = re_date.exec(str_datetime)))
	{
		if (m[7].toUpperCase() == "PM") m[4] = (parseInt(m[4])%12) + 12 ;
		return new Date(m[3], m[1]-1, m[2] , m[4], m[5], m[6]); 
	}
	else
	{
		return alert("Invalid Datetime format: "+ str_datetime);
	} 	
};

/**
 * Check is show time or not.
 * @param begin date time.
 * @param end date time.
 */
zMsg.isShowTime = function (BeginDate, BeginTime, EndDate, EndTime) {
	var today = new Date() ; 
	var begin, end;
	var res;

	res = today.setHours(today.getHours() + 1); //Eastern Time

	if (BeginTime == "") BeginTime = "00:00:00 AM"
	if (EndTime == "") EndTime = "00:00:00 AM"

	if (BeginDate == "") begin = today;
	else begin = str2date(BeginDate + " " + BeginTime);

	if (EndDate == "") end = today;
	else end = str2date(EndDate + " " + EndTime);
	
	if( today >= begin && today <= end) {
		//alert("isShowTime...");
		return 1;
	} else {
		//alert("Not yet...");
		return 0;
	};
};

/**
 * Check if the area is affected.
 * @param affectedAreas The affected areas.
 * @param myAreas The user location.
 */
zMsg.isAffected = function (myArea, Affected_Areas) {
    if (myArea == "" && Affected_Areas != "") return 0;
	if (Affected_Areas != "") {
		var myString = new String(Affected_Areas);
		var myRE = new RegExp(myArea, "i");
		var results = myString.match(myRE);
		//alert(myString + ":" + myRE);
		if (results == null) return 0;
	}
	
	return 1;
};

/**
 * Load enabled messages in affected area to message array.
 * @param filename The XML file location.
 * @param area The affected area.
 */
zMsg.loadMessagesByArea = function (filename, area) {
	var oRoot;
    var aSpecialMessages;
	var xmlDom_Message;
	var iSpecialMessages;
	
    xmlDom_Message=zXmlDom.createDocument();
    
    if (xmlDom_Message==null)   {
		alert("MSXML is not installed.");
		return;
	}
    
	if (filename!="") {
		xmlDom_Message.async=false;
		xmlDom_Message.load(filename);
		oRoot=xmlDom_Message.documentElement;
		aSpecialMessages = oRoot.getElementsByTagName("message");
		iSpecialMessages = 0;
		for (var i=0; i < aSpecialMessages.length; i++) {
			zMsg.readMessage(aSpecialMessages[i]);
		
			if (zMsg.recStatus=="Enabled" 
				&& zMsg.isShowTime(zMsg.recDisplay_Begin_Date,zMsg.recDisplay_Begin_Time,zMsg.recDisplay_End_Date,zMsg.recDisplay_End_Time)
				&& zMsg.isAffected( area, zMsg.recAffected_Areas ) )
		    {
				iSpecialMessages=zMsg.saveMessage(iSpecialMessages);
			}
		}
	}
};

/**
 * Load messages by message id to message array.
 * @param id The message id.
 */
zMsg.loadMessagesById = function (filename, id) {
	var oRoot;
    var aSpecialMessages;
	var xmlDom_Message;
	var iSpecialMessages;
	
    xmlDom_Message=zXmlDom.createDocument();
    
    if (xmlDom_Message==null)   {
		alert("MSXML is not installed.");
		return;
	}
    
	if (filename!="") {
		xmlDom_Message.async=false;
		xmlDom_Message.load(filename);
		oRoot=xmlDom_Message.documentElement;
		aSpecialMessages = oRoot.getElementsByTagName("message");
		iSpecialMessages = 0;
		for (var i=0; i < aSpecialMessages.length; i++) {
			zMsg.readMessage(aSpecialMessages[i]);
		
			if (zMsg.recID==id) {
				iSpecialMessages=zMsg.saveMessage(iSpecialMessages);
				return;
			}
		}
	}
};

/**
 * Count the loaded messages.
 * @return The number of loaded messages.
 */
zMsg.count = function () {
		return zMsg.ARR_ID.length;
};

/**
 * Find the index number in array by ID.
 * @param id The message ID.
 * @return The index number.
 */
zMsg.getIndex = function (id) {
	for (var i=0; i < zMsg.ARR_ID.length; i++) {
		if (id == zMsg.ARR_ID[i]) return i;
	}
	return -1;
};

/**
 * Get the last update date.
 * @param id The message ID.
 * @return The string of last update date.
 */
zMsg.getLastupdate = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Lastupdate[idx];
	return "";
};

/**
 * Get the last update date time.
 * @param id The message ID.
 * @return The string of last update date time.
 */
zMsg.getLastupdate_Time = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Lastupdate_Time[idx];
	return "";
};

/**
 * Get the display begin date.
 * @param id The message ID.
 * @return The string of display begin date.
 */
zMsg.getDisplayBeginDate = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Display_Begin_Date[idx];
	return "";
};

/**
 * Get the display begin time.
 * @param id The message ID.
 * @return The string of display begin time.
 */
zMsg.getDisplayBeginTime = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Display_Begin_Time[idx];
	return "";
};

/**
 * Get the display end date.
 * @param id The message ID.
 * @return The string of display end date.
 */
zMsg.getDisplayEndDate = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Display_End_Date[idx];
	return "";
};

/**
 * Get the display end time.
 * @param id The message ID.
 * @return The string of display end time.
 */
zMsg.getDisplayEndTime = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Display_End_Time[idx];
	return "";
};


/**
 * Get the affected date.
 * @param id The message ID.
 * @return The string of affected date.
 */
zMsg.getAffectedDate = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Affected_Date[idx];
	return "";
};

/**
 * Get the affected time.
 * @param id The message ID.
 * @return The string of affected time.
 */
zMsg.getAffectedTime = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Affected_Time[idx];
	return "";
};

/**
 * Get the message headline.
 * @param id The message ID.
 * @return The string of headline.
 */
zMsg.getHeadline = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Headline[idx];
	return "";
};

/**
 * Get the default tag number.
 * @param id The message ID.
 * @return Th default tag number.
 */
zMsg.getDefaultTag = function (id) {
	var idx = zMsg.getIndex(id);
	var retNum = '';
	if (idx >= 0) retNum = zMsg.ARR_Default_Tag[idx];
	
	if (retNum == 'Yes') retNum = 4;
	else retNum = 0;
	return retNum;
};

/**
 * Get the affected areas.
 * @param id The message ID.
 * @return The string of affected areas.
 */
zMsg.getAffectedAreas = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Affected_Areas[idx];
	return "";
};

/**
 * Get the affected areas for BB v2.6.
 * @param id The message ID.
 * @return The string of affected areas.
 */
zMsg.getDisplayAffectedAreas = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Display_Affected_Areas[idx];
	return "";
};

/**
 * Get the affected services.
 * @param id The message ID.
 * @return The string of affected services.
 */
zMsg.getAffectedServices = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Affected_Services[idx];
	return "";
};

/**
 * Get the message addition information.
 * @param id The message ID.
 * @return The string of additional information.
 */
zMsg.getAdditionalInfo = function (id) {
	var idx = zMsg.getIndex(id);
	if (idx >= 0) return zMsg.ARR_Additional_Info[idx];
	return "";
};
