/************** Präsentationsmodi ******************/

var PRESENTATIONMODE = {}
PRESENTATIONMODE.CLEAR_LEFT = 'PM_CLRLEFT';
PRESENTATIONMODE.CLEAR_RIGHT = 'PM_CLRRIGHT';
PRESENTATIONMODE.FULL_IMAGE = 'PM_FULLIMG';
PRESENTATIONMODE.TEXT_LEFT = 'PM_TXTLEFT';
PRESENTATIONMODE.TEXT_ONLY = 'PM_TXTONLY';
PRESENTATIONMODE.TEXT_RIGHT = 'PM_TXTRIGHT';
PRESENTATIONMODE.KEEP_RIGHT_IMAGE = 'PM_KEEPRIMG';
PRESENTATIONMODE.KEEP_LEFT_IMAGE = 'PM_KEEPLIMG';
PRESENTATIONMODE.DEFAULT_MODE = PRESENTATIONMODE.FULL_IMAGE;
								
/*************** Verfügbare Sammelmappen *******************************/

/**
 * Eine Pseudo-Map mit dem Namen einer Sammelmappe als Key und dem Sammelmappenobjekt als Wert 
 */
var Binders = {};

/**
 * Fügt einen Sammelmappe hinzu
 * ACHTUNG: Falls bereits eine Sammelmappe unter dem geg. Namen vorhanden ist wird diese überschrieben
 * @param {Binder} binderObj Die hinzuzufügende Sammelmappe
 * @return void
 */
Binders.addBinder = function(binderObj) {
	this['BINDER$$$'+binderObj.getName()] = binderObj;
}

/**
 * Gibt die Sammelmappe anhand ihres Names zurück
 * @param {String} strBinderName Der name der gewünschten Sammelmappe
 * @return {Binder} Die Sammelmappe oder undefined falls nicht vorhanden
 */
Binders.getBinderByName = function(strBinderName) {
	return this['BINDER$$$'+strBinderName];
}

/**
 * Löscht eine Sammelmappe anhand ihres Names
 * @param {String} strBinderName der Name der zu löschenden Sammelmappe
 * @return void
 */
Binders.disposeBinderByName = function(strBinderName) {
	delete this['BINDER$$$'+strBinderName]; 
}

/**
 * Gibt ein Array mit allen Sammelmappen zurück
 * @return {Array} Ein Array mit allen Sammelmappenobjekten
 * @return void
 */
Binders.getAllBinders = function() {
	binders = new Array();
	for (strBinderName in this) {
		if (typeof(strBinderName)=='string' && typeof(this[strBinderName])=='object') {
			if (strBinderName.indexOf('BINDER$$$') == 0) {
				binders.push(this[strBinderName]);
			}
		}
	}
	return binders;
}

/**
 * Gibt die Anzahl der verfügbaren Sammelmappen zurück
 * @return {Number} Die Anzahl der verfügbaren Sammelmappen 
 */
Binders.getBinderCount = function() {
	binders = this.getAllBinders();
	return binders.length;
}

/****************** Sammelmappen ****************/

/**
 * Erstellt eine neue Sammelmappe
 * @constructor
 * @param {String} strName Eindeutiger Name der Mappe 
 */
var Binder = function(strName) {
	this.m_name = strName.toLowerCase();
	this.m_entries = new Array();
	this.m_isDirty = false;
	this.m_isLoaded = false;
}

/**
 * Gibt zurück ob der Binder geladen wurde oder nicht
 * @return {Boolean}
 */
Binder.prototype.getIsLoaded = function() {
	return this.m_isLoaded;
}

/**
 * Setzt ob der Binder geladen wurde oder nicht. Default: true
 * @param {Boolean} bIsLoaded
 * @return {void}
 */
Binder.prototype.setIsLoaded = function(bIsLoaded) {
	if (typeof(bIsLoaded)!='boolean') {
		bIsLoaded = true;
	}
	this.m_isLoaded = bIsLoaded; 
}

Binder.prototype.sendToServer = function() {
	if (this.getIsLoaded()) {
		var dnNode = DynDataNode.ROOTNODE.getNodeByPath(this.getName());
		if (dnNode) {
			if (dnNode.canWrite()) {
				var sBucketStr = this.getBucketSourceString();
				bb.command.trace(null, 'SEND (' + this.getName() + '): ' + sBucketStr);
				bb.command.load("/db/apsisa.dll/setDDNodeContent?fullNodePath=" + this.m_name + "&mimeType=text/xml", "POST", "nodeData=" + encodeURIComponent(sBucketStr), {'Content-Type':'application/x-www-form-urlencoded; charset=utf-8'}, null, null, null, null, null, true, null);
			}
		}
	}
} 

