function debug_alert() {
	var aa = [];
	for(var i=0; i<arguments.length; i++) aa.push(arguments[i]);
	if(debug_on) alert('[DEBUG ALERT MESSAGE] set debug_on = false, if you want to turn off the debug alert message.\n'
	                 + '--------------------------------------------------------------------------------------------\n\n'
	                 + aa.join('\n') );
}

function ltrim(str) {
	return str==null ? '' : str.toString().replace(/^\s*/g,'');
}
function rtrim(str) {
	return str==null ? '' : str.toString().replace(/\s*$/,g,'');
}
function trim(str) {
	return str==null ? '' : str.toString().replace(/(^\s*)|(\s*$)/g, '');
}

function BYTE(input) {
    var i, j=0;
    for(i=0;i<input.length;i++) {
        val=escape(input.charAt(i)).length;
        if(val==  6) j++;
        j++;
    }
    return j;
}

function lpad(s, n, d) { s = new String(s==null ? '' : s); d = d==null ? ' ' : d.toString(); while(s.length<n) s = d + s; return s; }
function rpad(s, n, d) { s = new String(s==null ? '' : s); d = d==null ? ' ' : d.toString(); while(s.length<n) s += d; return s; }
function toNumber(s)   { s = new String(s==null ? '' : s); return (new Number(s.replace(/[^\d\-\+\.]/g,''))) * 1; }

function displayAccountNumber(s) { return s==null ? '' : s.replace(/[^\w]/g,'').replace(/^(\w{3})(\w)/,'$1-$2-'); }
function isEmpty(s)              { return s==null || s.length<1; }
function isNotEmpty(s)           { return !isEmpty(s); }
function isBlank(s)              { return isEmpty(trim(s)); }
function isNotBlank(s)           { return !isBlank(s); }
function isEnterKey()            { return event.keyCode == 13; }
function isToNumber(s)           { if(s==null) return false; s = s.toString().replace(/[^\d\-\+\.]/g, ''); return !isNaN(s); }
function isNotToNumber(s)        { return !isToNumber(s); }
function cleanToNumber(s)        { return s==null ? '' : s.toString().replace(/[^\d\-\+\.]/g, ''); }
function ifBlank(s, d)           { return isBlank(s) ? d : s; }
function dfBlank(s)              { return isBlank(s) ? '' : s; } 			 

function toOrderPriceView(s)     { return short_price_on ? (toNumber(s) / 1000).toFixed(1) : parseInt(toNumber(s)); }
function toOrderPriceReal(s)     { return short_price_on ? parseInt(toNumber(s) * 10) * 100 : parseInt(toNumber(s)); }
function toOrderPriceSet(s)      { return short_price_on ? parseInt(toNumber(s) * 10) / 10 : parseInt(toNumber(s)); }

function cleanToWord(s)          { return s==null ? '' : s.toString().replace(/[\w]/g, ''); }
function cleanToAlpha(s)         { return s==null ? '' : s.toString().replace(/[^a-zA-Z]/g, ''); }
function toOnlyNumber(s)         { return s==null ? '' : s.toString().replace(/[^\d]/g, ''); }
function reverse(s)              { if(s==null || s.length<1) return ''; var t = 0; for(var i=s.length-1; i>=0; i--) t += s.charAt(i); return t; }
function numberFormat(s, format, zero) {
	if(format==null) format='#,###,###,##0';
	if(zero==null) zero = '0';
	var no = cleanToNumber(s);
	return no==0 ? zero : Number(no).numberFormat(format);
}

function numberFormatFloat(s, format, zero) {
	if(format==null) format = '#,###,###,##0.0';
	if(zero==null) zero = '0';
	var no = cleanToNumber(s);
	return no==0 ? zero : Number(no).numberFormat(format);
}

function orderPriceFormat(s, zero) {
	if(isBlank(s)) return isBlank(zero) ? '' : zero;
	var nf = short_price_on ? '#,###,###,##0.0' : '#,###,###,##0';
	return numberFormat(s, nf, zero);
}

function getById(id, doc) { if(doc==null) doc = document; return doc.getElementById(id); }

function getByTyName(name, root, res) {
	if(root==null) root = document.body;
	if(res==null) res = [];
	var es = root.childNodes;
	for(var i=0; i<es.length; i++) { if(es[i].tyname == name) res.push(es[i]); getByTyName(name, es[i], res); }
	return res;
}

function eventHandleNumber(input, firstZero) {
	if(firstZero==null) firstZero = false;
	var e = window.event; var k = e.keyCode;
	if(k>=48 && k<=57) {
		if(firstZero==false && k==48 && input!=null && trim(input.value).length==0) e.returnValue = false;
		else return;
	} else e.returnValue = false;
}

function eventHandleNumberFloat(input, firstZero) {
	if(firstZero==null) firstZero = false;
	var e = window.event; var k = e.keyCode;
	if((k>=48 && k<=57) || k==46) {
		if(firstZero==false && k==48 && input!=null && trim(input.value).length==0) e.returnValue = false;
		else return;
	} else e.returnValue = false;
}

function eventHandleAlphaNumber(input, firstZero, capitalize) {
	if(firstZero==null) firstZero = false;
	var e = window.event; var k = e.keyCode;
	if((k>='a' && k<='z') || (k>='A' && k<='Z') || (k>='0' && k<='9') || k==46) {
		if(capitalize == true && k>='a' && k<='z') k = k - 32;
		if(firstZero==false && k==48 && input!=null && trim(input.value).length==0) e.returnValue = false;
		else return;
	} else e.returnValue = false;
}

function eventHandlerAccountNumber(input) {
	var e = window.event; var k = e.keyCode;
	if(k==45 || (k>=48 && k<=57) || (k>=65 && k<=90) || (k>=97 && k<=122)) {
		var s = input.value.replace(/[^a-zA-Z0-9]/g,'');
		if(s.length<10) return;
		else e.returnValue = false;
	}
	else e.returnValue = false;
}

function eventHandleDateStr(input) {
	var e = window.event; var k = e.keyCode;
	if((k>=48 && k<=57) || k==47) {
		var v = trim(input.value);
		var n = v.length;
		if(n==0 && k==47) e.returnValue = false;
		else return;
	} else e.returnValue = false;
}

function tyCheckSymbol_input(obj, kmode, mode, auto_submit) {
	var ec = event.keyCode;
       if(kmode=='DN') {
           if(ec == 40 || ec == 38) {
            var ud = ec == 38 ? -1 : 1;
            var d1 = document.getElementById('did_symbolListBox_table');
            var d2 = document.getElementById('did_symbolListBox_2');
            var rows = d1.rows;
            if(d1==null || rows==null || d1.row_index==null) { return; }
            var ri = (d1.row_index * 1) + ud;
            if(ri < 0) ri = 0;
            else if(ri >= rows.length) ri = rows.length - 1;
            for(var i = 0; i < rows.length; i++) {
                var row = rows(i);
                if(i==ri) {
                    tyTrColorOn(row); d1.row_mark = row; obj.value = row.row_value;
                    if(ec == 40) {
                       if(i > 11) {
                           rows(i - 11).scrollIntoView(true);
                          }
                    } else {
                        row.scrollIntoView(true);
                    }
                } else { tyTrColorOff(row); }
            }
            d1.row_index = ri;
        }
       }

	else if(kmode=='UP') {
		if(ec == 13) {
			var d0 = document.getElementById('did_symbolListBox');
			if(d0 == null) { return; }
			else { d0.style.display = 'none'; }
			var d1 = document.getElementById('did_symbolListBox_table');
			if(d1!=null && d1.row_mark != null) {
				var row = d1.row_mark;
                setSymbol(row.row_value, auto_submit);
            } else {
                setSymbol(obj.value, auto_submit);
            }
        } else {
			if ( ec >= 37 && ec <= 40 ) return;
			tySetSymbolList(obj, mode, auto_submit);
		}
	}
}

