/* file: homepage.js */
/* usage: only those javascript use in Homepage is put here */
/* 2007.03.12 : add weather stuff */
/* 2009.03.11 : add random promotion items */
/* 2009.04.22 : add top search keywords */
/* 2009.05.27 : add API checking */

/* function amend from MM_showHideLayer, for weather */
function Govhk_Display() { 
  var i,p,v,obj,args=Govhk_Display.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; /* v=(v=='show')?'visible':(v=='hide')?'hidden':v; */  }
      obj.display=v;
    }
}

/* 20090527 KC: Display API Layout, call by WeatherLayout */
function APILayout() {
	// 20090227 Check if API valid
	var api_cond = 1;					// assume good api first	
	var apiArea = document.getElementById("weatherAPIArea");			
	try {
		
		// for i=1 to 2 (General and RoadSide API)
		for (i=0;i<=1;i++) {

			var str2 = apiArea.getElementsByTagName("p")[i].innerHTML ;
			var str = str2.toLowerCase();	// 20090601 fix for IE change tag to uppercase
			
			// the format inside paragraph: 
			// 1) <br> 62 <span class="high">high</span>
			// 2) <br> 10 - 65 <span class="low">low</span> to <span class="high">high</span>
			// description(s) is a MUST have value
			var brindex = str.indexOf('<br')+4;	
			var spanindex = str.indexOf('<span');	
			if (brindex < 0 || spanindex < 0 ) { api_cond=0; }
			else {
				var apitext = str.substring(brindex,spanindex);
				// apitext may be "39" or "39 - 45"		
				var minusindex = apitext.indexOf('-');
				if (minusindex < 0 ) {	
					// single number like "39"
					var num0a = apitext;
					var num0b = num0a.replace(/(^\s*)|(\s*$)/g, "");	// trim
					if (num0b.length==0 || isNaN(num0b)) { api_cond=0; }
					
				} else {
					var num1a = apitext.substring(0,minusindex);	// num1 may contain may space
					var num2a = apitext.substring(minusindex+1);	// num2 may contain may space
					var num1b = num1a.replace(/(^\s*)|(\s*$)/g, "");	// trim
					var num2b = num2a.replace(/(^\s*)|(\s*$)/g, "");	// trim
					if (num1b.length==0 || isNaN(num1b)) { api_cond=0; }
					if (num2b.length==0 || isNaN(num2b)) { api_cond=0; }				
				}
			}
		}
	} catch (err) {
		// if any above checking cannot execute, api is error
		api_cond = 0;
	}

	// If API error, replace the weatherAPIArea HTML by EPD link only
	if (api_cond==0) {
		// the third paragraph is the link for EPD
		// for simple, do not get the print url here
		var errorArea = document.getElementById("weatherErrorArea");
		apiArea.innerHTML = "<p>" + errorArea.getElementsByTagName("p")[2].innerHTML + "</p>"; 
	}

	//alert('api_cond='+api_cond);
}


