String.prototype.doubleByteStringLength = function () {
	return this.replace(/[^\x00-\xff]/g,"xx").length;
}

String.prototype.trimAllSpace  = function() {
	return this.replace(/^\s+|\s+$|^　+|　+$/g,"");
}

String.prototype.trimHeadSpace  = function() {
	return this.replace(/^\s+|^　+/g,"");
}

String.prototype.trimTailSpace  = function() {
	return this.replace(/\s+$|　+$/g,"");
}

function getMmDdFormatted(ymd) {
	ymd = reformatEnglishTimestamp("0000-"+ymd);
	return ymd.substr(5);
}

function reformatEnglishTimestamp(timeStr) {
	timeStr = timeStr.replace("年","-").replace("月","-").replace("日","");
	timeStr = timeStr.trimAllSpace();
	yloc = timeStr.search(/[0-9]{1,4}-[0-9]{1,2}-[0-9]{1,2}/);

	if (yloc==-1) return timeStr;
	
	bc = 0;
	ymd = timeStr.split("-");
	
	if (ymd[1]==0 || ymd[2]==0) { alert("Invalid Datestamp"); return timeStr; }
	if (ymd[0]!=undefined) {
		if (ymd[0].indexOf("公元前")!=-1) { bc = -1; ymd[0]=ymd[0].replace("公元前",""); }
		timeStr = ymd[0]+"年";
	}
	if (ymd[1]!=undefined) timeStr = timeStr+ymd[1]+"月";
	if (ymd[2]!=undefined) timeStr = timeStr+ymd[2]+"日";

	timeStr = reformatChineseTimestamp(timeStr);
	timeStr = timeStr.replace("年","-").replace("月","-").replace("日","");
	
	if (bc==-1) timeStr = "公元前"+timeStr;
	return timeStr;
}

function reformatChineseTimestamp(timeStr) {
	timeStr = timeStr.trimAllSpace();
	yloc = timeStr.search(/[0-9]{1,4}年/);
	mloc = timeStr.search(/[0-9]{1,2}月/);
	dloc = timeStr.search(/[0-9]{1,2}日/);
	
	if (yloc==-1) return timeStr;

	head=y=m=d='';
	head = timeStr.slice(0,yloc);
	if (mloc!=-1) {
		y = timeStr.slice(yloc,mloc);
		if (dloc!=-1) {
			m = timeStr.slice(mloc,dloc);
			d = timeStr.slice(dloc);
		}
		else m = timeStr.slice(mloc);
	}
	else {
		y = timeStr.slice(yloc);
	}
	
	y = padUpString(y,"年",4); y = y.replace("年年","年");
	m = padUpString(m,"月",2); m = m.replace("月月","月");
	d = padUpString(d,"日",2); d = d.replace("日日","日");

	return head+y+m+d;
}

function padUpString (s,c,num) {
	if (s==null || s=="") return "";

	var loc = s.indexOf(c);
	var rest = s.substr(loc);
	var strLen = s.substr(0,loc).length;
	var lenDiff = num - strLen;
	if (lenDiff > 0) for (i=0; i<lenDiff; i++) s = "0"+s;
	return s;
}

function stringToArray(str, delimiter){
	var index = 0;
	var result = new Array();
	if(str=="") return result;
	
	if(str.substring(str.length-1)==delimiter) str = str.substring(0,str.length-1);
	while(true){
		if(str.indexOf(delimiter)<0 && index==0){
			result[0] = str;
			break;
		}
		var temp = str.substring(0,str.indexOf(delimiter));
		result[index] = temp;
		
		str = str.substring(str.indexOf(delimiter)+1,str.length);
		if(str.indexOf(delimiter)<0) {
			result[index+1] = str;
			break;
		}
		index++;
	}
	return result;
}