function tyCheckSymbol_onblur(obj) {
	if(obj) obj.value = obj.value.toUpperCase();
	setTimeout("try { var d0 = document.getElementById('did_symbolListBox'); if(d0 != null && d0.onmouseover) d0.style.display = 'none'; else { }; } catch(e) { };", 1000);
}

function tyCheckSymbol_onchange(obj) {
	if(obj) obj.value = obj.value.toUpperCase();
}

function tySetSymbolList(obj, mode, auto_flag) {
       var auto_s = auto_flag == true ? 'true' : 'false';
	var r = '<iframe id="did_symbolListBox_frame" style="witdh: 300; height: 204; padding: 0 0 0 0; margin: 0 0 0 0; position: absolute;" frameborder="0"></iframe>\n'
		  + '<div    id="did_symbolListBox_1"     style="width: 300; height: 204; padding: 2 2 2 2; margin: 0 0 0 0; position: absolute; background-color: #E7F3FE;">\n'
		  + '<div    id="did_symbolListBox_2"     style="width: 296; height: 200; padding: 2 2 2 2; margin: 0 0 0 0;                     background-color: white; overflow-y: auto; overflow-x: hidden; text-align: left; vertical-align: top;">\n'
		  + '<table  id="did_symbolListBox_table" style="width: 292;              padding: 0 0 0 0; margin: 0 0 0 0;                     background-color: white; table-layout: fixed; cursor: pointer;" '
		  + ' row_index="0" border="0" cellpadding="0" cellspacing="0">\n';
	var s = obj.value.toUpperCase();
	var c = 0;
	if(isBlank(mode)) mode = upcom3_on ? 'A3' : 'HH';
	var isAA = mode.indexOf('AA') != -1;
	var isA3 = isAA || mode.indexOf('A3') != -1;
	var isHH = isA3 || mode.indexOf('HH') != -1;
	var isUp = isA3 || mode.indexOf('UP') != -1;
	var isMg = mode.indexOf('Mg') != -1;
	if(s.length > 0) {
		for(var i=0; i<symbolTbl.length; i++) {
			var sym = symbolTbl[i];
			if(sym.getStockType()=='1' && ((sym.symbol.substring(0, s.length) == s) || (s.length > 1 && sym.getLangName().indexOf(s)!=-1))) {
				if( isAA || (isHH && sym.isHH()) || (isUp && sym.isUpcom()) ) {
					if(isMg == true && sym.isMrgn == false) continue;
					r += '<tr row_value="' + sym.symbol + '" onMouseOver="tyTrColorOff(did_symbolListBox_table.row_mark); tyTrColorOn(this); did_symbolListBox_table.row_mark = this;" OnMouseOut="tyTrColorOff(this)" onClick="did_symbolListBox.style.display = \'none\'; setSymbol(\''+sym.symbol+'\', ' + auto_s + ');"><td style="padding:2 2 2 2;" nowrap="nowrap">' + sym.symbol + ' - ' + sym.getLangName() + '</td></tr>\n';
					c++;
				}
			}
		}
	}
	r += '</table></div></div>\n';
	var d_ = document.getElementById('did_symbolListBox');
	if(d_ != null) {
		d_.innerHTML = r;
           var dt = document.getElementById('did_symbolListBox_table');
           var df = document.getElementById('did_symbolListBox_frame');
           var d1 = document.getElementById('did_symbolListBox_1');
           var d2 = document.getElementById('did_symbolListBox_2');
           d_.style.display = c > 0 ? 'block' : 'none';
           var ht = dt.clientHeight;
           var h2 = d2.clientHeight;
           var h1 = d1.clientHeight;
           var hq = ht < h1 ? ht : h1;

           d1.style.height = hq + 8;
           d2.style.height = hq + 4;
           df.style.height = hq + 8;

		if(c > 0) {
			tyTableRowHeight(dt);
			tyTrColorOn(dt.rows(0));
			dt.row_index = 0;
			dt.row_mark = dt.rows(0);
		}
	} else {
	  // alert('ERROR');
	}
}

function searchSymbol(autoSubmit, mode, mode2, fnc) {
	if(mode ==null) mode  = '';
	if(mode2==null) mode2 = '';
	var symbol = window.showModalDialog(tyUrlDummy('/public/SearchSymbol.jsp?mode=' + mode + '&mode2=' + mode2), '', 'dialogWidth: 406px; dialogHeight: 611px;');
	if (symbol != '' && symbol != undefined) {
		if(fnc != null) fnc(symbol, autoSubmit);
		else setSymbol(symbol, autoSubmit);
		return true;
	}
	return false;
}

function tySearchSymbol(p) {
	var mode  = p.mode  == null ? '' : p.mode;
	var mode2 = p.mode2 == null ? '' : p.mode2;
	var symbol = window.showModalDialog(tyUrlDummy('/public/SearchSymbol.jsp?mode=' + mode + '&mode2=' + mode2), '', 'dialogWidth: 406px; dialogHeight: 611px;');
	try { p.callBack(symbol); } catch(e) { }
}

function setFavoriteSymbol() {
	var objWin = window.open(tyUrlDummy('/public/SetFavoriteSymbol.jsp'), 'SetFavoriteSymbol', 'width=851, height=420, toolbar=no, status=yes, directories=no, scrollbars=no, location=no, resizable=yes, menubar=no');
	objWin.focus();
}

function searchSymbolSet(function_name) {
	var symbol  = window.showModalDialog(tyUrlDummy('/public/SearchSymbolSet.jsp'), '', 'dialogWidth: 340px; dialogHeight: 480px;');
	function_name(symbol);
}

function doVIP_List(idno) {
	var objWin = window.open(tyUrlDummy('/vip/ToList.jsp?idno' + idno), 'VIP_List', 'width=800, height=760, toolbar=no, status=yes, directories=no, scrollbars=no, location=no, resizable=yes, menubar=no');
}

var POP_WIN_VIP_LIST = null;
function doOpenVIP_List() {
	if(tyIsLogin()==false) { tyYouMustLogin(); return; }
	if(tyIsVip()==false) { }
	if(POP_WIN_VIP_LIST!=null) POP_WIN_VIP_LIST.close();
	var url = '/vip/ToList.jsp';
	POP_WIN_VIP_LIST = window.open(tyUrlDummy(url), 'POP_WIN_VIP_LIST', 'width=660, height=630');
	POP_WIN_VIP_LIST.focus();
}

function doChangeVIP_HTSPwd(htsId) {
	var url = '/public/ChangeVIP_HTSPwd.jsp?mode=wts';
	if(isNotBlank(htsId)) url += '&htsId=' + htsId;
	window.showModalDialog(tyUrlDummy(url), self, 'dialogWidth:406px; dialogHeight:450px;');
}

function changeHTSPwd(response) {
	if(tyIsLogin()==false) { tyYouMustLogin(); return; }
	// if(tyIsVip()==true) { doChangeVIP_HTSPwd(); return; }
	if(response==null) {
		Ext.Ajax.request({ url: '/public/CheckLogin.jsp', success: changeHTSPwd, failure: function(){} });
		return;
	}
	var txt = response.responseText;
	var res = tyJSON_decode(txt);
	tySetIsLogin(res.res);
	if(res.res==false) { tyToLogin(); return; }
	window.showModalDialog(tyUrlDummy('/public/ChangeHTSPwd.jsp'), self, 'dialogWidth: 406px; dialogHeight: 450px;');
}