/**
 * Gibt den eindeutigen Namen dieser Sammelmappe zurück
 * @return {String} der eindeutge Name dieser Sammelmappe
 */
Binder.prototype.getName = function() {
	return this.m_name;
}

/**
 * Setzt den Änderungszustand dieser Sammelmappe auf geändert / nicht geändert
 * @param {Boolean} bIsDirty 
 */
Binder.prototype.setDirty = function(bIsDirty) {
	if (typeof(bIsDirty)=='boolean') {
		if (bIsDirty === true) {
			this.sendToServer();
		}
		this.m_isDirty = bIsDirty;	
	}
}

/**
 * Gibt zurück ob sich diese Sammelmappe geändert hat und gerendert werden muss
 * @return {Boolean} true wenn die Sammelmappe geändert und neu gerendert werden muss, anosnten false
 */
Binder.prototype.isDirty = function() {
	return this.m_isDirty;
}

/**
 * Gibt die Anzahl der Einträge zurück
 * @return {Number} Die Anzahl aller Einträge
 */
Binder.prototype.getEntryCount = function() {
	return this.m_entries.length;
}

/**
 * Gibt das Array mit allen Einträgen zurück
 * ACHTUNG: Änderungen am zurückgegebenen Array beinflussen die Sammelmappe
 * @return {Array} Das Array mit allen Einträgen
 */
Binder.prototype.getAllEntries = function() {
	return this.m_entries;
}

/**
 * Gibt den Eintrag zurück, der sich am geg. Index befindet
 * @param {Number} iIndex Der Index des zu holenden Eintrags
 * @return {BinderEntry} Den Eintrag, oder undefined wenn kein Eintrag am geg. Index vorhanden ist
 */
Binder.prototype.getEntryAtIndex = function(iIndex) {
	return this.m_entries[iIndex];
}

/**
 * Fügt einen neuen Eintrag am Ende hinzu
 * @param {BinderEntry} binderEntryObj Der hinzuzufügende Eintrag
 */
Binder.prototype.addEntryAtEnd = function(binderEntryObj) {
	this.addEntryAtIndex(binderEntryObj, this.m_entries.length)
}

/**
 * Fügt einen neuen Eintrag an erster Stelle ein
 * @param {BinderEntry} binderEntryObj Der hinzuzufügende Eintrag
 */
Binder.prototype.addEntryAtBeginning = function(binderEntryObj) {
	this.addEntryAtIndex(binderEntryObj, 0)
}

/**
 * Fügt einen Eintrag am geg. Index ein
 * @param {BinderEntry} binderEntryObj Der Eintrag
 * @param {Number} iIndex Index an dessen Position der Eintrag stehen soll.
 */
Binder.prototype.addEntryAtIndex = function(binderEntryObj, iIndex) {
	binderEntryObj.m_parentBinder = this;
	switch (iIndex) {
		case 0: {
			this.m_entries.unshift(binderEntryObj);
			break;
		}
		case this.m_entries.length:{
			this.m_entries.push(binderEntryObj);
			break;
		}
		default: {
			var beginning = this.m_entries.slice(0, iIndex);
			var between = binderEntryObj;
			var ending = this.m_entries.slice(iIndex);
			tmp = new Array();
			this.m_entries = tmp.concat(beginning, between, ending);
			delete tmp;
			break;
		}
	}
	this.setDirty(true);
	
}

/**
 * Löscht den Enitrag am geg. Index
 * @param {Number} iIndex des zu entferneden Elements
 */
Binder.prototype.removeEntryAtIndex = function(iIndex) {
	switch(iIndex) {
		case 0: {
			this.m_entries.shift();
			break;
		}
		case (this.m_entries.length-1): {
			this.m_entries.pop();
			break;
		}
		default: {
			this.m_entries.splice(iIndex, 1);
			break;
		}
	}
	this.setDirty(true);
}

/**
 * Löscht den letzten Eintrag in der Sammelmappe
 */
Binder.prototype.removeLastEntry = function() {
	this.removeEntryAtIndex(this.m_entries.length-1);
}

/**
 * Löscht den ersten Eintrag in der Sammelmappe
 */
Binder.prototype.removeFirstEntry = function() {
	this.removeEntryAtIndex(0);
}

/**
 * Gibt die XHTML/BTL/DTDL Darstellung dieser Sammelmappe als String zurück
 * @return {String} XHTML String
 */