// you can find the range of utf8 (4e00 - 9fa5) in XP TrueType program
// self-made chinese range of utf8 (e000 - f8ff)
function isAllChineseByRegEx(str, codingType){
	if (codingType == "utf8") 
		{ if ( ! (/^[\u4e00-\u9fa5]+$/gi.test(str)) ) return false; else return true; }
	else
		{ if ( ! (/^([\xa1-\xff])+$/.test(str)) ) return false; else return true; }
		//{ if ( ! (/^([\xa1a0-\xfeff])+$/.test(str)) ) return false; else return true; }
}

// gary: by utf-8 coding, but it covers simplified and traditional chinese
function isAllChinese (str) {
	var ret = true;
	for (var i=0; i<str.length; i++) {
		ret = ret && ((str.charCodeAt(i)>=0x4E00 && str.charCodeAt(i)<=0x9Fa5));
	}
	return ret;
}

function alertArray(arr) {
	alert(arr.toString());
}

function getFirstCharPinyinLetter (str) {
	var tmp=65536 + str.charCodeAt(0);
	if(tmp >=45217 && tmp <=45252) return "A";
	else if(tmp>=45253 && tmp <=45760) return "B";
	else if(tmp>=45761 && tmp <=46317) return "C";
	else if(tmp>=46318 && tmp <=46825) return "D";
	else if(tmp>=46826 && tmp <=47009) return "E";
	else if(tmp>=47010 && tmp <=47296) return "F";
	else if(tmp>=47297 && tmp <=47613) return "G";
	else if(tmp>=47614 && tmp <=48118) return "H";
	else if(tmp>=48119 && tmp <=49061) return "J";
	else if(tmp>=49062 && tmp <=49323) return "K";
	else if(tmp>=49324 && tmp <=49895) return "L";
	else if(tmp>=49896 && tmp <=50370) return "M";
	else if(tmp>=50371 && tmp <=50613) return "N";
	else if(tmp>=50614 && tmp <=50621) return "O";
	else if(tmp>=50622 && tmp <=50905) return "P";
	else if(tmp>=50906 && tmp <=51386) return "Q";
	else if(tmp>=51387 && tmp <=51445) return "R";
	else if(tmp>=51446 && tmp <=52217) return "S";
	else if(tmp>=52218 && tmp <=52697) return "T";
	else if(tmp>=52698 && tmp <=52979) return "W";
	else if(tmp>=52980 && tmp <=53688) return "X";
	else if(tmp>=53689 && tmp <=54480) return "Y";
	else if(tmp>=54481 && tmp <=62289) return "Z";
	else return null;
}

function unpackAjaxData (str) {
	str = str.trimAllSpace();

	var start=str.indexOf("#|#");
	var end=str.lastIndexOf("#|#");

	if (start==-1 || end==-1) {}
	else str = str.substring(start+3,end);

	return str;
}

function getAlpha (start, end) {
	var alpha = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
	var ret = new Array();
	for (i=0; i<alpha.length; i++)
		if (i >= start-1 && i <= end-1)
			ret.push(alpha[i]);
			
	return ret;
}

function getSelectedRadioBoxByName (name) {
	var hasCheckedTags = new Array();
	eval("var oTag = document.forms[0]."+name);
	if(oTag==undefined)
		return 0;

	eval("var length = document.forms[0]."+name+".length");
	if(length==undefined)	{
		hasCheckedTags.push(oTag.value);
		if(oTag.checked)
			return oTag.value;
	}
	else
		for (i=0;i<length;i++) {
			if(oTag[i].checked)	{
				return oTag[i].value;
			}
		}
}

function getSelectedRadioBoxById(name) {
  var hasCheckedTags = new Array();
	var oTag = document.getElementById(name);

	var length = oTag.length;
	if(length==undefined)	{
		hasCheckedTags.push(oTag.value);
	}
	else
		for (i=0;i<length;i++) {
			if(oTag[i].checked)	{
				return oTag[i].value;
			}
		}
}