function changeACTPwd(response) {
	if(response==null) {
		Ext.Ajax.request({ url: '/public/CheckLogin.jsp', success: changeACTPwd, failure: function(){} });
		return;
	}
	var txt = response.responseText;
	var res = tyJSON_decode(txt);
	tySetIsLogin(res.res);
	if(res.res==false) {
		tyToLogin();
		return;
	}
	window.showModalDialog(tyUrlDummy('/public/ChangeACTPwd.jsp'), self, 'dialogWidth: 406px; dialogHeight: 407px;');
	//var objWin = window.open('/public/ChangeACTPwd.jsp', 'popup1', 'width=400, height=308, toolbar=no, status=yes, directories=no, scrollbars=no, location=no, resizable=no, menubar=no');
	//objWin.focus();
}

function goToChangeACTPwd() {
	if(tyIsVip()) {
		tyAlert(tyMsg('msg.vip.RestrictedMenu'));
		return;
	}
	window.location.href = tyMsg('m.s.B_ChangeAccountPassword.-.url');
}

function setMyMenu() {
	window.showModalDialog(tyUrlDummy('/public/SetMyMenu.jsp'), '', 'dialogWidth: 406px; dialogHeight: 594px;');
	//var objWin = window.open('/public/SetMyMenu.jsp', 'popup1', 'width=406, height=594, toolbar=no, status=yes, directories=no,dscrollbars=no, location=no, resizable=no, menubar=no');
	//objWin.focus();
}

function convertYmd(s) {
	return isBlank(s) ? '' : s.replace(/[^\d]/g,'').replace(/(.{2})(.{2})(.{4})/, '$3$2$1');
}

function convertDate(s) {
	return isBlank(s) ? '' : s.replace(/[^\d]/g,'').replace(/(.{2})(.{2})(.{4})/, '$3/$2/$1');
}

// ty Functions
var TY_USER_INFO = {};
var TY_OK_ACCOUNT_PASSWORD = '*************';

function tyReadUserInfo(callback) {
	if(TY_USER_INFO != null) {
		if(callback!=null) callback(TY_USER_INFO);
	} else {
		Ext.Ajax.request({
			url: '/public/GetUserInfo.jsp',
			params: {},
			success: function(response) { var txt = response.responseText; TY_USER_INFO = ty_issacweb_json_js(txt); if(callback != null) callback(TY_USER_INFO); },
			failure: function(response) { }
		});
	}
}

function tyAccountNumberFormat(accountNumber) {
	return isBlank(accountNumber) ? '' : tyAccountNumberStrip(accountNumber).replace(/^(\w{3})(\w)/, '$1-$2-');
}

function tyAccountNumberStrip(accountNumber) {
	return isBlank(accountNumber) ? '' : accountNumber.replace(/[^\w]/g, '');
}

function tyGetCurrentBankCode(accountNumber) {
	var account = tyGetAccount(accountNumber);
	return account==null ? null : account.currentBankCode;
}

function tySetCurrentBankCode(accountNumber, bankCode) {
	var account = tyGetAccount(accountNumber);
	if(account==null) return;
	account.currentBankCode = bankCode;
	Ext.Ajax.request({
		url: '/public/SetCurrentBankCode.jsp',
		params: ty_issacweb_encrypt_object_data({accountNumber: accountNumber, bankCode: bankCode}),
		success: function(response) { debug_alert('success: ' + response.responseText); },
		failure: function(response) { debug_alert('failure: ' + accountNumber + ', ' + bankCode); }
	});
}

function tyGetCurrentAccountNumber() {
	return TY_USER_INFO == null ? null : TY_USER_INFO.currentAccountNumber;
}

function tySetCurrentAccountNumber(accountNumber) {
	if(TY_USER_INFO == null) return;
	TY_USER_INFO.currentAccountNumber = accountNumber = tyAccountNumberStrip(accountNumber);
	var issacweb_data = ty_issacweb_encrypt_object_data({accountNumber: accountNumber});
	Ext.Ajax.request({
		url: '/public/SetCurrentAccountNumber.jsp',
		params: issacweb_data,
		success: function(response){
			// debug_alert('setCurrentAccountNumber - success: ' + response.responseText);
		},
		failure: function(response){
			// debug_alert('setCurrentAccountNumber - failure: failed');
		}
	});
}

function tyGetAccount(accountNumber) {
	if(TY_USER_INFO==null) return null;
	var accounts = TY_USER_INFO.accounts;
	if(accounts==null) return null;
	for(var i=0; i<accounts.length; i++) {
		if(tyAccountNumberStrip(accounts[i].accountNumber) == tyAccountNumberStrip(accountNumber)) return accounts[i];
	}
	return null;
}

function tySetAccount(account) {
	if(TY_USER_INFO == null) return false;
	var accounts = TY_USER_INFO.accounts;
	if(accounts == null) return false;
	for(var i=0; i<accounts; i++) {
		if(tyAccountNumberStrip(accounts[i].accountNumber) == tyAccountNumberStrip(account.accountNumber)) {
			accounts[i] = account;
			return true;
		}
	}
	return false;
}

function tySetBankCode(accountNumber, bankObj, isCurrent) {
	// debug_alert('start tySetBankCoce: ' + accountNumber);
	if(bankObj==null) {
		// debug_alert('bankObj is null');
		return;
	}
	var t1 = bankObj.tagName;
	if(t1=='SELECT') {
		var account = tyGetAccount(accountNumber);
		var g = false;
		if(account == null) {
			// debug_alert('account is null');
			g = true;
		}
		else if(account.banks == null) {
			// debug_alert('('+accountNumber+')banks is null');
			g = true;
		}
		else if(account.banks.length < 1) {
			// debug_alert('account banks length little than 1');
			g = true;
		}

		if(g == true) {
			var os = bankObj.options;
			os.length = 1;
			os[0].value = os[0].text = '    ';
		} else {
			var bv = tyGetCurrentBankCode(accountNumber);
			var banks = account.banks;
			var os = bankObj.options;
			os.length = banks.length;
			for(var k=0; k < banks.length; k++) {
				os[k].value = banks[k].bankCode;
				os[k].text  = banks[k].bankCodeName;
				if(os[k].value==bv) {
					bankObj.selectedIndex = k; os[k].selected = true;
					if(isCurrent) tySetCurrentBankCode(accountNumber, os[k].value);
				}
			}
		}
		return;
	} else {
		// debug_alert('unsupportable tagName[' + t1 + ']');
		return;
	}
}

