YAHOO.namespace("njaru");

// Example:
//	 YAHOO.njaru.TimeDebug.Start();
//	 YAHOO.njaru.TimeDebug.DebugPoint("table rendered");
//	 YAHOO.njaru.TimeDebug.End();
// Result alert() message:
//	 **START: 59873562
//	 table rendered: 59873572 - 10ms
//	 **END: 59873582 - 20ms
YAHOO.njaru.TimeDebug = function(){
	var _startat = 0;
	var _message = "";

	var _GetMicroTime = function(){
		var d = new Date();
		return (((d.getHours() * 60 + d.getMinutes()) * 60 + d.getSeconds()) * 1000 + d.getMilliseconds());
	};

	return {
		Start: function(){
			_startat = _GetMicroTime();
			_message = "**START: " + _startat.toString() + "\r\n";
		},

		DebugPoint: function(pointid){
			var t = _GetMicroTime();
			_message = _message + pointid.toString() + ": " + t.toString() + " - " + (t - _startat).toString() + "ms\r\n";
		},

		End: function(){
			this.DebugPoint("**END");
			alert(_message);
			_message = "";
		}
	};
}();

YAHOO.njaru.Number = function(){
	return {
		// Example:
		//	 YAHOO.njaru.Number.Dec2Hex(7630);
		// Result:
		//	 string: "1DCE"
		Dec2Hex: function(num, radix){ // radix can be: 16 (default), 8, 2
			if (!YAHOO.lang.isNumber(num)){ num = 0; }
			var array_hex_vals = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"], loc, ret = "";
			if (!YAHOO.lang.isNumber(radix)){ radix = 16; }
			while (num >= radix){
				loc = num % radix;
				num = Math.floor(num / radix);
				ret += array_hex_vals[loc];
			}
			ret += array_hex_vals[num];
			return YAHOO.njaru.String.Reverse(ret);
		},

		// Example:
		//	 YAHOO.njaru.Number.FormatCurrency(98945.23902);
		// Result:
		//	 string: "$98,945.24"
		FormatCurrency: function(num, cur_code){
			if (!YAHOO.lang.isNumber(num)){ num = 0; }
			var ret = "",i,j,k,s;
			if (YAHOO.lang.isUndefined(cur_code)){ cur_code = "$"; }
			i = Math.floor(num);
			j = Math.round((num - i) * 100) / 100;
			s = "" + i;
			for(k = s.length-1; k > -3; k -= 3){
				ret = s.substring(k-2, k+1) + "," + ret;
			}
			while(ret.substring(0,1) == ","){ ret = ret.substring(1, ret.length - 1); }
			while(ret.substring(ret.length-1, ret.length) == ","){ ret = ret.substring(0, ret.length - 1); }
			if (j > 0){
				s = "" + j + "0000";
				ret = cur_code + ret + "." + s.substring(2,4);
			}else{
				ret = cur_code + ret + ".00";
			}
			return ret;
		}
	};
}();