Binder.prototype.getViewSourceString = function() {
	var strSrc = '<dia:resultsView id="view:' + this.getName() + '" mode="' + Cookie.get('binderview') + '" xmlns="http://www.w3.org/1999/xhtml" xmlns:c="http://www.backbase.com/2006/command" xmlns:b="http://www.backbase.com/2006/btl" xmlns:e="http://www.backbase.com/2006/xel" xmlns:dia="http://www.aps-info.de/2008/diathek">';
	for (var i=0; i<this.m_entries.length; i++) {
		var curEntry = this.m_entries[i];
		strSrc += curEntry.getViewSourceString();
	}
	strSrc += '</dia:resultsView>';
	return strSrc;
}

/**
 * Gibt die XHTML/BTL/DTL-Darstellung dieser Sammelmappe als DOM Knoten zurück
 * @return {Node} DOM Knoten mit der Darstellung dieser Sammelmappe
 */
Binder.prototype.getViewNode = function() {
	var dom = bb.xml.parse(this.getViewSourceString(), false);	
	return dom.documentElement;
}
Binder.prototype.getBucketSourceString = function() {
	var strSrc='<binder name="'+this.getName()+'">';
	for (var i=0; i<this.m_entries.length; i++) {
		var curEntry = this.m_entries[i];
		strSrc += curEntry.getBucketSourceString();
	}
	strSrc += '</binder>'
	return strSrc;
}

/**
 * Gibt den Index des übergebenen Eintrags innerhalb dieser Sammelmappe zurück
 * Wenn der Client die Funktion Array.indexOf unterstützt wird diese verwendet, ansonsten wird ein Vergleich über die GUID geführt 
 * @param {BinderEntry} binderEntryObj Der Eintrag, dess Index ermittelt werden soll
 * @return {Number} Der Index des übergebenen Eintrags, oder -1 wenn das Element nicht gefunden wurde
 */
Binder.prototype.indexOf = function(binderEntryObj) {
	var iIndex = -1;
	if (typeof(Array.indexOf) == 'function') {
		iIndex = this.m_entries.indexOf(binderEntryObj);
	}
	else {
		for (var i=0; i<this.m_entries.length && iIndex === -1; i++) {
			if (this.m_entries[i].getGUID() === binderEntryObj.getGUID()) {
				iIndex = i;
			}
		}
	}
	return iIndex;
}

/*************** Sammelmappeneinträge ***********/

var BinderEntry = function(pMode, sGUID) {
	this.m_media = new Array();
	this.m_docmeta = new Array();
	this.m_parentBinder = undefined;
	if (typeof(sGUID) != 'string') {
		sGUID = GUID.generate();
	}
	else if (!GUID.isValidGUID(sGUID)) {
		sGUID = GUID.generate();
	}
	this.m_GUID = sGUID;
	this.m_pMode = undefined;
	switch(pMode) {
		case PRESENTATIONMODE.CLEAR_LEFT:
		case PRESENTATIONMODE.CLEAR_RIGHT:
		case PRESENTATIONMODE.FULL_IMAGE:
		case PRESENTATIONMODE.TEXT_LEFT:
		case PRESENTATIONMODE.TEXT_ONLY:
		case PRESENTATIONMODE.TEXT_RIGHT:
		case PRESENTATIONMODE.KEEP_RIGHT_IMAGE:
		case PRESENTATIONMODE.KEEP_LEFT_IMAGE: {
			this.m_pMode = pMode;
			break;
		}
		default: {
			this.m_pMode = PRESENTATIONMODE.DEFAULT_MODE;
			break;
		}
	}
	
	GUIDtoBinderEntryMap[this.m_GUID] = this;
}
BinderEntry.prototype.getPresentationMode = function() {
	return this.m_pMode;
}
BinderEntry.prototype.setPresentationMode = function(pmode) {
	this.m_pMode = pmode;
}
BinderEntry.prototype.getGUID = function() {
	return this.m_GUID;
}
BinderEntry.prototype.getIndex = function() {
	var iIndex = -1;
	if (this.m_parentBinder) {
		var iIndex = this.m_parentBinder.indexOf(this);
	}
	return iIndex;
}
BinderEntry.prototype.getNext = function() {
	var nextEntry = undefined;
	if (this.m_parentBinder) {
		nextEntry = this.m_parentBinder.getEntryAtIndex(this.getIndex()+1);
	}
	return nextEntry;
}
BinderEntry.prototype.getPrevious = function() {
	var prevEntry = undefined;
	if (this.m_parentBinder) {
		prevEntry = this.m_parentBinder.getEntryAtIndex(this.getIndex()-1);
	}
	return prevEntry;
}
BinderEntry.prototype.addMedium = function(mediumObj) {
	mediumObj.m_parentEntry = this;
	this.m_media.push(mediumObj);
	if (this.m_parentBinder) {
		this.m_parentBinder.setDirty(true);
	}
}