/* Display Weather Warning */
function WeatherLayout()
{
	// Condition for handle Display Block or None
	var good_cond = 1;      			// assume good cond first
	var warning_cond = -1;				// assume cannot get the JSON first
	var warning_string = "";			// default is empty
	var weather_time_string = "";
	var jsonlimit = 15;				// 15 mins limit
	var NO_JSON_BUT_XML_WARNING_LIMIT = 60;		// 60 mins limit
	var NORMAL_XML_LIMIT = 120;			// 120 mins limit
	var jsondiff = jsonlimit + 1; 		// assume no JSON first

	// check xml healthness
	//var xmldiff = Math.abs(server_dt - xml_dt) / (1000 * 60);
	var xmldiff = (server_dt - xml_dt) / (1000 * 60);
	if ((xmldiff > NORMAL_XML_LIMIT) || (xmldiff < 0) ) { good_cond = 0; }

	// 20090527 KC: handle API Display
	APILayout();

	try {
		// get the WeatherJSON first
		var weatherJSON = weatherWarning();
		var json_dt = new Date(weatherJSON.lastModified);	
		
		// images, can use en for all version
		var imgpath = "/images/weather/icon/warning/";	
		var picarray = new Array("dummy.png",
		  "tc1.png","tc3.png","tc8ne.png","tc8nw.png","tc8se.png",
		  "tc8sw.png","tc9.png","tc10.png","raina.png","rainr.png",
		  "rainb.png","ts.png","ntfl.png","landslip.png","sms.png",
		  "frost.png","firey.png","firer.png","cold.png","vhot.png",
		  "tsunami.png");
		
		var warningUrlArray = new Array("http://www.hko.gov.hk/textonly/warning/detail.htm",
			"http://www.hko.gov.hk/textonly/warning/detailc.htm",
			"http://gb.weather.gov.hk/textonly/warning/warnc.htm");
	
		// Define a 2-D array
		var d1 = 3;
		var d2 = 22;
		var altarray = new Array(d1);
		for (i = 0 ; i < d2 ; i++) {
		  altarray[i] = new Array(d2);
		}
		
		altarray[0][0]="";	// dummy
		altarray[0][1]="Standby signal no.1";
		altarray[0][2]="Strong wind signal no.3";
		altarray[0][3]="No.8 northeast gale or storm signal";
		altarray[0][4]="No.8 northwest gale or storm signal";
		altarray[0][5]="No.8 southeast gale or storm signal";
		altarray[0][6]="No.8 southwest gale or storm signal";
		altarray[0][7]="Increasing gale or storm signal no.9";
		altarray[0][8]="Hurricane signal no.10";
		altarray[0][9]="Amber rainstorm warning signal";
		altarray[0][10]="Red rainstorm warning signal";
		altarray[0][11]="Black rainstorm warning signal";
		altarray[0][12]="Thunderstorm warning";
		altarray[0][13]="Special announcement on flooding in the northern New Territories";
		altarray[0][14]="Landslip warning";
		altarray[0][15]="Strong monsoon signal";
		altarray[0][16]="Frost warning";
		altarray[0][17]="Yellow fire danger warning";
		altarray[0][18]="Red fire danger warning";
		altarray[0][19]="Cold weather warning";
		altarray[0][20]="Very hot weather warning";
		altarray[0][21]="Tsunami warning";
	
		altarray[1][0]=""; // dummy
		altarray[1][1]="一號戒備信號";
		altarray[1][2]="三號強風信號";
		altarray[1][3]="八號東北烈風或暴風信號";
		altarray[1][4]="八號西北烈風或暴風信號";
		altarray[1][5]="八號東南烈風或暴風信號";
		altarray[1][6]="八號西南烈風或暴風信號";
		altarray[1][7]="九號烈風或暴風增強信號";
		altarray[1][8]="十號颶風信號";
		altarray[1][9]="黃色暴雨警告信號";
		altarray[1][10]="紅色暴雨警告信號";
		altarray[1][11]="黑色暴雨警告信號";
		altarray[1][12]="雷暴警告";
		altarray[1][13]="新界北部水浸特別報告";
		altarray[1][14]="山泥傾瀉警告";
		altarray[1][15]="強烈季候風信號";
		altarray[1][16]="霜凍警告";
		altarray[1][17]="黃色火災危險警告";
		altarray[1][18]="紅色火災危險警告";
		altarray[1][19]="寒冷天氣警告";
		altarray[1][20]="酷熱天氣警告";
		altarray[1][21]="海嘯警告";
	
		altarray[2][0]=""; // dummy
		altarray[2][1]="一号戒备信号";
		altarray[2][2]="三号强风信号";
		altarray[2][3]="八号东北烈风或暴风信号";
		altarray[2][4]="八号西北烈风或暴风信号";
		altarray[2][5]="八号东南烈风或暴风信号";
		altarray[2][6]="八号西南烈风或暴风信号";
		altarray[2][7]="九号烈风或暴风增强信号";
		altarray[2][8]="十号飓风信号";
		altarray[2][9]="黄色暴雨警告信号";
		altarray[2][10]="红色暴雨警告信号";
		altarray[2][11]="黑色暴雨警告信号";
		altarray[2][12]="雷暴警告";
		altarray[2][13]="新界北部水浸特别报告";
		altarray[2][14]="山泥倾泻警告";
		altarray[2][15]="强烈季候风信号";
		altarray[2][16]="霜冻警告";
		altarray[2][17]="黄色火灾危险警告";
		altarray[2][18]="红色火灾危险警告";
		altarray[2][19]="寒冷天气警告";
		altarray[2][20]="酷热天气警告";
		altarray[2][21]="海啸警告";
		
		// lang variable set in combine.js
		// var lang = 0;
		// lang = langCurrentPage();
	  	
		if (weatherJSON.warningCode.length > 0 ) {
			warning_cond = 1;		// 1 or more warning
			warning_string = "<ul>";
			for (var i=0; i<weatherJSON.warningCode.length ; i++) {
				var wcode = weatherJSON.warningCode[i];
				if (wcode == null || wcode ==0 || wcode > 21) { 
					throw "ErrorCode" ;
				} 
				var picname = picarray[wcode];
				var altname = altarray[lang][wcode];
				var warningUrl = warningUrlArray[lang];
				warning_string += "<li><a rel=\"external\" href=\""+warningUrl+"\"><img width=\"40\" height=\"40\" alt=\""+altname+"\" src=\"" + imgpath + picname + "\"></a></li> ";
			}
			warning_string += "</ul>";
		} else {
			warning_cond = 0;		// 0 warning (no warning in force)
			warning_string = "";
		}

		// jsondiff = Math.abs(server_dt - json_dt) / (1000 * 60);
		jsondiff = (server_dt - json_dt) / (1000 * 60);
		if (jsondiff > jsonlimit ) { warning_cond = -1; }
		
		// time string of the WeatherJSON
		weather_time_string = FormatUpdateTime(lang,json_dt);
	} catch (e) {
		// exception
		warning_string = "" ;
		warning_cond = -1;
	}
	
	if ( good_cond == 1) {
		// Good Cond and Have Warning
		if (warning_cond == 1) 
		{
			var warningArea = document.getElementById('weatherWarningArea');
			var weatherTimeArea = document.getElementById('weatherUpdateTime');
			if ((warningArea != null) && (json_dt >= xml_dt) && !IsWarningSignalSame(xml_warning_array,weatherJSON.warningCode)) {
				warningArea.innerHTML = warning_string;
				if (weatherTimeArea != null)
					weatherTimeArea.innerHTML = weather_time_string;
			}
			
			// Show "Warning Icon(s)"
			Govhk_Display('weatherWarningArea','','block');
	  		Govhk_Display('weatherCurrentArea','','block');
	  		Govhk_Display('weatherErrorArea','','none');
			Govhk_Display('weatherAPIArea','','block');
			Govhk_Display('weatherUpdateTime','','inline');
		} else if (warning_cond == 0)  {
			// No "Warning Icon(s)"
			// Check if warning signals in weather XML is update or not
			var weatherTimeArea = document.getElementById('weatherUpdateTime');
			if ((weatherTimeArea != null) && !IsWarningSignalSame(xml_warning_array,weatherJSON.warningCode)) {
				weatherTimeArea.innerHTML = weather_time_string;
			}
			Govhk_Display('weatherWarningArea','','none');
	  		Govhk_Display('weatherCurrentArea','','block');
	  		Govhk_Display('weatherErrorArea','','none');
			Govhk_Display('weatherAPIArea','','block');
			Govhk_Display('weatherUpdateTime','','inline');
		} else {
			// Cannot Get the Warning JSON, display the warning get from feedin
			if (xml_has_warning && xmldiff > NO_JSON_BUT_XML_WARNING_LIMIT)
			{
				Govhk_Display('weatherWarningArea','','none');
  				Govhk_Display('weatherCurrentArea','','block');
		  		Govhk_Display('weatherErrorArea','','block');
				Govhk_Display('weatherAPIArea','','block');
				Govhk_Display('weatherUpdateTime','','inline');
			}
			else
			{
				Govhk_Display('weatherWarningArea','','block');
		  		Govhk_Display('weatherCurrentArea','','block');
		  		Govhk_Display('weatherErrorArea','','none');
				Govhk_Display('weatherAPIArea','','block');
				Govhk_Display('weatherUpdateTime','','inline');
			}
		}
	} else {
		// Not Good Condition
		// Hide "Current Weather","Warning Icons", "Last Update"
		// Show "Warning in Force"
		Govhk_Display('weatherWarningArea','','none');
  		Govhk_Display('weatherCurrentArea','','none');
  		Govhk_Display('weatherErrorArea','','block');
		Govhk_Display('weatherAPIArea','','none');
		Govhk_Display('weatherUpdateTime','','none');
	}	  
}

