﻿
// Common Functions Library ----------------------------------------------------

// Configurations:

// Page navigation
var htmlGoBack = '&lt;&lt;';
var htmlGoNext = '&gt;&gt;';


function leadZero(n, units) {
	var sN = new String(n);
	var i, sRet = sN;
	for (i=sN.length; i<units; i++) {
		sRet = '0' + sRet;
	}
	return sRet;
}

function displayDate(dDate) {
	var today;
	if (dDate)
		today = new Date(dDate);
	else
		today = new Date(); 
	var dow = new Array('Chủ Nhật','Thứ Hai','Thứ Ba','Thứ Tư','Thứ Năm','Thứ Sáu','Thứ Bảy');
	var months = new Array('01','02','03','04','05','06','07','08','09','10','11','12');
	var year = today.getFullYear();
	year = (year <= 1888) ? (1900 + year) : year;
	document.write(dow[today.getDay()] + ' ngày ' + today.getDate() + '/' + months[today.getMonth()] + '/' + year + ', ' + leadZero(today.getHours(), 2) + 'h' + leadZero(today.getMinutes(), 2) + ' GMT+7');
}

function displayPageNavigator(scriptName, queryString, currentOffset, pageCount, recordCount) {
	var previousOffset, nextOffset, offsetBegin, offsetEnd, nPage;
	currentOffset = currentOffset == '' ? 0 : currentOffset/1;
	pageCount = pageCount == '' ? 1 : pageCount/1;
	recordCount = recordCount == '' ? 0 : recordCount/1;
	if (currentOffset - 5 > 1) {
		if (currentOffset + 5 <= pageCount)
			offsetBegin = currentOffset - 5;
		else {
			if (pageCount - 10 >= 1)
				offsetBegin = pageCount - 10;
			else
				offsetBegin = 1;
		}
	} else
		offsetBegin = 1;
	
	if (offsetBegin + 10 < pageCount)
		offsetEnd = offsetBegin + 10;
	else
		offsetEnd = pageCount;
	
	if (currentOffset - 1 > 1)
		previousOffset = currentOffset - 1;
	else
		previousOffset = 1;
	
	if (currentOffset + 1 < pageCount)
		nextOffset = currentOffset + 1;
	else
		nextOffset = pageCount;
	
	
	var html = '';
	
	html += '<span class=SearchNavigation>';
	html += '<a href="' + scriptName + '?' + queryString + '&offs=' + previousOffset + '">' + htmlGoBack + '</a>&nbsp;';
	for (nPage=offsetBegin; nPage<=offsetEnd; nPage++) {
		if (nPage-currentOffset == 0)
			html += '<span class=SearchNavigationOffset>' + nPage + '</span>';
		else
			html += '<a href="' + scriptName + '?' + queryString + '&offs=' + nPage + '">' + nPage + '</a>';
		html += '&nbsp;';
	}
	html += '<a href="' + scriptName + '?' + queryString + '&offs=' + nextOffset + '">' + htmlGoNext + '</a>';
	html += '</span>';
	document.write(html);
}

var ppimgNW;
function popupImage(src, note, title, css, border) {
	if (border==null) border = 0;
	if (note==null) note = '';
	if (ppimgNW != null) ppimgNW.close();

	ppimgNW = window.open('','POPUPIMAGE','width=1,height=1');
	var doc = ppimgNW.document;
	doc.write('<html>');
	doc.write('<head>');

	if (title!=null) doc.write('<title>'+ title +'</title>');
	doc.write('<style> body {'+css+'} #ppImgText{'+ css +'} #ppImg{cursor:hand}</style></head>');
	doc.write('<body leftmargin="0" topmargin="' + border + '" onload="doResize();">');
	doc.write('<div align="center">');
	doc.write('<img src="' + src + '" id="ppImg" onclick="self.close();" title="Close">');
	doc.write('</div>');
	doc.write('<div style="height:1; width:' + border + '; font-size:4pt;">');
	doc.write('</div>');
	doc.write('<div id="ppImgText" align="center">');
	doc.write(note);
	doc.write('</div>');
	doc.write('</body>');
	doc.write('</html>');

	doc.write('<' + 'script>');
	doc.write('function doResize() {');
	doc.write('	var imgW = ppImg.width, imgH = ppImg.height;');		 
	doc.write('	window.resizeTo(imgW + 8 +' + border*2 +', imgH + ppImgText.offsetHeight + 26 + '+ border*2 +');');
	doc.write('	setTimeout(\'doResize()\', 1000);');
	doc.write('}');
	doc.write('doResize(); ');
	doc.write('</' + 'script>');


}

