/**
 * GoRss
 * Kapselung der GoRss-Funktionen und -Klassen.
 * 
 * @version $Id: Globals.js,v 1.38.2.8 2009/05/20 09:40:00 mk Exp $
 * @since 19.03.2008
 */
var GoRss = {
	/**
	 * @var Object Konfigurationen der GoRss-Funktionen
	 */
	Options: {
	},
	/**
	 * @param Array Diese Eigenschaft wird Serverseitig mit lokalisierten Nachrichtentexten gefüllt.
	 */
	Messages: {},
	/**
	 * @param Array Alle verfügbaren Callback-Instanzen.
	 */
	Callbacks: {},
	/**
	 * Sendet die Reihenfolge der Sortable-Controls per Ajax-Request an das PHP-Skript.
	 * 
	 * @return boolean
	 */
	postSortables: function() {
		var url = '?app='+ApplicationID+'&fp';
		
		return IMLib.Sortables.fastPostback( url );
	},
	Ajax: {
		SessionExpireResponder: function(){
			this.onComplete=function(request, transport) {
				var header=transport.getResponseHeader('X-GoRss-Session-Expired');
				if(header=='true') {
					return Link.reload();
				}
			}
		}
	},
	/**
	 * @var Object Lookup-Objekt für die checkSortableSequences-Methode.
	 */
	MessageWindowSortables: {},
	/**
	 * Sendet die Reihenfolge eines Sortable-Controls eines Sortable-Items an das PHP-Skript.
	 * 
	 * @return boolean
	 */
	postMessageWindowSortable: function(sortableID) {
		Loading.show();
		var url = '?app='+ApplicationID+'&mw';
		var seq = arguments.length>1 ? arguments[1] : Sortable.serialize(sortableID, {name: 'id'});
		var options = arguments.length>2 ? arguments[2] : {};
		
		var feedID=$(sortableID).up('.Draggable, .NonDraggable').identify().match( /_Feed(\d+)$/ )[1];
		
		options.method = 'post';
		options.parameters = {
			id: feedID,
			sequences:	seq
		};
		options.onComplete = function(transport) {
			Loading.hide();
			
			var m=transport.responseText.match(/^ERROR: (.*)/);
			if(m!=null) {
				IMLib.Alert(m[1]);
			}
		}
		
		new Ajax.Request( url, options );
	},
	/**
	 * Lädt die Feed-Ansicht für das Sortable sortable nach und ersetzt den Inhalt des Elements.
	 * 
	 * @return void
	 * @param Element
	 * @param integer ID des Kanals
	 * @param integer Anzahl Nachrichten, die Maximal in der Ansicht sichtbar sein sollen.
	 * @param boolean Flag, ob das ViewChooser-Control nicht gerendert werden soll. Der Standardwert
	 *  ist false, d.h. es wird ein Control erstellt.
	 */	
	loadFeedView: function( sortable, itemID ) {
		sortable.loadingFeedView=true;
		
		// Success-Handler für den Ajax-Request.
		var func = function( transport ) {
			var response = transport.responseText.evalJSON();
			var p = sortable.down( 'p' );
			if( p ) {
				p.remove();
			}
			sortable.insert( response['html'] );
			sortable.removeClassName( 'Dummy' );
			sortable.loadingFeedView=false;
			
			sortable.select( '.ContextMenu, .QuickInfo' ).each( function( item ) {
				item.parentNode.removeChild(item);
				document.body.appendChild(item);
			} );
			
			Behaviour.applySheet(GoRssImgBehaviours);
			IMLib.Sortables.recreate.delay(0.01);
		}
		
		// Url zusammenstellen
		var url = '?app='+ApplicationID+'&render-item='+itemID;
		var match=window.location.search.match(/page=[a-z]+/i);
		if(match) {
			url += '&'+match[0];
		}
		if( arguments.length>2 ) {
			url += '&c='+arguments[2];
		}
		if( arguments.length>3 ) {
			url += '&ignore-viewchooser';
		}
		url += '&rand='+Math.random();
		
		// Ajax-Request erstellen
		new Ajax.Request( url, {
			method:		'get',
			onSuccess:	func,
			onFailure:	IMLib.Alert.curry( GoRss.Messages['msg.refreshing.failed'] )
		} );
	},
	loadTreeView: function(treeViewID) {
		treeView=$(treeViewID);
		if(!treeView) {
			treeViewID='Page_MainContent_'+treeViewID+'TreeView';
			treeView=$(treeViewID);
			if(!treeView) {
				throw "TreeView "+treeViewID+" not found";
			}
		}
		
		// Success-Handler für den Ajax-Request.
		var func = function( transport ) {
			var response = transport.responseText;
			this.childElements().map(function(item){item.remove();});
			this.insert( response );
			
			this.select( '.ContextMenu, .QuickInfo' ).each( function( item ) {
				item.parentNode.removeChild(item);
				document.body.appendChild(item);
			} );
			
			Behaviour.applySheet(GoRssImgBehaviours);
			Behaviour.applySheet(GoRssTreeViewBehaviours);
			this.treeViewHandle.restoreState();
		}.bind(treeView);
		
		// Url zusammenstellen
		var value=treeView.identify().match(/^Page_MainContent_([a-z]+)TreeView$/i)[1];
		var url = '?app='+ApplicationID
					+'&page=GetTreeView&TreeView='+value
					+'&rand='+Math.random();
		
		// Ajax-Request erstellen
		new Ajax.Request( url, {
			method:		'get',
			onSuccess:	func,
			onFailure:	IMLib.Alert.curry( GoRss.Messages['msg.refreshing.failed'] )
		} );
		
		// TreeView leeren und Aktualisieren-Control anzeigen
		treeView.childElements().map(function(item){item.remove();});
		treeView.insert( '<p>'+GoRss.Messages['msg.refreshing']+' <img src="'+GoRss.Messages['img.refreshing']+'" alt="" /></p>' );
	},
	/**
	 * Eventhandler für das OnChange-Event der ItemCount-Listbox im GoRssViewChooser-Control.
	 * 
	 * @return void
	 * @param Event
	 */
	changeItemCount: function( event ) {
		var element = $( Event.element( event ) );
		var viewChooser = element.up( '.ViewChooser' );
		var feedView = viewChooser.next( '.FeedView' );
		var value = element.getValue();
		
		var sortable = element.up( '.Draggable, .NonDraggable' );
		sortable.addClassName( 'Dummy' );
		
		var opts = viewChooser.down( 'select' ).select( 'option' );
		opts.each( function( opt ) {
		    opt.removeAttribute( 'selected' );
		} );
		opts.first().setAttribute( 'selected', 'selected' );
		
		// FeedView entfernen
		feedView.remove();
		
		// Nachricht in das SortableItem einfügen
		sortable.insert( '<p>'+GoRss.Messages['msg.refreshing']+' <img src="'+GoRss.Messages['img.refreshing']+'" alt="" /></p>' );
		
		// FeedView laden
		if( Prototype.Browser.IE ) {
			GoRss.loadFeedView.delay( 1, sortable, GoRss.extractFeedID( sortable.identify() ), value, true );
		}
		else {
			GoRss.loadFeedView( sortable, GoRss.extractFeedID( sortable.identify() ), value, true );
		}
	},
	/**
	 * Lädt ein Sortable-Item neu.
	 * 
	 * @return void
	 * @param ID des entsprechenden Kanals
	 */
	refreshItem: function( channelID ) {
		var sortable=null;
		
		if(Object.isElement(channelID)) {
			sortable=channelID;
			channelID=GoRss.extractFeedID(sortable.identify());
		}
		else {
			// Sortable suchen
			$$( '.Draggable, .NonDraggable' ).each( function( el ) {
				if( GoRss.extractFeedID( el.identify() )==channelID ) {
					sortable = el;
				}
			} );
			
			if(!sortable) {
				//alert('sortable not found');
				return;
			}
		}
		
		// Element wird bereits aktualisiert
		if(sortable.hasClassName('Dummy') && sortable.loadingFeedView) {
			return;
		}
		
		var viewChooser = sortable.down( '.ViewChooser' );
		var feedView = viewChooser.next( '.FeedView' );
		
		var value = viewChooser.down('select',1).value;
		
		sortable.addClassName( 'Dummy' );
		
		// FeedView entfernen
		if(feedView) {
			feedView.remove();
			
			// Nachricht in das SortableItem einfügen
			sortable.insert( '<p>'+GoRss.Messages['msg.refreshing']+' <img src="'+GoRss.Messages['img.refreshing']+'" alt="" /></p>' );
		}
		
		// FeedView laden
		if( Prototype.Browser.IE ) {
			GoRss.loadFeedView.delay( 1, sortable, channelID, value, true );
		}
		else {
			GoRss.loadFeedView( sortable, channelID, value, true );
		}
	},
	refresh: function() {
		window.onunload = null;
		
		var form = $('Page_Form');
		
		var input = document.createElement( 'input' );
		input.setAttribute( 'type', 'hidden' );
		input.setAttribute( 'name', 'sequences' );
		input.setAttribute( 'value', Object.toJSON( IMLib.Sortables.getSequences() ) );
		form.appendChild( input );
		
		var input = document.createElement( 'input' );
		input.setAttribute( 'type', 'hidden' );
		input.setAttribute( 'name', 'pageid' );
		input.setAttribute( 'value', IMLib.getPageID() );
		form.appendChild( input );
		
		var input = document.createElement( 'input' );
		input.setAttribute( 'type', 'hidden' );
		input.setAttribute( 'name', 'refresh') ;
		input.setAttribute( 'value', 'true' );
		form.appendChild( input );
		
		// den PageState löschen
		$( 'PRADO_PAGESTATE' ).remove();
		
		IMLib.Element.Modal.show();
		Loading.show();
		
		form.submit();
	},
	toQueryString: function( obj ) {
		var tokens = [];
		Object.keys( obj ).each( function( key ) {
			tokens.push( key+'='+encodeURIComponent( obj[key] ) );
		} );
		return( '?'+tokens.join( '&' ) );
	},
	extractFeedID: function( base ) {
		return( base.match( /(\d)+$/ )[0] );
	},
	initDroppable: function( element ) {
		element = $( element );
		Droppables.add( element, {
			hoverclass: 'hover',
			accept: 'FeedItem',
			onDrop: function( draggableElement, droppableElement) {
				var a = droppableElement.down('a');
				IMLib.WebUI.TreeView.findHandle( droppableElement ).showLoading( a );
				Loading.show();
				
				var itemID = IMLib.extractContainerID( draggableElement.className );
				
				// DraggableObserver mitteilen, dass keine Änderungen an den MessageWindows gespeichert werden sollen
				IMLib.Sortables.MessageWindow.getDraggableObserver().commitOnEnd=false;
				
				// IDs extrahieren
				var sourceFeedID = GoRss.extractFeedID( draggableElement.up('.FeedView').up().identify() );
				var targetFeedID = IMLib.extractContainerID( droppableElement.down('li').className );
				
				// Callback vorbereiten
				var callback = GoRss.Callbacks.AddMessageToChannel;
				var param = {
					sourceFeedID:	sourceFeedID,
					targetFeedID:	targetFeedID,
					itemID:			itemID
				};
				
				// onComplete-Handler setzen
				callback.options.onComplete = function(){
					IMLib.WebUI.TreeView.findHandle( a ).hideLoading( a );
					Loading.hide();
					
					// Das FeedView-Control zu diesem Kanal auf der Arbeitsbühne aktualisieren
					GoRss.refreshItem(targetFeedID);
				}
				
				// Callback absetzen
				callback.setCallbackParameter( param );
				callback.dispatch();
			}
		} );
	},
	checkSortableSequences: function() {
		// Sequence der Unter-Sortables
		try {
			$A(IMLib.Sortables.MessageWindow.Sortables).each(function(sortableID) {
				if(!$(sortableID)) {
					return;
				}
				
				var seq=Sortable.serialize(sortableID, {name: 'id'});
				if(GoRss.MessageWindowSortables[sortableID]!=undefined && GoRss.MessageWindowSortables[sortableID]!=seq) {
					try {
						GoRss.postMessageWindowSortable(sortableID, seq);
					}
					catch(e) {
						if(window['console']) console.log(e);
					}
				}
				
				GoRss.MessageWindowSortables[sortableID]=seq;
			});
		}
		catch(e) {
			if(window.console) console.log(e);
		}
	},
	createNewChannel: function( hfid, contextMenu ) {
		var containerIdentifier=contextMenu.forControl.down( 'li' ).className;
		var id=IMLib.extractContainerID(containerIdentifier);
		$(hfid).value=id;
		
		var wizard=IMWindow.find('CreateChannelWizard');
		if(!wizard) {
			return;
		}
		
		wizard.show();
	},
	createNewCategory: function( hfid, hftype, type, contextMenu ) {
		var containerIdentifier=contextMenu.forControl.down( 'li' ).className;
		var id=IMLib.extractContainerID(containerIdentifier);
		$(hfid).value=id;
		$(hftype).value=type;
		
		var wizard=IMWindow.find('CreateCategoryWizard');
		if(!wizard) {
			return;
		}
		
		wizard.show();
	},
	/**
	 * Togglet den Live-/Preview-Status einer Nachricht.
	 * 
	 * @return void
	 * @param Element Statusbild
	 * @param integer Nachrichten-ID
	 */
	ToggleState: function(elem, id) {
		// Callback vorbereiten
		var callback = GoRss.Callbacks.ToggleState;
		var param = {
			id:			id
		};
		
		callback.options.onSuccess = function() {
			Loading.hide(true);
			
			// Bild-URL ändern
			var type=elem.src.match(/State([a-z]+)\.gif/i)[1];
			
			if(type=='Live') {
				elem.src=elem.src.replace(/(State)Live(\.gif)/, "$1Preview$2");
			}
			else {
				elem.src=elem.src.replace(/(State)Preview(\.gif)/, "$1Live$2");
			}
			
			new Effect.Highlight(elem.up('li'));
		};
		Loading.show(true);
		
		// Callback absetzen
		callback.setCallbackParameter( param );
		callback.dispatch();
	},
	/**
	 * Öffnet das Bild aus einem Wizard heraus in einem neuen Tab. Ist die URL
	 * ungültig oder leer, wird eine entsprechende Fehlermeldung ausgegeben.
	 * 
	 * @return void
	 * @param string
	 */
	openImage: function(url) {
		var m;
		
		// Nur weiße Zeichen
		if(url.match(/^\s*$/)!=null) {
			IMLib.Alert(GoRss.Messages['openimage.blank']);
			return;
		}
		// Interne Url
		else if((m=url.match(/^Internal:\/\/\/image=(\d+)/i))!=null) {
			var l=document.location;
			var s=l.search.toQueryParams();
			var params={
				app: s['app'] || '',
				image: m[1]
			}
			
			url=l.protocol+'//'+l.host+((l.port=='' || Prototype.Browser.IE) ? '' : ':'+l.port)+l.pathname+'?'+Object.toQueryString(params);
		}
		
		Link.blank({href: url});
	},
	/**
	 * Versucht nicht mehr genutzte Objekte abzuräumen.
	 * 
	 * @return void
	 */
	gc: function() {
		// QuickInfos
		$$('.QuickInfo').each(function(qi){
			try {
				if($(qi.QuickInfo.forControl.identify())==null) {
					qi.QuickInfo.stopObserver();
    				qi.parentNode.removeChild(qi);
    				qi.QuickInfo.forControl.removeChild(qi.QuickInfo.forControl);
				}
			}
			catch(e) {}
		});
		// ContextMenu
		$$('.ContextMenu').each(function(cm){
			try {
				if($(cm.ContextMenu.forControl.identify())==null) {
					cm.ContextMenu.unregisterFromControl();
    				cm.parentNode.removeChild(cm);
    				cm.ContextMenu.forControl.removeChild(cm.ContextMenu.forControl);
				}
			}
			catch(e) {}
		});
	}
}
