﻿/*
* jquery.renderhtml.js
*
*
* Written and maintained by Highmore Hill (highmore@163.com)
*/

;(function($) {
	if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
		alert("RenderHtml 需要 jQuery v1.2.3以上版本! 您使用的版本是 v" + $.fn.jquery);
		return;
	}

	$.fn.RenderHtml = function(options) {
		var opts = $.extend({}, $.fn.RenderHtml.defaults, options);

		return this.each(function(i, e) {
			$e = $(e);

			if (opts.target == "self") {
				processRender($e, opts.rsuccess);
			} else {
				processRender($(opts.target), opts.rsuccess);
			}
		});
	};

	$.fn.RenderHtml.version = "0.0.02";

/*
********************************************************************************************************
*
* private function
*
********************************************************************************************************
*/
	function processRender($target, renderSuccess) {
		var _targetid = $target.attr("id");
		var targetdate = $target.data("OPTION");
		//alert("渲染数据前-元素[" + _targetid + "]高度：" + $target.height() + "/元素[" + _targetid + "]宽度：" + $target.width());
		//renderSuccess = $.fn.RenderHtml.rsuccess[renderSuccess];

		if (targetdate !== undefined && targetdate !== null) {
			if (targetdate.template_url !== undefined && targetdate.template_url !== null) {
				$.ajax({
					url: targetdate.template_url, data: targetdate.template_pars, type: "GET", dataType: "html", cache: false, global: false, async: true,
					beforeSend	: function(xhr) {
						//xhr.setRequestHeader("If-Modified-Since","0");
						//xhr.setRequestHeader("Cache-Control","no-cache");
						if (renderSuccess == "replaceContainerHtml") {$target.html('<div style="text-align:center">正在装载模板...<div>');}
					},
					//complete	: function(xhr, status) {},
					success		: function(rtx, status) {
						if ((targetdate.data !== undefined && targetdate.data !== null) || (targetdate.data_url !== undefined && targetdate.data_url !== null)) {
							if (targetdate.data_url !== undefined && targetdate.data_url !== null) {
								$.ajax({
									url: targetdate.data_url, data: targetdate.data_pars, type: "GET", dataType: "json", cache: false, global: false, async: true,
									beforeSend	: function(xhr) {
										//xhr.setRequestHeader("If-Modified-Since","0");
										//xhr.setRequestHeader("Cache-Control","no-cache");
										if (renderSuccess == "replaceContainerHtml") {$target.html('<div style="text-align:center">正在装载模板...<div>');}
									},
									//complete	: function(xhr, status) {},
									success		: function(json, status) {
										if (targetdate.data !== undefined) {json = $.extend({}, json, targetdate.data)};
										$.fn.RenderHtml.rsuccess[renderSuccess](rtx.process(json, {throwExceptions:true}), $target);
									},
									error		: function() {
										$target.html("获取[" + _targetid + "]的数据时发生错误!");
									}
								});
							} else {
								$.fn.RenderHtml.rsuccess[renderSuccess](rtx.process(targetdate.data, {throwExceptions:true}), $target);
							}
						} else {
							$.fn.RenderHtml.rsuccess[renderSuccess](rtx, $target);
						}
						//alert("渲染数据后-元素[" + _targetid + "]高度：" + $target.height() + "/元素[" + _targetid + "]宽度：" + $target.width());
					},
					error		: function() {
						$target.html("获取[" + _targetid + "]的模板时发生错误!");
					}
				});
			} else {
				$target.html("渲染[" + _targetid + "]时发生错误! 没有指定模版!");
			}
		} else {
			$target.html("渲染[" + _targetid + "]时发生错误! 没有指定数据!");
		}
	}

/*
********************************************************************************************************
*
* BloackUI 参数
*
********************************************************************************************************
*/
	var css_form = {
		message	: "",
		css		: {
			padding	: 0,
			margin	: 0,
			border	: "0px solid #aaaaaa",
			width	: "auto",
			height	: "auto",
			left	: "30%",
			top		: "60px"
		},
		overlayCSS	: {
			backgroundColor	: "#000000",
			opacity			: "0.9"
		}
	}
	var css_subform = {
		message	: "",
		css		: {
			padding	: 0,
			margin	: 0,
			border	: "0px solid #aaaaaa",
			width	: "auto",
			height	: "auto",
			left	: 0,
			top		: 0
		},
		overlayCSS	: {
			backgroundColor	: "#000000",
			opacity			: "0.8"
		},
		centerX: true,
		centerY: true
	}
	var css_formblock = {
		message		: "",
		css			: {
			padding			: 6,
			margin			: 0,
			border			: "0px solid #67476c",
			width			: "120px",
			color			: "#ffffff",
			backgroundColor	: "#67476c"
		},
		overlayCSS	: {
			backgroundColor	: "#ffffff",
			opacity			: "0.8"
		},
		centerX: true,
		centerY: true
	}

/*
********************************************************************************************************
*
* private function
*
********************************************************************************************************
*/

	var setFormError = function($f, err) {
		for (var i=0 in err) {
			if (err[i].select) {
				$f.find(err[i].select).parent("span").addClass("error");
				$f.find(err[i].select).next("span").html(err[i].message);
				$f.find(err[i].select).one("blur", function() {
					$(this).next("span").empty();
					$(this).parent("span").removeClass("error");
				});
			} else {
				$f.find(".formStatus").append(err[i].message);
			}
		}
	}

/*
********************************************************************************************************
*
* rsuccess definitions - only fade is defined here, transition pack defines the rest
*
********************************************************************************************************
*/
	$.fn.RenderHtml.rsuccess = {
		replaceContainerHtml: function(html, $container) {
			$container.empty();
			//$container.hide();
			$container.html(html);
			//var _h = $container.height();
			//$container.animate({height:0}, {queue:false, duration:0});
			//$container.show();
			//$container.animate({height:_h}, {queue:false, duration:500});
		},

		insertContainerHtml: function(html, $container) {
			$container.append(html);
		},

		replaceContainer: function(html, $container) {
			var _data = $container.data("OPTION");
			$container.replaceWith(html);
			$container.data("OPTION", _data);
		},

		renderDialogHtml: function(html, $container) {
			$.blockUI({message:html});
		},

		//普通对话框
		renderDialog: function(html, $container) {
			css_form.message = html;
			$container.block(css_formblock);
			$container.find(".closeDialog").bind("click", function(e) {
				e.preventDefault();
				$container.unblock();
				return false;
			});
		},

		//普通表单
		renderForm: function(html, $container) {
			$container.html(html);

			var $form = $container.find("form");

			$form.ajaxForm({
				beforeSubmit: function (formData, jqForm, options) {
					css_formblock.message = "正在传送数据...";
					$form.find(".formStatus").empty();
		           	$form.block(css_formblock);
					return true;
				},
		      	success		: function (json, status) {
					$form.unblock();
					if (json.status == "error") {
						setFormError($form, json.error);
					} else if (json.status == "ok") {
		                if (json.refresh !== undefined) {$(json.refresh+",.Refresh").RenderHtml();} else if (json.refresh == "close") {window.close();}
		            } else {
		              	alert("未知的状态代码!");
		            }
				},
				dataType	: "json",
				clearForm	: false,
				resetForm	: false,
				// $.ajax options can be used here too, for example:
				data		: {},
				global		: false
			});
		},

		//对话框表单
		renderDialogForm: function(html, $container) {

			var width=520, height=494;
			css_form.message = html;
			css_form.css.width = width + "px";
			css_form.css.top = ($(window).height() - height) / 2 + "px";
			css_form.css.left = ($(window).width() - width) / 2 + "px";

			$.blockUI(css_form);

			var $form = $("body>.blockUI form");
			$form.find(".closeDialog").bind("click", function(e) {
				e.preventDefault();
				$.unblockUI();
				return false;
			});
			$form.find(".formTab").cycle({
				fx		: "fade",
				speed	: "fast",
				timeout	: 0,
				pager	: ".formNav",
				after	: function(next, previous) {},
				before	: function(next, previous) {},
				pagerAnchorBuilder: function(idx, slide) {
					return '<a href="#">' + $(slide).find("legend").text() + '</a>';
				}
			});
			$form.find(".uploadThumbnail").bind("click", function(e) {
				e.preventDefault();
				$(this).closest(".blockUI")
				    .data("OPTION", {template_url:"/json_template/form/image/upload.htm", data:{filetype:"thumbnail"}})
				    .RenderHtml({rsuccess: "renderDialogUploadForm"});
				return false;
			});
			$form.find(".uploadAttachment").bind("click", function(e) {
				e.preventDefault();
				$(this).closest(".blockUI")
				    .data("OPTION", {template_url:"/json_template/form/image/upload.htm", data:{filetype:"attachment", action:"upload"}})
				    .RenderHtml({rsuccess: "renderDialogUploadForm"});
				return false;
			});
			$form.find(".editAttachment").bind("click", function(e) {
				e.preventDefault();
				$(this).closest(".blockUI")
				    .data("OPTION", {template_url:"/json_template/form/image/upload.htm", data:{filetype:"attachment", action:"edit"}})
				    .RenderHtml({rsuccess: "renderDialogUploadForm"});
				return false;
			});
			$form.find(".jwysiwyg").wysiwyg();

			$form.ajaxForm({
				beforeSubmit: function (formData, jqForm, options) {
					css_formblock.message = "正在传送数据...";
					$form.find(".formStatus").empty();
		           	$form.block(css_formblock);
					return true;
				},
		      	success		: function (json, status) {
					$form.unblock();

					if (json.status == "error") {
						setFormError($form, json.error);
					} else if (json.status == "ok") {
						$.unblockUI();
		                if (json.refresh !== undefined) {$(json.refresh+",.Refresh").RenderHtml();} else {window.close();}
		            } else {
		              	alert("未知的状态代码!");
		            }
				},
				dataType	: "json",
				clearForm	: false,
				resetForm	: false,
				// $.ajax options can be used here too, for example:
				data		: {},
				global		: false
			});
		},

		//对话框UPLOADFILE 表单
		renderDialogUploadForm: function(html, $container) {
			css_subform.message = html;
			css_subform.centerY = false;
			$container.closest(".blockUI").block(css_subform);

			var $form = $container.find(".blockUI form");
			$form.find(".closeDialog").bind("click", function(e) {
				e.preventDefault();
				$container.closest(".blockUI").unblock();
				return false;
			});

			$form.ajaxForm({
				beforeSubmit: function (formData, jqForm, options) {
					css_formblock.message = "正在上传文件...";
					$form.find(".formStatus").empty();
		           	$form.closest(".blockUI").block(css_formblock);
					return true;
				},
				success		: function (json, status) {
					$form.closest(".blockUI").unblock();

					if (json.status == "error") {
						setFormError($form, json.error);
					} else if (json.status == "ok") {
						if (json.UPLOAD_FILES !== undefined) {
							$container.closest(".blockUI").unblock();
						    var filedata = json.UPLOAD_FILES[0];

							// 上传 Thumbnail 后激活 Resizeimage
						    if (filedata.filetype == "thumbnail") {
		                        $container.closest(".blockUI")
		                            .data("OPTION", {template_url:"/json_template/form/image/resizeimage.htm", data:filedata})
		                            .RenderHtml({rsuccess: "renderDialogResizeForm"});
							} else {
		        				var $preview = $("#" + filedata.filetype.toUpperCase() + "-CONTAINER");
		        				$preview.append("<span id=\"imagepreview_" + filedata.IMAGE_NAME + "\" style=\"float:left; position:relative;\"></span>");
		        				$("#imagepreview_" + filedata.IMAGE_NAME)
		        					.data("OPTION", {template_url:"/json_template/form/image/previewimage.htm", data:filedata})
		        					.RenderHtml();
							}
							/* 不激活 Resizeimage 功能
							var $preview = $("#" + filedata.filetype.toUpperCase() + "-CONTAINER");
		
							if (filedata.filetype == "thumbnail") {
								$preview.append("<span id=\"thumbnailpreview_" + filedata.IMAGE_NAME + "\" style=\"float:left; position:relative;\"></span>");
								$("#thumbnailpreview_" + filedata.IMAGE_NAME)
									.data("OPTION", {template_url: "/json_template/form/image/previewimage.htm", data:filedata})
									.RenderHtml();
							} else {
								$preview.append("<span id=\"imagepreview_" + filedata.IMAGE_NAME + "\" style=\"float:left; position:relative;\"></span>");
			        			$("#imagepreview_" + filedata.IMAGE_NAME)
			        				.data("OPTION", {template_url:"/json_template/form/image/previewimage.htm", data:filedata})
			        				.RenderHtml();
			        		}
							*/
						}
					} else {
						$form.find(".formStatus").html(json.message);
					}
				},
				dataType	: "json",
				iframe		: false,
				clearForm	: false,
				resetForm	: false,
				// $.ajax options can be used here too, for example:
				data		: {},
				global		: false
			});
		},

		//对话框RESIZEIMAGE 表单
		renderDialogResizeForm: function(html, $container) {
			css_subform.message = html;
			$container.block(css_subform);

			var $form = $container.find(".blockUI form");
			$form.find(".closeDialog").bind("click", function(e) {
				e.preventDefault();
				$("#resizeImage").imgAreaSelect({hide:true});
				$container.unblock();
				return false;
			});

			$form.ajaxForm({
				beforeSubmit: function (formData, jqForm, options) {
					css_formblock.message = "正在传送数据...";
		           	$form.closest(".blockUI").block(css_formblock);
					return true;
				},
				success		: function (json, status) {
					$form.closest(".blockUI").unblock();
					$form.find(".formStatus").html(json.message);
		
					if (json.status == "error") {
						//if (json.select !== undefined) $(json.select).select();
						setFormError($form, json.error);
					} else if (json.status == "ok") {
						$("#resizeImage").imgAreaSelect({remove:true});
						$container.unblock();

						var filedata = json.UPLOAD_IMAGE;

						var $preview = $("#" + filedata.filetype.toUpperCase() + "-CONTAINER");
						$preview.append("<span id=\"thumbnailpreview_" + filedata.IMAGE_NAME + "\" style=\"float:left; position:relative;\"></span>");
		        		$("#thumbnailpreview_" + filedata.IMAGE_NAME)
							.data("OPTION", {template_url: "/json_template/form/image/previewimage.htm", data:filedata})
							.RenderHtml();
					} else {
						$form.find(".formStatus").html(json.message);
					}
				},
				dataType	: "json",
				clearForm	: false,
				resetForm	: false,
				// $.ajax options can be used here too, for example:
				data		: {},
				global		: false
			});
		}

	}

//
// plugin options defaults
//
	$.fn.RenderHtml.defaults = {
		target		: "self",
		rsuccess	: "replaceContainerHtml"
	};

})(jQuery);