/**
 * Gibt die Sammelmappe zurück in der diser Eintrag ist, oder undefined, wenn der Eintrag in keiner Sammelmappe steck
 * @return {Binder} die Sammelmappe zurück in der diser Eintrag ist, oder undefined, wenn der Eintrag in keiner Sammelmappe steck
 */
BinderEntry.prototype.getBinder = function() {
	return this.m_parentBinder;
}

/**
 * Fügt ein DocMeta Feld hinzu
 * @param {DocMetaField} dmObj Das hinzuzufügende DocMeta Feld
 */
BinderEntry.prototype.addDocMetaField = function(dmObj) {
	dmObj.m_parentEntry = this;
	this.m_docmeta.push(dmObj);
	if (this.m_parentBinder) {
		this.m_parentBinder.setDirty(true);
	}
}
BinderEntry.prototype.getMedia = function(){
	return this.m_media;
}
BinderEntry.prototype.getMediumByName = function(strMedName) {
	var resMed = undefined;
	for (var i=0; i<this.m_media.length && resMed == undefined; i++) {
		var curMedium = this.m_media[i];
		if (curMedium.getName() === strMedName) {
			resMed = curMedium;
		}
	}
	return resMed;
}
BinderEntry.prototype.getDocMetaTextFields = function(){
	var dmTexts = new Array();
	for (var i=0; i<this.m_docmeta.length; i++) {
		var curDM = this.m_docmeta[i];
		if (curDM.getType()=='text') {
			dmTexts.push(curDM);
		}
	}
	return dmTexts;
}

BinderEntry.prototype.getDocMetaUserText = function() {
	var dmDesc = undefined;
	for (var i=0; i<this.m_docmeta.length && dmDesc == undefined; i++) {
		var curDM = this.m_docmeta[i];
		if (curDM.getType()=='usertext') {
			dmDesc = curDM;
		}
	}
	
	// Kompatibilität zu alten Bindern
	if (typeof(dmDesc) == 'undefined') {
		dmDesc = new DocMetaField('', 'usertext', '');
		this.addDocMetaField(dmDesc);		
	}
	return dmDesc;
}


BinderEntry.prototype.getDocMetaDescription = function() {
	var dmDesc = undefined;
	for (var i=0; i<this.m_docmeta.length && dmDesc == undefined; i++) {
		var curDM = this.m_docmeta[i];
		if (curDM.getType()=='description') {
			dmDesc = curDM;
		}
	}
	return dmDesc;
}
BinderEntry.prototype.getDocMetaObjectID = function() {
	var dmObjId = undefined;
	for (var i=0; i<this.m_docmeta.length && dmObjId == undefined; i++) {
		var curDM = this.m_docmeta[i];
		if (curDM.getType()=='objectid') {
			dmObjId = curDM;
		}
	}
	return dmObjId;
}
BinderEntry.prototype.getDocMetaTitle = function() {
	var dmTitle = undefined;
	for (var i=0; i<this.m_docmeta.length && dmTitle == undefined; i++) {
		var curDM = this.m_docmeta[i];
		if (curDM.getType()=='title') {
			dmTitle = curDM;
		}
	}
	return dmTitle;
}
BinderEntry.prototype.getDocMetaSubtitle = function() {
	var dmSubT = undefined;
	for (var i=0; i<this.m_docmeta.length && dmSubT == undefined; i++) {
		var curDM = this.m_docmeta[i];
		if (curDM.getType()=='subtitle') {
			dmSubT = curDM;
		}
	}
	return dmSubT;
}
BinderEntry.prototype.remove = function() {
	if (this.m_parentBinder) {
		this.m_parentBinder.removeEntryAtIndex(this.getIndex());
	}
}
BinderEntry.prototype.moveToFirstPosition = function() {
	if (this.m_parentBinder) {
		var iIndex = this.getIndex();
		if (iIndex > 0) {
			this.m_parentBinder.removeEntryAtIndex(iIndex);
			this.m_parentBinder.addEntryAtBeginning(this);
		}
	}
}
BinderEntry.prototype.moveOneToLeft = function() {
	if (this.m_parentBinder) {
		var iIndex = this.getIndex();
		if (iIndex > 0) {
			this.m_parentBinder.removeEntryAtIndex(iIndex);
			this.m_parentBinder.addEntryAtIndex(this, iIndex-1);
		}
	}
}
BinderEntry.prototype.moveOneToRight = function() {
	if (this.m_parentBinder) {
		var iIndex = this.getIndex();
		if (iIndex < (this.m_parentBinder.getEntryCount()-1)) {
			bEntryWasMoved = true;
			this.m_parentBinder.removeEntryAtIndex(iIndex);
			this.m_parentBinder.addEntryAtIndex(this, iIndex+1);
		}
	}
}
BinderEntry.prototype.moveToLastPosition = function() {
	if (this.m_parentBinder) {
		var iIndex = this.getIndex();
		if (iIndex < (this.m_parentBinder.getEntryCount()-1)) {
			bEntryWasMoved = true;
			this.m_parentBinder.removeEntryAtIndex(iIndex);
			this.m_parentBinder.addEntryAtEnd(this);
		}
	}
}
BinderEntry.prototype.moveToPosition = function(iTargetIndex) {
	if (this.m_parentBinder) {
		var iIndex = this.getIndex();
		if (iIndex != iTargetIndex) {
			bEntryWasMoved = true;
			this.m_parentBinder.removeEntryAtIndex(iIndex);
			this.m_parentBinder.addEntryAtIndex(this, iTargetIndex);
		}
	}
}
BinderEntry.prototype.moveToBinder = function(binderObj) {
	this.remove();
	binderObj.addEntryAtEnd(this);
}