// Restrict input alphabetic letters only ////////////////
// USAGE: onKeyPress="checkAlphabetic();"
function checkAlphabetic() {
	if ((event.keyCode >= 65 && event.keyCode <= 90) || (event.keyCode >= 65+32 && event.keyCode <= 90+32))
		return; 
	else
		event.returnValue = null;
}

// Restrict input numeric letters only /////////////////
// USAGE: onKeyPress="checkNumeric();"
function checkNumeric() {
	if ( (event.keyCode >= 48 && event.keyCode <= 57) || event.keyCode == 46 )	// 0-9 and "."
		return; 
	else
		event.returnValue = null;
}

function hasChars(str, charStr) {
	var i;
	for (i=0; i<charStr.length; i++) {
		if (str.indexOf(charStr.charAt(i)) >= 0)
			return true;
	}
	return false;
}

function isEmail(str) {
	iAt = str.indexOf('@');
	iDot = str.lastIndexOf('.');
	return (iAt>=0 && iDot>=0 && iAt<iDot);
}

function isUsername(str) {
	return !hasChars(str, ' ~!@#$%^&*()+|=\\{}[]:";\'<>?,./');
}

function isPassword(str) {
	return !hasChars(str, ' ~!@#$%^&*()+|=\\{}[]:";\'<>?,./');
}



function csv2Array(str, separator) {
	if (!separator) separator = ',';
	return str.split(separator);
}

function items2Array(sItems) {
	var index = 0, aRet = new Array();
	var i, a = sItems.split(';');
	for (i=0; i<a.length; i++) 
		if (a[i] != '') {
			var b = a[i].split('=');
			aRet[index++] = b[0];
			aRet[index++] = b[1];
		}
	return aRet;
}

function searchArray(arr, val) {
	if (arr)
		{
			var i;
			for (i=0; i<arr.length; i++)
				if (arr[i] == val)
					return i;
		}
	return -1;
}

function getName(aArgs, sValue) {
	for (i=0; i<aArgs.length-1; i+=2) {
		if (sValue == aArgs[i+1])
			return aArgs[i];
	}
	return null;
}

function getSelect(sName, args, sSelect, sAttr) {
	var strHTML = '';
	var aArgs;
	if (typeof(args) == 'string')
		aArgs = items2Array(args);
	else
		aArgs = args;
	strHTML += '<select name="' + sName + '" ' + (sAttr==null ? '' : sAttr) + '>';
	for (i=0; i<aArgs.length; i+=2) {
		if (sSelect == aArgs[i+1])
			strHTML += '<option' + (aArgs[i+1]!=null ? ' value="' + aArgs[i+1] + '"' : '') + ' selected>' + aArgs[i] + '</option>\r\n';
		else
			strHTML += '<option' + (aArgs[i+1]!=null ? ' value="' + aArgs[i+1] + '"' : '') + '>' + aArgs[i] + '</option>\r\n';
	}
	strHTML += '</select>';
	return strHTML;
}

function writeSelect(sName, aArgs, sSelect, sAttr) {
	document.write(getSelect(sName, aArgs, sSelect, sAttr));
}

function getSingleChoices(sName, args, selectedValue, sType, sAttr) {
	var html = '';
	var aArgs;
	if (typeof(args) == 'string')
		aArgs = items2Array(args);
	else
		aArgs = args;
	
	if (sType == 'radio') {
		for (i=0; i<aArgs.length; i+=2)
			html += '<input type=radio name="'+ sName +'" ' + (aArgs[i+1]!=null ? ' value="' + aArgs[i+1] + '"' : '') + ' ' + (aArgs[i+1] == selectedValue ? 'checked' : '') + '>' + aArgs[i] + '&nbsp;&nbsp;\r\n';
	} else if (sType == 'select') {
		html = '<select name="' + sName + '" ' + (sAttr==null ? '' : sAttr) + '>';
		for (i=0; i<aArgs.length; i+=2)
			html += '<option value="' + aArgs[i+1] + '" ' + (aArgs[i+1] == selectedValue ? 'selected' : '') + '>' + aArgs[i] + '</option>\r\n';
		html += '</select>';
	}

	return html;
}

