dojo.provide("epages.cartridges.de_epages.mediagallery.widget.Mediagallery");
dojo.require("epages.widget.LocalizedWidget");
dojo.require("epages.widget.Dialog");
dojo.require('epages.cartridges.de_epages.mediagallery.widget.Filebrowser');
dojo.require("epages.cartridges.de_epages.mediagallery.widget.GallerySizeUsage");

dojo.require('epages.string');
dojo.require('epages.html');
dojo.require('epages.browser');

dojo.declare (
	"epages.cartridges.de_epages.mediagallery.widget.Mediagallery",
	[epages.widget.LocalizedWidget],
	{
		/**
		 * public properties
		 */
		onApply         : '',					// onApply function
		applyButtonLabel: '',					// label of apply button

		// pass properties to filebrowser widget
		siteId          : epages.vars.SiteID,				// epages SiteID
		url             : '?',											// request url
		directory       : 'MediaGallery',						// base directory
		multiSelect     : 'true',										// multi item selection on or off
		validFileTypes  : "",												// show only files with these file extensions
		imageDB         : epages.vars.ImageDbRoot,	// url to image database
		opener          : '',												// string to define from where it was opend, passed to the Filebrowser

		// pass properties to gallery size usage widget
		maxGallerySize      : '',
		currentGallerySize  : '',



		/**
		 * private properties
		 */
		_applyButtonDisabled: true,				// flag: indicates wether the apply button is disabled or not
		_applyButtonActive  : false,			// flag: indicates wether the apply button is active (highlighted) or not

		/**
		 * widget properties
		 */

		templatePath     : dojo.moduleUrl('epages.cartridges.de_epages.mediagallery.widget','templates/Mediagallery.html'),
		translationName  : dojo.moduleUrl('epages.cartridges.de_epages.mediagallery.widget','templates/translation'),
		widgetsInTemplate:true,

		/**
		 * widget life cycle
		 */
		postMixInProperties: function() {
		// summary: initalize values - adjust properites
			this.inherited("postMixInProperties", arguments);
		},

		postCreate: function() {
		// summary: initalize widget - append events, adjust properites
			this.inherited("postCreate", arguments);
			this.multiSelect = epages.string.toBoolean(this.multiSelect);
			this._appendEvents();
			this._initButtonBar();

			// remove the dialog title
			this.dialogWidget.titleBar.removeAttribute("title");

			// gallery usage updater
			this.gallerySizeUsage.updateUsage(this.fileBrowserWidget.galleryUsage);
		},

		_initButtonBar: function() {
		// summary: move buttons into dialog widget, init apply button
			if(this.applyButtonLabel !=""){
				this.applyButtonLabelNode.firstChild.data = this.applyButtonLabel;
			}
			if(dojo.hasClass(this.applyButtonNode,'Active')){
				this._applyButtonActive = true;
			}
			this._doDisableApplyButton(true);

			// move buttons into the Dialogs button bar
			this.dialogWidget.buttonBarNode.appendChild(this.buttonsNode);
			this.dialogWidget.buttonBarNode.style.display = "block";

			if (this.onApply == ''){
				this._hideApplyButton();
			}else{
				this._showApplyButton();
			}

			var bNode = this.buttonsNode; // silly workaround for msie (force rendering again)
			bNode.style.display="none";
			window.setTimeout(function() {bNode.style.display="block";}, 10);
		},

		_appendEvents: function() {
		// summary: append button events, subscribe to filetree and imagedb
			// events
			this.connect(this.applyButtonNode, 'onclick', '_OnApply');
			this.connect(this.cancelButtonNode, 'onclick', 'hide');

			// subscriptions
			dojo.subscribe(this.id+'_Filebrowser/fileTreeNodeSelected', this, '_enableApplyButton');			// on select folder -> show apply button
			//dojo.subscribe(this.id+'_Filebrowser/imageDBSelected', this, '_disableApplyButton');					// on select imageDB -> hide apply button
			dojo.subscribe('Mediagallery/hide',this,'hide');
			dojo.subscribe('Mediagallery/disableApplyButton',this,'_disableApplyButton');
			dojo.subscribe('Mediagallery/enableApplyButton',this,'_enableApplyButton');

			// propagate upload/delete/create events
			dojo.subscribe(this.id+'_Filebrowser/updateCurrentBytes', this, function(kilobytes) {
				dojo.publish(this.gallerySizeUsage.id+'/updateCurrentBytes', [kilobytes]);
			});
		},

		/**
		 * getter, setter and other public functions
		 */

		hide: function() {
		// summary: hide dialog widget
			this.dialogWidget.hide();
		},

		show: function() {
		// summary: show dialog widget
			this.dialogWidget.show();
		},

		changeOpener: function(opener){
			if(opener){
				this.opener = opener;
				this.fileBrowserWidget.changeOpener(opener);
			}
		},

		setOnApply: function(/* function */ onApply) {
		// summary: setter for onApply function
			if(onApply != '' && onApply != null && onApply !== undefined) {
				this.onApply=onApply;
				this._showApplyButton();
			} else {
				// reset on invalid onApply value
				this.onApply='';
				this._hideApplyButton();
			}
		},

		setFileTypes: function(/* String */ fileTypes) {
			// summary: updates the list of allowed file extensions
			if(typeof(fileTypes) === "string" && (this.validFileTypes != fileTypes)) {
				this.validFileTypes = fileTypes;
				this.fileBrowserWidget.setFileTypes(this.validFileTypes);
			}
		},

		/**
		* widget button/ display functions
		*/

		_showApplyButton: function() {
		// summary: show and enable apply button
			dojo.removeClass(this.applyButtonNode, "HideElementSoft");
			this._doDisableApplyButton(false);
		},

		_hideApplyButton: function() {
		// summary: hide and disable apply button
			dojo.addClass(this.applyButtonNode, "HideElementSoft");
			this._doDisableApplyButton(true);
		},

		_disableApplyButton: function() {
		// summary: disable apply button
			this._doDisableApplyButton(true);
		},

		_enableApplyButton: function() {
		// summary: enable apply button
			this._doDisableApplyButton(false);
		},

		_doDisableApplyButton: function(/* boolean */ doDisable) {
		// summary: disable or enable apply button
			this._applyButtonDisabled = doDisable;
			if(doDisable){
				dojo.addClass(this.applyButtonNode, "Disabled");
				if(this._applyButtonActive){ 
					dojo.removeClass(this.applyButtonNode, "Active");
				}
			} else {
				dojo.removeClass(this.applyButtonNode, "Disabled");
				if(this._applyButtonActive){ 
					dojo.addClass(this.applyButtonNode, "Active");
				}
			}
		},

		_OnApply: function(evt) {
		// summary: call callback function onApply and pass selected items
		//check if apply button is clicked while plugin is open

			if(!this._applyButtonDisabled) {
				this.fileBrowserWidget.onApply();
				if(this.fileBrowserWidget.pluginActive()){
					//if inside the filebrowser a plugin ist still active return and do nothing
					//plugin has to be deactivated or has to close the mediagallery
					return;
				}
				this.dialogWidget.hide();
				var items = this.fileBrowserWidget.getSelectedItems();
				//only do custom onApply if now plugin is active inside filebrowser
				if (typeof(this.onApply) == 'function') {
					this.onApply(items);
				} else {
				 console.warn("Invalid function passed to onApply in "+this.declaredClass);
				}
			}
		}

});