/*
* Common støff
*/
Ext.lib.Ajax.defaultPostHeader = "application/x-www-form-urlencoded; charset=UTF-8";
Ext.BLANK_IMAGE_URL = "/util/ext-2.2/resources/images/default/s.gif";
Ext.namespace('Ext.gt');
var getEntity = function(recordDef, data, id) {
var fi = recordDef.prototype.fields.items;
for (var i = 0; i < fi.length; i++) {
var f = fi[i];
var v = data[f.name];
data[f.name] = f.convert((v !== undefined) ? v : f.defaultValue);
}
var r = new recordDef(data, id);
return r;
}
var getDocumentParent = function() {
var topWindow = window.parent;
while (topWindow.parent && topWindow.parent != topWindow) {
try {
if (topWindow.parent.document.domain != document.domain)
break;
if (topWindow.parent.document.getElementsByTagName('frameset').length > 0)
break;
} catch (e) {
break;
}
topWindow = topWindow.parent;
}
return {
window: topWindow,
document: topWindow.document
}
}
var getMimeIconFromMimetype = function(mimetype) {
var delimiter = mimetype.indexOf("/");
var commonType = mimetype.substring(0, delimiter);
var type = mimetype.substring(delimiter + 1);
var ret;
switch(type) {
case "pdf":
ret = "util/admin/images/mime/pdf.png";
break;
case "vnd.ms-word":
ret = "util/admin/images/mime/document.png";
break;
}
switch (commonType) {
case "audio":
ret = "util/admin/images/mime/audio.png";
break;
case "video":
ret = "util/admin/images/mime/video.png";
break;
case "image":
ret = "util/admin/images/mime/image.png";
break;
}
if (ret == null) {
ret = "util/admin/images/mime/unknown.png";
}
return ret;
}
var getSessionId = function() {
var retval = "";
var offset = document.cookie.indexOf("JSESSIONID=");
if (offset >= 0) {
var end = document.cookie.indexOf(";", offset);
if (end < 0) {
end = document.cookie.length;
}
retval = document.cookie.substring(offset + 11, end);
}
return retval;
}
var getAdminBaseUrl = function() {
var loc = window.location.pathname;
loc = loc.substring(0, loc.lastIndexOf("admin"));
return loc + "admin/";
}
var getServletBaseUrl = function() {
return "";
}
var servletBase = getServletBaseUrl();
var getApplicationBaseUrl = function() {
var loc = window.location.pathname;
loc = loc.substring(0, loc.indexOf("/", 1));
return loc;
}
var applicationBaseUrl = getApplicationBaseUrl();
var getQueryParam = function(name) {
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^]*)";
var regex = new RegExp( regexS );
var results = regex.exec( window.location.href );
if( results == null )
return "";
else
return results[1];
}
function checkFlashVersion() {
var x;
var pluginversion;
if(navigator.plugins && navigator.mimeTypes.length){
x = navigator.plugins["Shockwave Flash"];
if(x && x.description) x = x.description;
} else if (Ext.isIE){
try {
x = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
x = x.GetVariable("$version");
} catch(e){}
}
pluginVersion = (typeof(x) == 'string') ? parseInt(x.match(/\d+/)[0]) : 0;
return pluginVersion;
}
Ext.override(Ext.Toolbar, {
insertField : function(position, field){
var td = document.createElement("td");
this.tr.insertBefore(td, this.tr.childNodes[position]);
field.render(td);
var ti = new Ext.Toolbar.Item(td.firstChild);
ti.render(td);
this.items.insert(position, field);
return ti;
},
insertItem : function(position, item){
var td = document.createElement("td");
this.tr.insertBefore(td, this.tr.childNodes[position]);
item.render(td);
this.items.insert(position, item);
return item;
},
insertSeparator : function(position){
this.insertItem(position, new Ext.Toolbar.Separator());
},
insertSpacing : function(position){
this.insertItem(position, new Ext.Toolbar.Spacer());
},
insertFill : function(position){
this.insertItem(position, new Ext.Toolbar.Fill());
}
});
// http://extjs.com/learn/Tutorial:Extending_Ext2_Class
if (Ext.version && (Ext.version.substring(0, 3) == '2.2')) {
Ext.gt.IconCombo = Ext.extend(Ext.form.ComboBox, {
initComponent:function() {
Ext.apply(this, {
tpl: ''
+ ''
+ '{' + this.displayField + '}'
+ '
'
});
Ext.gt.IconCombo.superclass.initComponent.call(this);
},
onRender:function(ct, position) {
Ext.gt.IconCombo.superclass.onRender.call(this, ct, position);
this.wrap.applyStyles({position:'relative'});
this.el.addClass('x-icon-combo-input');
this.icon = Ext.DomHelper.append(this.el.up('div.x-form-field-wrap'), {
tag: 'div', style:'position:absolute'
});
},
setIconCls:function() {
var rec = this.store.query(this.valueField, this.getValue()).itemAt(0);
if(rec) {
this.icon.className = 'x-icon-combo-icon x-flag-' + rec.get(this.valueField);
}
},
setValue: function(value) {
Ext.gt.IconCombo.superclass.setValue.call(this, value);
this.setIconCls();
}
});
Ext.reg('iconcombo', Ext.gt.IconCombo);
}
var sessionKeepAlive = function(url, interval){
var fail = function() {
Ext.Msg.show({
title: "Logged out",
msg: "You have been logged out. Any changes made in the current document will be discarded. "
+ "Press OK to redirect to the login page. "
+ "Press Cancel to close this message (if you need to copy unsaved changes from the current document, before reloading manually).",
buttons: Ext.Msg.OKCANCEL,
icon: Ext.Msg.ERROR,
fn: function(btn) {
if (btn == 'ok') {
window.location.reload(true);
}
Ext.TaskMgr.stop(t);
}
});
}
var t = {
run: function() {
Ext.Ajax.request({
url: url,
success: function(res, o) {
if (res.responseText.indexOf("") < 0) {
fail();
}
},
failure: fail
});
},
interval: interval
}
Ext.TaskMgr.start(t);
}
if (Ext.ux.UploadForm) {
Ext.override(Ext.ux.UploadForm, {
getProgressTemplate : function(){
var tpl = new Ext.Template(
'
'
, '| ' + this.pgSizeText + ': | '
, '{bytes_uploaded}/{bytes_total} |
'
, '| ' + this.pgSpeedAvgText + ': | '
, '{speed_average} |
'
, '| ' + this.pgEtaText + ': | '
, '{est_sec} |
'
, '
'
);
tpl.compile();
return tpl;
}
});
}
if (Ext.gt.SWFUpload) {
Ext.override(Ext.gt.SWFUpload, {
getProgressTemplate : function(){
var tpl = new Ext.Template(
''
, '| ' + this.pgSizeText + ': | '
, '{bytes_uploaded}/{bytes_total} |
'
, '| ' + this.pgSpeedAvgText + ': | '
, '{speed_average} |
'
, '| ' + this.pgEtaText + ': | '
, '{est_sec} |
'
, '
'
);
tpl.compile();
return tpl;
}
});
}
var createUploader;
if (Ext.gt.SWFUpload || Ext.ux.UploadForm) {
createUploader = function(o) {
var iconPath = '/util/admin/images/';
var uploader;
if (checkFlashVersion() >= 9) {
uploader = new Ext.gt.SWFUpload({
autoScroll: true,
iconPath: iconPath,
flashPath: '/util/ext-2.2/ux/swfupload.swf',
fileSizeLimit: '0',
fileTypes: o.fileSelection,
fileTypesDescription: o.fileDescription,
uploadTarget: o.url + '/admin/blank.html;jsessionid=' + getSessionId(),
pgCfg: {
progressBar: true,
progressTarget: 'under'
}
});
uploader.on('beforeupload', function(form) {
var cmid;
if (o.scope) {
cmid = o.cmidCallback.call(o.scope);
} else {
cmid = o.cmidCallback();
}
form.setPostParams({
"TYPE": o.cmtype,
"ID": cmid,
"CHARACTER_ENCODING": "UTF8"
});
});
} else {
var id = Ext.id();
var el = Ext.DomHelper.append(document.body, {tag: 'div', id: id});
uploadForm = new Ext.ux.UploadForm(el, {
iconPath: iconPath,
uploadIcon: 'transmit_go.png',
clearIcon: 'cancel.png',
autoCreate: true,
url: o.url,
method: 'post',
maxNameLength: 30
, pgCfg: {
uploadIdName: 'ID'
, uploadIdValue: "-1"
, progressBar: true
, progressTarget: 'under'
, interval: 1000
, maxPgErrors: 20
, options: {
url: servletBase + '/openPage/admin/progress.html'
, method: 'post'
}
}
});
uploadForm.on('beforeaction', function(form) {
form.baseParams = {'TYPE': o.cmtype};
form.uploadId.value = o.cmidCallback.call(o.scope);
});
uploader = new Ext.Panel({
autoScroll: true,
autoHeight: true,
layout: 'fit',
contentEl: el
});
uploader.relayEvents(uploadForm, ['stopupload', 'fileadded', 'fileremoved', 'clearqueue']);
uploader.clearQueue = uploadForm.clearQueue.createDelegate(uploadForm);
uploader.startUpload = function() { uploadForm.startUpload(); }
uploadForm.uploadBtn.setText("Upload");
uploadForm.uploadBtn.getEl().replaceClass('x-btn-icon', 'x-btn-text-icon');
uploadForm.clearBtn.setText("Cancel");
uploadForm.clearBtn.getEl().replaceClass('x-btn-icon', 'x-btn-text-icon');
}
return uploader;
};
}
Ext.gt.ItemImages = function(config) {
this.cmtype = config.cmtype;
this.uploadButton = new Ext.Toolbar.Button({text: "Upload", icon: "/util/admin/images/image_add.png", cls: "x-btn-text-icon", handler: this.showUploadDialog, scope: this });
this.deleteButton = new Ext.Toolbar.Button({text: "Delete", icon: "/util/admin/images/image_delete.png", cls: "x-btn-text-icon", handler: this.deleteImages, scope: this });
Ext.apply(this, config, {
border: false,
store: new Ext.data.Store({
baseParams: {TYPE: this.cmtype},
proxy: new Ext.data.HttpProxy({url: servletBase + "/getItemImages/admin/jsonObjectsResult.html?objects=images"}),
reader: new Ext.data.JsonReader({
root: "images",
totalProperty: "results",
id: "IMAGE_ID"
}, Ext.gt.ItemImages.recordDef),
sortInfo: {field: 'IMAGE_SORT', direction: 'ASC'}
}),
autoExpandColumn: 'YARR',
enableDragDrop: true,
ddGroup: 'dd_' + Ext.id(),
columns: [
{header: 'Preview', width: 100, dataIndex: 'IMAGE_ID', renderer: this.renderPreview},
{header: 'Filename', width: 200, dataIndex: 'IMAGE_NAME'},
{header: 'Description', width: 300, dataIndex: 'IMAGE_DESCRIPTION', editor: new Ext.form.TextArea()},
{id: 'YARR', header: 'Long Description', width: 200, dataIndex: 'IMAGE_LONG_DESCRIPTION', editor: new Ext.form.TextArea()},
{header: '
', renderer: this.renderSlideShowToggle, width: 30, dataIndex: 'IMAGE_EXCLUDE_SLIDESHOW', menuDisabled: true, tooltip: "Doubleclick to toggle slideshow exclusion of this image"}
],
sm: new Ext.grid.RowSelectionModel({singleSelect: false}),
tbar: [this.uploadButton, this.deleteButton]
});
Ext.gt.ItemImages.superclass.constructor.call(this);
this.conn = new Ext.data.Connection();
this.queuedDeleteImages = 0;
this.cmid = -1;
this.uploader = createUploader({
cmtype: this.cmtype,
cmidCallback: function() {return this.cmid},
url: servletBase + "/insertItemImage",
fileSelection: "*.png;*.jpg;*.gif",
fileDescription: "Images",
scope: this
});
this.dialog = new Ext.Window({
closeAction: 'hide',
modal: true,
layout: 'fit',
title: 'Upload Images',
width: 400,
height: 300,
items: this.uploader
});
/* Event handlers */
this.uploader.on('stopupload', function() {
this.uploader.clearQueue();
this.refresh();
}, this);
this.uploader.on('clearqueue', function() {
this.dialog.hide();
}, this);
this.on('render', function() {
var dropTarget = new Ext.dd.DropTarget(this.getEl(), {
itemImages: this,
ddGroup: this.ddGroup,
notifyDrop: function(source, e, data) {
var sel = data.selections;
var rec = null;
var newSort = source.getDragData(e).rowIndex + 1;
if (sel.length > 0) {
rec = sel[0];
}
rec.set('IMAGE_SORT', newSort);
this.itemImages.updateMetadata({record: rec, field: 'IMAGE_SORT', value: newSort});
}
});
}, this);
this.on("celldblclick", function(p, row, cell) {
var r = this.store.getAt(row);
if (!r) return;
if (cell == 4) {
r.set("IMAGE_EXCLUDE_SLIDESHOW", r.get("IMAGE_EXCLUDE_SLIDESHOW") == 1 ? 0 : 1);
this.updateMetadata({record: r, field: "IMAGE_EXCLUDE_SLIDESHOW", value: r.get("IMAGE_EXCLUDE_SLIDESHOW")});
}
}, this);
this.on('afteredit', this.updateMetadata);
};
Ext.gt.ItemImages.recordDef = Ext.data.Record.create([
'IMAGE_ID', 'CM_TYPE', 'CM_ID', 'IMAGE_NAME', 'IMAGE_SIZE', 'IMAGE_MIME',
'IMAGE_DESCRIPTION', 'IMAGE_LONG_DESCRIPTION',
{name: 'IMAGE_SORT', type: 'int'},
{name: 'IMAGE_EXCLUDE_SLIDESHOW', type: 'int'}
]);
Ext.extend(Ext.gt.ItemImages, Ext.grid.EditorGridPanel, {
showUploadDialog: function() {
this.dialog.show(this.uploadButton.getEl());
},
deleteImageCallback: function() {
this.queuedDeleteImages--;
if (this.queuedDeleteImages == 0) {
this.getEl().unmask();
this.refresh();
}
},
deleteImage: function(imageId) {
var values = new Object();
values.ID = this.cmid;
values.TYPE = this.cmtype;
values.IMAGE_ID = imageId;
this.conn.request({
url: servletBase + "/deleteItemImage",
method: "post",
params: values,
success: this.deleteImageCallback,
scope: this,
failure: function(){
Ext.MessageBox.alert('Status', 'aaaaaaaaaaaaaaaaaaarh');
}
});
},
deleteImages: function() {
var selNodes = this.getSelectionModel().getSelections();
var ids = new Array();
for (var i = 0; i < selNodes.length; i++) {
ids.push(selNodes[i].id);
}
if (ids.length == 0) {
return;
}
Ext.Msg.confirm("Confirm delete", String.format("Confirm delete of {0} image(s)", ids.length), function(b) {
if (b != 'yes') {
return;
}
this.getEl().mask("Deleting images...");
this.queuedDeleteImages = ids.length;
for (var i = 0; i < ids.length; i++) {
this.deleteImage(ids[i]);
}
}, this);
},
renderPreview: function(val) {
return String.format('
', val, servletBase);
},
renderSlideShowToggle: function(val) {
if (val) {
return "
";
} else {
return "
";
}
},
updateMetadata: function(event) {
var rec = event.record;
var conn = new Ext.data.Connection();
var values = new Object();
values.IMAGE_ID = rec.id;
values[event.field] = event.value;
conn.request({
url: servletBase + "/updateImageMetadata",
method: "post",
params: values,
scope: this,
success: function(responseObject){
rec.commit();
if (event.field == 'IMAGE_SORT') {
this.getEl().child('.x-grid3-viewport .x-grid3-row-selected').frame('8db2e3');
this.refresh();
this.getSelectionModel().clearSelections();
}
},
failure: function(){
Ext.MessageBox.alert('Status', 'aaaaaaaaaaaaaaaaaaarh');
}
});
},
refresh: function(id) {
if (id) {
this.cmid = id;
}
this.store.load({params: {'ID': this.cmid}});
},
enable: function() {
this.uploadButton.enable();
this.deleteButton.enable();
},
disable: function() {
this.uploadButton.disable();
this.deleteButton.disable();
}
});
Ext.gt.ItemAttachments = function(config) {
this.cmtype = config.cmtype;
this.uploadButton = new Ext.Toolbar.Button({text: "Upload", icon: "/util/admin/images/tag_blue_add.png", cls: "x-btn-text-icon", handler: this.showUploadDialog, scope: this });
this.deleteButton = new Ext.Toolbar.Button({text: "Delete", icon: "/util/admin/images/tag_blue_delete.png", cls: "x-btn-text-icon", handler: this.deleteAttachments, scope: this });
Ext.apply(this, config, {
store: new Ext.data.Store({
baseParams: {TYPE: this.cmtype},
url: servletBase + "/getItemAttachments/admin/jsonObjectsResult.html?objects=attachments&LANGUAGE=ALL",
reader: new Ext.data.JsonReader({
root: "attachments",
totalProperty: "results",
id: "ATTACHMENT_ID"
}, Ext.gt.ItemAttachments.recordDef)
}),
border: false,
loadMask: true,
autoWidth: true,
autoExpandColumn: 'EXPANDCOL',
languageSwitcher: true,
columns: [
{header: "", dataIndex: 'ATTACHMENT_ORIGINAL_NAME', width: 125, renderer: this.renderItem},
{header: "Filename", dataIndex: 'ATTACHMENT_ORIGINAL_NAME', editor: new Ext.form.TextField(), width: 300},
{id: 'EXPANDCOL', header: "Description", dataIndex: 'ATTACHMENT_DESCRIPTION', editor: new Ext.form.TextArea(), width: 300}
],
sm: new Ext.grid.RowSelectionModel({singleSelect: false}),
tbar: [this.uploadButton, this.deleteButton]
});
if (this.languageSwitcher) {
this.columns.push({header: "Language", dataIndex: 'ATTACHMENT_LANGUAGE', editor: languageStore.getCombobox(), width: 200, renderer: this.renderLang });
}
Ext.gt.ItemAttachments.superclass.constructor.call(this);
this.cmid = -1;
this.queuedDelete = 0;
this.uploader = createUploader({
cmtype: this.cmtype,
cmidCallback: function() {return this.cmid},
url: servletBase + "/insertItemAttachment",
fileSelection: "*.*",
fileDescription: "All files",
scope: this
});
this.dialog = new Ext.Window({
closeAction: 'hide',
modal: true,
layout: 'fit',
title: 'Upload Attachments',
width: 400,
height: 300,
items: this.uploader
});
/* Event handlers */
this.uploader.on('stopupload', function() {
this.uploader.clearQueue();
this.refresh();
}, this);
this.uploader.on('clearqueue', function() {
this.dialog.hide();
}, this);
this.on('celldblclick', function(grid, row, col) {
if (col === 0) { // download for første kolonne
var rec = this.getSelectionModel().getSelected();
window.location.replace(servletBase + "/getAttachment?ATTACHMENT_ID=" + rec.get('ATTACHMENT_ID'));
}
}, this);
this.on('afteredit', function(event) {
var rec = event.record;
var conn = new Ext.data.Connection();
var values = new Object();
values.ATTACHMENT_ID = rec.get('ATTACHMENT_ID');
values[event.field] = event.value;
if (event.field == "ATTACHMENT_LANGUAGE" && event.value == "all") {
values[event.field] = '';
}
conn.request({
url: servletBase + "/updateAttachmentMetadata",
method: "post",
params: values,
success: function(responseObject){
rec.commit();
},
failure: function(){
Ext.MessageBox.alert('Status', 'aaaaaaaaaaaaaaaaaaarh');
}
});
}, this);
}
Ext.gt.ItemAttachments.recordDef = Ext.data.Record.create([
'ATTACHMENT_ID', 'CM_TYPE', 'CM_ID', 'ATTACHMENT_NAME', 'ATTACHMENT_ORIGINAL_NAME',
'ATTACHMENT_SIZE', 'ATTACHMENT_MIME', 'ATTACHMENT_LANGUAGE', 'ATTACHMENT_DESCRIPTION'
]);
Ext.extend(Ext.gt.ItemAttachments, Ext.grid.EditorGridPanel, {
deleteAttachmentCallback: function() {
this.queuedDelete--;
if (this.queuedDelete == 0) {
this.getEl().unmask();
this.refresh();
}
},
deleteAttachment: function(id) {
var values = new Object();
values.ID = this.cmid;
values.TYPE = this.cmtype;
values.ATTACHMENT_ID = id;
var conn = new Ext.data.Connection();
conn.request({
url: servletBase + "/deleteItemAttachment",
method: "post",
params: values,
success: this.deleteAttachmentCallback,
scope: this,
failure: function(){
Ext.MessageBox.alert('Status', 'aaaaaaaaaaaaaaaaaaarh');
}
});
},
deleteAttachments: function() {
var selected = this.getSelectionModel().getSelections();
if (selected.length == 0) {
return;
}
Ext.Msg.confirm("Confirm delete", String.format("Confirm delete of {0} attachment(s)", selected.length), function(b) {
if (b != 'yes') {
return;
}
this.getEl().mask("Deleteing attachments...");
this.queuedDelete = selected.length;
for (var i = 0; i < selected.length; i++) {
this.deleteAttachment(selected[i].id);
}
}, this);
},
showUploadDialog: function() {
this.dialog.show(this.uploadButton.getEl());
},
renderItem: function(val, cell, rec) {
var iconpath = '/' + getMimeIconFromMimetype(rec.data['ATTACHMENT_MIME']);
return String.format('
{1}
Size: {2}', iconpath, "Download", Ext.util.Format.fileSize(rec.data['ATTACHMENT_SIZE']));
},
renderLang: function(val, cell, rec) {
var r = languageStore.get(val);
if (r == null) return;
return String.format('{1}
', val, r.get('language'));
},
refresh: function(id) {
if (id) {
this.cmid = id;
}
this.store.load({params: {'ID': this.cmid}});
},
enable: function() {
this.uploadButton.enable();
this.deleteButton.enable();
},
disable: function() {
this.uploadButton.disable();
this.deleteButton.disable();
}
});