// Creating Namespace
var Common = {
	// Page constants.
	DEBUG_MODE: true,
	initialize: function() {
	}
};
Common.initialize();

// Creating Module
Common.Utils = (function()  {
	// Private members.

	return { // Public members.
		log: function(msg, doTransform) {
			if (Common.DEBUG_MODE && window.console != null) {
				if (doTransform) {
					msg = this.tostr(msg);
				}
				console.log(msg);
			}
		},
		tostr: function(data, showLevels, options) {
			if (showLevels == null) {
				showLevels = 2;
			}
			return DWRUtil.toDescriptiveString(data, showLevels, options);
		}
	};
})();

var regNowFormat = /^[a-zA-Z0-9_-]{5,}$/;

var accountFormat = /^[a-zA-Z0-9._-]{6,12}$/;

var passwordFormat = /^[a-zA-Z0-9]{6,12}$/;

var emailFormat = new RegExp('^[a-zA-Z0-9]*[\\w\\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\\w\\.-]*\\.[a-zA-Z][a-zA-Z\\.]*[a-zA-Z]$');

var captchaFormat = /^[a-zA-Z0-9]{4}$/;

var versionFormat = new RegExp('^[0-9]+(\\.[0-9]+)+$');

var birthdayFormat =/^(19|20)\d\d([-])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$/;

var validateFormat = function(regex, source){
	return regex.test(source);
};

var trim = function(str, chars) {
	return ltrim(rtrim(str, chars), chars);
};

var ltrim = function(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
};

var rtrim = function(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
};

var getMessage = function(key, lang) {
	var fullKey = key + '_' + lang;
	try {
		var message = eval(fullKey);
		alert(message);
	} catch (e) {
		alert('?' + fullKey);
	}
};

var loadCaptcha = function(){
	var now = new Date();
	var captchaImage = DWRUtil.byId('captchaImage');

	if (captchaImage == null) {
		captchaImage = new Image();
		captchaImage.id = 'captchaImage';
		captchaImage.name = 'captchaImage';
		captchaImage.style.cursor = 'pointer';
		captchaImage.src = '/captcha/secure.captcha?rand=' + now.getTime();
		jQuery('#randomCaptcha').prepend(captchaImage);
		jQuery(captchaImage).click(loadCaptcha);
	} else {
		captchaImage.src = '/captcha/secure.captcha?rand=' + now.getTime();
	}
	Common.Utils.log("Generate new CAPTCHA image at " + now.getTime());
};

var pressEscKey = function(){
	jQuery(document.body).bind('keypress', function(evt) {
		var key = evt.which || evt.keyCode;
		if (key == 27) {
			// close modal dialog UI
			jQuery.modal.close();
			// unblock fool-proof UI
			jQuery.unblockUI();
			jQuery(document.body).unbind('keypress');
		}
	});
};

var openDialog = function(dialog) {
	dialog.overlay.fadeIn('normal', function () {
		dialog.container.slideDown('normal', function () {
			dialog.data.fadeIn('normal');
		});
	});
};

var closeDialog = function(dialog) {
	dialog.data.fadeOut('normal', function () {
		dialog.container.slideUp('normal', function () {
			dialog.overlay.fadeOut('normal', function () {
				jQuery.modal.close();
			});
		});
	});
};

jQuery.fn.preloadImages = function() {
	return this.each(function() {
		var preloadImg = jQuery(this).clone(true);
		var imgSrc = jQuery(preloadImg).attr('src');
		if (imgSrc.lastIndexOf('_off') >= 0) {
			var newSrc = imgSrc.replace('_off', '_on');
			// preload image to cache it
			preloadImg.attr('src', newSrc);
			jQuery(this).after(preloadImg);
			preloadImg.hide();
		}
	});
};