function getSelectedCheckBox(name) {
	var hasCheckedTags = new Array();
	eval("var oTag = document.forms[0]."+name);
	if(oTag==undefined)
		return 0;
		
	eval("var length = document.forms[0]."+name+".length");
	if(length==undefined)	{
		if(oTag.checked)
			hasCheckedTags.push(oTag.value);
	}
	else {
		for (i=0;i<length;i++) {
			if(oTag[i].checked)	{
				hasCheckedTags.push(oTag[i].value);
			}
		}
	}
	return hasCheckedTags;
}

function setRadioBox(name,value) {
	eval("var oTag = document.forms[0]."+name);

	eval("var length = document.forms[0]."+name+".length");
	if(length==undefined)	{
		oTag.checked == true;
	}
	else
		for (i=0;i<length;i++) {
			if(oTag[i].value == value) {
				oTag[i].checked = true;
				return ;
			}
		}
}

function setSelectedOption(name,value) {
	eval("var oTag = document.forms[0]."+name);

	eval("var length = document.forms[0]."+name+".length");
	if(length==undefined)	{
		oTag.value == value;
	}
	else
		for (i=0;i<length;i++) {
			if(oTag.options[i].value == value) {
				oTag.options[i].selected = true;
				return ;
			}
		}
}

function formToEncodedString(formId) {
	var formTag = document.getElementById(formId);

	var length = formTag.length;
	var andTag = "";
	var postString = "";

	for(i=0;i<length;i++)	{
		formElement = formTag.elements[i];

		if (formElement.name!='') {
			if (formElement.type=='select-one') {
				elementValue=formElement.options[formElement.selectedIndex].value;
			}
			else if (formElement.type=='checkbox' || formElement.type=='radio') {
				if (formElement.checked==false)continue;	
				elementValue=formElement.value;
			}
			else if(formElement.type=='submit'||formElement.type=='button'||formElement.type=='reset'||formElement.type=='image') {
				continue;
			}
			else {
				elementValue = formElement.value.replace(/\'/g,'\\\'');
			}
			elementValue = encodeURIComponent(elementValue);
			postString += andTag + formElement.name + '=' + elementValue;
			
			andTag="&";
				
		}//end if
	}//end for
	//alert(postString);
	return postString;
}

function formToString(formId) {
	var length = formId.length;
	var andTag = "";
	var postString = "";
	
	for(i=0;i<length;i++) {
		formElement = formId.elements[i];

		if (formElement.name!='') {
			if (formElement.type=='select-one') {
				elementValue = formElement.options[formElement.selectedIndex].value;
			}
			else if (formElement.type=='checkbox' || formElement.type=='radio') {
				if (formElement.checked==false) continue;	
				elementValue = formElement.value;
			}
			else if(formElement.type=='submit'||formElement.type=='button'||formElement.type=='reset'||formElement.type=='image') {
				continue;
			}
			else {
				elementValue = formElement.value.replace(/\'/g,'\\\'');
			}

			postString += andTag + formElement.name + '=' + elementValue;
			andTag = "&";
		}//end if
	}//end for
	//alert(postString);
	
	return postString;
}

function isIE6() {
	if (navigator.userAgent.indexOf("MSIE") > -1) {
		if (navigator.userAgent.indexOf("MSIE 6.") > -1) {
		 	return true;
		}
	}
	return false;
}

function isNull(value) {
	if (value=='undefined' || value==null) return true;
	else {
		if (value=='' || value.length==0) return true;
		else return false;
	}
}

function isIntNumber(value) {
	value = getGb2312IntNumber(value);
	if (isNaN(value)) return false;
	else return true;
}

