
Kelda.Info.Statemanager = function() {
	
	this.app = null;
	var maxSize = 20000;
	this.persistState = persistState;
	this.loadState = loadState;
	this.serializePortlet = serializePortlet;
	this.getOpenTabId = getOpenTabId;
	this.getVisibleColumnIds = getVisibleColumnIds;
	this.persistToCookie = persistToCookie;
	this.persistToStore = persistToStore;
	this.localStore = localStore;
	this.loadFromLocalStore = loadFromLocalStore;
	this.loadFromStore = loadFromStore;
	this.loadDefault = loadDefault;
	this.loadPortlets = loadPortlets;
	this.configPortlet = configPortlet;
	this.getNewsFilters = getNewsFilters;
	this.removeLocalStore = removeLocalStore;
	this.setApp = setApp;
	
	function loadState() {
		//Ext.Msg.wait(keldan_lang_text('desktoploadmsg'),keldan_lang_text('desktoploadtitle'));
		
		Ext.Msg.progress(keldan_lang_text('desktoploadtitle'),keldan_lang_text('desktoploadmsg'));
		this.loadFromStore();
		
	}
	function persistState() {
		var main_portal = Ext.getCmp('main-portal');
		if(!main_portal)return;
		var portlets = [];
		for (var i = 0; i < main_portal.items.length; i++) {
            var col = main_portal.items.items[i];
            for (var j = 0; j < col.items.length; j++) {
                var portlet = col.items.items[j];
                //console.log('serializing '+portlet.getXType());
                 var json_portlet = this.serializePortlet(portlet,i,j);
                 portlets.push(json_portlet);
               
            }
		}
		this.persistToStore(portlets);
		
	}
	function serializePortlet(portlet,col,row) {
			var jsonp = {};
			Ext.apply(jsonp,{
				id : portlet.id,
				xt : portlet.getXType(),
				v : portlet.version,
				cnr : col,
				rnr : row,
				height : (portlet.resizeable && !portlet.collapsed ) ? portlet.getSize().height : null,
				collapsed:portlet.collapsed,
				tid : this.getOpenTabId(portlet),
				columns : this.getVisibleColumnIds(portlet),
				newsfilters : portlet.getXType()=='nfp' ? this.getNewsFilters(portlet) : null
			});
			
			return jsonp;
	}
	function getNewsFilters(newsp) {
		var cat = [];
		newsp.cascade(function(cat){
			if(this.getXTypes().indexOf('tabpanel') >= 0) {
				for(a = 0; a < this.items.length; a++) {
				  var p = this.items.items[a];
				  // ok ,p is a newsfeedgrid with filters!
				  var nfilters = p.newsFilters;
				   
				  if(nfilters) {
					  var filters = nfilters.filters;
					  filters.each(function(i,idx,len){
						 //console.log('Category '+i.category+" List : "+i.getValue());
							 
						// i is probably a ListFilter
						if(i.getValue().length > 0) {
							//we got some sources
							cat.push({
								cat : i.category,
								val : i.getValue()
							})
						}
					  });
				  }
				}
				return false;
			}else
				return true;
		},null,[cat]);
		return cat;
	}
	function getOpenTabId(portlet) {
		var tabId = {
			id:null	
		};
		portlet.cascade(function(tabId) {
			if(this.getXTypes().indexOf('tabpanel') >= 0) {
				//console.log('OpenTabId, '+this.getXType()+' , id is '+this.getActiveTab().stateId);
				tabId.id = this.getActiveTab().stateId;
				return false;
			}
			
		},null,[tabId]);
		return tabId;
	}
	function getVisibleColumnIds(portlet) {
		var col = [];
		//per tab, if any
		portlet.cascade(function(col) {
			
			if(this.getXTypes().indexOf('tabpanel') >= 0 ) {
				for(a = 0; a < this.items.length; a++) {
					var vc = [];
					var p = this.items.items[a];
					// p is most likely a grid
					var sid = p.stateId;
					if(p.getXTypes().indexOf('grid') >= 0) {
						var cm = p.getColumnModel();
						var colEn = cm.getColumnsBy(function(colconf,idx){
							if(this.isHidden(idx))return false;
							else return true;
						},cm);
						for(y = 0; y < colEn.length;y++) {
							vc.push({
									id : colEn[y].id,
									idx : cm.getIndexById(colEn[y].id),
									width : colEn[y].width
								});
						}
						//collect grouping info.
						var groupIds = {};
						var view = p.getView();
						if(view.getGroupField && view.grid) {
							var groupField = view.getGroupField();
							p.store.each(function(rec){
								//console.log('adding '+rec.data[groupField]);
								groupIds[rec.data[groupField]]=true;
							});
							for(var q in groupIds) {
								//console.log('getting groupId by '+q);
								var gId = view.getGroupId(q);
								var group = Ext.getDom(gId);
						        var gel = Ext.fly(group);
						        var expanded = !gel.hasClass('x-grid-group-collapsed');

								groupIds[q] = expanded;
								//console.log('group '+q+' expaned '+expanded);
							}
						}
						col.push({
							tabid : p.stateId,
							cols : vc,
							groups : groupIds
						});
					}
				}
				return false;
			}else if(this.getXTypes().indexOf('grid')>=0 && !(this.ownerCt.getXTypes().indexOf('tabpanel') >= 0) ) {
				var vc = [];
				//console.log(this.getXType()+' getVisibleColumns , grid, getting visible columns');
				var cm = this.getColumnModel();
				var colEn = cm.getColumnsBy(function(colconf,idx){
					if(this.isHidden(idx))return false;
					else return true;
				},cm);
				for(y = 0; y < colEn.length;y++) {
					vc.push({
						id: colEn[y].id,
						idx : cm.getIndexById(colEn[y].id),
						width : colEn[y].width
					});
				}
				
				var groupIds = {};
				var view = this.getView();
				if(view.getGroupField && view.grid) {
					var groupField = view.getGroupField();
					//console.log(p.getXType()+" groupField is  "+view.getGroupField());
					this.store.each(function(rec){
						//console.log('adding '+rec.data[groupField]);
						groupIds[rec.data[groupField]]=true;
					});
					for(var q in groupIds) {
						//console.log('getting groupId by '+q);
						var gId = view.getGroupId(q);
						var group = Ext.getDom(gId);
				        var gel = Ext.fly(group);
				        var expanded = !gel.hasClass('x-grid-group-collapsed');

						groupIds[q] = expanded;
						//console.log('group '+q+' expaned '+expanded);
					}
				}
				col.push({
					tabid : 'notab',
					cols : vc,
					groups : groupIds
				});
				//console.log('No tab , '+this.getXType()+' got '+colEn.length+" visible columns");
			}
		},null,[col]);
		return col;
		
	}
	function persistToCookie(portlets /*Array*/ ) {
		var st = Ext.encode(portlets);
		//console.log(escape(st));
		//console.log('--------------------------------------------------------------------------')
		var newst = unescape(st);
		var newarr = Ext.decode(newst);
		//console.log('Array length is '+newarr.length);
	}
	function persistToStore(portlets) {
		//lets try localStorage (HTML5) first
		if(!this.localStore(portlets)) {
			//console.log('saving to db');
		var data = escape(Ext.encode(portlets));
		
		if(data.length >= maxSize) {
			Ext.Msg.show({
				title:keldan_lang_text('statesave'),
				msg:keldan_lang_text('statesavetobig'),
				buttons:Ext.Msg.OK,
				icon:Ext.Msg.WARNING,
				modal:false
			});
			return;
		}
		Ext.Msg.wait(keldan_lang_text('savingdesktopmsg'),keldan_lang_text('savingdesktoptitle'));
		Ext.Ajax.request({
			   url:window.location.protocol+"//"+window.location.hostname+"/"+basePath+"keldaconnect/saveWorkspace",
			   success: function(res,opts) {
					Ext.Msg.hide();
					if(res.responseText.indexOf('WS_Size')> 0) {
						//console.log(res.responseText);
						Ext.Msg.show({
							title:keldan_lang_text('statesave'),
							msg:keldan_lang_text('statesavetobig'),
							buttons:Ext.Msg.OK,
							icon:Ext.Msg.WARNING,
							modal:false
						});
					}else {
						
						Ext.Msg.show({
							title:keldan_lang_text('statesave'),
							msg:keldan_lang_text('statesavesuccesstext'),
							buttons:Ext.Msg.OK,
							icon:Ext.Msg.INFO,
							modal:false
						});
					}
					
			   },
			   failure: function(res,opts) {
				   Ext.Msg.hide();
					//console.log('save to db failed');
				   Ext.Msg.show({
						title:keldan_lang_text('statesavefail'),
						msg:keldan_lang_text('statesavefailtext'),
						buttons:Ext.Msg.OK,
						icon:Ext.Msg.ERROR,
						modal:false
					});
			   },
			   params: { 
					data : data
				}
			});
		}
	}
	function localStore(portlets) {
		/*if(!(Ext.isSafari4 || Ext.isIE8 || Ext.isGecko3)) {
			//console.log('no localStorage');
			return false;
		}*/
		if(!hasLocalStore())
			return false;
		var data = escape(Ext.encode(portlets));
		//console.log('saving to localStorage');
		localStorage.workspace = data;
		return true;
	}
	function hasState() {
		return Keldan_hasState();
	}
	function hasLocalStore() {
		return Keldan_hasLocalStore();
		
		/*
		if(typeof(localStorage) == 'undefined')
			return false;
		else 
			return true;
		*/
	}
	/*
	 * Must load default workspace if ANY failure occurs!
	 */
	function loadFromStore() {
		//console.log('loading from store');
		if(!this.loadFromLocalStore()) {
			//console.log('loading from db');
		Ext.Ajax.request({
			   url:window.location.protocol+"//"+window.location.hostname+"/"+basePath+"keldaconnect/loadWorkspace",
			   success: function(res,opt) {
				if(res.responseText.indexOf('WS_NoWS')> 0){
					Ext.Msg.show({
						title:keldan_lang_text('desktoploaderrortitle'),
						msg:keldan_lang_text('desktoploaderrormsg'),
						fn:function() {
							Keldan_Set_Cookie('wsid','',0,'/');
							this.loadDefault();
						},
						scope:this,
						buttons:Ext.Msg.OK,
						icon:Ext.Msg.ERROR,
						modal:false
						});
					}
					//console.log('load from db success');
					var js = unescape(res.responseText);
					var portlets = null;
					try {
						portlets = Ext.decode(js);
						//console.log('Number of portlets '+portlets.length);
						if(portlets.length == 0) {
							this.loadDefault();
						}else {
							Ext.Msg.updateProgress(0,'O'+ (keldan_lang=='is' ? ' af ' : ' of ')+portlets.length);
							keldan_fixed_stcount=keldan_store_count=portlets.length;
							this.loadPortlets(portlets);
						}
						
					}catch(e) {
						//console.log('Exception in workspace decode, load default!'+e);
						Ext.Msg.getDialog().hide();
						Ext.Msg.show({
							title:keldan_lang_text('desktoploaderrortitle'),
							msg:keldan_lang_text('desktoploaderrormsg'),
							buttons:Ext.Msg.OK,
							icon:Ext.Msg.ERROR,
							modal:false
						});
						this.loadDefault();
						return;
					}
					
			   },
			   failure: function() {
					//console.log('load from db failed , load default workspace!');
					this.loadDefault();
			   },
			   scope : this
			});
		}
	}
	function loadFromLocalStore() {
		/*if(!(Ext.isSafari4 || Ext.isIE8 || Ext.isGecko3)) {
			//console.log('no localStorage');
			return false;
		}*/
		if(!hasLocalStore())
			return false;
		var js = unescape(localStorage.workspace);
		//if(js)console.log('got js');
		var portlets = null;
		try {
			portlets = Ext.decode(js);
			if(!portlets || portlets.length == 0) {
				this.loadDefault();
			}else {
				Ext.Msg.updateProgress(0,'O'+ (keldan_lang=='is' ? ' af ' : ' of ')+portlets.length);
				keldan_fixed_stcount=keldan_store_count=portlets.length;
				this.loadPortlets(portlets);
			}
			return true;
		}catch(e) {
			//console.log('Exception in workspace decode, load default!'+e);
			Ext.Msg.getDialog().hide();
			Ext.Msg.show({
				title:keldan_lang_text('desktoploaderrortitle'),
				msg:keldan_lang_text('desktoploaderrormsg'),
				buttons:Ext.Msg.OK,
				icon:Ext.Msg.ERROR,
				modal:false
			});
			this.removeLocalStore();
			this.loadDefault();
			return true;
		}
	}
	function removeLocalStore() {
		Keldan_Set_Cookie('wsid','',0,'/');
		if(typeof(localStorage)!='undefined') {
			delete localStorage.workspace;
		}
	}
	
	function loadToStore(portlets) {
		
	}
	function loadDefault() {
		//console.log('Loading default');
		var main_portal = Ext.getCmp('main-portal');
		for (var i = 0; i < main_portal.items.length; i++) {
            var col = main_portal.items.items[i];
            col.removeAll(true);
		}
		this.app.defaultPortlets();
	}
	/*
	 * Version checks etc.
	 */
	function loadPortlets(portlets /*Array*/) {
		var main_portal = Ext.getCmp('main-portal');
		var cfun = function(a,b) {
			if(a.rnr < b.rnr) return -1;
			else if(a.rnr > b.rnr) return 1;
			else return 0;
		};
		var portletsByXType = new Ext.util.MixedCollection();
		for(k = 0; k < portlets.length; k++) {
			var p = portlets[k];
			//Ext.Msg.updateProgress(k*pstatus,"Still loading","Loading desktop...");
			var count = 'i';
			var postfix = '';
			while(portletsByXType.containsKey(p.xt+postfix) ) {
				// ok more then one portlet with same xtype
				postfix = '_'+count;
				count += "i";
			}
			portletsByXType.add(p.xt+postfix,p);
			var col = main_portal.items.items[p.cnr]; 
			var app_p = this.app.portletXTypes[p.xt];
			if(app_p) {
				//console.log('Got xtype in app');
				var newp = {
					id : p.id,
					xtype : p.xt,
					header : true,
					name : app_p.title,
					title:app_p.title.toUpperCase(),
					headerCfg : app_p.headerCfg,
					collapsed:p.collapsed,
					items : (app_p.item ? app_p.item : {
						xtype:p.xt+"_Child"
					})
				};
				if(p.height) {
					Ext.apply(newp,{
						height:p.height
					});
				}
				col.add(newp);
			}
		}
		this.configPortlet(portletsByXType);
		main_portal.doLayout();
	
	}
	function configPortlet(pxtype) {
		var main_portal = Ext.getCmp('main-portal');
		for (var i = 0; i < main_portal.items.length; i++) {
            var col = main_portal.items.items[i];
            for (var j = 0; j < col.items.length; j++) {
                var portlet = col.items.items[j];
                // get the FIRST save portlet with matching xtype
                
                var p = pxtype.find(function(i) {
                	//console.log('item xt '+i.xt+' portlet xt is '+portlet.getXType());
                	return i.xt === portlet.getXType();
                });
                pxtype.remove(p);
                //ok matching portlet from js and p from store,check version
                if(portlet.version != p.v) {
                	//console.log('mismatch in versions on '+portlet.getXType()+' from store: '+p.v+' and latest '+portlet.version);
                	continue;
                }
                //console.log('Configing '+p.xt);
                for(a = 0; a < p.columns.length;a++) {
                	var colconf = p.columns[a];
                	if(colconf.tabid=='notab') {
                		portlet.cascade(function(colconf) {
                			if(this.getXTypes().indexOf('grid')>= 0) {
                				var cm = this.getColumnModel();
                				var orgcols = cm.getColumnsBy(function(conf,idx){
                					return true;
                				});
                				for(c = 0; c < orgcols.length;c++) {
                					var column = orgcols[c];
                					for(b=0;b<colconf.cols.length;b++) {
                						if(column.id == colconf.cols[b].id) {
                							column.hidden=false;
                							var oldidx = cm.getIndexById(column.id); 
                							if(oldidx != colconf.cols[b].idx)
                								cm.moveColumn(oldidx,colconf.cols[b].idx);
                							column.width = colconf.cols[b].width;
                							break;
                						}else {
                							column.hidden=true;
                						}
                						
                						//var column = cm.setHidden(i,false);
                					}
                				}
                				//check for groups
                				var view = this.getView();
                				if(view.getGroupField && view.grid) {
                					for(var g in colconf.groups) {
                						var gId = view.getGroupId(g);
                						view.toogleGroup(gId,colconf.groups[g]);
                					}
                				}
                				return false;
                			}
                		},null,[colconf]);
                	}else {
                		portlet.cascade(function(colconf,p,groups) {
                			if(this.getXTypes().indexOf('tabpanel')>= 0) {
                				//console.log('tabid is '+colconf.tabid);
                				var fxmatrixFn = function() {
                					//console.log('REnder');
                					var xcld = new Ext.util.MixedCollection();	
                					var cm = this.getColumnModel();
                    				var orgcols = cm.getColumnsBy(function(conf,idx){
                    					return true;
                    				});
                    				for(c = 0; c < orgcols.length;c++) {
                    					var column = orgcols[c];
                    					for(b=0;b<colconf.cols.length;b++) {
                    						if(column.id == colconf.cols[b].id) {
                    							xcld.remove(column.id);
                    							break;
                    							//column.hidden=false;
                    							//var oldidx = cm.getIndexById(column.id);
                    							
                    							//cm.setHidden(oldidx,false);
                    							//cm.fireEvent('hiddenchange',cm,oldidx,false);
                    							//if(oldidx != colconf.cols[b].idx)
                    							//	cm.moveColumn(oldidx,colconf.cols[b].idx);
                    							//break;
                    						}else {
                    							xcld.add(column.id,column.id);
                    							//var oldidx = cm.getIndexById(column.id);
                    							//console.log('index is '+oldidx);
                    							//column.hidden=true;
                    							//console.log('hiding');
                    							//cm.setHidden(oldidx,true);
                    							//cm.fireEvent('hiddenchange',cm,oldidx,true);
                    						}
                    						
                    						//var column = cm.setHidden(i,false);
                    					}
                    				}
                    				xcld.each(function(i,idx,len){
                    					var oldidx = cm.getIndexById(i);
            							cm.setHidden(oldidx,true);
            							cm.fireEvent('hiddenchange',cm,oldidx,true);
                    				},this);
                    				this.store.un('load',fxmatrixFn,this);
                				};
                				/*
                				if(colconf.tabid=='fxmatrix') {
                					this.on('render',configFn,this);
                					//return false; //cant deal with this one right now.
                				}*/
                				
                				//console.log('Number of items '+this.items.length);
                				var tabs = this.items.find(function(i){
                					//console.log(i.stateId);
                					return i.stateId===colconf.tabid;
                				});
                				//console.log(tabs);
                				
                				tabs.cascade(function(colconf,p) {
                        			if(this.getXTypes().indexOf('grid')>= 0) {
                        				
                        				if(this.getXType()=='FxMatrix') {
                        					this.store.on('load',fxmatrixFn,this);
                        					return false;
                        				}
                        				
                        				var cm = this.getColumnModel();
                        				var orgcols = cm.getColumnsBy(function(conf,idx){
                        					return true;
                        				});
                        				for(c = 0; c < orgcols.length;c++) {
                        					var column = orgcols[c];
                        					for(b=0;b<colconf.cols.length;b++) {
                        						if(column.id == colconf.cols[b].id) {
                        							column.hidden=false;
                        							var oldidx = cm.getIndexById(column.id); 
                        							if(oldidx != colconf.cols[b].idx)
                        								cm.moveColumn(oldidx,colconf.cols[b].idx);
                        							break;
                        						}else {
                        							column.hidden=true;
                        						}
                        						
                        						//var column = cm.setHidden(i,false);
                        					}
                        				}
                        				//configure groups
                        				if(this.getView().getGroupField) {
                        					var gfn = function(){
                        						//console.log('load');
                        						if(this.rendered) {
                        							for(var g in colconf.groups) {
                        								var view = this.getView();
                        								var gId = view.getGroupId(g);
                        									//console.log('Groupname '+g+" id : "+gId);
                        								view.toggleGroup(gId,colconf.groups[g]);
                        							}
                        							this.store.removeListener('load',gfn,this);
                        						}
                        						
                        					};
                        					this.store.on('load',gfn,this);
                        					
                        				}
                        				/*
                        				var view = this.getView();
                        				if(view.getGroupField && view.grid) {
                        					console.log(colconf.groups);
                        					for(var g in colconf.groups) {
                        						var gId = view.getGroupId(g);
                        						console.log('Groupname '+g+" id : "+gId);
                        						view.toogleGroup(gId,colconf.groups[g]);
                        					}
                        				}
                        				*/
                        				if(this.getXType()=='nfp_Child' && p) {
                        					var nf = p.newsfilters;
                        					for(ii = 0; ii < nf.length;ii++) {
                        						var f = nf[ii];
                        						if(this.newscategory==f.cat) {
                        							this.loadOnShow=false;
                        							var nfilters = this.newsFilters;
                        							if(nfilters) {
                        								var filters = nfilters.filters;
                        								filters.each(function(i,idx,len){
                        									if(i.category == f.cat) {
                        										i.sourceStore.on('load',function(){
                        											i.setCategoryValues(i.category,f.val,!this.isVisible());
                        											this.loadOnShow=true;
                        											if(this.isVisible()) {
                        												var dt = new Ext.util.DelayedTask();
                        												dt.delay(30000,this.startTimer,this,[]);
                        											}
                        										},this);
                        										i.sourceStore.load();
                        									}
                        									// i is probably a ListFilter
                        								
                        								},this);
                        							  }
                        							break;
                        						}
                        					}
                        					
                        				}
                        				
                        				return false;
                        			}
                        		},null,[colconf,p]);
                				var active = this.items.find(function(a){
                					return a.stateId === p.tid.id; 
                				});
                				if(active)
                					this.activate(active);
                				
                				return false;
                			}
                		},null,[colconf,p]);
                		
                	}
                }
               
            }
            
		} // end for
	}
	function configNewsFilters() {
		
	}
	function setApp(app) {
		this.app = app;
	}
};
