
function gb() {};

var GB_EDITION = if_empty(gb_get_cookie('gb-html-edition'), new Date() > new Date(2010, 6, 18, 8, 0, 0) ? '2010' : '2009');
//var GB_EDITION = new Date() > new Date(2010, 6, 18, 8, 0, 0) ? '2011' : '2010';

GB_EDITION = '2010';

var GB_JS_MODULES = {
	'jquery': { r: 'jQuery', t: 'function', u: 'http://images.goodbaby.com/jquery/1.4.2/jquery.min.js' },
	'jqueryui': { r: 'jQuery.ui', t: 'function', u: 'http://images.goodbaby.com/jqueryui/1.8/jquery-ui.min.js' }
};

var GB_COMMON_FRAGS = {};
switch (GB_EDITION) {
    case '2011': 
        GB_COMMON_FRAGS.body_header = '/common/frags/body_header_2011.html';
        GB_COMMON_FRAGS.body_footer = '/common/frags/body_footer_2011.html';
        break;
	case '2010':
		GB_COMMON_FRAGS.body_header = '/common/frags/body_header_2010.html';
		GB_COMMON_FRAGS.body_footer = '/common/frags/body_footer_2010.html';
	    break;
	case '2009':
	default:
		GB_COMMON_FRAGS.body_header = '/common/frags/body_header.html';
		GB_COMMON_FRAGS.body_footer = '/common/frags/body_footer.html';
        break;
}

function gb_loaded(module, load_it, callback) {
	var m = GB_JS_MODULES[module];
	try {	var r = eval(m.r); } catch(ex) {}
	if (typeof r != m.t) {
		if (load_it) {
			// document.write('<scr' + 'ipt type="text/javascript" src="' + m.u + '"></scr' + 'ipt>');
			gb_load_js(m.u, callback);
		}
		else {
			throw(new Error(0, module + ' is necessary but not loaded. Recommended URL is ' + m.u));
		}
	}
	else if (typeof callback == 'function') {
		callback();
	}
};

function if_empty() {
	for (var i = 0; i < arguments.length; i++) {
		if (arguments[i]) {
			return arguments[i];
		}
	}
	return null;
};

function if_null() {
	for (var i = 0; i < arguments.length; i++) {
		if (arguments[i] != null) {
			return arguments[i];
		}
	}
	return null;
};

function gb_empty(arg) {
	switch (typeof arg)	{
		case 'boolean':
			return !arg;
		case 'undefined':
			return true;
		case 'function':
			return false;
		case 'string':
			return arg == '';
		case 'number':
			return arg == 0;
		case 'object':
			if (arg == null) {
				return true;
			}
			else if (arg instanceof Array) {
				return arg.length == 0;
			}
			else if (typeof arg.empty == 'function') {
				return arg.empty();
			}
			else {
				return false;
			}
	}
};

function gb_parent_domain(domain_name) {
	if (typeof domain_name != 'string') {
		domain_name = window.location.host;
	}
	return domain_name.replace(/^\.?[^.]{0,}\./, '');
};

function gb_tldn(domain_name, level) {
	if (typeof level == 'undefined') {
		level = 0;
	}

	var domains = ['ac', 'com', 'edu', 'gov', 'mil', 'net', 'org'];
	domains['com'] = ['cn', 'ru'];
	domains['cn'] = ['ac', 'com', 'edu', 'gov', 'mil', 'net', 'org', 'ah', 'bj', 'cq', 'fj', 'gd', 'gs', 'gx', 'gz', 'ha', 'hb', 'he', 'hi', 'hk', 'hl', 'hn', 'jl', 'js', 'jx', 'ln', 'mo', 'nm', 'nx', 'qh', 'sc', 'sd', 'sh', 'sn', 'sx', 'tj', 'tw', 'xj', 'xz', 'yn', 'zj'];

	if (typeof domain_name != 'string') {
		domain_name = window.location.host;
	}

	var part = domain_name.split('.').reverse();
	var domain = domains;
	var i = 0;
	while (1) {
		var p = part[i];
		if (domain[p] instanceof Array) {
			domain = domain[p];
			i++;
			continue;
		}
		for (var j = 0; j < domain.length; j++) {
			if (p == domain[j]) {
				i++;
				break;
			}
		}
		break;
	}
	var tldn = part[0];
	for (var j = 1; j <= i + level; j++) {
		tldn = part[j] + '.' + tldn;
	}

	return tldn;
};