function tySetAccountNumber(accountObj, passwordObj, ownerObj, accountNumber, isCurrent, bankObj) {
	if(TY_USER_INFO == null) { return; }
	var accounts = TY_USER_INFO.accounts;
	if(accounts == null) { return; }
	var temp = [];
	if(isNotBlank(accountObj.accountKind)) {
		for(var i=0; i < accounts.length; i++) {
			var acc = accounts[i];
			if(acc == null) continue;
			if(accountObj.accountKind=='9') {
				var ba = acc.banks;
				if(ba != null && ba[0] != null && ba[0].bankCode == '9999') temp.push(acc);
			} else {
				if(accountObj.accountKind.indexOf(acc.accoutKind) != -1) temp.push(acc);
			}
		}
		accounts = temp;
	}
	if(passwordObj) passwordObj.value = '';
	if(accounts.length<1) {
		accountObj.options.length = 1;
		var obj = accountObj.options[0];
		obj.value = '';
		obj.text = '';
		accountObj.disabled = true;
		if(ownerObj) ownerObj.innerText = '';
	} else {
		accountObj.options.length = accounts.length;
		var currentAccountNumber = tyGetCurrentAccountNumber();
		if(isBlank(currentAccountNumber) && accounts!=null && accounts.length>0 && accounts[0]!=null) {
			currentAccountNumber = accounts[0].accountNumber;
			tySetCurrentAccountNumber(currentAccountNumber);
		}
		if(isBlank(accountNumber)) accountNumber = currentAccountNumber;
		if(isCurrent && isNotBlank(accountNumber) && tyAccountNumberStrip(accountNumber) != tyAccountNumberStrip(currentAccountNumber)) tySetCurrentAccountNumber(accountNumber);
		for(var i = 0; i<accounts.length; i++) {
			var account = accounts[i];
			var opts = accountObj.options[i];
			opts.text = tyAccountNumberFormat(account.accountNumber);
			opts.value = account.accountNumber;
			opts.tyAccountOwner = account.accountOwner;
			if(tyAccountNumberStrip(account.accountNumber) == tyAccountNumberStrip(accountNumber)) {
				accountObj.selectedIndex = i;
				opts.selected = true;
				if(ownerObj) ownerObj.innerText = opts.tyAccountOwner;
				if(account.checked && passwordObj) passwordObj.value = TY_OK_ACCOUNT_PASSWORD;
			}
		}
		accountObj.disabled = false;
	}
	if(bankObj != null) tySetBankCode(accountNumber, bankObj);
	return true;
}

function tyChangeAccountNumber(accountObj, passwordObj, ownerObj, accountNumber, isCurrent, bankObj) {
	var options = accountObj.options;
	if(options==null) return;
	if(isBlank(accountNumber)) accountNumber = accountObj.value;
	var account = tyGetAccount(accountNumber);
	if(account==null) { debug_alert('account is null'); return; }
	if(isCurrent) { debug_alert('OK isCurrent is TRUE'); tySetCurrentAccountNumber(accountNumber); }
	else { debug_alert('isCurrent is FALSE'); }
	if(passwordObj != null) passwordObj.value = account.checked ? TY_OK_ACCOUNT_PASSWORD : '';
	if(ownerObj != null) ownerObj.innerText = accountObj.options[accountObj.selectedIndex].tyAccountOwner;
	if(bankObj != null) tySetBankCode(accountNumber, bankObj);
}

var ty_shk_b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var ty_shk_s = null;

function ty_get_shk_s() {
	ty_shk_s = Cookies.get('ty_shk');
	if(ty_shk_s == null || ty_shk_s.length != ty_shk_b.length) ty_shk_s = ty_shk_b;
	return ty_shk_s;
}

function ty_enshake(s) {
	var a = ty_shk_b;
	var b = ty_get_shk_s();
	if(s==null || s.length < 1) return s;
	s = s.replace(/=/g, '_');
	if(test_on) return s;
	var r = '';
	for(var i=0; i<s.length; i++) {
		var ch = s.charAt(i);
		var ci = a.indexOf(ch);
		r += ci < 0 ? ch : b.charAt(ci);
	}
	return r;
}
function ty_deshake(s) {
	var a = ty_shk_b;
	var b = ty_get_shk_s();
	if(s==null || s.length < 1) return s;
	s = s.replace(/_/g, '=');
	if(test_on) return s;
	var r = '';
	for(var i=0; i<s.length; i++) {
		var ch = s.charAt(i);
		var ci = b.indexOf(ch);
		r += ci < 0 ? ch : a.charAt(ci);
	}
	return r;
}

function ty_base64encode(s) {
	return s2r(s);
}

function ty_base64decode(s) {
	return r2s(s);
}

function ty_escape(s) {
	return (issac_on==true) ? issacweb_escape(s) : escape(s);
}

function ty_unescape(s) {
	return unescape(s);
}

function ty_issacweb_encrypt(catMsg) {
	if(isBlank(catMsg))
		return '';
	else if(issac_on==true)
		return document.IssacWebEnc.issacweb_hybrid_encrypt_s_utf8(catMsg, pubkey1, keyname1);
	else if(encrypt_on==true)
		return ty_enshake(ty_base64encode(ty_escape(catMsg)));
	else
		return catMsg;
}

function ty_issacweb_decrypt(catMsg) {
	if(isBlank(catMsg))
		return '';
	else if(issac_on==true)
		return document.IssacWebDec.issacweb_decrypt_s(catMsg, keyname2);
	else if(encrypt_on==true)
		return ty_unescape(ty_base64decode(ty_deshake(catMsg)));
	else
		return catMsg;
}

function ty_issacweb_decrypt_js(catMsg) {
	if(isBlank(catMsg)) return '';
	try { return eval('("' + ty_issacweb_decrypt(catMsg) + '")'); } catch(e) { return ''; }
}

function ty_issacweb_decrypt_json_js(catMsg) {
	if(isBlank(catMsg)) return {};
	try { return eval( '(' + ty_issacweb_decrypt_js(catMsg) + ')' ); } catch(e) { return {} };
}

function ty_issacweb_decrypt_array(ary) {
	var sa = [];
	for(var i=0; i<ary.length; i++) sa[i] = ty_issacweb_decrypt(ary[i]);
	return sa;
}

function ty_issacweb_encrypt_object_data(obj, name) {
	if(isBlank(name)) name = 'issacweb_data';
	var res = {};
	res[name] = ty_issacweb_encrypt_object(obj);
	return res;
}

function ty_issacweb_encrypt_object(obj) {
	var sa = []; // string array
	for(var k in obj) {
	    var v = obj[k];
	    if(v!=null) {
		    var a = (v instanceof Array) ? v : [v];
		    for(var i=0; i<a.length; i++) {
                sa.push(issacweb_escape(k) + '=' + issacweb_escape(a[i]));
		    }
	    }
	}
	var ss = sa.join('&');
	return ty_issacweb_encrypt(ss);
}

function ty_issacweb_encrypt_form_data(form, name) {
	if(name==null) name = 'issacweb_data';
	var res = {};
	res[name] = ty_issacweb_encrypt_form(form, name);
	return res;
}

function ty_issacweb_form_submit_by_hidden_form(form1, form2, action) {
	var data = ty_issacweb_encrypt_form(form1);
	form2.issacweb_data.value = data;
	if(action) form2.action = action;
	else form2.action = form1.action;
	form2.submit();
}

function ty_issacweb_form_submit(form, name) {
	if(isBlank(name)) name = 'issacweb_data';
	var eo = ty_issacweb_get_form(form);
	if(!form[name]) {
		var o = document.createElement('textarea');
		o.setAttribute('name', name);
		o.style.display = 'none';
		form.appendChild(o);
	}
	form[name].value = ty_issacweb_encrypt_form(form, name, true);
	form.submit();
	ty_issacweb_set_form(form, eo);
}

function ty_issacweb_encrypt_form(form, name, clear_ok) {
	if(name==null) name = 'issacweb_data';
	var first = true;
	var catMsg = '';
	var curMsg;
	for(i=0; i< form.length; i++){
		if(form.elements[i].type != 'button'
			&& form.elements[i].type != 'reset'
			&& form.elements[i].type != 'submit') {
			if(form.elements[i].type == 'checkbox' || form.elements[i].type == 'radio') {
				if(form.elements[i].checked) {
					curMsg =  form.elements[i].value;
					if(clear_ok == true) form.elements[i].checked = false;
				} else {
					continue;
				}
			} else if(form.elements[i].type == 'select-one') {
				var index = form.elements[i].selectedIndex;
				if(index<0) {
					curMsg = '';
				} else {
					if(form.elements[i].options[index].value != '') {
						curMsg = form.elements[i].options[index].value;
					} else {
						curMsg = form.elements[i].options[index].text;
					}
					if(clear_ok == true) form.elements[i].selectedIndex = 0;
				}
			} else {
				if(form.elements[i].name == 'issacweb_data' || form.elements[i].name == name) continue;
				curMsg = form.elements[i].value;
				if(clear_ok == true) form.elements[i].value	= '';
			}
			if(first){
				first = false;
			} else {
				catMsg	= catMsg + '&';
			}
			catMsg += issacweb_escape(form.elements[i].name) + '=' + issacweb_escape(curMsg);
		}
	}
	return ty_issacweb_encrypt(catMsg);
}