BinderEntry.prototype.getViewSourceString = function(){
	var strSrc = '<dia:resultViewItem e:behavior="b:drag" dragMode="symbol" dropMode="none" dragSymbol="." dragItem="dia-binderentry" b:dragReceive="dia-binderentry" xmlns="http://www.w3.org/1999/xhtml" xmlns:c="http://www.backbase.com/2006/command" xmlns:b="http://www.backbase.com/2006/btl" xmlns:e="http://www.backbase.com/2006/xel" xmlns:dia="http://www.aps-info.de/2008/diathek">';
	strSrc += '<e:handler event="dragDrop" type="application/javascript">';
	strSrc += 'var srcEntry = event.dragInitiator.getProperty("m_binderEntry");';
	strSrc += 'var tgtIndex = ' + this.getIndex() + ';';
	strSrc += 'srcEntry.moveToPosition(tgtIndex);'
	strSrc += '</e:handler>';
	
	strSrc += '<e:handler event="construct" type="application/javascript" propagate="stop">';
	strSrc += 'this.setProperty("m_binderEntry", GUIDtoBinderEntryMap["' + this.m_GUID + '"]);';
	strSrc += '</e:handler>';
	strSrc += '<dia:media b:dragReceive="dia-binderentry">';
	strSrc += '<e:handler event="dragDrop" type="application/javascript">';
	strSrc += 'var srcEntry = event.dragInitiator.getProperty("m_binderEntry");';
	strSrc += 'var tgtIndex = ' + this.getIndex() + ';';
	strSrc += 'srcEntry.moveToPosition(tgtIndex);'
	strSrc += '</e:handler>';
	for (var i = 0; i < this.m_media.length; i++) {
		var curMedium = this.m_media[i];
		strSrc += curMedium.getViewSourceString();
	}
	strSrc += '</dia:media>';
	strSrc += '<dia:docmeta b:dragReceive="dia-binderentry">';
	strSrc += '<e:handler event="dragDrop" type="application/javascript">';
	strSrc += 'var srcEntry = event.dragInitiator.getProperty("m_binderEntry");';
	strSrc += 'var tgtIndex = ' + this.getIndex() + ';';
	strSrc += 'srcEntry.moveToPosition(tgtIndex);'
	strSrc += '</e:handler>';
	for (var i = 0; i < this.m_docmeta.length; i++) {
		var curDMField = this.m_docmeta[i];
		strSrc += curDMField.getViewSourceString();
	}
	strSrc += '</dia:docmeta>';
	
	strSrc += '<dia:imageMenu b:dragReceive="dia-binderentry">';
	strSrc += '<e:handler event="dragDrop" type="application/javascript">';
	strSrc += 'var srcEntry = event.dragInitiator.getProperty("m_binderEntry");';
	strSrc += 'var tgtIndex = ' + this.getIndex() + ';';
	strSrc += 'srcEntry.moveToPosition(tgtIndex);'
	strSrc += '</e:handler>';
	
	strSrc += '<dia:imageMenuEntry icon="movefirst"';
	if (this.m_parentBinder) {
		if (this.getIndex() == 0) {
			strSrc += ' disabled="true"';
		}
	}
	strSrc += '>';
	
	
	strSrc += '<e:handler event="click" propagate="stop" type="application/xml">';
	strSrc += '<e:call function="moveEntryToFirstPosition">';
	strSrc += '<e:with-argument name="binderEntry" select="javascript:GUIDtoBinderEntryMap[\'' + this.m_GUID + '\']"/>'
	strSrc += '</e:call>';
	strSrc += '<e:call function="repaintDirtyBinders"/>';
	strSrc += '</e:handler>';
	strSrc += '</dia:imageMenuEntry>';
	
	strSrc += '<dia:imageMenuEntry icon="moveleft"';
	if (this.m_parentBinder) {
		if (this.getIndex() == 0) {
			strSrc += ' disabled="true"';
		}
	}
	strSrc += '>';
	strSrc += '<e:handler event="click" propagate="stop" type="application/xml">';
	strSrc += '<e:call function="moveEntryLeft">';
	strSrc += '<e:with-argument name="binderEntry" select="javascript:GUIDtoBinderEntryMap[\'' + this.m_GUID + '\']"/>'
	strSrc += '</e:call>';
	strSrc += '<e:call function="repaintDirtyBinders"/>';
	strSrc += '</e:handler>'; 
	strSrc += '</dia:imageMenuEntry>';
	
	strSrc += '<dia:imageMenuEntry icon="moveright"';
	if (this.m_parentBinder) {
		if (this.getIndex() == (this.m_parentBinder.getEntryCount()-1)) {
			strSrc += ' disabled="true"';
		}
	}
	strSrc += '>';
	strSrc += '<e:handler event="click" propagate="stop" type="application/xml">';
	strSrc += '<e:call function="moveEntryRight">';
	strSrc += '<e:with-argument name="binderEntry" select="javascript:GUIDtoBinderEntryMap[\'' + this.m_GUID + '\']"/>'
	strSrc += '</e:call>';
	strSrc += '<e:call function="repaintDirtyBinders"/>';
	strSrc += '</e:handler>'; 
	strSrc += '</dia:imageMenuEntry>';
	
	strSrc += '<dia:imageMenuEntry icon="movelast"';
	if (this.m_parentBinder) {
		if (this.getIndex() == (this.m_parentBinder.getEntryCount()-1)) {
			strSrc += ' disabled="true"';
		}
	}
	strSrc += '>';
	strSrc += '<e:handler event="click" propagate="stop" type="application/xml">';
	strSrc += '<e:call function="moveEntryToLastPosition">';
	strSrc += '<e:with-argument name="binderEntry" select="javascript:GUIDtoBinderEntryMap[\'' + this.m_GUID + '\']"/>'
	strSrc += '</e:call>';
	strSrc += '<e:call function="repaintDirtyBinders"/>';
	strSrc += '</e:handler>'; 
	strSrc += '</dia:imageMenuEntry>';
	
	strSrc += '<dia:imageMenuEntry icon="delete">';
	strSrc += '<e:handler event="click" propagate="stop" type="application/xml">';
	strSrc += '<e:call function="deleteEntry">';
	strSrc += '<e:with-argument name="binderEntry" select="javascript:GUIDtoBinderEntryMap[\'' + this.m_GUID + '\']"/>'
	strSrc += '</e:call>';
	strSrc += '<e:call function="repaintDirtyBinders"/>';
	strSrc += '</e:handler>';
	strSrc += '</dia:imageMenuEntry>';
	
	strSrc += '<dia:imageMenuEntry icon="edit">';
	strSrc += '<e:handler event="click" propagate="stop" type="application/xml">';
	strSrc += '<e:call function="editEntryNew">';
	strSrc += '<e:with-argument name="binderEntry" select="javascript:GUIDtoBinderEntryMap[\'' + this.m_GUID + '\']"/>'
	strSrc += '</e:call>';
	strSrc += '<e:call function="repaintDirtyBinders"/>';
	strSrc += '</e:handler>';
	strSrc += '</dia:imageMenuEntry>';
	
	strSrc += '<dia:imageMenuEntry icon="zoom"';
	if (this.getMediumByName('zoomImage')==undefined || this.getMediumByName('zoomImage')=='') {
		strSrc += ' disabled="true"';
	}
	strSrc += '>';
	strSrc += '<e:handler event="click" propagate="stop" type="application/xml">';
	strSrc += '<e:call function="zoomEntry">';
	strSrc += '<e:with-argument name="binderEntry" select="javascript:GUIDtoBinderEntryMap[\'' + this.m_GUID + '\']"/>'
	strSrc += '</e:call>';
	strSrc += '<e:call function="repaintDirtyBinders"/>';
	strSrc += '</e:handler>';
	strSrc += '</dia:imageMenuEntry>';
	
	strSrc += '</dia:imageMenu>';
	strSrc += '</dia:resultViewItem>';
	return strSrc;
}
BinderEntry.prototype.getViewNode = function() {
	var dom = bb.xml.parse(this.getViewSourceString(), false);	
	return dom.documentElement;
}
BinderEntry.prototype.getBucketSourceString = function() {
	var strSrc = '<entry GUID="' + this.getGUID() + '" pMode="' + this.m_pMode + '">';
	strSrc += '<media>'
	for (var i=0; i<this.m_media.length; i++) {
		strSrc += this.m_media[i].getBucketSourceString();
	}
	strSrc += '</media>'
	strSrc += '<docmeta>'
	for (var i=0; i<this.m_docmeta.length; i++) {
		strSrc += this.m_docmeta[i].getBucketSourceString();
	}
	strSrc += '</docmeta>'
	strSrc += '</entry>';
	return strSrc;
}
BinderEntry.prototype.toString = function() {
	return this.getGUID();
}

