329 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			329 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
|  | /******************************************************************************* | |||
|  | * KindEditor - WYSIWYG HTML Editor for Internet | |||
|  | * Copyright (C) 2006-2011 kindsoft.net | |||
|  | * | |||
|  | * @author Roddy <luolonghao@gmail.com> | |||
|  | * @site http://www.kindsoft.net/
 | |||
|  | * @licence http://www.kindsoft.net/license.php
 | |||
|  | *******************************************************************************/ | |||
|  | 
 | |||
|  | KindEditor.plugin('image', function(K) { | |||
|  | 	var self = this, name = 'image', | |||
|  | 		allowImageUpload = K.undef(self.allowImageUpload, true), | |||
|  | 		allowImageRemote = K.undef(self.allowImageRemote, true), | |||
|  | 		formatUploadUrl = K.undef(self.formatUploadUrl, true), | |||
|  | 		allowFileManager = K.undef(self.allowFileManager, false), | |||
|  | 		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'), | |||
|  | 		imageTabIndex = K.undef(self.imageTabIndex, 0), | |||
|  | 		imgPath = self.pluginsPath + 'image/images/', | |||
|  | 		extraParams = K.undef(self.extraFileUploadParams, {}), | |||
|  | 		filePostName = K.undef(self.filePostName, 'imgFile'), | |||
|  | 		fillDescAfterUploadImage = K.undef(self.fillDescAfterUploadImage, false), | |||
|  | 		lang = self.lang(name + '.'); | |||
|  | 
 | |||
|  | 	self.plugin.imageDialog = function(options) { | |||
|  | 		var imageUrl = options.imageUrl, | |||
|  | 			imageWidth = K.undef(options.imageWidth, ''), | |||
|  | 			imageHeight = K.undef(options.imageHeight, ''), | |||
|  | 			imageTitle = K.undef(options.imageTitle, ''), | |||
|  | 			imageAlign = K.undef(options.imageAlign, ''), | |||
|  | 			showRemote = K.undef(options.showRemote, true), | |||
|  | 			showLocal = K.undef(options.showLocal, true), | |||
|  | 			tabIndex = K.undef(options.tabIndex, 0), | |||
|  | 			clickFn = options.clickFn; | |||
|  | 		var target = 'kindeditor_upload_iframe_' + new Date().getTime(); | |||
|  | 		var hiddenElements = []; | |||
|  | 		for(var k in extraParams){ | |||
|  | 			hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />'); | |||
|  | 		} | |||
|  | 		var html = [ | |||
|  | 			'<div style="padding:20px;">', | |||
|  | 			//tabs
 | |||
|  | 			'<div class="tabs"></div>', | |||
|  | 			//remote image - start
 | |||
|  | 			'<div class="tab1" style="display:none;">', | |||
|  | 			//url
 | |||
|  | 			'<div class="ke-dialog-row">', | |||
|  | 			'<label for="remoteUrl" style="width:60px;">' + lang.remoteUrl + '</label>', | |||
|  | 			'<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:200px;" />  ', | |||
|  | 			'<span class="ke-button-common ke-button-outer">', | |||
|  | 			'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />', | |||
|  | 			'</span>', | |||
|  | 			'</div>', | |||
|  | 			//size
 | |||
|  | 			'<div class="ke-dialog-row">', | |||
|  | 			'<label for="remoteWidth" style="width:60px;">' + lang.size + '</label>', | |||
|  | 			lang.width + ' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ', | |||
|  | 			lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ', | |||
|  | 			'<img class="ke-refresh-btn" src="' + imgPath + 'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="' + lang.resetSize + '" />', | |||
|  | 			'</div>', | |||
|  | 			//align
 | |||
|  | 			'<div class="ke-dialog-row">', | |||
|  | 			'<label style="width:60px;">' + lang.align + '</label>', | |||
|  | 			'<input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> <img name="defaultImg" src="' + imgPath + 'align_top.gif" width="23" height="25" alt="" />', | |||
|  | 			' <input type="radio" name="align" class="ke-inline-block" value="left" /> <img name="leftImg" src="' + imgPath + 'align_left.gif" width="23" height="25" alt="" />', | |||
|  | 			' <input type="radio" name="align" class="ke-inline-block" value="right" /> <img name="rightImg" src="' + imgPath + 'align_right.gif" width="23" height="25" alt="" />', | |||
|  | 			'</div>', | |||
|  | 			//title
 | |||
|  | 			'<div class="ke-dialog-row">', | |||
|  | 			'<label for="remoteTitle" style="width:60px;">' + lang.imgTitle + '</label>', | |||
|  | 			'<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:200px;" />', | |||
|  | 			'</div>', | |||
|  | 			'</div>', | |||
|  | 			//remote image - end
 | |||
|  | 			//local upload - start
 | |||
|  | 			'<div class="tab2" style="display:none;">', | |||
|  | 			'<iframe name="' + target + '" style="display:none;"></iframe>', | |||
|  | 			'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + K.addParam(uploadJson, 'dir=image') + '">', | |||
|  | 			//file
 | |||
|  | 			'<div class="ke-dialog-row">', | |||
|  | 			hiddenElements.join(''), | |||
|  | 			'<label style="width:60px;">' + lang.localUrl + '</label>', | |||
|  | 			'<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:200px;" readonly="true" />  ', | |||
|  | 			'<input type="button" class="ke-upload-button" value="' + lang.upload + '" />', | |||
|  | 			'</div>', | |||
|  | 			'</form>', | |||
|  | 			'</div>', | |||
|  | 			//local upload - end
 | |||
|  | 			'</div>' | |||
|  | 		].join(''); | |||
|  | 		var dialogWidth = showLocal || allowFileManager ? 450 : 400, | |||
|  | 			dialogHeight = showLocal && showRemote ? 300 : 250; | |||
|  | 		var dialog = self.createDialog({ | |||
|  | 			name : name, | |||
|  | 			width : dialogWidth, | |||
|  | 			height : dialogHeight, | |||
|  | 			title : self.lang(name), | |||
|  | 			body : html, | |||
|  | 			yesBtn : { | |||
|  | 				name : self.lang('yes'), | |||
|  | 				click : function(e) { | |||
|  | 					// Bugfix: http://code.google.com/p/kindeditor/issues/detail?id=319
 | |||
|  | 					if (dialog.isLoading) { | |||
|  | 						return; | |||
|  | 					} | |||
|  | 					// insert local image
 | |||
|  | 					if (showLocal && showRemote && tabs && tabs.selectedIndex === 1 || !showRemote) { | |||
|  | 						if (uploadbutton.fileBox.val() == '') { | |||
|  | 							alert(self.lang('pleaseSelectFile')); | |||
|  | 							return; | |||
|  | 						} | |||
|  | 						dialog.showLoading(self.lang('uploadLoading')); | |||
|  | 						uploadbutton.submit(); | |||
|  | 						localUrlBox.val(''); | |||
|  | 						return; | |||
|  | 					} | |||
|  | 					// insert remote image
 | |||
|  | 					var url = K.trim(urlBox.val()), | |||
|  | 						width = widthBox.val(), | |||
|  | 						height = heightBox.val(), | |||
|  | 						title = titleBox.val(), | |||
|  | 						align = ''; | |||
|  | 					alignBox.each(function() { | |||
|  | 						if (this.checked) { | |||
|  | 							align = this.value; | |||
|  | 							return false; | |||
|  | 						} | |||
|  | 					}); | |||
|  | 					if (url == 'http://' || K.invalidUrl(url)) { | |||
|  | 						alert(self.lang('invalidUrl')); | |||
|  | 						urlBox[0].focus(); | |||
|  | 						return; | |||
|  | 					} | |||
|  | 					if (!/^\d*$/.test(width)) { | |||
|  | 						alert(self.lang('invalidWidth')); | |||
|  | 						widthBox[0].focus(); | |||
|  | 						return; | |||
|  | 					} | |||
|  | 					if (!/^\d*$/.test(height)) { | |||
|  | 						alert(self.lang('invalidHeight')); | |||
|  | 						heightBox[0].focus(); | |||
|  | 						return; | |||
|  | 					} | |||
|  | 					clickFn.call(self, url, title, width, height, 0, align); | |||
|  | 				} | |||
|  | 			}, | |||
|  | 			beforeRemove : function() { | |||
|  | 				viewServerBtn.unbind(); | |||
|  | 				widthBox.unbind(); | |||
|  | 				heightBox.unbind(); | |||
|  | 				refreshBtn.unbind(); | |||
|  | 			} | |||
|  | 		}), | |||
|  | 		div = dialog.div; | |||
|  | 
 | |||
|  | 		var urlBox = K('[name="url"]', div), | |||
|  | 			localUrlBox = K('[name="localUrl"]', div), | |||
|  | 			viewServerBtn = K('[name="viewServer"]', div), | |||
|  | 			widthBox = K('.tab1 [name="width"]', div), | |||
|  | 			heightBox = K('.tab1 [name="height"]', div), | |||
|  | 			refreshBtn = K('.ke-refresh-btn', div), | |||
|  | 			titleBox = K('.tab1 [name="title"]', div), | |||
|  | 			alignBox = K('.tab1 [name="align"]', div); | |||
|  | 
 | |||
|  | 		var tabs; | |||
|  | 		if (showRemote && showLocal) { | |||
|  | 			tabs = K.tabs({ | |||
|  | 				src : K('.tabs', div), | |||
|  | 				afterSelect : function(i) {} | |||
|  | 			}); | |||
|  | 			tabs.add({ | |||
|  | 				title : lang.remoteImage, | |||
|  | 				panel : K('.tab1', div) | |||
|  | 			}); | |||
|  | 			tabs.add({ | |||
|  | 				title : lang.localImage, | |||
|  | 				panel : K('.tab2', div) | |||
|  | 			}); | |||
|  | 			tabs.select(tabIndex); | |||
|  | 		} else if (showRemote) { | |||
|  | 			K('.tab1', div).show(); | |||
|  | 		} else if (showLocal) { | |||
|  | 			K('.tab2', div).show(); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		var uploadbutton = K.uploadbutton({ | |||
|  | 			button : K('.ke-upload-button', div)[0], | |||
|  | 			fieldName : filePostName, | |||
|  | 			form : K('.ke-form', div), | |||
|  | 			target : target, | |||
|  | 			width: 60, | |||
|  | 			afterUpload : function(data) { | |||
|  | 				dialog.hideLoading(); | |||
|  | 				if (data.error === 0) { | |||
|  | 					var url = data.url; | |||
|  | 					if (formatUploadUrl) { | |||
|  | 						url = K.formatUrl(url, 'absolute'); | |||
|  | 					} | |||
|  | 					if (self.afterUpload) { | |||
|  | 						self.afterUpload.call(self, url, data, name); | |||
|  | 					} | |||
|  | 					if (!fillDescAfterUploadImage) { | |||
|  | 						clickFn.call(self, url, data.title, data.width, data.height, data.border, data.align); | |||
|  | 					} else { | |||
|  | 						K(".ke-dialog-row #remoteUrl", div).val(url); | |||
|  | 						K(".ke-tabs-li", div)[0].click(); | |||
|  | 						K(".ke-refresh-btn", div).click(); | |||
|  | 					} | |||
|  | 				} else { | |||
|  | 					alert(data.message); | |||
|  | 				} | |||
|  | 			}, | |||
|  | 			afterError : function(html) { | |||
|  | 				dialog.hideLoading(); | |||
|  | 				self.errorDialog(html); | |||
|  | 			} | |||
|  | 		}); | |||
|  | 		uploadbutton.fileBox.change(function(e) { | |||
|  | 			localUrlBox.val(uploadbutton.fileBox.val()); | |||
|  | 		}); | |||
|  | 		if (allowFileManager) { | |||
|  | 			viewServerBtn.click(function(e) { | |||
|  | 				self.loadPlugin('filemanager', function() { | |||
|  | 					self.plugin.filemanagerDialog({ | |||
|  | 						viewType : 'VIEW', | |||
|  | 						dirName : 'image', | |||
|  | 						clickFn : function(url, title) { | |||
|  | 							if (self.dialogs.length > 1) { | |||
|  | 								K('[name="url"]', div).val(url); | |||
|  | 								if (self.afterSelectFile) { | |||
|  | 									self.afterSelectFile.call(self, url); | |||
|  | 								} | |||
|  | 								self.hideDialog(); | |||
|  | 							} | |||
|  | 						} | |||
|  | 					}); | |||
|  | 				}); | |||
|  | 			}); | |||
|  | 		} else { | |||
|  | 			viewServerBtn.hide(); | |||
|  | 		} | |||
|  | 		var originalWidth = 0, originalHeight = 0; | |||
|  | 		function setSize(width, height) { | |||
|  | 			widthBox.val(width); | |||
|  | 			heightBox.val(height); | |||
|  | 			originalWidth = width; | |||
|  | 			originalHeight = height; | |||
|  | 		} | |||
|  | 		refreshBtn.click(function(e) { | |||
|  | 			var tempImg = K('<img src="' + urlBox.val() + '" />', document).css({ | |||
|  | 				position : 'absolute', | |||
|  | 				visibility : 'hidden', | |||
|  | 				top : 0, | |||
|  | 				left : '-1000px' | |||
|  | 			}); | |||
|  | 			tempImg.bind('load', function() { | |||
|  | 				setSize(tempImg.width(), tempImg.height()); | |||
|  | 				tempImg.remove(); | |||
|  | 			}); | |||
|  | 			K(document.body).append(tempImg); | |||
|  | 		}); | |||
|  | 		widthBox.change(function(e) { | |||
|  | 			if (originalWidth > 0) { | |||
|  | 				heightBox.val(Math.round(originalHeight / originalWidth * parseInt(this.value, 10))); | |||
|  | 			} | |||
|  | 		}); | |||
|  | 		heightBox.change(function(e) { | |||
|  | 			if (originalHeight > 0) { | |||
|  | 				widthBox.val(Math.round(originalWidth / originalHeight * parseInt(this.value, 10))); | |||
|  | 			} | |||
|  | 		}); | |||
|  | 		urlBox.val(options.imageUrl); | |||
|  | 		setSize(options.imageWidth, options.imageHeight); | |||
|  | 		titleBox.val(options.imageTitle); | |||
|  | 		alignBox.each(function() { | |||
|  | 			if (this.value === options.imageAlign) { | |||
|  | 				this.checked = true; | |||
|  | 				return false; | |||
|  | 			} | |||
|  | 		}); | |||
|  | 		if (showRemote && tabIndex === 0) { | |||
|  | 			urlBox[0].focus(); | |||
|  | 			urlBox[0].select(); | |||
|  | 		} | |||
|  | 		return dialog; | |||
|  | 	}; | |||
|  | 	self.plugin.image = { | |||
|  | 		edit : function() { | |||
|  | 			var img = self.plugin.getSelectedImage(); | |||
|  | 			self.plugin.imageDialog({ | |||
|  | 				imageUrl : img ? img.attr('data-ke-src') : 'http://', | |||
|  | 				imageWidth : img ? img.width() : '', | |||
|  | 				imageHeight : img ? img.height() : '', | |||
|  | 				imageTitle : img ? img.attr('title') : '', | |||
|  | 				imageAlign : img ? img.attr('align') : '', | |||
|  | 				showRemote : allowImageRemote, | |||
|  | 				showLocal : allowImageUpload, | |||
|  | 				tabIndex: img ? 0 : imageTabIndex, | |||
|  | 				clickFn : function(url, title, width, height, border, align) { | |||
|  | 					if (img) { | |||
|  | 						img.attr('src', url); | |||
|  | 						img.attr('data-ke-src', url); | |||
|  | 						img.attr('width', width); | |||
|  | 						img.attr('height', height); | |||
|  | 						img.attr('title', title); | |||
|  | 						img.attr('align', align); | |||
|  | 						img.attr('alt', title); | |||
|  | 					} else { | |||
|  | 						self.exec('insertimage', url, title, width, height, border, align); | |||
|  | 					} | |||
|  | 					// Bugfix: [Firefox] 上传图片后,总是出现正在加载的样式,需要延迟执行hideDialog
 | |||
|  | 					setTimeout(function() { | |||
|  | 						self.hideDialog().focus(); | |||
|  | 					}, 0); | |||
|  | 				} | |||
|  | 			}); | |||
|  | 		}, | |||
|  | 		'delete' : function() { | |||
|  | 			var target = self.plugin.getSelectedImage(); | |||
|  | 			if (target.parent().name == 'a') { | |||
|  | 				target = target.parent(); | |||
|  | 			} | |||
|  | 			target.remove(); | |||
|  | 			// [IE] 删除图片后立即点击图片按钮出错
 | |||
|  | 			self.addBookmark(); | |||
|  | 		} | |||
|  | 	}; | |||
|  | 	self.clickToolbar(name, self.plugin.image.edit); | |||
|  | }); |