// --- Random Banner
function RandomBanner() {
	
	var numSum = 0;
	var numRan = 0;
	var numTemp = 0;
	var arrayPercentage = new Array();
	var n = 0;
	var arrayImage = new Array();
	var m = 0;
	var index = 0;
	
	var banDivTag = document.getElementsByTagName("div");
	var banImage = "";
	var banPercentage = "";
	
	for (var k=0; k < banDivTag.length; k++) {

		if (banDivTag[k].className == "banPercentage") {

			if(isNaN(parseInt(banDivTag[k].innerText))) {
				// for NON-IE
				numSum = parseInt(numSum) + parseInt(banDivTag[k].textContent);
				// setting the new array for banPercentage
				arrayPercentage[n] = parseInt(banDivTag[k].textContent);
				n++;
			
			} else {
				// for IE
				numSum = parseInt(numSum) + parseInt(banDivTag[k].innerText);
				arrayPercentage[n] = parseInt(banDivTag[k].innerText);
				n++;
			}	

		}
		
		if (banDivTag[k].className == "banImage") {
			// setting the new array for banPercentage
				arrayImage[m] = banDivTag[k].innerHTML;
				m++;

		}
		
		
	} 
	
	numRan = Math.round(numSum*Math.random());

	
	/*	
	index=0;
	// find the image to show
	for (var i=0;i < arrayPercentage.length;i++) {

		// increase the percentage covered
		numTemp = numTemp + arrayPercentage[i]; 

		// when percentage can cover the random number
		if (numRan < numTemp) {
			index = i;
			i = arrayPercentage.length + 10;	// quit condition
		}
	}
		
	document.getElementById("hpAdHocShowImage").innerHTML = arrayImage[index];
	*/

	for (var i=0;i < arrayPercentage.length;i++) {

		numTemp = parseInt(numTemp) + parseInt(arrayPercentage[i]);
		
		if (i == 0) {
		
			if (numRan < numTemp) {
				
				document.getElementById("hpAdHocShowImage").innerHTML = arrayImage[i];

			}
		
		} else {
			
			if ((numRan >= (numTemp - parseInt(arrayPercentage[i]))) && (numRan <= numTemp)) {
				document.getElementById("hpAdHocShowImage").innerHTML = arrayImage[i];

			}			
				
		}
		
	}

}