YAHOO.njaru.String = function(){
	return {
		// Example:
		//	 YAHOO.njaru.String.Valid("93127478FE93", "0123456789");
		// Result:
		//	 boolean: false
		Valid: function(str, charset){
			if (!YAHOO.lang.isString(str)){ str = ""; }
			var i, len = str.length, ret = true;
			for (i = 0; i < len; i++){
				if (charset.indexOf(str.substr(i,1))<0){ ret = false; break; }
			}
			return ret;
		},

		// Example:
		//	 YAHOO.njaru.String.Reverse("123456");
		// Result:
		//	 string: "654321"
		Reverse: function(str){
			if (!YAHOO.lang.isString(str)){ str = ""; }
			var i, len = str.length, ret = "";
			for (i = 0; i < len; i++){ ret = ret + str.substring(len-i-1, len-i); }
			return ret;
		},

		// Example:
		//	 YAHOO.njaru.String.Filter("this text include number 2939, let's see what we can get", "0123456789", true);
		// Result:
		//	 string: "this text include number , let's see what we can get"
		Filter: function(str, fltr, remove_keep){ // remove_keep=false/undefined (default): Keep, remove_keep = true: Remove
			if (!YAHOO.lang.isString(str)){ str = ""; }
			var i, len = str.length, chr, fnd, ret = "";
			for (i = 0; i < len; i++){
				chr = str.substr(i, 1);
				fnd = fltr.indexOf(chr);
				if (remove_keep == true){ // remove if found
					if (fnd < 0){ ret = ret + chr; }
				}else{ // keep if found
					if (fnd >= 0){ ret = ret + chr; }
				}
			}
			return ret;
		},

		// Example:
		//	 YAHOO.njaru.String.InsertAt("test string", -3, " number ");
		// Result:
		//	 string: "test stri number ng"
		InsertAt: function(str, iLoc, sChar){
			if (!YAHOO.lang.isString(str)){ str = ""; }
			var len = str.length, ret = "";
			if (iLoc >= 0){ ret = str.substr(0, iLoc) + sChar + str.substr(iLoc); }
			else{ ret = str.substr(0, len + iLoc + 1) + sChar + str.substr(len + iLoc + 1); }
			return ret;
		},

		// Example:
		//	 YAHOO.njaru.String.URLDecode("index.php%3Fg%3Dadmin");
		// Result:
		//	 string: "index.php?g=admin"
		URLDecode: function(str){
			if (!YAHOO.lang.isString(str)){ str = ""; }
			return unescape(str);
		},

		// take instead encodeURI()
		// problem of encodeURI(): "#" should be translated to "%23", but it doesn't
		// Example:
		//	 YAHOO.njaru.String.URLEncode("index.php?g=admin");
		// Result:
		//	 string: "index.php%3Fg%3Dadmin"
		URLEncode: function(str){
			if (!YAHOO.lang.isString(str)){ str = ""; }
			/*
			var i, len = str.length, t, ret = "";
			for (i = 0; i < len; i++){
				t = str.substring(i, i+1);
				if (this.Valid(t, "-_.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")){ ret = ret + t; }
				else{ ret = ret + "%" + YAHOO.njaru.Number.Dec2Hex(t.charCodeAt(0)); }
			}
			return ret;
			*/
			return encodeURIComponent(str);
		},

		// Example:
		//	 YAHOO.njaru.String.HTMLSpecialChars("<font color=\"red\">red font</font>");
		// Result:
		//	 string: "&lt;font color=&quot;red&quot;&gt;red font&lt;/font&gt;"
		HTMLSpecialChars: function(str){
			if (!YAHOO.lang.isString(str)){ str = ""; }
			str = str.replace(/&/g,"&amp;");
			str = str.replace(/</g,"&lt;");
			str = str.replace(/>/g,"&gt;");
			str = str.replace(/\"/g,"&quot;");
			str = str.replace(/\'/g,"&#039;");
			return str;
		},

		// convert date format
		// Example:
		//	 YAHOO.njaru.String.ConvertPHPDateFormat2Mattkruse("F j, Y H:i:s");
		// Result:
		//	 string: "MMM d, yyyy HH:mm:ss"
		ConvertPHPDateFormat2Mattkruse: function(str){
			if (!YAHOO.lang.isString(str)){ str = ""; }
			var ret = str;
			ret = ret.replace(/A/g, "a");
			ret = ret.replace(/d/g, "dd");
			ret = ret.replace(/D/g, "E");
			ret = ret.replace(/h/g, "hh");
			ret = ret.replace(/H/g, "HH");
			ret = ret.replace(/g/g, "h");
			ret = ret.replace(/G/g, "H");
			ret = ret.replace(/j/g, "d");
			ret = ret.replace(/l/g, "EE");
			ret = ret.replace(/M/g, "NNN");
			ret = ret.replace(/F/g, "MMM");
			ret = ret.replace(/m/g, "MM");
			ret = ret.replace(/i/g, "mm");
			ret = ret.replace(/n/g, "M");
			ret = ret.replace(/s/g, "ss");
			ret = ret.replace(/y/g, "yy");
			ret = ret.replace(/Y/g, "yyyy");
			return ret;
		}
	};
}();

YAHOO.njaru.Tree = function(){
	this.nodes = [];
	
	this.add = function(_id, _title, _pid){
			this.nodes[this.nodes.length] = {id: _id, title: _title, pid: _pid, level: 0, hasson: false };
		};
	this.rebuild = function(_pid, _level){
			if (YAHOO.lang.isUndefined(_pid)){ _pid = 0; }
			if (!YAHOO.lang.isNumber(_level)){ _level = 0; }
			var i, l = this.nodes.length, i_son_count = 0, ret = 0;
			for (i = 0; i < l; i++){
				if (this.nodes[i].pid == _pid){
					i_son_count = this.rebuild(this.nodes[i].id, _level + 1);
					this.nodes[i].level = _level;
					this.nodes[i].hasson = (i_son_count > 0);
					ret ++;
				}
			}
			return ret;
		};
	this.debug = function (){
		var i, l = this.nodes.length, ret = "";
		for (i = 0; i < l; i++){
			ret = ret + "" + i + ".";
			ret = ret + " id=" + this.nodes[i].id;
			ret = ret + " title=" + this.nodes[i].title;
			ret = ret + " pid=" + this.nodes[i].pid;
			ret = ret + " level=" + this.nodes[i].level;
			ret = ret + " hasson=" + this.nodes[i].hasson;
			ret = ret + "\r\n";
		}
		alert(ret);
	};
};

YAHOO.njaru.Form = function(){
	return {
		// get form element by name
		// Example:
		//	 YAHOO.njaru.Form.get("txt_username");
		// Result:
		//	 array of HTMLElement object
		get: function(el_name, root){
			if (!YAHOO.lang.isString(el_name)){ return []; }
			el_name = el_name.toUpperCase();
			return YAHOO.util.Dom.getElementsBy(function(el){
					return el.name && el.tagName && (el.tagName.toUpperCase() == "INPUT" || el.tagName.toUpperCase() == "SELECT" || el.tagName.toUpperCase() == "TEXTAREA") && (el.name.toUpperCase() == el_name || el.name.toUpperCase() == el_name + "[]");
				}, "*", root);
		},
		
		// Example:
		//	 YAHOO.njaru.Form.getObjectValue(el);
		// Result:
		//	 string: "running"
		getObjectValue: function(el){
			var i, ret = "";
			switch(el.type){
				case "radio": case "checkbox":
					if (el.checked){
						if (ret == ""){ ret = el.value.toString(); }
						else{ ret += "," + el.value.toString(); }
					}
					break;
				case "select-one":
				case "select-multiple":
					for (i = 0; i < el.options.length; i++){
						if (el.options[i].selected){
							if (ret == ""){ ret = el.options[i].value.toString(); }
							else{ ret += "," + el.options[i].value.toString(); }
						}
					}
					break;
				case "text": case "hidden": case "textarea": case "password":
					if (ret == ""){ ret = el.value.toString(); }
					else{ ret += "," + el.value.toString(); }
					break;
			}
			return ret;
		},
		
		// Example:
		//	 YAHOO.njaru.Form.getObjectArrayValue(YAHOO.njaru.Form.get("txt_username"));
		// Result:
		//	 string: "running"
		getObjectArrayValue: function(arr_el){
			if (!YAHOO.lang.isArray(arr_el)){ return ""; }
			var i, l = arr_el.length, one, ret = "";
			for (i = 0; i < l; i++){
				one = this.getObjectValue(arr_el[i]);
				if (one != ""){
					if (ret == ""){ ret = one; }
					else{ ret += "," + one; }
				}
			}
			return ret;
		},
		
		// Example:
		//	 YAHOO.njaru.Form.getValue("txt_username");
		// Result:
		//	 string: "running"
		getValue: function(el_name, root){
			return this.getObjectArrayValue(this.get(el_name, root));
		},
		
		// Example:
		//	 YAHOO.njaru.Form.setObjectValue(el, "running");
		// Result:
		//	 false: no element to set
		setObjectValue: function(el, v){
			var i, j, ret = false, arr_v;
			switch(el.type){
				case "radio":
					el.checked = (el.value.toString() == v);
					ret = true;
					break;
				case "checkbox":
					el.checked = false;
					arr_v = v.split(",");
					for (i = 0; i < arr_v.length; i++){
						if (!el.checked){ el.checked = (el.value.toString() == arr_v[i]); }
					}
					ret = true;
					break;
				case "select-one":
					for (i = 0; i < el.options.length; i++){
						if (el.options[i].selected = (el.options[i].value.toString() == v)) { break; };
					}
					ret = true;
					break;
				case "select-multiple":
					for (i = 0; i < el.options.length; i++){ el.options[i].selected = false; }
					arr_v = v.split(",");
					for (i = 0; i < arr_v.length; i++){
						for (j = 0; j < el.options.length; j++){
							if (!el.options[j].selected){ el.options[j].selected = (el.options[j].value.toString() == arr_v[i]); }
						}
					}
					ret = true;
					break;
				case "text": case "hidden": case "textarea": case "password":
					el.value = v;
					ret = true;
					break;
			}
			return ret;
		},

		// Example:
		//	 YAHOO.njaru.Form.setObjectArrayValue(YAHOO.njaru.Form.get("txt_username"), "running");
		// Result:
		//	 false: no element to set
		setObjectArrayValue: function(arr_el, v){
			if (!YAHOO.lang.isArray(arr_el)){ return false; }
			var i, l = arr_el.length, ret = false;
			for (i = 0; i < l; i++){
				if (ret){ this.setObjectValue(arr_el[i], v); }
				else{ ret = this.setObjectValue(arr_el[i], v); }
			}
			return ret;
		},
		
		// Example:
		//	 YAHOO.njaru.Form.setValue("txt_username", "running");
		// Result:
		//	 false: no element to set
		setValue: function(el_name, v, root){
			return this.setObjectArrayValue(this.get(el_name, root), v);
		},
		
		// Example:
		//	 YAHOO.njaru.Form.getForm("txt_username");
		// Result:
		//	 object: HTMLFormElement
		//	 null
		getForm: function(el){
			var node = YAHOO.util.Dom.get(el);
			if (!node && YAHOO.lang.isString(el)) { node = YAHOO.util.Dom.get(el + "__1"); }
			if (!node) { return null; }
			return YAHOO.util.Dom.getAncestorBy(node, function(el) { return el.tagName && el.tagName.toUpperCase() == "FORM"; });
		}
	};
}();

// object to validate the credit card number
// parameter:
//	 1: string, card number to be validated, required
//	 2: string, optional, card type
YAHOO.njaru.CreditCard = function(card_number, card_type){
	if (!YAHOO.lang.isString(card_number)){ card_number = ""; }
	if (!YAHOO.lang.isString(card_type)){ card_type = ""; }

	var _checkprefix = function (sprefixes, cm){
		var arr_prefix = sprefixes.split(","), ret = false;
		for (var i = 0; i < arr_prefix.length; i++){
			var exp = new RegExp ("^" + arr_prefix[i]);
			if (exp.test(cm)){ ret = true; }
		}
		return ret;
	};
	var _checklength = function (slength, cm){
		var arr_length = slength.split(","), l = cm.length, ret = false;
		for (var i = 0; i < arr_length.length; i++){
			if (parseInt(arr_length[i], 10) == l){ ret = true; }
		}
		return ret;
	};
	var _checkluhn = function (cm){
		var checksum = 0;	// running checksum total
		var i, j = 1;			// takes value of 1 or 2
		var calc;
		for (i = cm.length - 1; i >= 0; i--) {
			calc = Number(cm.charAt(i)) * j;
			if (calc > 9) {
				checksum = checksum + 1;
				calc = calc - 10;
			}
			checksum = checksum + calc;
			if (j == 1) {j = 2; } else {j = 1; }
		}
		return (checksum % 10 === 0);
	};
	return {
		// Sample test credit card number:
		//	 Visa:	   4111111111111111
		//	 MasterCard: 5431111111111111
		//	 Amex:	   341111111111111
		//	 Discover:   6011601160116611
		// Example:
		//	 YAHOO.njaru.CreditCard("341111111111111").IsValid();
		// Result:
		//	 boolean: true
		// Example:
		//	 YAHOO.njaru.CreditCard("341111111111111", "Visa").IsValid();
		// Result:
		//	 boolean: false
		IsValid: function (){
			var validation_rules = [];
			validation_rules[0] = {name: "Visa", length: "13,16", prefixes: "4", checkdigit: true};
			validation_rules[1] = {name: "MasterCard", length: "16", prefixes: "51,52,53,54,55", checkdigit: true};
			validation_rules[2] = {name: "DinersClub", length: "14,", prefixes: "300,301,302,303,304,305,36,38", checkdigit: true};
			validation_rules[3] = {name: "CarteBlanche", length: "14", prefixes: "300,301,302,303,304,305,36,38", checkdigit: true};
			validation_rules[4] = {name: "AmEx", length: "15", prefixes: "34,37", checkdigit: true};
			validation_rules[5] = {name: "Discover", length: "16", prefixes: "6011", checkdigit: true};
			validation_rules[6] = {name: "JCB", length: "16", prefixes: "3", checkdigit: true};
			validation_rules[7] = {name: "JCB", length: "15", prefixes: "1800,2131", checkdigit: true};
			validation_rules[8] = {name: "Enroute", length: "15", prefixes: "2014,2149", checkdigit: false};

			var i, bOK = true;
			if (card_number.length === 0){ bOK = false; }
			if (bOK && !YAHOO.njaru.String(card_number).Valid("0123456789 ")){ bOK = false; }
			if (bOK){
				card_number = card_number.replace(/ /g, "");
				bOK = false;
				for (i = 0; i < validation_rules.length && !bOK; i++){
					if ((card_type === "") || (card_type.toLowerCase() == validation_rules[i].name.toLowerCase())){
					if (_checklength(validation_rules[i].length, card_number)){
					if (_checkprefix(validation_rules[i].prefixes, card_number)){
					if (validation_rules[i].checkdigit){
						if (_checkluhn(card_number)){
							bOK = true;
							if (card_type === ""){ card_type = validation_rules[i].name; }
						}
					}else{
						bOK = true;
						if (card_type === ""){ card_type = validation_rules[i].name; }
					} } } }
				}
			}
			return bOK;
		}
	};
};

// object to resize images in the document
YAHOO.njaru.Image = function(){
	var _timeout_id = 0;
	var _interval = 100;

	return {
		// Example:
		//	 JavaScript:
		//		YAHOO.njaru.Image.Resize(document.images[0], 50, 50);
		Resize: function(objImage, iWidth, iHeight){
			var r1, r2, w, h;
			if (''+objImage.readyState=="complete" || (''+objImage.readyState=="undefined" && objImage.complete)){
				w = objImage.width;
				h = objImage.height;
				if (w > 0 && h > 0){
					//alert(objImage.id + ' = ' + w + ':' + h);
					if (w > iWidth || h > iHeight){
						r1 = w / iWidth;
						r2 = h / iHeight;
						if (r1 > r2){
							objImage.width = iWidth;
							objImage.height = h / r1;
						}else{
							objImage.width = w / r2;
							objImage.height = iHeight;
						}
					}
					objImage.id=objImage.id.replace("__njaru_auto", "__njaru_done");
				}
			}
		},

		// all images which id is like "__njaru_auto_resize_image_nw_nh" will be resized to nw x nh
		// Example:
		//	 In HTML page:
		//		<img src="http://features.cgsociety.org/stories/2007_09/deathblow/14.jpg" id="__njaru_auto_resize_image_200_200"><br>
		//		<img src="http://features.cgsociety.org/stories/2007_09/deathblow/15.jpg" id="__njaru_auto_resize_image_200_200"><br>
		//		<img src="http://features.cgsociety.org/stories/2007_09/deathblow/16.jpg" id="__njaru_auto_resize_image_200_200"><br>
		//		<img src="http://features.cgsociety.org/stories/2007_09/deathblow/17.jpg" id="__njaru_auto_resize_image_200_200"><br>
		//	 JavaScript:
		//		YAHOO.njaru.Image.ResizeAll();
		// Result:
		//	 resize all image to 200 x 200px
		ResizeAll: function(){
			var i, iIdCount, imgid, sz, asz;
			iIdCount = 0;
			for(i=0; i<document.images.length; i++){
				imgid = document.images[i].id;
				if(imgid.substr(0, 26) == "__njaru_auto_resize_image_"){
					sz = imgid.substr(26);
					asz = sz.split("_");
					if (asz.length >= 2){
						this.Resize(document.images[i], parseInt("0"+asz[0], 10), parseInt("0"+asz[1], 10));
						iIdCount++;
					}
				}
			}
			if (iIdCount > 0){
				_timeout_id = window.setTimeout("YAHOO.njaru.Image.ResizeAll();", _interval);
			}else{
				if (_timeout_id !== 0){ window.clearTimeout(_timeout_id); }
			}
		}
	}
}();

YAHOO.njaru.LightBox = function(){
	var _default_properties = {
				width: "600px",
				fixedcenter: true,
				modal: true,
				constraintoviewport: true,
				close:true,
				visible:false,
				draggable:true,
				dragOnly:true
			};
//				effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.25}

	return {
		_parent_control: null,
		_parent_form: null,
		_lightbox_window: null,
		_lightbox_resize: null,
		
		// Parameters:
		//	 m_properties: array may include these values:
		//				   url: display url in the panel
		//				   content: display this html content in the panel
		//				   title: light box title
		//				   footer: light box footer text
		//				   resizable (boolean): if allow resizable
		//				   height: will be passed to iframe if "url" is set
		//			 all other properties will be passed to YAHOO.widget.ResizePanel directly
		// Example:
		//	 YAHOO.njaru.LightBox.Open({
		//			   url: "http://www.njaru.com/",
		//			   title: "n'jaru.com",
		//			   resizable: true,
		//			   height: "400px"
		//		 });
		Open: function(m_properties, root){
			if (!YAHOO.lang.isObject(m_properties)){ m_properties = {}; }
			var ppt, pptl, default_value = null;
			var panel_properties = {};
			var lightbox_properties = {
						url: "",
						content: "",
						title: "&nbsp;",
						footer: "&nbsp;",
						resizable: true,
						height: "400px"
					};

			for (ppt in m_properties){
				pptl = ppt.toLowerCase();
				if (pptl == "parent_control"){
					this._parent_control = m_properties[ppt];
				}else if (pptl == "url" || pptl == "content" || pptl == "title" || pptl == "footer" || pptl == "resizable"){ // || pptl == "height"
					lightbox_properties[pptl] = m_properties[ppt];
				}else{
					panel_properties[pptl] = m_properties[ppt];
				}
			}
			if (root){
				this._parent_form = root;
			}
			if (this._parent_control){
				if (this._parent_form){
					default_value = YAHOO.njaru.Form.getValue(this._parent_control, this._parent_form);
				}else{
					default_value = YAHOO.njaru.Form.getValue(this._parent_control);
				}
			}
			if (lightbox_properties.url != "" && !YAHOO.lang.isNull(default_value)){
				if (lightbox_properties.url.indexOf("?") >= 0){ lightbox_properties.url = lightbox_properties.url + "&dv=" + YAHOO.njaru.String.URLEncode(default_value); }
				else{ lightbox_properties.url = lightbox_properties.url + "?dv=" + YAHOO.njaru.String.URLEncode(default_value); }
			}

			if (!YAHOO.lang.isObject(this._lightbox_window)){
				this._lightbox_window = new YAHOO.widget.Panel("njaru_lightbox_window", YAHOO.lang.merge(_default_properties, panel_properties));
			}else{
				for (ppt in _default_properties){
					this._lightbox_window.cfg.setProperty(ppt, _default_properties[ppt]);
				}
				for (ppt in panel_properties){
					this._lightbox_window.cfg.setProperty(ppt, panel_properties[ppt]);
				}
			}
			this._lightbox_window.hideEvent.subscribe(this.onHide, this._lightbox_window, true);
			this._lightbox_window.setHeader("<div class=\"tl\"></div><span>" + lightbox_properties.title + "</span><div class=\"tr\"></div>");
			if (lightbox_properties.url != ""){
				// style=\"height: " + (lightbox_properties.height?lightbox_properties.height:"") + "\"
				this._lightbox_window.setBody("<iframe src=\"" + lightbox_properties.url + "\" width=\"100%\" frameborder=\"0\" class=\"njaru-lightbox-iframe\"></iframe>");
			}else{
				this._lightbox_window.setBody(lightbox_properties.content);
			}
			this._lightbox_window.setFooter("<div class=\"bl\"></div><span>" + lightbox_properties.footer + "</span><div class=\"br\"></div>");
			this._lightbox_window.render(document.body);
			this._lightbox_window.show();

			if (!YAHOO.lang.isObject(this._lightbox_resize)){
			//if (lightbox_properties.resizable){
				this._lightbox_resize = new YAHOO.util.Resize('njaru_lightbox_window', {
					handles: ['br'],
					hiddenHandles: true,
					autoRatio: false,
					minWidth: 200,
					minHeight: 100,
					proxy: true,
					status: true
				});

				this._lightbox_resize.on('resize', function(args) {
					var IE_QUIRKS = (YAHOO.env.ua.ie && document.compatMode == "BackCompat");
					var IE_SYNC = (YAHOO.env.ua.ie == 6 || (YAHOO.env.ua.ie == 7 && IE_QUIRKS));
					var PANEL_BODY_PADDING = 0;//(10*2);
	
					var panelHeight = args.height;
					var headerHeight = this.header.offsetHeight; // Content + Padding + Border
					var footerHeight = this.footer.offsetHeight; // Content + Padding + Border
					var bodyHeight = (panelHeight - headerHeight - footerHeight);
					var bodyContentHeight = (IE_QUIRKS) ? bodyHeight : bodyHeight - PANEL_BODY_PADDING;
	
					var lb_iframe = YAHOO.util.Dom.getElementsByClassName("njaru-lightbox-iframe", "iframe", this.body)[0];
					if (lb_iframe){ YAHOO.util.Dom.setStyle(lb_iframe, "height", bodyContentHeight + "px"); }
					YAHOO.util.Dom.setStyle(this.body, "height", bodyContentHeight + "px");
	
					if (IE_SYNC) {
						this.sizeUnderlay();
						this.syncIframe();
					}
				}, this._lightbox_window, true);
			}
			
			this._lightbox_resize.resize(null, panel_properties.height, panel_properties.width, null, null, true);
			this._lightbox_window.center();
		},
		
		// Example:
		//	 YAHOO.njaru.LightBox.Hide();
		Hide: function(){
			if (YAHOO.lang.isObject(this._lightbox_window) && this._lightbox_window.cfg.getProperty("visible")){ this._lightbox_window.hide(); }
		},
		
		// this event to fix the problem of IE rendor problem
		// in IE, after the panel hide, the background of a table in iframe is still there
		//	but this may cause some problem when do return value, so we use
		//			 window.setTimeout("YAHOO.njaru.LightBox.Hide();", 0);
		//	instead of
		//			 YAHOO.njaru.LightBox.Hide();
		onHide: function(type,args,obj){
			obj.setBody("&nbsp;");
		},
		
		// Example:
		//	 YAHOO.njaru.LightBox.ReturnValue("#FFCC33", function(el_name, v, xv){
		//			  var sample = parent.YAHOO.util.Dom.get(el_name + "__sample");
		//			  if (sample){ sample.style.backgroundColor = v; }
		//		  });
		ReturnValue: function(v, extra_change, extra_v){
			if (this._parent_form){
				YAHOO.njaru.Form.setValue(this._parent_control, v, this._parent_form);
			}else{
				YAHOO.njaru.Form.setValue(this._parent_control, v);
			}
			if (YAHOO.lang.isFunction(extra_change)){ extra_change(this._parent_control, v, extra_v); }
			window.setTimeout("YAHOO.njaru.LightBox.Hide();", 0);
		}
	};
}();

YAHOO.njaru.LBWait = function(){
	var _default_properties = {
				width: "260px",
				fixedcenter: true,
				close:false,
				modal: true,
				visible:false,
				draggable:false
			};
//				effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.25}

	return {
		_lightbox_wait: null,
		
		// Parameters:
		//	 m_properties: array may include these values:
		//				   content: display this html content in the panel
		//				   title: light box title
		//				   footer: light box footer text
		//			 all other properties will be passed to YAHOO.widget.Panel directly
		// Example:
		//	 YAHOO.njaru.LBWait.Open({
		//			   title: "n'jaru.com"
		//		 });
		Open: function(m_properties){
			if (!YAHOO.lang.isObject(m_properties)){ m_properties = {}; }
			var ppt, pptl, default_value = null;
			var panel_properties = {};
			var lightbox_properties = {
						content: "<img src=\"http://us.i1.yimg.com/us.yimg.com/i/us/per/gr/gp/rel_interstitial_loading.gif\" align=\"center\" style=\"margin: 2em;\"/>"
					};

			for (ppt in m_properties){
				pptl = ppt.toLowerCase();
				if (pptl == "content"){
					lightbox_properties[ppt] = m_properties[ppt];
				}else{
					panel_properties[ppt] = m_properties[ppt];
				}
			}

			if (!YAHOO.lang.isObject(this._lightbox_wait)){
				this._lightbox_wait = new YAHOO.widget.Panel("njaru_lightbox_wait", YAHOO.lang.merge(_default_properties, panel_properties));
			}else{
				for (ppt in _default_properties){
					this._lightbox_wait.cfg.setProperty(ppt, _default_properties[ppt]);
				}
				for (ppt in panel_properties){
					this._lightbox_wait.cfg.setProperty(ppt, panel_properties[ppt]);
				}
			}
			this._lightbox_wait.setBody(lightbox_properties.content);
			this._lightbox_wait.render(document.body);
			this._lightbox_wait.show();
		},
		
		// Example:
		//	 YAHOO.njaru.LBWait.Hide();
		Hide: function(){
			if (YAHOO.lang.isObject(this._lightbox_wait) && this._lightbox_wait.cfg.getProperty("visible")){ this._lightbox_wait.hide(); }
		}
	};
}();