function ty_issacweb_encrypt_form_value(form) {
	var es = form.elements;
	for(var i=0; i<es.length; i++) {
		var e = es[i];
		var n = e.name;
		var t = e.type;
		var g = e.tagName;
		if(t=='file') {
			continue;
		} else if(e.options!=null) {
			for(var j=0; j<e.options.length; i++) {
				e.options[j].value = ty_issacweb_encrypt(e.options[j].value);
			}
		} else if(e.value!=null) {
			e.value = ty_issacweb_encrypt(e.value);
		}
	}
}
function ty_issacweb_get_form(form_obj) {
	var es = form_obj.elements;
	var eo = {};
	for(var i=0; i<es.length; i++) {
		var e = es[i];
		var n = e.name;
		var t = e.type;
		var g = e.tagName;
		if(g != null) g = g.toUpperCase();
		if(g == null || g == 'FORM' || t == null || t == 'button' || t == 'reset' || t == 'submit') continue;
		if(eo[n]==null) eo[n] = new Array();
		if(t == 'checkbox' || t == 'radio') {
			if(e.checked==true) eo[n].push(e.value);
		} else {
			eo[n].push(e.value);
		}
	}
	return eo;
}

function ty_issacweb_set_form(form_obj, data_obj) {
	var es = form_obj.elements;
	var eo = {};
	for(var i=0; i<es.length; i++) {
		var e = es[i];
		var n = e.name;
		var t = e.type;
		var g = e.tagName;
		if(g == null || g == 'FORM' || t == null || t == 'button' || t == 'reset' || t == 'submit') continue;
		if(eo[n]==null) eo[n] = new Array();
		eo[n].push(e);
	}

	for(var n in eo) {
		var va = data_obj[n];
		if(va==null) continue;
		if((va instanceof Array)==false) { va = [va]; }
		var ea = eo[n];
		for(var i=0; i<ea.length; i++) {
			var e = ea[i];
			var t = e.type;
			if(e.type == 'file') {
				continue;
			}
			else if(e.type == 'CHECKBOX' || e.type == 'RADIO' || e.type == 'checkbox' || e.type == 'radio') {
				for(var j=0; j<va.length; j++) { if(e.value == va[j]) e.checked = true; }
			}
			else if(va[i] != null) e.value = va[i];
		}
	}
}


function tyTopOnload() { tyPreCheck(); tyHeadOnload(); tyLeftOnload(); tyPageOnload(); tyRightOnload(); tyFootOnload(); }
function tyTopUnload() { tyHeadUnload(); tyLeftUnload(); tyPageUnload(); tyRightUnload(); tyFootUnload(); }

function tyPreCheck() {
	tyBrowserCheck();
	tyCheckIssac();
}

function tyBrowserCheck() {
	var b_name = navigator.appName;
	var b_ver  = navigator.appVersion;
	if( b_name != 'Microsoft Internet Explorer') {
		var m = tyMsg('msg.Install.Explorer');
		var c = confirm(m);
		if(c == true) {
			var u = 'http://www.microsoft.com/windows/internet-explorer/default.aspx';
			window.location.href = u;
			return;
		}
	}
}

function tyCheckIssac() {
	/*
	try {
		var obj = document.IssacWebEnc;
		if(obj==null || obj.issacweb_encrypt_s == null) {
			window.location.href = tyUrlDummy('/etc/IssacWeb.jsp');
		}
	} catch(e) {

	}
	*/
}

function tyActiveXOnload(){
/**
	if(onChart != true) return;
	var installed = false;
	try{
		var xObj = document.all.TWebChart;
		var res = xObj!=null;
		if(xObj){
			installed = true;
		}else{
			installed = false;
		}
	}catch(ex){
		installed = false;
	}

	if(installed == true) {
		alert('ActiveX Control is installed');
		return true;
	} else {
		alert('ActiveX Control isn't installed');
		return false;
	}
	*/
}

function tyHeadOnload() { }
function tyHeadUnload() { }

function tyLeftOnload() { }
function tyLeftUnload() { }

function tyPageOnload() { }
function tyPageUnload() { }

function tyRightOnload() {}
function tyRightUnload() {}

function tyFootOnload() { }
function tyFootUnload() { }
function tyPrintArguments(args) {
	var s = 'length = ' + args.length + '\n\n';
	for(var i=0; i<args.length; i++) s += '['+i+'] = ' + args[i] + '\n';
	return s;
}

function tyIsModalWin(obj) {
	try {
		if(obj==null) if(arguments.length<1) obj = self; else return false;
		return obj.window.dialogArguments!=null;
	} catch(e) {
		return false;
	}
}

function tyIsOpenWin(obj) {
	try {
		if(obj==null) if(arguments.length<1) obj = self; else return false;
		return obj.window.menuIsTop != true && obj.opener != null;
	} catch(e) {
		return false;
	}
}

function tyIsChildWin(obj) {
	try {
		if(obj==null) if(arguments.length<1) obj = self; else return false;
		return obj.parent != null && obj != obj.parent;
	} catch(e) {
		return false;
	}
}

function tyIsTop(obj) {
	try {
		if(obj==null) if(arguments.length<1) obj = self; else return false;
		return obj == tyFindTopWin(obj);
	} catch(e) {
		return false;
	}
}

function tyFindTopWin(obj) {
	try {
		if(obj==null) { if(arguments.length==0) obj = self; else return null; }
		if(obj.window.menuIsTop == true) return obj;
		     if( obj.window.dialogArguments && obj!=obj.window.dialogArguments ) { var res = tyFindTopWin(obj.window.dialogArguments); if(res!=null) return res; }
		else if( obj.opener                 && obj!=obj.opener                 ) { var res = tyFindTopWin(obj.opener); if(res!=null) return res; }
		else if( obj.parent                 && obj!=obj.parent                 ) { var res = tyFindTopWin(obj.parent); if(res!=null) return res; }
		return arguments.length==0 ? top : null;
	} catch(e) {
		return self;
	}
}