function RandomPromotionItems(){

 	var promotionItems = getElementsByClassName("itemContainer");

	if (promotionItems.length==0) return;

	var pool = [];
	//check which items are not pinned
	for (var i=0; i<promotionItems.length; i++){
		if (!hasClass(promotionItems[i], "pinned"))
		pool.push(i);
	}

	//roll the first 3 items
	for (var i=0; i<3; i++){
		if (!hasClass(promotionItems[i], "pinned")) {
			//pick a random item in the pool
			k = pool[Math.floor(Math.random()*pool.length)];

			//swap the content
			temp = promotionItems[k].innerHTML;
			promotionItems[k].innerHTML = promotionItems[i].innerHTML;
	        promotionItems[i].innerHTML = temp;
		}
	}
	// 20090923: add ID to A(href)
	for (var i=0; i<3; i++){	
		try { 
			var aObjs = promotionItems[i].getElementsByTagName("a");	// array
			var imgObjs = promotionItems[i].getElementsByTagName("img"); // array
			var promoDivId = promotionItems[i].id;
			var imgSrc = imgObjs[0].src;
			var pos1 = imgSrc.lastIndexOf('/');
			var pos2 = imgSrc.lastIndexOf('.');
			var text1 = imgSrc.substring(pos1+1,pos2);
			var text2 = text1.replace(/[^a-zA-Z 0-9]+/g,'');
			var piID = 'HP' + promoDivId + 'X'  + text2;
			aObjs[0].setAttribute('ID',piID);
		} catch (e) {
			// do nothing if fail
		}
	}
}