/************ Medien i. Sammelmappeneinträgen *******/

var Medium = function(strName, strURL) {
	this.m_name = strName;
	this.m_url = strURL;
	this.m_mimeType = this.getMimeType();
	this.m_parentEntry = undefined;
}
Medium.prototype.getName = function() {
	return this.m_name;
}
Medium.prototype.getURL = function() {
	return this.m_url;
}
Medium.prototype.setName = function(strMediumName) {
	this.m_name = strMediumName;
	if (this.m_parentEntry) {
		if (this.m_parentEntry.getBinder()) {
			this.m_parentEntry.getBinder().setDirty(true);
		}
	}
}
Medium.prototype.setURL = function(strMediumUrl) {
	this.m_url = strMediumUrl;
	this.m_mimeType = this.getMimeType();
	if (this.m_parentEntry) {
		if (this.m_parentEntry.getBinder()) {
			this.m_parentEntry.getBinder().setDirty(true);
		}
	}
}
Medium.prototype.getMimeType = function() {
	if (this.m_mimeType == undefined) {
		var resultingMimeType = undefined;
		var mySuffix = undefined;
		if (this.m_url.lastIndexOf(".") > 0) {
			mySuffix = this.m_url.substr(this.m_url.lastIndexOf("."));
		}
		if (mySuffix != undefined != undefined) {
			for (var i = 0; i < navigator.mimeTypes.length && resultingMimeType == undefined; i++) {
				var curMimeType = navigator.mimeTypes[i];
				var curMimeTypeSuffixes = curMimeType.suffixes;
				if (curMimeTypeSuffixes.search(mySuffix) >= 0) {
					resultingMimeType = curMimeType.type;
				}
			}
			if (resultingMimeType == undefined) {
				switch (mySuffix.toLowerCase()) {
					case '.bmp': {
						resultingMimeType = 'image/bmp';
					}
					case '.jpg':
					case '.jpe':
					case '.jpeg':{
						resultingMimeType = 'image/jpeg';
						break;
					}
					case '.gif':{
						resultingMimeType = 'image/gif';
						break;
					}
					case '.png':{
						resultingMimeType = 'image/png';
						break;
					}
					case '.tif':
					case '.tiff:':{
						resultingMimeType = 'image/tiff';
						break;
					}
				}
			}
		}
		this.m_mimeType = resultingMimeType;
	}
	return this.m_mimeType;
}
Medium.prototype.getViewSourceString= function() {
	var xmlWriter = new XMLWriter();

	var attribs = new Array(
		new XMLAttribute("src", this.getURL()),
		new XMLAttribute("xmlns", "http://www.w3.org/1999/xhtml"),
		new XMLAttribute("xmlns:c", "http://www.backbase.com/2006/command"),
		new XMLAttribute("xmlns:b", "http://www.backbase.com/2006/btl"),
		new XMLAttribute("xmlns:e", "http://www.backbase.com/2006/xel"),
		new XMLAttribute("xmlns:dia", "http://www.aps-info.de/2008/diathek")
	);
	
	if (this.m_parentEntry) {
		attribs.push(new XMLAttribute("b:dragReceive", "dia-binderentry"));
	}
	
	xmlWriter.writeStartElement('dia:'+this.getName(), attribs);

	 
	if (this.m_parentEntry) {
		xmlWriter.writeStartElement('e:handler',
		[
			new XMLAttribute('event', 'dragDrop'),
			new XMLAttribute('type', 'application/javascript')
		]
		);
		xmlWriter.writeEncodedCharacters('var srcEntry = event.dragInitiator.getProperty("m_binderEntry");')
		xmlWriter.writeEncodedCharacters('var tgtIndex = ' + this.m_parentEntry.getIndex() + ';')
		xmlWriter.writeEncodedCharacters('srcEntry.moveToPosition(tgtIndex);');
		xmlWriter.writeEndElement();
	}
	
	xmlWriter.writeEndElement();
	xmlWriter.writeEndDocument();
	return xmlWriter.getDocumentAsString();
}
Medium.prototype.getViewNode = function() {
	var dom = bb.xml.parse(this.getViewSourceString(), false);	
	return dom.documentElement;
}
Medium.prototype.getBucketSourceString = function() {
	return '<medium name="' + this.getName() + '" mimetype="' + this.getMimeType() +'" url="' + this.getURL() + '"/>'; 
}