var _gat = null;

function gb_gat_id() {
	var gat_ids = {
		'goodbaby.com': 'UA-3253201-1',
		'mamasgoodbaby.com': 'UA-3253201-2',
		'hshongfuyou.com': 'UA-3253201-3',
		'mama626.com': 'UA-3253201-4',
		'goodbabystore.com': 'UA-25621280-1',
		'silvercrosschina.com.cn': 'UA-3253201-7',
		'silvercrosschina.com': 'UA-3253201-7',
		'haohaizi.com':'UA-25621280-2'
	};
	var tldn = gb_tldn();
	var id = gat_ids[tldn];
	return id;
};

function gb_gat_onload() {
	if (!_gat) {
		window.setTimeout(gb_gat_onload, 1000);
		return;
	}
	var pageTracker = _gat._getTracker(gb_gat_id());
	pageTracker._setDomainName('.' + gb_tldn());
	pageTracker._trackPageview();
};

var g_gb_tigger_ga_runtimes = 0;
function gb_trigger_ga(host, gat_onload) {
	g_gb_tigger_ga_runtimes++;
	if (typeof host != 'string' || host == window.location.host) {
		if (typeof gat_onload != 'function') {
			gat_onload = gb_gat_onload;
		}
		if (_gat) {
			gat_onload();
		}
		else {
			var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
			gb_load_js(gaJsHost + 'google-analytics.com/ga.js', gat_onload);
		}
	}
	else {
		//gb_trigger_ga_crossdomain(host);
	}
};

function gb_trigger_ga_crossdomain(host) {
	if (gb_browser.name == 'ie' && document.readyState != 'complete') {
	 	window.setTimeout(function() { gb_trigger_ga_crossdomain(host); }, 1000);
		return;
	}
	var iframe = document.createElement('iframe');
    if(host == 'im.goodbaby.com') host = 'www.goodbaby.com';
	iframe.src = 'http://' + host + '/common/ga.html';
	iframe.style.display = 'none';
	document.body.appendChild(iframe);
};

var GB_CHARSET_GBK = 1;
var GB_CHARSET_UTF8 = 2;
var gb_doc = {};
gb_doc.charset = function() {
	var charset_name = 'utf-8';
	switch (gb_browser.name) {
		case 'firefox':
			charset_name = document.characterSet;
			break;
		case 'ie':
		default:
			charset_name = document.charset;
			break;
	}
	var charset;
	switch (charset_name) {
		case 'gb2312':
		case 'x-gbk':
			charset = GB_CHARSET_GBK;
			break;
		case 'UTF-8':
		case 'utf-8':
		default:
			charset = GB_CHARSET_UTF8;
			break;
	}
	return charset;
};

// @todo
var gb_body = document.documentElement ? document.documentElement : document.body;

var gb_browser = { 'name': 'unknown', 'version': 'unknown' };
if (window.ActiveXObject) {
	gb_browser.name = 'ie';
	if (window.navigator.appVersion.match(/\sMSIE\s([^;]+);/)) {
		gb_browser.version = RegExp.$1;
	}
}
else if (navigator.appName == "Netscape") {
	gb_browser.name = 'firefox';
}
else if (navigator.userAgent.indexOf("Opera") >= 0) {
	gb_browser.name = 'opera';
}

if (gb_browser.name == 'ie') { /*@cc_on
	function XMLHttpRequest() {
		var arrSignatures = [
			"Microsoft.XMLHTTP",
			"MSXML2.XMLHTTP"];
		for (var i = 0; i < arrSignatures.length; i++) {
			try {
				return new ActiveXObject(arrSignatures[i]);
			}
			catch (ex) {
			}
		}
		throw new Error("MSXMLHttpRequest not found.");
	}
@*/ }

function gb_scroll_top() {
	var body = document.documentElement ? document.documentElement : document.body;
	return body.scrollTop;
};