function getGb2312SiblingOrder(v) {
	v = v.toString().trimAllSpace();
	var final_value='';
	var value;
	var digit = v.length;
	
	for (i=(digit-1); i>=0; i--) {
		value=v.charAt(i);
		if (i==digit-1) {
			value = value.replace('1','一');
			value = value.replace('2','二');
			value = value.replace('3','三');
			value = value.replace('4','四');
			value = value.replace('5','五');
			value = value.replace('6','六');
			value = value.replace('7','七');
			value = value.replace('8','八');
			value = value.replace('9','九');
			value = value.replace('0','0');
		}
		else if (i==digit-2) {
			value = value.replace('1','十');
			value = value.replace('2','二十');
			value = value.replace('3','三十');
			value = value.replace('4','四十');
			value = value.replace('5','五十');
			value = value.replace('6','六十');
			value = value.replace('7','七十');
			value = value.replace('8','八十');
			value = value.replace('9','九十');
			value = value.replace('0','零');
		}
		else if (i==digit-3) {
			value = value.replace('1','一百');
			value = value.replace('2','二百');
			value = value.replace('3','三百');
			value = value.replace('4','四百');
			value = value.replace('5','五百');
			value = value.replace('6','六百');
			value = value.replace('7','七百');
			value = value.replace('8','八百');
			value = value.replace('9','九百');
			value = value.replace('0','零');
		}
		final_value = value + final_value;
	}

	return final_value;
}

function getGb2312IntNumber(value) {
	value = value.trimAllSpace();
	value = value.replace(new RegExp("－","g"),'-');
	value = value.replace(new RegExp("。","g"),'.');

	value = value.replace(new RegExp("１","g"),'1');
	value = value.replace(new RegExp("２","g"),"2");
	value = value.replace(new RegExp("３","g"),"3");
	value = value.replace(new RegExp("４","g"),"4");
	value = value.replace(new RegExp("５","g"),"5");
	value = value.replace(new RegExp("６","g"),"6");
	value = value.replace(new RegExp("７","g"),"7");
	value = value.replace(new RegExp("８","g"),"8");
	value = value.replace(new RegExp("９","g"),"9");
	value = value.replace(new RegExp("０","g"),"0");

	return parseInt(value); // gary: if not a number, typeof gives "number" but "NaN"
}

function getAsciiTimestampString(value) {
	value = value.trimAllSpace();
	value = value.replace(new RegExp("－","g"),'-');
	value = value.replace(new RegExp("１","g"),'1');
	value = value.replace(new RegExp("２","g"),"2");
	value = value.replace(new RegExp("３","g"),"3");
	value = value.replace(new RegExp("４","g"),"4");
	value = value.replace(new RegExp("５","g"),"5");
	value = value.replace(new RegExp("６","g"),"6");
	value = value.replace(new RegExp("７","g"),"7");
	value = value.replace(new RegExp("８","g"),"8");
	value = value.replace(new RegExp("９","g"),"9");
	value = value.replace(new RegExp("０","g"),"0");
	return value;
}

function openDisplayWindow(src,title) {
	var windowStyle = "titlebar=no ,toolbar=no, menubar=no, scrollbars=yes, location=no, directories=no, resizable=yes, status=no";
	window.open(src,title,windowStyle);
}

function openStyleWindow(src,title,windowStyle) {
  src = src + "&returnType=backOneStep";
	window.open(src,title,windowStyle);
}

function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ";", len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

// gary: a way to rotate images before using Flash
// e.g. imagesArray[] = "include/utils/popup_image.php?opCode=family&id=1"
// function startRotateImages() {
//		imageDisplayTag ="family_images";
//		rotateImages();
//		fps = setInterval("rotateImages()", 10000);
// }

var imagesArray = new Array();
imagesCurrentPos = -1;
imageDisplayTag = "";
fps = null; // usage: fps = setInterval("rotateImages()", 5000);

function rotateImages() {
	var length = imagesArray.length;

	if(length>0) {
		if(imagesCurrentPos<0) {
			imagesCurrentPos=length-1;
		}
		
		if(imagesCurrentPos>=0 && document.getElementById(imageDisplayTag)!=null)	{
			src = imagesArray[imagesCurrentPos];
			document.getElementById(imageDisplayTag).src=src;			
			if(--imagesCurrentPos<0) imagesCurrentPos=length-1;
		}
	}
}