function getMultiChoices(sName, args, selectedValues, sType, sAttr) {
	var html = '';
	var aArgs, aSelectedValues;
	if (typeof(args) == 'string')
		aArgs = items2Array(args);
	else
		aArgs = args;
	if (typeof(selectedValues) == 'string')
		aSelectedValues = csv2Array(selectedValues, ';');
	else
		aSelectedValues = selectedValues;
	if (sType == 'checkbox') {
		for (i=0; i<aArgs.length; i+=2)
			html += '<input type=checkbox name="'+ sName +'" ' + (aArgs[i+1]!=null ? ' value="' + aArgs[i+1] + '"' : '') + ' ' + (searchArray(aSelectedValues, aArgs[i+1]) >= 0 ? 'checked' : '') + '>' + aArgs[i] + '&nbsp;&nbsp;\r\n';
	} else if (sType == 'select') {
		html = '<select name="' + sName + '" multiple ' + sAttr + '>';
		for (i=0; i<aArgs.length; i+=2)
			html += '<option value="' + aArgs[i+1] + '" ' + (searchArray(aSelectedValues, aArgs[i+1]) >= 0 ? 'selected' : '') + '>' + aArgs[i] + '</option>\r\n';
		html += '</select>';
	}
	return html;
}

function writeSingleChoices(sName, args, selectedValue, sType, sAttr) {
	document.write(getSingleChoices(sName, args, selectedValue, sType, sAttr));
}

function writeMultiChoices(sName, args, selectedValues, sType, sAttr) {
	document.write(getMultiChoices(sName, args, selectedValues, sType, sAttr));
}


/*
Parameters:

specs = "EmptyItem=<text>:<value>,Month={vn|sort-vn|en|sort-en|number},Year={from-to},Order={dmy|mdy|ymd}"
*/