function gb_scroll_left() {
	var body = document.documentElement ? document.documentElement : document.body;
	return body.scrollLeft;
};

function gb_scroll_height() {
	var body = document.documentElement ? document.documentElement : document.body;
	return body.scrollHeight;
};

function gb_scroll_width() {
	var body = document.documentElement ? document.documentElement : document.body;
	return body.scrollWdith;
};

function gb_client_height() {
	var body = document.documentElement ? document.documentElement : document.body;
	return body.clientHeight;
};

function gb_client_width() {
	var body = document.documentElement ? document.documentElement : document.body;
	return body.clientWidth;
};

function gb_get_elements_by_name(name, node, elements) {
	if (!node) { node = document.body; }
	if (!elements) { var elements = []; }
	var nodes = node.childNodes;
	for (var i = 0; i < nodes.length; i++) {
		if (gb_get_attribute(nodes[i], 'name') == name) {
			elements.push(nodes[i]);
		}
		gb_get_elements_by_name(name, nodes[i], elements);
	}
	return elements;
};

function gb_get_elements_by_tagname(tagname, node, elements) {
	tagname = tagname.toLowerCase();
	if (!node) { node = document.body; }
	if (!elements) { var elements = []; }
	var nodes = node.childNodes;
	for (var i = 0; i < nodes.length; i++) {
		try {
			if (nodes[i].tagName.toLowerCase() == tagname) {
				elements.push(nodes[i]);
			}
		} catch (ex) {}
		gb_get_elements_by_tagname(tagname, nodes[i], elements);
	}
	return elements;
};

function gb_get_element_by_name(name, node) {
	var elements = gb_get_elements_by_name(name, node);
	return elements[0];
};

function gb_get_parent_element_by_name(name, node) {
	while (node && gb_get_attribute(node, 'name') != name) {
		node = node.parentNode;
	}
	return node;
};

function gb_get_parent_element_by_tagname(tagname, node) {
	tagname = tagname.toLowerCase();
	while (node && node.tagName.toLowerCase() != tagname) {
		node = node.parentNode;
	}
	return node;
};

function gb_set_attribute(element, name, value) {
	var item = element.attributes.getNamedItem(name);
	if (item) {
		item.value = value;
	}
	else {
		var ua_try = true;
		if (ua_try) {
			try {
				item = document.createAttribute(name);
				item.value = value;
				element.attributes.setNamedItem(item);
				ua_try = false;
			} catch (ex) { }
		}
		if (ua_try) {
			try {
				item = element.createAttribute(name);
				item.value = value;
				ua_try = false;
			} catch (ex) { }
		}
	}
};

function gb_get_attribute(element, name) {
	var item = element.attributes ? element.attributes.getNamedItem(name) : null;
	return item ? item.value : null;
};

function gb_get_innertext(element) {
	var text;
	if (typeof element.innerText != 'undefined') {	// ie
		text = element.innerText;
	}
	else if (typeof element.textContent != 'undefined') {	// firefox
		text = element.textContent;
	}
	return text;
};

function gb_set_innertext(element, text) {
	if (typeof element.innerText != 'undefined') {	// ie
		element.innerText = text;
	}
	else if (typeof element.textContent != 'undefined') {	// firefox
		element.textContent = text;
	}
};

function gb_iterate(arr, func) {
	for (var i = 0; i < arr.length; i++) {
		func(arr[i]);
	}
};

function gb_in_array(item, arr) {
	var exists = false;
	for (var i = 0; i < arr.length; i++) {
		if (item == arr[i]) {
			exists = true;
			break;
		}
	}
	return exists;
};

function gb_array_purge(item, arr) {
	for (var i = 0, j = 0; i < arr.length; i++) {
		if (arr[i] == item) {
			continue;
		}
		if (j != i) {
			arr[j] = arr[i];
		}
		j++;
	}
	for (; i > j; i--) {
		arr.pop();
	}
	return arr;
};

function gb_get_copy() {
	return window.clipboardData.getData('Text');
};

function gb_set_copy(data) {
	window.clipboardData.setData('Text', data);
};

