diff --git a/nicEdit.js b/nicEdit.js
index 090ccda..7bba113 100644
--- a/nicEdit.js
+++ b/nicEdit.js
@@ -538,6 +538,18 @@ var nicEditorInstance = bkClass.extend({
}
},
+ selBlockType : function() {
+ var e = this.selElm();
+ var t = {'P':1,'PRE':1,'H1':1,'H2':1,'H3':1,'H4':1,'H5':1,'H6':1};
+ while (e != this.elm) {
+ if (t[e.nodeName]) {
+ return e.nodeName;
+ }
+ e = e.parentNode;
+ }
+ return false;
+ },
+
saveRng : function() {
this.savedRange = this.getRng();
this.savedSel = this.getSel();
@@ -551,13 +563,9 @@ var nicEditorInstance = bkClass.extend({
keyDown : function(e,t) {
if(e.keyCode == 13 || e.keyCode == 10) {
- if (!e.ctrlKey) {
- this.ne.nicCommand('insertHTML','
');
- } else {
- this.ne.nicCommand('insertHTML','
');
+ if (!e.shiftKey && !this.selBlockType()) {
+ this.ne.nicCommand('formatBlock', 'p');
}
- e.preventDefault();
- return false;
}
if(e.ctrlKey) {
this.ne.fireEvent('key',this,e);
@@ -990,7 +998,7 @@ var nicEditorAdvancedButton = nicEditorButton.extend({
document._nicCss.appendChild(document.createTextNode(
'.niceabf table { border-collapse: collapse; }\n'+
'.niceabf td { padding: 2px 5px 2px 0; }\n'+
- '.niceabf td.h { vertical-align: top; padding-top: 4px; }\n'+
+ '.niceabf td.h { vertical-align: top; padding-top: 4px; white-space: nowrap; }\n'+
'.niceabf h2 { font-size: 14px; font-weight: bold; padding: 0; margin: 0; }\n'+
'.niceabf input, .niceabf select { vertical-align: middle; font-size: 13px; border: 1px solid #ccc; }\n'+
'.niceabf textarea { border: 1px solid #ccc; }\n'+
diff --git a/nicImageUploadGT.js b/nicImageUploadGT.js
index a2b9f04..ff1f322 100644
--- a/nicImageUploadGT.js
+++ b/nicImageUploadGT.js
@@ -1,22 +1,23 @@
-/** nicImageGT */
+/** nicImageUploadGT (Image+Upload) */
/* START CONFIG */
-var nicImageOptions = {
+var nicImageUploadGTOptions = {
buttons: {
- 'image': {name: __('Add Image'), type: 'nicImageButton', tags: ['IMG']}
+ 'image': {name: __('Add Image'), type: 'nicImageUploadGTButton', tags: ['IMG']}
}
};
/* END CONFIG */
-var nicImageButton = nicEditorAdvancedButton.extend({
+var nicImageUploadGTButton = nicEditorAdvancedButton.extend({
addPane: function() {
- this.im = this.ne.selectedInstance.selElm().parentTag('IMG');
- var params = this.parseParams(this.im);
+ this.im = (this.selElm || this.ne.selectedInstance.selElm()).parentTag('IMG');
+ var s, params = this.parseParams(this.im);
this.addForm({
'': {type: 'title', txt: __('Add/Edit Image')},
'src': {type: 'text', txt: __('URL or Name'), style: {width: '150px'}},
+ 'upload': {type: 'container', txt: __('Or upload')},
'href': {type: 'text', txt: __('Hyperlink'), style: {width: '150px'}},
'size': {type: 'container', txt: __('Max Size')},
'align': {type: 'select', txt: __('Align'), options: {none: __('Inline'), left: __('Left'), right: __('Right')}},
@@ -24,17 +25,40 @@ var nicImageButton = nicEditorAdvancedButton.extend({
this.hinter = new SimpleAutocomplete(this.inputs['src'], this.gtLoadData.closure(this), null, null, null, false, true);
- var s = this.inputs['href'].parentNode;
+ s = this.inputs['href'].parentNode;
new bkElement('br').appendTo(s);
this.inputs['newwindow'] = new bkElement('input').setAttributes({type: 'checkbox', id: 'newwindow', checked: 1 && params.newwindow}).appendTo(s);
new bkElement('label').setAttributes({htmlFor: 'newwindow'}).setContent(__('Open in new window')).appendTo(s);
+ var self = this;
+ s = this.inputs['upload'];
+ this.inputs['fileName'] = new bkElement('input').setStyle({width: '150px', height: '20px'}).setAttributes({type: 'button', value: __('Select file')}).appendTo(s);
+ this.inputs['fileName'].addEvent('click', function() { self.inputs['file'].click(); });
+ this.inputs['file'] = new bkElement('input').setStyle({width: '150px', display: 'none'}).setAttributes({type: 'file', size: 5}).appendTo(s);
+ this.inputs['file'].addEvent('change', this.onFileChange.closure(this));
+ new bkElement('br').appendTo(s);
+ this.inputs['progress'] = new bkElement('progress')
+ .setStyle({ width: '100%', display: 'none' })
+ .setAttributes('max', 100)
+ .appendTo(s);
+
s = this.inputs['size'];
this.inputs['width'] = new bkElement('input').setAttributes({type: 'text', size: 5, value: params.width||''}).appendTo(s);
s.appendChild(document.createTextNode(' x '));
this.inputs['height'] = new bkElement('input').setAttributes({type: 'text', size: 5, value: params.height||''}).appendTo(s);
},
+ onFileChange: function() {
+ this.inputs['src'].value = '';
+ this.inputs['fileName'].value = this.inputs['file'].files[0].name;
+ },
+
+ checkNodes: function(e) {
+ var r = nicEditorAdvancedButton.prototype.checkNodes.apply(this, [e]);
+ this.selElm = r ? e : null;
+ return r;
+ },
+
parseParams: function(elm) {
var r = { getAttribute: function(n) { return this[n]; } };
if (!elm) return r;
@@ -82,6 +106,11 @@ var nicImageButton = nicEditorAdvancedButton.extend({
},
submit: function(e) {
+ if (!this.inputs['src'].value && this.inputs['file'].files[0]) {
+ // Upload the file, then continue from a callback
+ this.uploadFile();
+ return false;
+ }
var src = this.inputs['src'].value;
var gtId = /^#(\d+)(\s*-\s*)?(.*)/.exec(src);
var alt = '';
@@ -130,113 +159,54 @@ var nicImageButton = nicEditorAdvancedButton.extend({
align: this.inputs['align'].value
});
}
- }
-});
-
-nicEditors.registerPlugin(nicPlugin,nicImageOptions);
-
-/** nicUploadGT */
-
-/* START CONFIG */
-var nicUploadOptions = {
- buttons: {
- 'upload': {name: __('Upload Image'), type: 'nicUploadButton'}
- }
-
-};
-/* END CONFIG */
-
-var nicUploadButton = nicEditorAdvancedButton.extend({
- errorText: __('Failed to upload image'),
-
- addPane: function() {
- if(typeof window.FormData === "undefined") {
- return this.onError(__("Image uploads are not supported in this browser, use Chrome, Firefox, or Safari instead."));
- }
- this.im = this.ne.selectedInstance.selElm().parentTag('IMG');
-
- var container = new bkElement('div')
- .setStyle({ padding: '10px' })
- .appendTo(this.pane.pane);
-
- new bkElement('div')
- .setStyle({ fontSize: '14px', fontWeight: 'bold', paddingBottom: '5px' })
- .setContent(__('Insert an Image'))
- .appendTo(container);
-
- this.fileInput = new bkElement('input')
- .setAttributes({ type: 'file' })
- .appendTo(container);
-
- this.progress = new bkElement('progress')
- .setStyle({ width: '100%', display: 'none' })
- .setAttributes('max', 100)
- .appendTo(container);
-
- this.fileInput.onchange = this.uploadFile.closure(this);
- },
-
- onError: function(msg) {
- this.removePane();
- alert(msg || __("Failed to upload image"));
},
uploadFile: function() {
- var file = this.fileInput.files[0];
+ var file = this.inputs['file'].files[0];
if (!file || !file.type.match(/image.*/)) {
- this.onError(__("Only image files can be uploaded"));
+ alert(__("Only image files can be uploaded"));
return;
}
- this.fileInput.setStyle({ display: 'none' });
+ this.inputs['file'].setStyle({display: 'none'});
this.setProgress(0);
var fd = new FormData(); // https://hacks.mozilla.org/2011/01/how-to-develop-a-html5-image-uploader/
- fd.append("image", file);
- fd.append("key", "b7ea18a4ecbda8e92203fa4968d10660");
- var xhr = new XMLHttpRequest();
- xhr.open("POST", this.ne.options.uploadURI || this.nicURI);
+ fd.append("e_file", file);
+ fd.append("e_title", file.name);
+ var self = this;
+ var xhr = new XMLHttpRequest();
+ xhr.open("POST", GT.domain+'/file.php?action=save&format=json');
xhr.onload = function() {
- try {
- var res = JSON.parse(xhr.responseText);
- } catch(e) {
- return this.onError();
+ try { var res = JSON.parse(xhr.responseText); } catch(e) {}
+ if (res && (res.file || res.duplicate)) {
+ self.onUploaded(res);
+ } else {
+ alert(__('Error uploading file') + (res && res.error ? ': '+res.error : ''));
}
- this.onUploaded(res.upload);
- }.closure(this);
- xhr.onerror = this.onError.closure(this);
+ };
+ xhr.onerror = function(e) { alert(__('Error uploading file')+': '+e); };
xhr.upload.onprogress = function(e) {
- this.setProgress(e.loaded / e.total);
- }.closure(this);
+ self.setProgress(e.loaded / e.total);
+ };
xhr.send(fd);
},
- setProgress: function(percent) {
- this.progress.setStyle({ display: 'block' });
- if(percent < .98) {
- this.progress.value = percent;
- } else {
- this.progress.removeAttribute('value');
- }
+ onUploaded: function(r) {
+ var f = r.file||r.duplicate;
+ this.inputs['src'].value = '#'+f.id+' - '+f.title;
+ this.submit();
},
- onUploaded: function(options) {
- this.removePane();
- var src = options.links.original;
- if(!this.im) {
- this.ne.selectedInstance.restoreRng();
- var tmp = 'javascript:nicImTemp();';
- this.ne.nicCommand("insertImage", src);
- this.im = this.findElm('IMG','src', src);
+ setProgress: function(percent) {
+ var p = this.inputs['progress'];
+ p.setStyle({display: 'block'});
+ if(percent < .98) {
+ p.value = percent;
+ } else {
+ p.removeAttribute('value');
}
- var w = parseInt(this.ne.selectedInstance.elm.getStyle('width'));
- if(this.im) {
- this.im.setAttributes({
- src: src,
- width: (w && options.image.width) ? Math.min(w, options.image.width) : ''
- });
- }
- }
+ },
});
-nicEditors.registerPlugin(nicPlugin,nicUploadOptions);
+nicEditors.registerPlugin(nicPlugin,nicImageUploadGTOptions);
diff --git a/nicRu.js b/nicRu.js
index 9aabd60..b15d3c6 100644
--- a/nicRu.js
+++ b/nicRu.js
@@ -73,6 +73,8 @@ var nicRu = {
'Open in new window': 'Открывать в новом окне',
'Max Size': 'Макс. размер',
'To insert an image you must select uploaded file ID or enter the image URL!': 'Чтобы вставить картинку, либо выберите её из выпадающего списка (работают подсказки по названию), либо введите её прямой URL!',
+ 'Or upload': 'Или загрузить',
+ 'Select file': 'Выбрать файл',
'Upload Image': 'Загрузить картинку',
'Failed to upload image': 'Ошибка загрузки картинки',