/*********** Meta-Infos in Sammelmappen *****/

var DocMetaField = function(strName, strType, strValue) {
	if (typeof(strValue)!='string') {
		strValue = '';
	}
	this.m_name = strName;
	this.m_value = strValue;
	this.m_type = strType;
	this.m_parentEntry = undefined;
}
DocMetaField.prototype.getType = function() {
	return this.m_type;
}
DocMetaField.prototype.getName = function() {
	return this.m_name;
}
DocMetaField.prototype.getValue = function() {
	var value = '';
	if (this.getType() == 'text' || this.getType() == 'description'|| this.getType() == 'usertext'){
		value = this.m_value; 	
	}
	else if (this.m_value.length > 0) {
		var div = document.createElement('div');
		var textNode = document.createTextNode(this.m_value);
		div.appendChild(textNode);
		value = div.innerHTML;
	}
	return value;
}
DocMetaField.prototype.setValue = function(strDMFieldValue) {
	this.m_value = strDMFieldValue;
	if (this.m_parentEntry) {
		if (this.m_parentEntry.getBinder()) {
			this.m_parentEntry.getBinder().setDirty(true);
		}
	}
	
}
DocMetaField.prototype.setName = function(strDMFieldName) {
	this.m_name = strDMFieldName;
	if (this.m_parentEntry) {
		if (this.m_parentEntry.getBinder()) {
			this.m_parentEntry.getBinder().setDirty(true);
		}
	}
}
DocMetaField.prototype.getViewSourceString = function() {
	var xmlWriter = new XMLWriter();
	var xmlAttribs = new Array(
		new XMLAttribute('name', this.getName()),
		new XMLAttribute('type', this.getType()),
		new XMLAttribute('xmlns', 'http://www.w3.org/1999/xhtml'),
		new XMLAttribute('xmlns:c', 'http://www.backbase.com/2006/command'),
		new XMLAttribute('xmlns:e', 'http://www.backbase.com/2006/xel'),
		new XMLAttribute('xmlns:b', 'http://www.backbase.com/2006/btl'),
		new XMLAttribute('xmlns:dia', 'http://www.aps-info.de/2008/diathek')
	);

	if (this.m_parentEntry) {
		xmlAttribs.push(new XMLAttribute('b:dragReceive', 'dia-binderentry'));
	}
	xmlWriter.writeStartElement('dia:dm', xmlAttribs);
	if (this.m_parentEntry) {
		xmlWriter.writeStartElement('e:handler',
		[
			new XMLAttribute('event', 'dragDrop'),
			new XMLAttribute('type', 'application/javascript')
		]
		);
		xmlWriter.writeEncodedCharacters('var srcEntry = event.dragInitiator.getProperty("m_binderEntry");')
		xmlWriter.writeEncodedCharacters('var tgtIndex = ' + this.m_parentEntry.getIndex() + ';')
		xmlWriter.writeEncodedCharacters('srcEntry.moveToPosition(tgtIndex);');
		xmlWriter.writeEndElement();
		
	}
	/**
	xmlWriter.writeStartElement('e:handler',
	[
		new XMLAttribute('event', 'DOMNodeInsertedIntoDocument'),
		new XMLAttribute('propagate', 'stop'),
		new XMLAttribute('type', 'application/javascript')
	]
	);
	xmlWriter.writeCDATASection("this.viewNode.innerHTML = '"+this.getValue().replace(/\\n/g,"")+"';");
	xmlWriter.writeEndElement();
	*/
	xmlWriter.writeCharacters(this.getValue());
	xmlWriter.writeEndElement();
	xmlWriter.writeEndDocument();
	return xmlWriter.getDocumentAsString();
}
DocMetaField.prototype.getViewNode = function() {
	var dom = bb.xml.parse(this.getViewSourceString(), false);	
	return dom.documentElement;
}
DocMetaField.prototype.getBucketSourceString = function() {
	var strSrc = '<dm name="' + this.getName() + '" type="' + this.getType() + '">';
	if (this.getType()=='text'||this.getType()=='description'||this.getType()=='usertext') {
		strSrc += this.getValue();
	}
	else {
		strSrc += this.getValue();
	}
	strSrc += '</dm>';
	return strSrc;
}

/*****************************************************************/

var GUIDtoBinderEntryMap = {};