function gb_request(src) {
	var xhr = new XMLHttpRequest();
	xhr.open('GET', src, false);
	xhr.send();
	return xhr.responseText;
};

function gb_get_cookie(name) {
	var cookies = [];
	var cookie = document.cookie;
	var i = 0;
	while (i >= 0 && i < cookie.length) {
		j = cookie.indexOf("=", i);
		if (j < 0) { break; }
		var n = cookie.substring(i, j);
		i = cookie.indexOf(";", j);
		j++;
		if (i > 0) {
			var value = cookie.substring(j, i);
			i += 2;
		}
		else {
			var value = cookie.substr(j);
		}
		cookies[n] = value;
	}
	return cookies[name];
};

function gb_unset_cookie(name) {
	gb_set_cookie({ name: name, value: 'nn', expires: new Date() });
};

function gb_set_cookie(params) {
	if (arguments.length == 2) {
		params = { name: arguments[0], value: arguments[1] };
	}
	var s = params.name + '=' + escape(params.value);
	if (params.expires) {
		 s += '; expires=' + params.expires.toGMTString();
	}

	if (params.domain) {
		s += '; domain=' + params.domain;
	}

	if (params.path) {
		s += '; path=' + params.path;
	}
	else {
		s += '; path=/';
	}

	document.cookie = s;
};

function gb_load_js(src, callback) {
	if (src instanceof Array) {
		if (src.length == 1) {
			src = src[0];
		}
		else {
			var $closure_src = src;
			var $closure_callback = callback;
			src = $closure_src.shift();
			callback = function() {
					gb_load_js($closure_src, $closure_callback);
				};
		}
	}

	var charset = 'utf-8';
	if (typeof src == 'object') {
		charset = src.charset;
		src = src.src;
	}

	var script = document.createElement('script');
	script.type = 'text/javascript';
	script.charset = charset;
	script.defer = 'true';
	if (callback) {
		script.onload = script.onreadystatechange = function() {
				if (typeof this.readyState == 'undefined' || this.readyState == 'complete' || this.readyState == 'loaded') {
					this.onload = this.onreadystatechange = null;
					callback();
				}
			};
	}
	script.src = src;
	document.getElementsByTagName('head')[0].appendChild(script);
};

function gb_exec_js(src) {
	document.write('<scr' + 'ipt type="text/javascript" src="' + src + '" charset="utf-8"></scr' + 'ipt>');
};

function gb_load_css(src) {
	var link = document.createElement('link');
	link.rel = 'stylesheet';
	link.type = 'text/css';
	link.href = src;
	document.getElementsByTagName('head')[0].appendChild(link);
};

