/**
 * Saladn Form
 * @require jquery.js 
 */

var saladn = saladn || {};

saladn.form = saladn.form || {};

saladn.form.lcase = function(str) { return (str ? str.toLowerCase() : str); };

saladn.form.formDataSet = function(f, data, $, option) 
{
	var o = $.extend({
		dateFormat: "yyyyMMddHHmm"
	}, option);
	
	$("input, select, textarea", f).each(function(i,field) {
		var fn = field.name;
		if (!fn || (fn == "")) return;
		var val = data[fn] ? data[fn] : "";
		if (typeof val == "object") {
			if (val.year) val = saladn.date.format(val, o.dateFormat);
		}
		var tn = saladn.form.lcase(field.tagName);
		
		if (tn == "input") {
			var ft = saladn.form.lcase(field.type);
			if (ft == "text")
				field.value = val;
			else if ((ft == "radio") || (ft == "checkbox"))
				field.checked = (field.value == val) ? "checked" : undefined;
		}
		else if (tn == "select") {
			var old = field.selectedIndex;
			field.selectedIndex = 0;
			$("option", field).each(function(i,op) {
				if (op.value == val) field.selectedIndex = i;
			});
			if ((old != field.selectedIndex) && (field.onchange))
				field.onchange();
		}
		else if (tn == "textarea") {
			field.value = val;
		}
	});
};

/**
 * <pre>
 * $("form#myForm").snFormDataSet({name:"test", age:"100", code:"01"});
 * </pre>
 */
jQuery.fn.snFormDataSet = function(data, option) {
	return this.each(function() {
		saladn.form.formDataSet(jQuery(this),data,jQuery,option);
	});
};


/**
 * <pre>
 * var name = $("form#myForm").snFieldVal("name");
 * var age = $("form#myForm").snFieldVal("age");
 * var code = $("form#myForm").snFieldVal("code");
 * </pre>
 * Use jQuery.serialize() to serialize(name1=value1&name2=value2 form) all the fields of form.
 */
jQuery.fn.snFieldVal = function(fname) {
	var val = "";
	$("*[name='" + fname + "']", this).each(function(i,field) {
		var tn = saladn.form.lcase(field.tagName);

		if (tn == "input") {
			var ft = saladn.form.lcase(field.type);
			if (ft == "text")
				val = field.value;
			else if (((ft == "radio") || (ft == "checkbox")) && (field.checked))
				val = field.value;
		}
		else if (tn == "select") {
			var i = field.selectedIndex;
			if (i >= 0)
				val = field.options[i].value;
		}
		else if (tn == "textarea") {
			val = field.value;
		}
	});
	
	return val;
};


/**
 * snNotice
 */
jQuery.fn.snNotice = function(t, callback) {
	var step = ["#FFAAAA", "#FFB2B2", "#FFBBBB", "#FFC3C3", "#FFCCCC", 
				"#FFD4D4", "#FFDDDD", "#FFE5E5", "#FFEEEE", "#FFF6F6", "#FFFFFF"];
	return this.each(function() {
		var idx = 0;
		var target = this;
		var orig = jQuery(target).css("backgroundColor");
		var f = function() {
			if (idx < step.length) {
				jQuery(target).css("backgroundColor", step[idx]);
				window.setTimeout(f, 100);	
			}
			else {
				jQuery(target).css("backgroundColor", orig);
				callback && callback(target);
			}
			++idx;
		};
		f();
	});
};

/**
 * snShowMessage
 */
jQuery.snShowMessage = function(msg, pos, option) {
	var $ = jQuery;
	if (jQuery.snShowMessage.curMsgBox)
		jQuery.snShowMessage.curMsgBox.remove();
	
	var o = $.extend({
		css: "",
		margin: 0,
		extraHPadding: 0,
		extraVPadding: 0,
		showMethod: "fadeIn",
		hideMethod: "fadeOut",
		showTime: 100,
		hideTime: 300,
		duration: 5000
	}, option);
	
	var box = $("<div></div>").css("position", "absolute").addClass("snShowMessage").text(msg);
	jQuery.snShowMessage.curMsgBox = box;
	
	var css = o.css;
	while (css && css.length > 0) {
		if (css.length == 0) break;
		var idx = css.indexOf(";");
		var st = (idx >= 0) ? css.substring(0, idx) : css;
		css = (idx >= 0) ? $.trim(css.substring(idx + 1)) : "";
		
		var idx2 = st.indexOf(":");
		if (idx2 > 0) {
			var n = $.trim(st.substring(0, idx2));
			var v = $.trim(st.substring(idx2 + 1));
			box.css(n, v);
		}
	}
	
	var va = "top"; var ha = "center";
	if (pos) {
		if (pos.indexOf("bottom") >= 0) va = "bottom";
		if (pos.indexOf("left") >= 0) ha = "left";
		if (pos.indexOf("right") >= 0) ha = "right";
	}
	
	$(document.body).append(box); box.hide();
	
	var top = o.margin;
	if (va == "bottom") top = $(window).height() - box.height() - o.margin - (o.extraVPadding * 2);

	var left = o.margin;
	if (ha == "right") left = $(window).width() - box.width() - o.margin - (o.extraHPadding * 2);
	if (ha == "center") left = ($(window).width() - box.width()) / 2 - o.margin - o.extraHPadding;	

	box.css("left", left + "px").css("top", top + "px")
		[o.showMethod](o.showTime);
	window.setTimeout((function() { 
		if (jQuery.snShowMessage.curMsgBox == box) {
			jQuery.snShowMessage.curMsgBox[o.hideMethod](o.hideTime, function() {
				if (jQuery.snShowMessage.curMsgBox == box) {
					jQuery.snShowMessage.curMsgBox.remove();
					jQuery.snShowMessage.curMsgBox = undefined;
				}
			});
		}
	}), o.duration);
};