function tyMenuId()      { var obj = tyFindTopWin(); return obj.menuId!=null ? obj.menuId : null; }
function tyMenuUrl()     {
	var obj = tyFindTopWin();
	var s = obj.menuUrl!=null ? obj.menuUrl : '/';
	if(s.match(/^javascript:/i)) return s;
	s  = s.replace(/[?&]dummy=[^?&]*/gi,'');
	s += (s.indexOf('?')<0 ? '?' : '&') + 'dummy=' + tyGetDummy();
	return s;
}
function tyUrlDummy(s) {
	if(s==null) s = '/';
	s  = s.replace(/[?&]dummy=[^?&]*/gi,'');
	s += (s.indexOf('?')<0 ? '?' : '&') + 'dummy=' + tyGetDummy();
	return s;
}
var TY_DUMMY = null;
function tyGetDummy()         { if(TY_DUMMY==null) dummy = (new Date()).getTime() + new String(Math.random()).substring(2); return dummy; }
function tySetMenuUrl(u)      { var obj = tyFindTopWin(); obj.menuUrl = u; }
function tyCheckLogin()       { if(tyIsLogin()==false) { tyYouMustLogin(); return false } else return true; }
function tyLogin()            { alert('TRY TO LOGIN'); }
function tyToLogin()          { var obj = tyFindTopWin(); if(obj!=null) obj.window.location.href = '/Login.jsp?returnUrl='+escape(tyMenuUrl()); if(tyIsOpenWin() && obj != self && true) self.close(); }
function tyToOTP()            { var obj = tyFindTopWin(); if(obj!=null) obj.window.location.href = '/otp/Otp.jsp?returnUrl='+escape(tyMenuUrl()); if(tyIsOpenWin() && obj != self && true) self.close(); }
function tyToChangePassword() { var obj = tyFindTopWin(); if(obj!=null) obj.window.location.href = '/public/ToChangePassword.jsp?returnUrl='+escape(tyMenuUrl()); if(tyIsOpenWin() && obj != self && true) self.close(); }
function tyLogout()           { var obj = tyFindTopWin(); if(obj!=null) obj.window.location.href = tyUrlDummy('/public/Logout.jsp'); }
function tyIsLogin()          { var obj = tyFindTopWin(); return (obj!=null && obj.menuIsLogin==true); }
function tyIsVip()            { return userLevel=='0A'; }
function tySetIsLogin(v)      { var obj = tyFindTopWin(); obj.menuIsLogin = v==true; }
function tyToActionTimeout()  {
	tyFindTopWin().window.location.href = tyUrlDummy('/etc/ActionTimeout.jsp');
	if(tyIsOpenWin()) self.close();
}
function tyCheckAccountPassword(accountNumber, accountPassword, successFunction, failureFunction) {
	var issacweb_data = ty_issacweb_encrypt_object_data({accountNumber: accountNumber, accountPassword: accountPassword});
	Ext.Ajax.request({url: '/public/CheckAccountPassword.jsp', params: issacweb_data, success: successFunction, failure: failureFunction});
}
function tyCheckValidPassword(type, password, successFunction, failureFunction) {
	var issacweb_data = ty_issacweb_encrypt_object_data({type: type, password: password});
	Ext.Ajax.request({url: '/public/CheckValidPassword.jsp', params: issacweb_data, success: successFunction, failure: failureFunction});
}
function tyCheckValidAccountPassword(accountNumber, accountPassword, successFunction, failureFunction) {
	var issacweb_data = ty_issacweb_encrypt_object_data({accountNumber: accountNumber, accountPassword: accountPassword});
	Ext.Ajax.request({url: '/public/CheckValidAccountPassword.jsp', params: issacweb_data, success: successFunction, failure: failureFunction});
}
function tyCheckValidVipPassword(typeId, type, password, successFunction, failureFunction) {
	var issacweb_data = ty_issacweb_encrypt_object_data({typeId: typeId, type: type, password: password});
	Ext.Ajax.request({url: '/public/CheckValidVipPassword.jsp', params: issacweb_data, success: successFunction, failure: failureFunction});
}
function tyLoginPrc(loginId, loginPassword, successFunction, failureFunction) {
	var issacweb_data = ty_issacweb_encrypt_object_data({loginId: loginId, loginPassword: loginPassword});
	Ext.Ajax.request({url: '/public/LoginPrc.jsp', params: issacweb_data, success: successFunction, failure: failureFunction});
}
function tyCheckTransferPassword(accountNumber, accountPassword, transferPassword, successFunction, failureFunction) {
	var issacweb_data = ty_issacweb_encrypt_object_data({accountNumber: accountNumber, accountPassword: accountPassword, transferPassword: transferPassword});
	Ext.Ajax.request({url: '/public/CheckTransferPassword.jsp', params: issacweb_data, success: successFunction, failure: failureFunction});
}

// for VCSC and PSI
function tyAfterLogin(url, res) {
	if(url == null) url = '/index.jsp';
	url = '/order/OrderMain.jsp?t04=4';
	if(res.otpCheck == true) { window.location.href = tyUrlDummy(url); return; }
	var s = res.otpStatus;
	var k = toNumber(res.otpIndex);
	if(res.blockCode == TY_USERINFO_BLOCKCODE.CHANGE_PASSWORD) {
		tyAlert(tyMsgText('msg.YouMustChangePasswordForUsingService'));
		changeHTSPwd();
		tyToChangePassword();
	}
	var e1 = 0;
	var m1 = '';
	if ( s == 'Y' && k > 0 ) { e1 = 0; m1 = ''; }
	else if ( s == 'P' ) { e1 = 1; m1 = tyMsgText('msg.OTP.MsgBox.Notice.P'); }
	else if ( s == 'X' ) { e1 = 1; m1 = tyMsgText('msg.OTP.MsgBox.Notice.X'); }
	else if ( s == 'N' ) { e1 = 1; m1 = tyMsgText('msg.OTP.MsgBox.Notice.N'); }
	else { e1 = 1; m1 = tyMsgText('msg.OTP.MsgBox.Notice.U'); }
	if(e1==0) {
		var r = '/otp/Otp.jsp?returnUrl='+escape(url);
		window.location.href = tyUrlDummy(r);
	} else {
		var cf = confirm(m1 + '\n' + tyMsgText('msg.OTP.onlyQuotation'));
		if(cf==true)
			window.location.href = tyUrlDummy('/index.jsp');
		else
			window.location.href = tyUrlDummy('/public/Logout.jsp');
	}
}

function tyOpenStockBoard(code) {
    if(isBlank(code)) code = '';
	var objWin = new Object();
	var height = code=='UPCOM' ? 768 : 768;
	objWin[code] = window.open(tyUrlDummy('/quotation/StockBoard.jsp?code=' + code), 'TYStockBoard_' + code, 'width=1024, height=' + height + ', toolbar=no, status=yes, directories=no, scrollbars=no, location=no, resizable=yes, menubar=no');
	objWin[code].focus();
}

function tyOpenQnACenter() {
       var objWin = window.open(tyUrlDummy('http://qna.hbse.com.vn'), 'TYQnACenter', 'width=600, height=470, toolbar=no, status=yes, directories=no, scrollbars=no, location=no, resizable=yes, menubar=no');
       objWin.focus();
}

var WIN_TY_OPEN_CHART = null;
function tyOpenChart(response) {
	if(response==null) {
		Ext.Ajax.request({url: '/public/CheckLogin.jsp', success: tyOpenChart, failure: function(){} });
		return;
	}
	var txt = response.responseText;
	var res = tyJSON_decode(txt);
	tySetIsLogin(res.res);
	if(res.res==false) { tyToLogin(); return; }

	if(WIN_TY_OPEN_CHART) WIN_TY_OPEN_CHART.close();
	WIN_TY_OPEN_CHART = tyFindTopWin().open(tyUrlDummy('/chart/TWebChart.jsp'),'WIN_TY_OPEN_CHART','width=820,height=528');
	WIN_TY_OPEN_CHART.focus();
}
function tyChangeLang(lang) { var obj = tyFindTopWin(); obj.window.location.href = '/public/ChangeLang.jsp?lang='+lang+'&clru='+escape(tyMenuUrl()); if(tyIsOpenWin()) self.close(); }

function tyTabChange(tab_id, tab_index) {
	if(tab_index==null) tab_index = tyTabIndex(tab_id);
	var es = null;
	try { es  = tab_id.getElementsByTagName('li'); } catch(e) { }
	if(es==null || es.length<1) return;
	for(var i=0; i<es.length; i++) { es[i].className = tab_index==i ? 'currentB' : ''; }
}

