/*
	Copyright (c) 2006-2007, ePages GmbH
	All Rights Reserved.

	epages.cartridges.de_epages.design.widget.Designtoolcontroller $Revision: 1.28 $

*/
dojo.provide("epages.cartridges.de_epages.design.widget.Designtoolcontroller");
dojo.require("epages.widget.LocalizedWidget");
dojo.require("epages.io.json");
dojo.require("epages.lang.array");
dojo.require("epages.cartridges.de_epages.design.widget.Designtool");
dojo.require("epages.widget.Message");
dojo.require("epages.widget.Modaldialog");

dojo.declare(
	"epages.cartridges.de_epages.design.widget.Designtoolcontroller",
	[epages.widget.LocalizedWidget],
	{
		/**
		 * public properties
		 */
		uri                : '?',
		id                 : 'Designtoolcontroller',
		undobuttonsId      : 'undoWidget',
		objectTreeId       : 'contentExplorerObjectTree',
		eventHandler       : '',
		imageUrl           : epages.vars.StoreRoot ? epages.vars.StoreRoot + '/BO/icons' : undefined,

		/**
		 * private properties
		 */
		 objects   : {},
		 pagetypes : {},
		_dialogWidget      : undefined,
		_visiblePageType : undefined, // _showDesignTools

		/**
		 * widget properties
		 */
		templatePath     : dojo.moduleUrl('epages.cartridges.de_epages.design.widget','templates/Designtoolcontroller.html'),
		translationName  : dojo.moduleUrl('epages.cartridges.de_epages.design.widget','templates/translation'),

		postCreate: function() {
			this.inherited("postCreate", arguments);
			dojo.subscribe(this.objectTreeId+'/select', this, '_onSelectObject');
			dojo.subscribe('Designtool/select', this, '_onSelectDesigntool');
			//set Reference to EventHandler if exists
			this.eventHandler = typeof contentEventHandler != 'undefined' ? contentEventHandler : undefined;
		},

		_createInputsForUndo: function (objectId) {
			var templates = this.objects[objectId].templates;
			var inputFields = {};
			var me = this;
			$H(templates).each( function(pair){
				var inputField = document.createElement('input');
				inputField.type = "hidden";
				inputField.name = objectId +':'+ pair.key + ':1:LayoutUndo';
				inputField.value = pair.value; // read current values
				inputField.size = 4;
				me.ControllerNode.appendChild(inputField);
				me.connect(inputField, 'onchange', 'callOnChange');
				var undoObject = $$(me.undobuttonsId).getUndoObject();
				undoObject.setDefaultValue(inputField);
				inputFields[pair.key] = inputField;
			});
			return inputFields;
		},

		_loadObject:function(node){
			if (this.objects[node.item.objectId] === undefined) {
				var json = new epages.io.Json();
				var output = json.loadSync(this.uri, {
					ObjectID:       node.item.objectId,
					ViewAction:     'JSONViewResponse',
					ChangeAction:   'JSONLayout',
					KnownPageTypes: $H(this.pagetypes).keys()
				});
				this.objects[node.item.objectId] = {
					templates : output.data.Templates,
					pagetype  : output.data.PageType,
					treeNode  : node
				};
				if (this.pagetypes[output.data.PageType] === undefined) {
					this.pagetypes[output.data.PageType] = {
						templates  : output.data.TemplateTypes,
						controller : undefined
					};
				}
			}
		},

		_showDesignTools: function (objectId) {
			$('Designbox').style.display = 'none';
			// hide old
			if (this._visiblePageType !== undefined) {
				$A(this.pagetypes[this._visiblePageType].controller).each(function (widget) {
					widget.hide();
				});
			}

			// create new if necessary
			var pagetype = this.objects[objectId].pagetype;
			if (this.pagetypes[pagetype].controller === undefined) {
				this.pagetypes[pagetype].controller = this._createDesigntoolcontroller(pagetype,objectId);
			}

			// show new
			this._visiblePageType = pagetype;
			var templates = this.objects[objectId].templates;
			if(this.pagetypes[pagetype].controller.length != 0){
				$A(this.pagetypes[pagetype].controller).each(function (widget) {
					if(templates[widget.folder] != 0){
						widget.setOption(templates[widget.folder],false,objectId);
						widget.show();
					}
				});
				//correct Layout if some Designtools are hidden
				var first = true;
				$A(this.pagetypes[this._visiblePageType].controller).each(function (widget) {
					if(widget.visible && first){
						widget.isfirst = true;
						widget.setSeperator(false);
						first = false;
					}
					else{
						widget.isfirst = false;
						widget.setSeperator(true);
					}
				});
				//show Designtoolcontroller
				$('Designbox').style.display = '';
			}
			//hide Designtoolcontroller if there are no templates for this pagetype
			else{
				$('Designbox').style.display = 'none';
			}
		},

		_onSelectObject: function(node){
			this._loadObject(node);
			this._showDesignTools(node.item.objectId);
		},

		allowSelectLayout: function(widgetId){
			//check if changes in page where made an ask to save them before opening Designtool
			if($$(this.undobuttonsId) !== undefined && $$(this.undobuttonsId).existsChanges()){
				this._activDesigntoolId = widgetId;
				if(!this._dialogWidget){
					 this._createDialog();
				}
				this._dialogWidget.show();
			}
			else{
				//if no changes where made open Designtool
				$$(widgetId).openMenuWidget();
			}
		},

		_createDialog: function(){

			var messageWidget = new epages.widget.Message({
				headline:this.translation.get("SaveQuestion"),
				message: this.translation.get("ChangeLayoutDescription"),
				sizeClass:"Large",
				typeClass:"Warning"
			});

			var me =this;
			var buttons = [{
				label: this.translation.get("Save"),
				cssClass: 'Active',
				onclick: function() {
					this._modalDialogWidget.hide();
					//if Save was clicked, undowidget saves changes
					$$(me.undobuttonsId).sendChanges();
					//open Designtool
					$$(me._activDesigntoolId).openMenuWidget();
				}
			},
			{
				label: this.translation.get("Cancel"),
				onclick: function() {
					this._modalDialogWidget.hide();
				}
			}];
			this._dialogWidget = new epages.widget.Modaldialog({
				id: "Designtoolcontroller_DialogWidget",
				options:{
					title : this.translation.get("ChangeOnLayout"),
					width : 400,
					height: 120,
					content: messageWidget
				},
				buttons : buttons

			});
			document.body.appendChild(this._dialogWidget.domNode);

		},

		_createDesigntoolcontroller: function(pagetype,objectId){
			if(this.imageUrl){
				var returnArray = [];
				var templates = this.pagetypes[pagetype].templates;
				for(templateTypeFolder in templates){
					var info = templates[templateTypeFolder];
					if (info.Variations.length) {
						var widget = new epages.cartridges.de_epages.design.widget.Designtool({
							folder       : templateTypeFolder,
							folderID     : this.objects[objectId].templates[templateTypeFolder],
							objectId     : objectId,
							title        : info.NameOrAlias,
							data         : info.Variations,
							imagedir     : this.imageUrl,
							controllerId : this.id,
							position     : info.Position
						});
						returnArray.push(widget);
					}
				}
				dojo.forEach(returnArray.sort(function(a,b) { return a.position - b.position; }), function (el) {
					this.ContainerNode.appendChild(el.domNode);
				}, this);
				return returnArray;
			}
			else{
				return [];
			}
		},

		_onSelectDesigntool:function(opt){

			var widgetId = opt.id;
			var active = $$(widgetId).getActive();
			if(active !== undefined){
				this.changeLayout(active);
			}
		},

		changeLayout:function(active){

			// save changes on server
			var json = new epages.io.Json();
			var params = {
				ObjectID    : active.objectId,
				ViewAction  : 'JSONViewResponse',
				ChangeAction: 'SaveDesign'
			};
			params[active.folder] = active.alias;
			var output = json.loadSync(this.uri, params);
			var objectInfo = this.objects[active.objectId];
			// correct internal data for next time
			objectInfo.templates[active.folder] = active.templateTypeId;
			if($$(this.undobuttonsId) !== undefined){
				$$(this.undobuttonsId).sendChanges();
			}
			// reload content if contentEventHandler is defined
			if(this.eventHandler !== undefined){
				 this.eventHandler.reloadContent(active.objectId, true);
			}
			//update page cache flag
			if(typeof pageCache_SetStatus == 'function'){
				pageCache_SetStatus(true);
			}
		},

		callOnChange: function(evt){
			var name = evt.target.name.split(':');
			var templateType = evt.target.value;
			var objectId = name[0];
			var templateTypeFolder = name[1];
			var pagetype = this.objects[objectId].pagetype;
			for( var i=0,iLength=this.pagetypes[pagetype].controller.length ; i<iLength ; i++ ){
				if(this.pagetypes[pagetype].controller[i].folder == templateTypeFolder){
					var designtool = this.pagetypes[pagetype].controller[i];
					designtool.setOption(templateType,true,objectId);
					this._showDesignTools(objectId);
					//$$(this.objectControllerId).selectNode(this.objects[objectId].treeNode);
				}
			}


		}
	}
);