/** saladn date namespace */

saladn.date = saladn.date || {};

saladn.date._makeLength = function(a, l) {
	for (var i = String(a).length; i < l; ++i) 
		a = ("0" + a);
	return a;
}
/**
 * @param f "yyyyMMddHHmmss" form. default is "yyyy.MM.dd HH:mm:ss".
 */
saladn.date.format = function(dt, f) {
	if (!dt.getYear && (dt.time > 0)) {
		dt = new Date(dt.time);
	}
	if (dt.getYear) {
		var y = (dt.getYear() < 1000) ? dt.getYear() + 1900 : dt.getYear();
		var M = saladn.date._makeLength(dt.getMonth() + 1, 2);
		var d = saladn.date._makeLength(dt.getDate(), 2);
		var H = saladn.date._makeLength(dt.getHours(), 2);
		var m = saladn.date._makeLength(dt.getMinutes(), 2);
		var s = saladn.date._makeLength(dt.getSeconds(), 2);
		f = f || "yyyy.MM.dd HH:mm:ss";
		return f.replace(/yyyy/, y).replace(/MM/, M).replace(/dd/, d)
			.replace(/HH/, H).replace(/mm/, m).replace(/ss/, s);
	}
	return "";
}


/** saladn IterativeChecker */

saladn.IterativeCheckerManager = {
	list: [],
	add: function(ic) {
		var index = this.list.length;
		this.list[index] = ic;
		return index;
	}
};

saladn.IterativeChecker = function(field, op)
{
	var $ = jQuery;
	var THIS = this;
	var option = $.extend({
		interval: 500
		//url: "",
		//emptyHandler: function(field) {},
		//checkHandler: function(field, data) {}
	}, op);
	var stop = false;
		
	this.field = $(field);
	this.oldVal = this.field.val();

	var checkerIndex = saladn.IterativeCheckerManager.add(this);
	
	this.check = function() {
		var val = THIS.field.val();
		if ((val != THIS.oldVal) && (option.url)) {
			if ((val == "") && option.emptyHandler)
				option.emptyHandler(field);
			else {
				var param = {};
				param[THIS.field.attr("id")] = THIS.field.val();
				$.get(option.url, param, function(data) {
					if (option.checkHandler)
						option.checkHandler(field, data);
				});
			}
			THIS.oldVal = val;
		}
		if (!stop)
			window.setTimeout("saladn.IterativeCheckerManager.list[" + checkerIndex + "].check()", option.interval);
	};
	
	(function() {
		THIS.check();
		$(window).unload(function() { THIS.stop = true; });
	})();
}

jQuery.fn.snIterativeChecker = function(option) {
	return this.each(function() {
		var ic = new saladn.IterativeChecker(this, option, jQuery);
		jQuery.data(this, "saladn_IterativeChecker", ic);
	});
};

/**
 * Application Event Queue and Topic
 */
saladn.mq = saladn.mq || {};

saladn.mq.Destination = function(isTopic) {
	this.isTopic = isTopic;
	this.consumer = [];
	this.position = 0;
	this.addConsumer = function(fn) {
		this.consumer[this.consumer.length] = fn;
	};
	this.send = function(obj) {
		if (isTopic)
			for (var i = 0; i < this.consumer.length; ++i) {
				this.consumer[i](obj);
			}
		else {
			if (this.consumer.length > 0) {
				if (this.position >= this.consumer.length)
					this.positin = 0;
					this.consumer[this.position](obj);
			}
		}
	};
};

/**
 * @param type 'queue' or 'topic'
 * @param dest destination name (queue name or topic name)
 * @param obj publising object
 */
saladn.mq.publish = function(type, dest, obj) {
	if (type != "queue" && type != "topic") throw "Invalid mq type";
	var t = saladn.mq[type] || (saladn.mq[type] = {});
	var d = t[dest] || (t[dest] = new saladn.mq.Destination(type == "topic"));
	d.send(obj);
};

saladn.mq.subscribe = function(type, dest, fn) {
	if (type != "queue" && type != "topic") throw "Invalid mq type";
	var t = saladn.mq[type] || (saladn.mq[type] = {});
	var d = t[dest] || (t[dest] = new saladn.mq.Destination(type == "topic"));
	d.addConsumer(fn);
};

/**
 * Dialog
 */
saladn.dialog = {};

saladn.dialog.openDialog = function(url, name, width, height, resize, scrollbar)
{
	var bg = {	left:window.top.screenX || window.top.screenLeft || 0, 
				top:window.top.screenY || window.top.screenTop || 0, 
				width:window.top.innerWidth, height:window.top.innerHeight};
	var b = {	left: bg.left + ((bg.width - width) / 2),
				top : bg.top + ((bg.height - height) / 2),
				width: width, height: height};
	var style = "left=" + b.left + ",top=" + b.top + ",width=" + b.width + ",height=" + b.height +
		",resizable=" + (resize ? "yes" : "no") + 
		",scrollbars=" + (scrollbar ? "yes" : "no") + 
		",status=yes,toolbar=no";
		
	var wnd = window.open(url, name, style);
	wnd.focus();
	return wnd;
}