jQuery.fn.toggleImage = function(blink) {
	var images = jQuery(this).children('img');
	for (var i = 0; i < images.length; i++) {
		var imgSrc = jQuery(images[i]).attr('src');
		if (!blink) {
			if (imgSrc.lastIndexOf('_off') >= 0) {
				jQuery(images[i]).show();
			} else if (imgSrc.lastIndexOf('_on') >= 0) {
				jQuery(images[i]).hide();
			}
		} else {
			if (imgSrc.lastIndexOf('_off') >= 0) {
				jQuery(images[i]).hide();
			} else if (imgSrc.lastIndexOf('_on') >= 0) {
				jQuery(images[i]).show();
			}
		}
	}
};

var defaultBeforeSend = function(XMLHttpRequest){
	var contentPanel = DWRUtil.byId('contentPanel');
	if (contentPanel) {
		jQuery('#contentPanel').block({
			message: '<img src="/js/jquery/loading.gif" /><font size="2">Please wait...</font>'
		});
	} else {
		jQuery('body').block({
			message: '<img src="/js/jquery/loading.gif" /><font size="2">Please wait...</font>'
		});
	}
};

var defaultComplete = function(XMLHttpRequest, textStatus){
	var contentPanel = DWRUtil.byId('contentPanel');
	if (contentPanel) {
		jQuery('#contentPanel').unblock();
	} else {
		jQuery('body').unblock();
	}
};

var defaultError = function(XMLHttpRequest, textStatus, errorThrown){
	alert('Our system is temporarily busy, please try again later.');
	Common.Utils.log('Request fail! \nstatus: ' + XMLHttpRequest.status + '\nresponse text: \n' +
		XMLHttpRequest.responseText);
};

jQuery.fn.clearForm = function(ignoredNames){
	Common.Utils.log("Ignored fields in form: \n" + Common.Utils.tostr(ignoredNames, 2));

	return this.each(function(){
		var type = this.type;
		var name = this.name;
		var tag = this.tagName.toLowerCase();

		if (tag == 'form') {
			return jQuery(':input', this).clearForm(ignoredNames);
		}

		if (ignoredNames != null) {
			for (var i = 0; i < ignoredNames.length; i++) {
				Common.Utils.log("element name: " + name + ", ignored names: " + ignoredNames[i]);
				if (name == ignoredNames[i]) {
					return true;
				}
			}
		}

		if (type == 'text' || type == 'password' || tag == 'textarea') {
			this.value = '';
		} else {
			if (type == 'checkbox' || type == 'radio') {
				this.checked = false;
			} else {
				if (tag == 'select') {
					this.selectedIndex = -1;
				}
			}
		}
	});
};

var ajaxPostJson = function(url, param, dataType, successFn, errorFn, beforeSendFn, completeFn){
	if (errorFn == null) {
		errorFn = defaultError;
	}

	if (beforeSendFn == null) {
		beforeSendFn = defaultBeforeSend;
	}

	if (completeFn == null) {
		completeFn = defaultComplete;
	}

	if (param == null) {
		param = {};
	}

	if (dataType == null) {
		dataType = 'json';
		param.dataType = 'json';
	} else {
		param.dataType = dataType;
	}

	jQuery.ajax({
		global: false,
		cache: false,
		type: "POST",
		url: url,
		data: param,
		dataType: dataType,
		beforeSend: beforeSendFn,
		complete: completeFn,
		success: successFn,
		error: errorFn
	});
};

var ajaxGetJson = function(url, param, dataType, successFn, errorFn, beforeSendFn, completeFn){
	if (errorFn == null) {
		errorFn = defaultError;
	}

	if (beforeSendFn == null) {
		beforeSendFn = defaultBeforeSend;
	}

	if (completeFn == null) {
		completeFn = defaultComplete;
	}

	if (param == null) {
		param = {};
	}

	if (dataType == null) {
		dataType = 'json';
		param.dataType = 'json';
	} else {
		param.dataType = dataType;
	}

	jQuery.ajax({
		global: false,
		cache: false,
		type: "GET",
		url: url,
		data: param,
		dataType: dataType,
		beforeSend: beforeSendFn,
		complete: completeFn,
		success: successFn,
		error: errorFn
	});
};