function writeDate(name, dateMDY, specs) {
	var defaultDate;
	var today = new Date();
	var d = today.getDate();
	var m = today.getMonth();
	var y = today.getFullYear();

	if (isNaN(new Date(dateMDY))) {
		defaultDate = new Date((today.getMonth()+1) + '/' + today.getDate() + '/' + today.getFullYear());
		if (typeof(dateMDY) == 'string') {
			var a = dateMDY.split('/');
			if (a.length >= 3) {
				m = a[0]; d = a[1]; y = a[2];
			}
		}
		//alert("1");
	} else {
		defaultDate = new Date(dateMDY);
		var d = defaultDate.getDate();
		var m = defaultDate.getMonth() + 1;
		var y = defaultDate.getFullYear();
		//alert("2");
	}

	//alert(d + "/" + m + "/" + y);

	var hr = defaultDate.getHours();
	var mn = defaultDate.getMinutes();

	var hasEmptyItem	= false;
	var emptyItemText	= '..';
	var emptyItemValue	= '';
	var month		= 'en';
	var yearFrom		= today.getFullYear() - 10;
	var yearTo		= today.getFullYear() + 10;
	var dayOrder		= 'dmy';
	var sDisabled		= '';

	if (specs) {
		var aSpecs = specs.split(',');
		for (i=0; i<aSpecs.length; i++) {
			var aPair = aSpecs[i].split('=');
			var sKey = aPair[0].toLowerCase(), sValue = aPair[1];
			switch(sKey) {
				case 'emptyitem':		var a = sValue.split(':'); emptyItemText=a[0]; emptyItemValue=a[1]; hasEmptyItem = true; break;
				case 'month':			month = sValue; break;
				case 'year':			var a = sValue.split('-'); yearFrom = a[0]; yearTo = a[1]; break;
				case 'order':			dayOrder = sValue; break;
				case 'disabled':		sDisabled = (sValue=='1') ? 'disabled' : ''; break;
			}
		}
	}

	var aDays = new Array('1','1','2','2','3','3','4','4','5','5','6','6','7','7','8','8','9','9','10','10','11','11','12','12','13','13','14','14','15','15','16','16','17','17','18','18','19','19','20','20','21','21','22','22','23','23','24','24','25','25','26','26','27','27','28','28','29','29','30','30','31','31');
	var aMonths;
	switch(month) {
		case 'vn':
			aMonths = new Array('Thang Gieng','1','Thang Hai','2','Thang Ba','3','Thang Tu','4','Thang Nam','5','Thang Sau','6','Thang Bay','7','Thang Tam','8','Thang Chin','9','Thang Muoi','10','Thang Muoi Mot','11','Thang Muoi Hai','12'); break;
		case 'sort-vn':
			aMonths = new Array('Thang 1','1','Thang 2','2','Thang 3','3','Thang 4','4','Thang 5','5','Thang 6','6','Thang 7','7','Thang 8','8','Thang 9','9','Thang 10','10','Thang 11','11','Thang 12','12'); break;
		case 'en':
			aMonths = new Array('January','1','February','2','March','3','April','4','May','5','June','6','July','7','August','8','September','9','October','10','November','11','December','12'); break;
		case 'sort-en':
			aMonths = new Array('Jan.','1','Feb.','2','Mar.','3','Apr.','4','May','5','Jun.','6','Jul.','7','Aug.','8','Sep.','9','Oct.','10','Nov.','11','Dec.','12'); break;
		case 'number':
			aMonths = new Array('1','1','2','2','3','3','4','4','5','5','6','6','7','7','8','8','9','9','10','10','11','11','12','12'); break;
	}

	var aYears = new Array();
	var i, j=0;
	
	for (i=yearFrom; i<=yearTo; i++) { aYears[j++] = i; aYears[j++] = i; }

	if (hasEmptyItem) {
		var emptyItem = new Array(emptyItemText, emptyItemValue);
		aDays = aDays.concat(emptyItem);
		aMonths = aMonths.concat(emptyItem);
		aYears = aYears.concat(emptyItem);
	}

	document.write('<input type="hidden" name="'+ name +'" value="'+m+'/'+d+'/'+y+'">');
	document.write('<input type="hidden" name="'+ name +'_vn" value="'+d+'/'+m+'/'+y+'">');

	function _dispD(){
		writeSelect(name + '_fpt_wdmy_d', aDays, d, 
			'onclick="document.all(\''+ name +'\').value = document.all(\'' + name + '_fpt_wdmy_m\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_d\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_y\').value;"' +
			'onchange="document.all(\''+ name +'_vn\').value = document.all(\'' + name + '_fpt_wdmy_d\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_m\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_y\').value;" ' + sDisabled);
	}
	function _dispM() {
		writeSelect(name + '_fpt_wdmy_m', aMonths, m, 
			'onclick="document.all(\''+ name +'\').value = document.all(\'' + name + '_fpt_wdmy_m\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_d\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_y\').value;"' +
			'onchange="document.all(\''+ name +'_vn\').value = document.all(\'' + name + '_fpt_wdmy_d\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_m\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_y\').value;" ' + sDisabled);
	}
	function _dispY() {
		writeSelect(name + '_fpt_wdmy_y', aYears, y, 
			'onclick="document.all(\''+ name +'\').value = document.all(\'' + name + '_fpt_wdmy_m\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_d\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_y\').value;"' +
			'onchange="document.all(\''+ name +'_vn\').value = document.all(\'' + name + '_fpt_wdmy_d\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_m\').value + \'/\' + document.all(\'' + name + '_fpt_wdmy_y\').value;" ' + sDisabled);
	}
	function _dispBlank() { document.write('&nbsp'); }

	switch(dayOrder) {
		case 'dmy': _dispD(); _dispBlank(); _dispM(); _dispBlank(); _dispY(); break;
		case 'mdy': _dispM(); _dispBlank(); _dispD(); _dispBlank(); _dispY(); break;
		case 'ymd': _dispY(); _dispBlank(); _dispM(); _dispBlank(); _dispD(); break;
	}

}


function writeDayMonthYear(name, d, m, y) {
	writeDate(name, m+'/'+d+'/'+y, 'Month=sort-vn');
}


// User Interface functions -------------------------------------------

function getTop (o) {
	var nTop=0;
	while (o.tagName != "BODY") {
		nTop += o.offsetTop;
		o = o.offsetParent;
	}
	return nTop;
}

function getLeft (o) {
	var nLeft=0;
	while (o.tagName != "BODY") {
		nLeft += o.offsetLeft;
		o = o.offsetParent;
	}
	return nLeft;
}

// VanHNN <vanhnn@hcm.fpt.vn>
// End -------------------------------------------------------------------------