function tyTabIndex(tab_id) {
	var es = tab_id.getElementsByTagName('li');
	if(es==null || es.length<1) return 0;
	for(var i=0; i<es.length; i++) { if(es[i].className=='currentB') return i; }
	return 0;
}

var TY_WIN_MYMENU = null;
function tyPopMyMenu() {
	if(TY_WIN_MYMENU) TY_WIN_MYMENU.close();
	TY_WIN_MYMENU = window.open(tyUrlDummy('/public/SetMyMenu.jsp'),'tyWIN_MYMENU', 'width=400, height=500, resizable=1');
	TY_WIN_MYMENU.focus();
}

var tyAjaxOn = false;
function tyCheckAjaxOn(msg) {
	if(tyAjaxOn == true) { if(msg) tyAlert(msg); return true; }
	return !(tyAjaxOn = true);
}

function tyCheckAjaxOff(msg) {
	if(msg) tyAlert(msg);
	return !(tyAjaxOn = false);
}

function tyMakeParametersDataByForm(form) {
	if(form==null) return; '';
	var es = form.elements;
	if(es==null || es.length<1) return '';
	var data = [];
	for(var i=0; i<es.length; i++) {
		var e = es[i];
		if(e.disabled==true) continue;
		if((e.type=='checkbox' || e.type=='radio') && e.checked==false) continue;
		data.push(escape(e.name) + '=' + escape(e.value));
	}
	return data.join('&amp;');
}
var isResizeRun = false;
function tyResizeParentIframe(parent_frame_id, minHeight, addHeight) {
	if(!parent) return;
	var frame = parent.document.getElementById(parent_frame_id);
	if(!frame) return;
	while(isResizeRun);
	isResiezeRun = true;
	try {
		var height = document.body.scrollHeight * 1;
		if(minHeight>height) height = minHeight;
		if(addHeight>0) height = (height * 1) + (1 * addHeight);
		frame.setAttribute('height', height);
	} catch(e) { } finally { isResiezeRun = false; }
}

function tySetCurrentSymbol(symbol) {
	var sym = getSymbol(symbol);
	if(sym == null) return;
	if(upcom3_on || sym.isHH()) { Cookies.set('tSymbol', symbol); if(sym.isMrgn()) Cookies.set('mSymbol', symbol); }
	else if(sym.isUpcom()) { Cookies.set('uSymbol', symbol); }
}

function tyTrColorOn(obj, color) { tyTrColor(obj, color ? color : '#dfdfdf'); }
function tyTrColorOff(obj, color) { tyTrColor(obj, color ? color : ''); }
function tyTrColor(obj, color) { if(obj==null) return; var os = obj.childNodes; for(var i=0; i<os.length; i++) os[i].style.backgroundColor = color; }
function tyTdColorOn (obj, color) { tyTdColor(obj, color ? color : '#dfdfdf'); }
function tyTdColorOff(obj, color) { tyTdColor(obj, color ? color : '#dfdfdf'); }
function tyTdColor   (obj, color) { if(obj==null) return; obj.style.cursor = 'hand'; obj.style.backgroundColor = color; if(obj.onmouseout==null) obj.onmouseout=function(){ obj.style.backgroundColor = ''; } }
function tyReadOnlyOn(obj)  { tyReadOnly(obj, true); }
function tyReadOnlyOff(obj) { tyReadOnly(obj, false); }
function tyReadOnly(obj, onoff) {
	if(!obj || !obj.tagName) return;
	var tn = obj.tagName;
	if(tn.indexOf('SELECT')==0) {
		var os = obj.options;
		var _os = obj._options_readOnly;
		if(_os==null) { _os = obj._options_readOnly = []; for(var i=0; i<os.length; i++) _os.push(os[i]); }
		if(onoff==true) {
			os.length = 0;
			for(var i=0; i<_os.length; i++) {
				if(_os[i].selected==true) {
			 		(os[os.length] = _os[i]).style.backgroundColor = '#dfdfdf';
				}
			}
		} else {
			os.length = _os.length;
			for(var i=0; i<_os.length; i++) {
				os[i] = _os[i];
				os[i].style.backgroundColor = '';
			}
		}
	} else {
		obj.readOnly = onoff;
		obj.style.backgroundColor = onoff ? '#dfdfdf' : '';
	}
}

function tyBuy(symbol) {
	tyFindTopWin().window.location.href = tyUrlDummy('/order/OrderMain.jsp?symbol='+symbol+'&amp;t01=0');
}

function tySell(symbol) {
	tyFindTopWin().window.location.href = tyUrlDummy('/order/OrderMain.jsp?symbol='+symbol+'&amp;t01=1');
}

function tyCorrect(symbol) {
	tyFindTopWin().window.location.href = tyUrlDummy('/order/OrderMain.jsp?symbol='+symbol+'&amp;t01=2');
}

function tyCancel(symbol) {
	tyFindTopWin().window.location.href = tyUrlDummy('/order/OrderMain.jsp?symbol='+symbol+'&amp;t01=2');
}

function tyCurrentPrice(symbol) {
	// tyFindTopWin().window.location.href = '/quotation/CurrentPrice.jsp?symbol='+symbol;
	tyGoToCurrentPrice( getSymbol(symbol) );
}

function tyCheckAttrFile(filename) {
	return true;
}

function tyWindowAutoSizeHeight(win) {
	if(win==null) win = window;
	var h = win.document.body.scrollHeight - win.document.body.clientHeight
	win.resizeBy(0, h);
}

function tyWindowAutoSize() {
	if(win==null) win = window;
	while(win.document.body.scrollWidth == win.document.body.clientWidth) win.resizeBy(-1, 0);
	var w = win.document.body.scrollWidth - win.document.body.clientWidth;
	var h = win.document.body.scrollHeight - win.document.body.clientHeight;
	win.resizeBy(w, h);
}

function tyDisplayNumberAT(symbol, price, volume, flag) {
	var t = getMarketType(symbol);
	price = numberFormat(price);
	flag = trim(flag);
	// check if it is hochimin market's sock or bond.
	if((t==1 || t==3) && toNumber(price)>0 && toNumber(volume)>0) {
		if(flag=='P') price = 'ATO';
		else if(flag=='A') price = 'ATC';
	}
	return price;
}

function tyWriteNumberAT(symbol, price, volume, flag) {
	document.write(tyDisplayNumberAT(symbol, price, volume, flag));
}

function tyIsDateStr(dateStr) {
	if(isBlank(dateStr)) return true;
	var a = dateStr.split('/');
	if(a.length!=3) return false;
	var d = new Number(a[0]);
	var m = new Number(a[1]);
	var y = new Number(a[2]);
	var date = new Date(y, m-1, d);
	return (d==date.getDate() && m==date.getMonth()+1 && y==date.getFullYear());
}

function tyParseDate(dateStr) {
	if(isBlank(dateStr)) return null;
	var a = dateStr.split('/');
	if(a.length!=3) return null;
	var d = new Number(a[0]);
	var m = new Number(a[1]);
	var y = new Number(a[2]);
	return new Date(y, m-1, d);
}

function tyFormatDate(date) {
	return date==null ? '' : date.format('d/m/Y');
}

function tyGetServerTime() {
	if(TY_SERVER_TIMESTAMP==null) TY_SERVER_TIMESTAMP = new Date().getTime();
	return new Date(TY_SERVER_TIMESTAMP);
}

function tyGetServerDate() {
	if(TY_SERVER_TIMESTAMP==null) TY_SERVER_TIMESTAMP = new Date().getTime();
	var date = new Date(TY_SERVER_TIMESTAMP);
	date.setHours(0);
	date.setMinutes(0);
	date.setSeconds(0);
	date.setMilliseconds(0);
	return date;
}