function gb_parse_url(url) {
	if (!url) { url = window.location.href; }
	var re = /^\s*(\w+):\/\/([^\/:]+)(:(\d+))?([^?#]*)?(\?([^#]*))?(#(.*))?\s*$/;
	var info = null;
	if (re.exec(url)) {
		info = {
			protocal : RegExp.$1,
			host     : RegExp.$2.concat(RegExp.$3),
			hostname : RegExp.$2,
			port     : RegExp.$4,
			pathname : RegExp.$5,
			search   : RegExp.$7,
			hash     : RegExp.$9
			};
	}
	else {
		re = /^([^?#]*)?(\?([^#]*))?(#(.*))?$/;
		if (re.exec(url)) {
			info = {
				protocal : gb_rtrim(window.location.protocol, ':'),
				host     : window.location.host,
				hostname : window.location.hostname,
				port     : window.location.port,
				pathname : RegExp.$1,
				search   : RegExp.$3,
				hash     : RegExp.$5
				};
		}
	}
	return info;
};

function gb_parse_str(str, decode) {
	var params = [];
	if (str && str != "") {
		var evaluations = str.split("&");
		for (var i = 0; i < evaluations.length; i++) {
			var a = evaluations[i].split("=");
			params[a[0]] = decode ? decodeURI(a[1]) : a[1];
		}
	}
	return params;
};

function gb_cut_words(str) {
	var words = [];
	var i = 0, j = -1;
	var b = !(str.charCodeAt(0) < 256);
	while (i < str.length) {
		if (b != str.charCodeAt(i) < 256) {
			j++;
			words[j] = '';
			b = !b;
		}
		words[j] += str.charAt(i);
		i++;
	}
	return words;
};

function gb_get_search(name, url) {
	var search;
	if (!url) {
		search = window.location.search;
	}
	else {
		search = gb_parse_url(url)['search'];
	}
	return gb_parse_str(search)[name];
};

function gb_post(action, params) {
	var form = document.createElement('form');
	for (var p in params) {
		alert(p);
	}
};

var gb_sso_account = undefined;
function gb_sso_decrypt() {
	if (typeof gb_sso_account != 'undefined') {
		return gb_sso_account;
	}

	var account = null;
	var c = gb_get_cookie('NickNameForShow');
	if (c) {
		c = c.split('%3a');
		var is_member = (gb_get_cookie('memberornot') == '1');
		account = {
			'username': unescape(c[0]),
			'crmuserid': c[1],
			'is_member': is_member
			};
		if (typeof Base64 != 'undefined') {
			var gbuser = gb_get_cookie('gbuser');
			gbuser = Base64.decode(gb_rptrim(gbuser.substr(32), '%3D'));
			if (gbuser.match(/^(\d+):(\d+):(.+)$/)) {
				account.gbuserid = RegExp.$2;
			}
		}
		gb_sso_account = account;
	}
	return account;
};

function gb_sso_url_logout() {
	return 'http://sso.' + gb_tldn() + '/logout/logoutLog.action';
};

function gb_sso_url_login() {
	return 'http://sso.' + gb_tldn() + '/login.jsp?lastUrl=' + encodeURIComponent(window.location.href);
};

function gb_sso_url_reg() {
	return 'http://sso.' + gb_tldn() + '/register/commonRegisterNew.action';
};

function gb_mypage(app, module, params) {
	var p = [];
	switch (gb_tldn(window.location.host, 1)) {
		case 'club.goodbaby.com':
			p.goodbabyflag = 0;
			break;
		case 'store.goodbaby.com':
			p.goodbabyflag = 2;
			break;
		default:
			p.goodbabyflag = 1;
	}

	var pages = {
		'gold'        : 'http://community.goodbaby.com/membermark',
		'crm'         : 'http://crm.' + gb_tldn() + '/good/customer/editWelcome.action?goodbabyflag=' + p.goodbabyflag,
		'crm/active'  : 'http://sso.' + gb_tldn() + '/effectclub/active_step1.jsp',
		'crm/coupon'  : 'http://crm.mamabb.com/shop/customer/listMyCoupon.action',
		'crm/join'    : 'http://crm.' + gb_tldn() + '/good/customer/editBabyInfo.action',
		'crm/favorite' : 'http://crm.goodbaby.com/good/customer/listMyGoodsInFavorite.action',
		'my/message'  : 'http://my.goodbaby.com/space.php?do=message'
		};

	if (typeof module == 'undefined') {
		module = 'default';
	}
	if (app == 'crm' && module == 'fillMemberInfo') {	// 'fillMemberInfo' is deprecated.
		module = 'active';
	}

	var url = pages[app + '/' + module];
	if (typeof url == 'undefined') {
		url = pages[app];
	}
	if (params) {
		url = gb_append_gets(url, params);
	}
	return url;
};

function gb_userpage(params) {
	username  = params['username'];
	crmuserid = params['crmuserid'];
	gbuserid  = params['gbuserid'];

	switch (params['app']) {
		case 'album':
			return 'http://album.goodbaby.com/album/album_all.php?uid=' + gbuserid;
		case 'bbs':
			return 'http://community.goodbaby.com/viewpro.php?uid=' + gbuserid;
		case 'blog':
			return 'http://blog.goodbaby.com/~' + username;
		default:
			if (gbuserid) {
				return 'http://my.goodbaby.com/space.php?gbuid=' + gbuserid;
			}
			else if (crmuserid) {
				return 'http://my.goodbaby.com/space.php?uid=' + crmuserid;
			}
	}
};

function gb_search_channel_id() {
	var host = gb_parse_url()['host'];
	var channel = null;
	switch (host) {
		case 'www.mamasgoodbaby.com' : channel =  0; break;
		case 'www.goodbaby.com'      : channel =  1; break;
		case 'wiki.goodbaby.com'     : channel =  2; break;
		case 'community.goodbaby.com': channel =  3; break;
		case 'blog.goodbaby.com'     : channel =  4; break;
		case 'ask.goodbaby.com'      : channel =  8; break;
		case 'nanny.goodbaby.com'    : channel = 11; break;
		case 'tutor.goodbaby.com'    : channel = 13; break;
		case 'download.goodbaby.com' : channel = 14; break;
	}
	return channel;
};

var GB_WINDOW_FUNCS_ONRESIZE = [];
function gb_window_onresize(func) {
	GB_WINDOW_FUNCS_ONRESIZE.push(func);
	window.onresize = function() {
		for (var i = 0; i < GB_WINDOW_FUNCS_ONRESIZE.length; i++) {
			GB_WINDOW_FUNCS_ONRESIZE[i]();
		}
	};
};

var GB_WINDOW_FUNCS_ONRSCROLL = [];
function gb_window_onscroll(func) {
	GB_WINDOW_FUNCS_ONRSCROLL.push(func);
	window.onscroll = function() {
		for (var i = 0; i < GB_WINDOW_FUNCS_ONRSCROLL.length; i++) {
			GB_WINDOW_FUNCS_ONRSCROLL[i]();
		}
	};
};

function gb_append_gets(url, params) {
	var info = gb_parse_url(url);
	for (var i in params) {
		info.search += '&' + i + '=' + encodeURIComponent(params[i]);
	}
	info.search = gb_ltrim(info.search, '&');
	return gb_combine_url(info);
};

function gb_replace_gets(url, params) {
	var info = gb_parse_url(url);
	var gets = [];
	var rawgets = [];
	if (!gb_empty(info.search)) {
		info.search.split('&');
	}
	for (var i = 0; i < rawgets.length; i++) {
		var a = rawgets[i].split('=');
		gets[a[0]] = decodeURIComponent(a[1]);
	}
	params = gb_array_merge(gets, params);
	info.search = '';
	for (var i in params) {
		info.search += '&' + i + '=' + encodeURIComponent(params[i]);
	}
	info.search = gb_ltrim(info.search, '&');
	return gb_combine_url(info);
}

function gb_combine_url(info) {
	var url = info.protocal + '://' + info.host;
	if (info.port) {
		url += ':' + info.port;
	}
	url += info.pathname;
	if (info.search) {
		url += '?' + info.search;
	}
	if (info.hash) {
		url += '#' + info.hash;
	}
	return url;
};

var GB_API_DATA_INDEX = 0;
function gb_api_data(src, callback) {
	if (typeof src == 'string') {
		src = { src: src };
	}
	var varname = '_api_data_' + GB_API_DATA_INDEX++;
	src.src = gb_append_gets(src.src, { '_api_data_varname': varname });
	var callback_wrap = function() {
		var t = eval('typeof ' + varname); 
		if (t == 'undefined') {
			callback();
		}
		else {
			callback(eval(varname));
		}
	}
	gb_load_js(src, callback_wrap);
};

function gb_api(name) {
	var params = [], callback = function(){};

	if (typeof arguments[1] != 'function') {
		params = arguments[1];
	}

	if (typeof arguments[1] == 'function') {
		callback = arguments[1];
	}
	else if (typeof arguments[2] == 'function') {
		callback = arguments[2];
	}

	gb_loaded('jquery', 1);
	jQuery.getJSON('/common/api/index.php?_api_name=' + name + '&' + new Date().getTime(), params, callback);
};

function gb_ltrim(str, chars) {
	if (typeof chars == 'undefined') {
		chars = ' 	';
	}
	var c = str.charAt(0);
	while (c && chars.indexOf(c) >= 0) {
		str = str.substr(1);
		c = str.charAt(0);
	}
	return str;
};

function gb_rtrim(str, chars) {
	if (typeof chars == 'undefined') {
		chars = ' 	';
	}
	var e = str.length - 1;
	while (e >= 0 && chars.indexOf(str.charAt(e)) >= 0) {
		str = str.substr(0, e);
		e--;
	}
	return str;
};

function gb_trim(str, chars) {
	str = gb_ltrim(str, chars);
	str = gb_rtrim(str, chars);
	return str;
};

function gb_lptrim(str, piece) {
	if (typeof piece == 'object') {
		do {
			var redo = false;
			for (var i in piece) {
				var new_str = gb_lptrim(str, piece[i]);
				if (str != new_str) {
					str = new_str;
					redo = true;
					break;
				}
			}
		} while (redo);
		return str;
	}

	var n = piece.length, m = str.length;
	while (m >= n && str.substr(0, n) == piece) {
		m -= n;
		str = str.substr(n);
	}
	return str;
};

function gb_rptrim(str, piece) {
	if (typeof piece == 'object') {
		do {
			var redo = false;
			for (var i in piece) {
				var new_str = gb_rptrim(str, piece[i]);
				if (str != new_str) {
					str = new_str;
					redo = true;
					break;
				}
			}
		} while (redo);
		return str;
	}

	var n = piece.length, m = str.length;
	while (m >= n && str.substr(m - n, n) == piece) {
		m -= n;
		str = str.substr(0, m);
	}
	return str;
};

function gb_ptrim(str, piece) {
	str = gb_lptrim(str, chars);
	str = gb_rptrim(str, chars);
	return str;
};

function gb_form_init(selector, callback_onprompt) {
	gb_loaded('jquery', 1);
	gb_loaded('jqueryui', 1);
	var form = jQuery(selector);

	form.submit(function() {
		var c = jQuery(this);
		var errcode = null;
		c.find('[define]').each(function() {
			if (errcode) { return; }
			if (!gb_form_item_validate(jQuery(this), callback_onprompt)) {
				errcode = 'error';
			}
		});
		c.find("[define*='NOT NULL'],[define*='NOT EMPTY']").each(function() {
			if (errcode) { return; }

			var item = jQuery(this);
			if (item.attr('disabled')) { return; }

			item.attr('define').match(/NOT (NULL|EMPTY)/);
			var req = RegExp.$1;
			var datatype = item.attr('define').replace(/[^a-z].+$/, '');
			var tagname = item.attr('tagName').toLowerCase();
			var type = item.attr('type').toLowerCase();

			if ((tagname == 'input' && gb_in_array(type, ['text', 'file']))
				|| tagname == 'select'
				|| tagname == 'textarea') {
				var v = item.val();
				if (req == 'NULL' && v == '') {
					errcode = 'null';
				}
				else if (req == 'EMPTY') {
					if ((datatype == 'int' && parseInt(v) == 0)
						|| gb_trim(v) == '') {
						errcode = 'empty';
					}
				}
			}

			if (tagname == 'input' && (type == 'checkbox' || type == 'radio')) {
				var sisters = form.find("[name='" + item.attr('name') + "']");
				var checked = false;
				for (var i = 0; i < sisters.length; i++) {
					if (jQuery(sisters[i]).attr('checked')) { checked = true; break; }
				}
				if (!checked) {
					errcode = 'null';
				}
			}

			if (errcode) {
				if (typeof callback_onprompt == 'function') {
					callback_onprompt(item, errcode);
				}
				else {
					alert('CONTENT NEEDED');
					item.get(0).select();
				}
			}
		});
		if (errcode) {
			jQuery(this).attr('nosubmit', 'true');
			return false;
		}
		else {
			jQuery(this).attr('nosubmit', 'false');
			return true;
		}
	});

	var items = form.find('[define]');
	items.each(function() {
		var item = jQuery(this);
		var define = gb_column_define(item.attr('define'));
		if (define.type == 'int.datetime') {
			item.datepicker({
				changeMonth: true,
				changeYear: true
			});
		}
	});
	items.change(function() {
		gb_form_item_validate(jQuery(this), callback_onprompt);
	});
};

function gb_column_define(define) {
	var info = [];
	if (typeof define == 'string') {
		items = define.split(/\s+/);
		var not = false;
		for (var i = 0; i < items.length; i++) {
			var item = items[i];
			if (i == 0) {
				info.type = item;
			}
			if (item == 'NOT' || item == 'NO') {
				not = true;
				continue;
			}
			switch (item.toLowerCase()) {
				case 'NULL':
					info.notnull = !not;
			}
		}
	}

	if (gb_empty(info.type)) {
		info.type = 'string';
	}

	return info;
};

function gb_form_item_validate(item, callback_onprompt) {
	var v = item.val();
	if (gb_empty(v)) { return true; }
	var define = gb_column_define(item.attr('define'));
	var errcode = '', message = null, datatype = define.type;
	switch (datatype) {
		case 'postcode':
		case 'mobile':
		case 'email':
		case 'int':
			if (!gb_is(v, datatype)) {
				errcode = 'error';
			}
			break;
	}
	if (errcode) {
		if (typeof callback_onprompt == 'function') {
			callback_onprompt(item, errcode);
		}
		else {
			alert('ERROR INPUT');
			item.get(0).select();
		}
		return false;
	}
	return true;
};

function gb_is(s, datatype) {
	var f = eval('gb_is_' + datatype);
	if (typeof f == 'function') {
		return f(s);
	}
	return undefined;
};

function gb_is_int(v) {
	return v.match(/^[+-]?\d+$/);
};

function gb_parse_int(v) {
	if (typeof v == 'string' && v.match(/^\d{1,3}(,\d{3})+$/)) {
		v = parseInt(v.replace(',', ''));
	}
	else {
		v = parseInt(v);
	}
	return v;
};

function gb_is_postcode(v) {
	if (arguments.length == 0) { return '20000'; }
	return v.match(/^[1-9]\d{5}$/);
};

function gb_is_mobile(v) {
	if (arguments.length == 0) { return '13912345678'; }
	return v.match(/^1[3589]\d{9}$/);
};

function gb_is_email(v) {
	if (arguments.length == 0) { return 'username@example.com'; }
	return v.toLowerCase().match(/^[a-z0-9._\-]+@[a-z0-9_\-]+(\.[a-z0-9_\-]+)+$/);
};

function gb_array_merge(a, b) {
	var c = [];
	for (var i in a) {
		c[i] = a[i];
	}
	for (var i in b) {
		if (typeof i == 'number' || i.match(/^\d+$/)) {
			c.push(b[i]);
		}
		else {
			c[i] = b[i];
		}
	}
	return c;
};

function gb_seo_url(url, callback) {
	gb_loaded('jquery', 1);
	var xhr = jQuery.ajax({
		async: false,
		type: 'POST',
		url: '/common/ajax/seo_url.php',
		data: { url: url }
		});

	return xhr.responseText;
};


function gb_avatar(params) {
	var size = params.size ? params.size : 'middle';
	var url = 'http://my.goodbaby.com/ucenter/avatar.php?size=' + size;
	if (params.gbuserid ) {
		url += '&gbuid=' + params.gbuserid;
	}
	else if (params.crmuserid) {
		url += '&uid=' + params.crmuserid;
	}
	return url;
};

function gb_date(format, timestamp) {
	var date = new Date();
	if (timestamp) {
		date.setTime(timestamp * 1000);
	}
	var str = format;
	var Y = date.getYear();
	var m = date.getMonth() + 1;
	var d = date.getDate();
	var H = date.getHours();
	var i = date.getMinutes();
	var s = date.getSeconds();
	str = str.replace("Y", Y);
	str = str.replace("m", m >= 10 ? m : "0" +  m);
	str = str.replace("d", d >= 10 ? d : "0" +  d);
	str = str.replace("H", H >= 10 ? H : "0" +  H);
	str = str.replace("i", i >= 10 ? i : "0" +  i);
	str = str.replace("s", s >= 10 ? s : "0" +  s);
	return str;
};

function gb_post(url, data) {
	var form = jQuery('<form action="' + url + '" method="POST"></form>');
	for (var i in data) {
		var input = jQuery('<input type="hidden" name="' + i + '" value="' + data[i] + '"/>');
		form.append(input);
	}
	jQuery('body').append(form);
	form.submit();
};