function showTopKeywords(){
	var loc = location.href.toString();
	var lang = (loc.indexOf("/sc/")>0)?"sc":(loc.indexOf("/tc/")>0)?"tc":"en";
	var queryURL = "http://search.gov.hk/search.html?ui_lang=%lang%&ui_charset=utf-8&query=%q%";
	var prop = {
		"en" : {
			"uiLang" : "en",
			"kwStr"	 : "Hot Searches: ",
			"kwSep"  : ", "
		},
		"tc" : {
			"uiLang" : "zh-hk",
			"kwStr"	 : "熱門搜尋：",
			"kwSep"  : "、"
		},
		"sc" : {
			"uiLang" : "zh-cnhk",
			"kwStr"	 : "热门搜寻：",
			"kwSep"  : "、"
		}
	};

	//check the existence of the element
	if (!document.getElementById("govhkTopKeywords")) return;

	//adjust ui_lang of queryURL
	queryURL = queryURL.replace(/%lang%/, prop[lang].uiLang);

	try {
		var keywords = govhkTopKeywords();
		//compose html
		var html = "";
		// 20090923: add keywordid
		var keywordid = "";
		for (var i=0; i<keywords[lang].length; i++){
			if (keywords[lang][i].replace(/(^\s*)|(\s*$)/g, "") != "") {
				// 20090923: fill value to keywordid
				keywordid= 'govhkTopKeywords' + i;
				// 20090923: append code to "html" variable
				html += "<a id=\"" + keywordid + "\" href=\"" + queryURL.replace(/%q%/, encodeURIComponent(keywords[lang][i])) + "\">";
				html += keywords[lang][i].replace(/(^\s*)|(\s*$)/g, "") + "</a>";
				html += (i!=keywords[lang].length-1) ? prop[lang].kwSep : "";
			}
		}
		if (html != "") {
			document.getElementById("govhkTopKeywords").innerHTML = prop[lang].kwStr + html;
		}
	} catch (e){
		//do nothing
	}
}



/* Compare Weather Warning Signals between XML and JSON */
function IsWarningSignalSame(xmlWarningCode,jsonWarningCode) {
	if (xmlWarningCode.length == jsonWarningCode.length) {
		var sortXmlWarningCode = xmlWarningCode.sort(CompareInt);
		var sortJsonWarningCode = jsonWarningCode.sort(CompareInt);
		var strXmlWarning = sortXmlWarningCode.join(" ");
		var strJsonWarning = sortJsonWarningCode.join(" ");
		return (strXmlWarning == strJsonWarning);
	} else {
		return false;
	}
}

function FormatUpdateTime(lang,json_dt) {
	var strTime = "";
	var hour = json_dt.getHours();
	var min = json_dt.getMinutes();
	var strMin = "";
	var midnightStrArray = ["[12 midnight]","[午夜12時]","[午夜12时]"];
	var noonStrArray = ["[12 noon]","[中午12時]","[中午12时]"];
	var amPrefixArray = ["[","[上午","[上午"];
	var amSuffixArray = [" am]","]","]"];
	var pmPrefixArray = ["[","[下午","[下午"];
	var pmSuffixArray = [" pm]","]","]"];
	
	if (min < 10)
		strMin = "0" + min;
	else
		strMin = "" + min;
	
	if (hour == 0) {
		if (min == 0) {
			strTime = midnightStrArray[lang];
		} else {
			strTime = amPrefixArray[lang] + "12:" + strMin + amSuffixArray[lang];
		}
	} else if (hour > 0 && hour < 12) {
		strTime = amPrefixArray[lang] + hour + ":" + strMin + amSuffixArray[lang];
	} else if (hour == 12) {
		if (min == 0)
			strTime = noonStrArray[lang];
		else
			strTime = pmPrefixArray[lang] + "12:" + strMin + pmSuffixArray[lang];
	} else {
		var displayHour = hour - 12;
		strTime = pmPrefixArray[lang] + displayHour + ":" + strMin + pmSuffixArray[lang];
	}

	return strTime;
}

function CompareInt(a,b) {
	return a-b;
}

function hasClass(el, className) {
	var reg = new RegExp('(\\s|^)'+className+'(\\s|$)');
	return el.className.match(reg);
}

function getElementsByClassName(searchClass) {

		if (document.getElementsByClassName) return document.getElementsByClassName(searchClass);
        var classElements = [];

        var els = document.getElementsByTagName('*');
        var elsLen = els.length;
        var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
        for (i = 0, j = 0; i < elsLen; i++) {
                if ( pattern.test(els[i].className) ) {
                        classElements[j] = els[i];
                        j++;
                }
        }
        return classElements;
}

function HomepageLoad() {
//	RandomBanner();
    RandomPromotionItems();
	showTopKeywords();
	WeatherLayout();
}