function GetObjectTop(obj) {
	if (obj.offsetParent == document.body) {
		return obj.offsetTop;
	}
	else {
		return obj.offsetTop + GetObjectTop(obj.offsetParent);
	}
}

function GetObjectLeft(obj) {
	if (obj.offsetParent == document.body) {
		return obj.offsetLeft;
	}
	else {
		return obj.offsetLeft + GetObjectLeft(obj.offsetParent);
	}
}

function tyObjectFocus(obj) {
	try { obj.focus(); return true; } catch(e) { return false; }
}

function tyObjectVisibility(obj, vs) {
	try {
		if(vs==null) return;
		var t = typeof(vs);
		if(t=='boolean' || t instanceof Boolean) obj.style.visibility = vs ? 'visible' : 'hidden';
		else if(t=='string' || t instanceof String) obj.style.visibility = vs;
	} catch(e) {
		alert(e);
	}
}

function tyMsgAlert(msg) { msg = isBlank(msg) ? '' : msg.replace(/\\r/g, '').replace(/<br>\\n?|\\n/gi, '\n'); alert(msg); }
function tyAlert(msg)    { msg = isBlank(msg) ? '' : msg.replace(/\\r/g, '').replace(/<br>\\n?|\\n/gi, '\n'); alert(msg); }
function tyMsg(code, reps) {
	try {
		var m = TY_MSG[code];
		if(m == null) { return 'Invalid Code [' + code + ']'; }
		var g = m[menuLang];
		if(g == null) { return '[' + code + '] does not supported by lang [' + menuLang + ']'; }
		return reps==null || reps.length < 1 ? g : g.replace(/\{\d+\}/g, function(m) { return reps[m.substring(1, m.length-1)]; });
	} catch(e) { return 'Unknown Message Code[' + code + ']'; }
}
function tyMsgText(code, reps) {
	var t = tyMsg(code, reps);
	if(t != null) t = t.replace(/<[^<]+>/gi, '');
	return t;
}
function tyMsgJs(code, reps) {
	var t = tyMsg(code, reps);
	if(t != null) t = t.replace(/\\r/g, '').replace(/\\n/g, '\n');
	return t;
}
function tyMsgAb(code, reps) {
	var t = tyMsg(code, reps);
	if(t != null) t = t.replace(/\\r/g, '').replace(/<br>\\n?|\\n/gi, '\n');
	return t; 		
}

function tyJSON_decode(txt) { return isBlank(txt) ? '' : Ext.util.JSON.decode(txt); }
function tyJSON_encode(obj) { return Ext.util.JSON.encode(obj); }

function tyXray(o) {
	if(o==null) return 'null';
	if(typeof o != 'object') return o.toString();
	if(o instanceof Boolean) return o.toString();
	if(o instanceof Number) return o.toString();
	if(o instanceof String) return o.toString();
	if(o instanceof Date) return o.toString();
	if(o instanceof Array) { var sa = []; for(var i=0; i<o.length; i++) sa.push( tyXray(o[i]) ); return '[' + sa.join(',\n') + ']\n'; }
	else { var sa = []; for(var k in o) sa.push( k + ':' + tyXray(o[k]) ); return '{' + sa.join(',\n') + '}\n'; }
}

function tyAddMyMenu() {
	var menuId = tyMenuId();
	if(tyCheckAjaxOn()) { alert( tyMsg('msg.AnotherProcessRunning') ); return; }
	Ext.Ajax.request({url: '/public/MyMenuList.jsp', method: 'post', params:{menuPrc: 'add', menuId: menuId},
	    success: function(response) {
		    tyCheckAjaxOff();
		    var res = tyJSON_decode(response.responseText);
			try { writeMyMenu(res.data); } catch(e) {};
		    tyAlert(res.msg);
	    },
	    failure: function(response) { tyCheckAjaxOff(tyMsg('msg.AjaxError')); }
	});
}

function tyYouMustLogin() {
	tyAlert(tyMsg('msg.YouMustLogin'));
}

var POP_STOCK_COMPANY_INFO = null;
function tyOpenStockCompanyInfo(symbol) {
	if(POP_STOCK_COMPANY_INFO) POP_STOCK_COMPANY_INFO.close();
	return;
	var u1 = 'http://www.hbse.com.vn/Stock/General.aspx?sym=' + symbol;
	var u2 = 'http://www.hbse.com.vn/Home/LangSwitch.aspx?lang=' + (menuLang == 'vn' ? 'vi' : 'en');
	POP_STOCK_COMPANY_INFO = window.open(u2, 'POP_STOCK_COMPANY_INFO', 'toolbar=0, location=0, status=0, menubar=0, scrollbars=1, resizable=1, width=1000, height=800');
	window.open(u1, 'POP_STOCK_COMPANY_INFO', '');
}

var POP_STOCK_RIGHTS = null;
function tyOpenStockRights(symbol) {
	if(POP_STOCK_RIGHTS) POP_STOCK_RIGHTS.close();
	var u1 = '/quotation/StockRights.jsp?symbol=' + symbol;
	POP_STOCK_RIGHTS = window.open(tyUrlDummy(u1), 'POP_STOCK_RIGHTS', 'toolbar=0, location=0, status=0, menubar=0, scrollbars=0, resizable=1, width=720, height=470');
}

function tyTableRowHeight(table, maxHeight, startRow, colIndex) {
	if(table == null) return;
	if(typeof(table) == 'string') table = document.getElementById(table);
	if(table == null) return;
	if(maxHeight == null) maxHeight = 32;
	if(startRow == null || startRow < 0) startRow = 0;
	if(startRow == null || startRow < 0) startRow = 0;
	if(colIndex == null || colIndex < 0) colIndex = 0;
	var rows = table.rows;
	if(rows == null) return;

	for(var i=0; i<100; i++) {
		var w = table.scrollWidth * 1;
		var max_h = 0;
		var max_r = 0;
		for(var j=startRow; j<rows.length; j++) {
			var r = rows(j);
			var cells = r.cells;
			if(cells == null) continue;
			var c = cells(colIndex);
			var h = c.clientHeight * 1;
			if(h>max_h) { max_h = h; max_r = j; }
		}
		if(max_h <= maxHeight) break;
		table.width = w + 10;
	}
}

function tyTableRowHeightBox(outbox, table, maxHeight, startRow, colIndex, add) {
	if(outbox == null || table == null) return;
	if(typeof(table) == 'string') table = document.getElementById(table);
	if(typeof(outbox) == 'string') outbox = document.getElementById(outbox);
	if(outbox == null || table == null) { return; }
	tyTableRowHeight(table, maxHeight, startRow, colIndex);
	if((add = toNumber(add)) < 20) add = 20;
	if(toNumber(outbox.style.width) < toNumber(table.offsetWidth))
		outbox.style.height = table.offsetHeight + add;
}

function tyGoToOrder(sym) {
	if(sym == null) return;
	var url = upcom3_on || sym.isHH() ? '/order/OrderMain.jsp' : ( sym.isUpcom() ? '/order/upcom/UpcomOrderMain.jsp' : null);
	if(win==null) win = tyFindTopWin();
	win.location.href = tyUrlDummy(url + '?symbol=' + sym.symbol);
}

function tyGoToCurrentPrice(sym, win) {
	if(sym == null) return;
	var url = upcom3_on || sym.isHH() ? '/quotation/CurrentPrice.jsp' : ( sym.isUpcom() ? '/quotation/upcom/UpcomCurrentPrice.jsp' : null);
	if(win==null) win = tyFindTopWin();
	win.location.href = tyUrlDummy(url + '?symbol=' + sym.symbol);
}

