 

function getPreviewPanel(fp){
	return {
		title:'Forhåndsvisning'
		,xtype:'panel'
		,fp:fp
		,bodyStyle:'padding:10px;font-size: 12px;'
		,cls:'previewTab'
		,listeners:{
			activate :function(component){
				if(component.body){
					var its = this.fp.items.items;
					var tempHtml = '';
					for(var i = 0; i<its.length; i++){
						var value = its[i].getValue();
						if(value != null && trim11(value)!='')
							tempHtml+=('<h3>'+its[i].fieldLabel+'</h3><p>'+magic(ws(ex(fd(value))))+'</p>');
					}
					component.body.dom.innerHTML=(tempHtml+'<br/>');
				}
			 }
		}
	};
}

function fd(o){
	if(typeof o === 'object' && o.getMonth){
		return o.format('d.m.Y')
	}
	return o;
}



// create namespace for plugins
Ext.ns('Ext.ux.plugins');
 
/**
 * @class Ext.ux.plugins.MultiLineRowSwitch
 * @extends Ext.util.Observable
 */
Ext.ux.plugins.MultiLineRowSwitch = function(config) {
    Ext.apply(this, config);
};
 
// plugin code
Ext.extend(Ext.ux.plugins.MultiLineRowSwitch, Ext.util.Observable, {
	
	/**
	 * @cfg {Boolean} renderWhiteSpace (optional) True to render white space (default)
	 */
	renderWhiteSpace:true
	
	/**
	 * @cfg {String} expandTool Tool to use for the expand (white space -> html) action.
	 * See Ext.Panel tools for alternatives (defaults to 'plus')
	 */
	,expandTool:'plus'
	
	/**
	 * @cfg {String} collapseTool Tool to use for the collapse (white space:nowrap;) action.
	 * See Ext.Panel tools for alternatives (defaults to 'minus')
	 */
	,collapseTool:'minus'
	
	,cssClass:'wsn'
	
	//gridPanel
	
    ,init:function(gridPanel) {

    	this.gridPanel=gridPanel;

		if(gridPanel.title && !this.skip){			
	    	var tools=gridPanel.tools||[];
	    	var p=this;
	    	tools[tools.length]={id:this.expandTool
				,qtip: 'Trykk for å vise tekst over flere linjer i rader hvor noe av teksten er skjult'
				,hidden: this.renderWhiteSpace
				,handler : function(){p.toolHandler(p);}
			};
	    	tools[tools.length]={id:this.collapseTool
				,qtip: 'Trykk for å ikke vise tekst i mer enn en linje per rad'
				,hidden: !this.renderWhiteSpace
				,handler : function(){p.toolHandler(p);}
			};
			gridPanel.tools=tools;
		}
		
 		//"safe" alternative
    	var cm=gridPanel.getColumnModel();
    	for(var i=0,l=cm.getColumnCount();i<l;i++){
    		//lag heller en array skipColumns
    		if(cm.getRenderer(i)){
    			var c=cm.config[i];
    			if(!(c.t&&c.t==7))
	    			cm.setRenderer(i,this.getWhiteSpaceRenderer(this,cm.getRenderer(i)));
    		}
		}// eo for i=0 -> cm.getColumnCount()
    	if(this.renderWhiteSpace)
    		gridPanel.cls+=' '+this.cssClass;
    		//gridPanel.getEl().addClass(this.cssClass); // doesn't work because grid isn't rendered yet

    } // end of function init
	
    
    // tool handler
    ,toolHandler:function(p){
    	var gp=p.gridPanel;
    	p.renderWhiteSpace=!p.renderWhiteSpace;
    	gp.getTool(p.expandTool).setVisible(!p.renderWhiteSpace);
    	gp.getTool(p.collapseTool).setVisible(p.renderWhiteSpace);
    	var el =gp.getEl();
    	if(p.renderWhiteSpace)
    		el.addClass(p.cssClass);
    	else
    		el.removeClass(p.cssClass);
    	gp.getView().refresh();
    	
    }
    
	,getWhiteSpaceRenderer:function(p,oldRenderer){
		return function(A,B,C,D,E,F){
			var s=oldRenderer(A,B,C,D,E,F);
			if(p.renderWhiteSpace){
				return p.whiteSpace2HTML(s);
			}
			return s;
		};
	}//eo function getWhiteSpaceRenderer

	//converts the most common white space characters (newline and 2 x space)
	,whiteSpace2HTML:function(s){
		return ws(s);
	}
}); // end of extend
 




function getEditPanel(fields){
	return new Ext.form.FormPanel({
			title:'Rediger'
			,labelWidth: 100
			,trackResetOnLoad:true
			,bodyStyle:'background:#dfe8f6;padding:10px 0px 10px 10px;'
			,defaults:{ xtype:'textfield',labelStyle:'font-weight:bold;color:#416AA3;'}
			,items:fields
		});
			
}
String.prototype.capitalize = function() {
    return this.charAt(0).toUpperCase() + this.slice(1);
}
String.prototype.uncapitalize = function() {
    return this.charAt(0).toLowerCase() + this.slice(1);
}

function pickDate(a,b){
	a=Ext.get(a);
    var w = new Ext.menu.DateMenu({
        handler : function(dp, date){
            a.dom.value=date.format('d/m/Y');
        }
    });
    var def = Date.parseDate(a.dom.value,'d/m/Y');
    if(def)
        w.picker.setValue(def);
    w.showAt(Ext.get(b).getXY());
}

function confirmDelete (message) {
	var x;
	if(message==null){x = confirm("Trykk Ok for å bekrefte at du vil slette.");}
	else{x = confirm(message);}
	return x;
}

Ext.Ajax.on('requestcomplete',function(co,r,o){
var result = Ext.util.JSON.decode(r.responseText);
	if(result.info)msg(App.NAME,result.info);
});

JBD={};
JBD.UpWin = Ext.extend(Ext.Window, {
	initComponent : function() {
		var x = this;
		var fpx;
		fpx = new Ext.FormPanel({
			fileUpload : true,
			frame : true,
			baseParams : this.params,
			bodyStyle : 'padding: 10px 10px 0 10px;',
			labelWidth : 70,
			defaults : {
				anchor : '95%',
				msgTarget : 'side'
			},
			items : [{
						xtype : 'textarea',
						height : 50,
						fieldLabel : 'Beskrivelse',
						name : 'desc'
					}, {
						xtype : 'fileuploadfield',
						allowBlank : false,
						emptyText : 'Velg en fil...',
						fieldLabel : 'Fil',
						name : 'file',
						buttonCfg : {
							text : 'Velg fil...'
						}
					}],
			buttons : [{
				text : 'Last opp filen',
				iconCls : 'icon-upload',
				handler : function(b) {
					var f = fpx.getForm();// b.ownerCt.getForm();
					if (f.isValid()) {
						f.submit({
									url : x.url || '?',
									success : function(fp, o) {
										var r = o.result;
										if (r.success) {
											x.fireEvent('uploadDone', r);
											x.close();
										} else {
											feil('Filopplastingen var ikke vellykket.')
										}
									}
								});
					}
				}
			}, {
				text : 'Avbryt',
				handler : function() {
					x.close();
				}
			}]
				// eo buttons
		});// eo new Ext.FormPanel
		Ext.apply(this, {
					title : 'Last opp en fil',
					modal : true,
					width : 500,
					height : 200,
					layout : 'fit',
					border : false,
					items : fpx
				});//eo Ext.apply

		JBD.UpWin.superclass.initComponent.apply(this, arguments);//call parent
		this.addEvents('uploadDone');

	}//eo initComponent	
});//eo Ext.extend(Ext.Window


function toFileLink(id,n){
	return '<a class="dl" href="/files/documents/'+id+'/'+escape(n)+'" target="_blank">'+n+'</a>';
}

function tag(s){
	var search = Ext.get('search').dom.value.trim().replace(/ /g,'|');
	var rep = '<span class="_hl">$1</span>';
	var r = new RegExp('('+search+')', 'gi');
	s=s.replace(r,rep);
	/*//*/
	return s;
}
function magic(s){
	if(typeof s != 'string'|| typeof(magicStore) ==='undefined' || !magicStore)return s;
	/*/**/
	var i =0,p=0,r='';
	
	while((i=s.indexOf('[',i))!=-1){
		var j = s.indexOf(']',i);
		if(j==-1)
			break;
		r+=s.substring(p,i);//til (men ikke med) [
		
		var k=s.substring(i+1,j).toLowerCase();
		var sx =0,x=magicStore.getRange();
		for(var m=0,l=x.length;m<l;m++){
			if(k==x[m].data.word){
				sx=ex(x[m].data.rep);
				//log(k+": "+sx);
				break;
			}
		}
		if(sx){
			r+=('<span class="_rhl">'+sx+'</span>');
			p=j+1;
			i=p;			
		}else{
			p=i;i++;
		}
		//if(confirm(i+'-'+j+' -> '+ sx +': '+magicWords[sx]))return s;
	}
	return r+=s.substring(p);//*/
}
function cap(s){
	if(typeof s!='string' || s.length==0)return s;
	return s.charAt(0).toUpperCase()+s.substr(1);
}
function feil(msg){
	Ext.Msg.show({
		title:'Kan ikke utføre handlingen',
		msg: msg,
		width: 400,
		buttons: Ext.Msg.OK,
		icon: Ext.MessageBox.ERROR
	});
	return false;
}
function exo(s){
	for(var i=0,len=s.length;i<len;i++){s[i]=ex(s[i]);}
	return s;
}
function cex(s){
	if(typeof s == 'string')return ex(s);
	else if(typeof s == 'object'){
		var r ='<ul>';
		for(var i=0,len=s.length;i<len;i++){r+='<li>'+ex(s[i])+'</li>';}
		return r+'</ul>';
	}
	return s;
}

//
function ex(s){
	if(typeof s == 'string')return Ext.util.Format.htmlEncode(s);
	return s;
}
function revex(s){
	if(s)return s.replace(/&amp;/gi,'&').replace(/&lt;/gi,'<').replace(/&gt;/gi,'>');
	return s;
}
/**
 * Erstatter whitespace med html-tag'er
 * @param {String} s
 * @return {String} s formatert (erstattet \n med <br/> og '  ' med ' &nbsp;'
 */
function ws(s){
	if(typeof s == 'string')return s.replace(/\n/g,'<br/>').replace(/  /g,' &nbsp;');
	return s;
}
//
function wsex(s){return ws(ex(s));}
function trim11 (str) {
	if(typeof str != 'string')return str;
	str = str.replace(/^\s+/, '');
	for (var i = str.length - 1; i >= 0; i--) {
		if (/\S/.test(str.charAt(i))) {
			str = str.substring(0, i + 1);
			break;
		}
	}
	return str;
}

/**/
function d_ren(a,t){
	var r ='';
	if(t!==1){
		if(a.length>=2)r='('+a.length+') - ';
	}
	for(var i=0, l=a.length;i<l;i++){
		var d=a[i];r+=((t===1?' - ':' ')+toFileLink(d.did,d.filename)+(t===1?' - '+d.description:'')+'\n');
			
	}
	return r;
}


//
function tf(h,v,t){
	if(v){
//
		if(t){var r=colz[t].c.renderer;
			if(r)v=r(v);
		}
		return '<p><b>'+h+'</b>'+ws(v)+'</p>';
	}
	return "";
}

function clone(o){
    if(o == null || typeof o != 'object')return o;
    var t = new o.constructor();
    for(var v in o)
        t[v] = clone(o[v]);
    return t;
}

/**
 * Rapport-panel (forhåndsvisning) - rec
 * @param {Ext.data.Record} rec
 * @param {String} title - tittel på panel
 * @param {Array} fields - [{l:'Dato',n:'date'},...]
 * @return {}
 */
function getRapPanel(rec,title,fields,docs){
	var html = '';
	for(var i=0,l=fields.length;i<l;i++){
		var a =fields[i], b=rec.data[a.n];
		if(b){
			html+=('<h3>'+a.l+'</h3><p>'+ws(ex(b))+'</p>')
		};
	}
	if(docs){
		var b='';
		for(var i=0,l=docs.length;i<l;i++){
			var d =docs[i];
			b+='<p>'+toFileLink(d.did,d.filename)+' '+wsex(d.description)+'</p>';
		}
		html+=('<h3>Vedlegg</h3>'+b);
	}
	return {title:title,height:'auto',autoScroll:true,bodyStyle:'padding:10px;font-size: 12px;',cls:'previewTab',html:html+'<br/>'};
}

var logoutTimer, nawl=true, timeout=25*60*1000, logoutWarning=function(){
	if(nawl)
	Ext.Msg.show({
		title:App.NAME+': Automatisk utlogging etter 30 minutters innaktivitet',width:550,
		msg: 'Advarsel: Du vil snart bli automatisk logget ut av Integrator på grunn av 30 minutter uten aktivitet.<br /><br />Trykk "ok" for å utsette utloggingen med 30 minutter. Dersom det allerede har gått 30 minutter uten aktivitet, vil du bli bedt om å skrive inn brukernavn og passord på nytt.',
		buttons: Ext.Msg.OKCANCEL,icon: Ext.MessageBox.WARNING
		,fn:function(btn){
			if(btn == 'ok'){//forsøk å forlenge session med 30 min, evt be om bekrefte brukernavn/passord
				Ext.Ajax.request({url: '?resetTimer=true',success: function(req){var result = Ext.util.JSON.decode(req.responseText);
				if(result.success){ Ext.Msg.alert(App.NAME+': Aktivitet registrert', result.msg); }}
				});
			}
		}
	});
};
logoutTimer = setTimeout(logoutWarning, timeout);

/* viser modal spinner / laster data animasjon ved ajax-kall. etc. */
var loadingData =false,skipSpinner=false;
Ext.Ajax.on('beforerequest', function(con,o){
	if(skipSpinner)
		return;
	//console.info( 'isDefined(o.params): '+isDefined(o.params) + '!o.params.query:'+!o.params.query );
	if(isDefined(o.params) && o.params.query)//en spørring
		return;
	loadingData = Ext.MessageBox.wait('Laster data... ',App.NAME);}
);
Ext.Ajax.on('requestcomplete',function(co,r,o){
	clearTimeout(logoutTimer);
	logoutTimer = setTimeout(logoutWarning, timeout);
	if(loadingData){
		loadingData.hide();
		loadingData =false;
	}
	try {
		var result = Ext.util.JSON.decode(r.responseText);
		if(result.logoutError && nawl){
			//brukeren er ikke lenger pålogget, vis påloggingsvindu
			nawl=false;
		    var win, login = new Ext.FormPanel({ 
		        labelWidth:120,url:'?',frame:true, 
		        title:App.NAME+': Pålogging', 
		        defaultType:'textfield',monitorValid:true,
		        items:[{xtype:'box', autoEl:{tag:'p', html:'<br/>Melding fra '+App.NAME+': '+result.msg+' <br/><br/>'}},
		               {fieldLabel:'Brukernavn (e-post)',name:'email_login',value:result.username,allowBlank:false 
		            },{ fieldLabel:'Passord', name:'password', inputType:'password', allowBlank:false }],
		        buttons:[{ 
		                text:'Logg på',formBind: true,	 
		                handler:function(){ 
		                    login.getForm().submit({ 
		                        method:'POST', 
		                        success:function(form, action){
		                    		var r = Ext.util.JSON.decode(action.response.responseText);
		                        	Ext.Msg.alert(App.NAME+': Pålogget', 'Velkommen, '+r.name+'!', function(btn, text){nawl=true;win.close();});
		                        },failure:function(form, action){
		                        	var r = Ext.util.JSON.decode(action.response.responseText);
		                            if(action.failureType == 'server'){ 
		                                Ext.Msg.alert('Pålogging feilet!', r.errors.reason); 
		                            }else{Ext.Msg.alert(App.NAME+': Feil!', 'Svar fra påloggingstjenesten: ' + r.msg); } 
		                        } 
		                    }); 
		                } 
		            }] 
		    });
		    win = new Ext.Window({layout:'fit',modal:true,width:400,height:200,closable: false,resizable: false,plain: true,border: false,items: [login]});
			win.show();
			
		}
		//if(result.info)msg(App.NAME,result.info);
		
	} catch (error) {
		//ikke json-respons
	}
	/*
	if(result.success){
	//success
	alert(result.msg);
	}else{
	//feil
	}
	//*/
});
Ext.Ajax.on('requestexception',function(){
	if(loadingData){
		loadingData.hide();
		loadingData =false;
	}
	Ext.Msg.show({
		title:App.NAME+': Feil',
		msg: 'Det har oppstått en feil under kommunikasjon med serveren.',
		buttons: Ext.Msg.OK,
		fn: function(bId){if(bId == 'yes'){}},
			icon: Ext.Msg.ERROR
		});
});





var columnTypes={
	INTEGER:0,
	FLOAT:1,
	SHORTTEXT:2,
	LONGTEXT:3,
	TIME:4,
	DATE:5,
	TIMESTAMP:6,
	BOOLEAN:7,
	OPTION:8
};
var colNames={
	0:'Heltall',
	1:'Desimaltall',
	2:'Tekst - en linje',
	3:'Tekst - flere linjer',
	//4:'Tidspunkt',
	5:'Dato',
	//6:'Tidspunkt',
	7:'Avkrysingsboks',
	8:'Flervalg'
	//,9:'Flervalg' -- selectOnly
	//,10:'Email'
};
var colz =[
{n:'Heltall',				f:{xtype:'numberfield',allowDecimals:false},						c:{width:50},						r:{type:'int'},b:'numeric'}
,{n:'Desimaltall',			f:{xtype:'numberfield',decimalSeparator:',',decimalPrecision:6},	c:{width:50},						r:{type:'float'},b:'numeric'}
,{n:'Tekst - en linje',		f:{},																c:{width:100,renderer:ex},	r:{type:'string'},b:'string'}
,{n:'Tekst - flere linjer',	f:{anchor:'-36',xtype:'textarea',height:100},						c:{width:150,renderer:ex},	r:{type:'string'},b:'string'}
,{n:'Tidspunkt',			f:{},																c:{width:100},						r:{},b:'date'}
,{n:'Dato',					f:{xtype:'datefield',format:'d.m.Y',width:100},						c:{width:70,renderer: Ext.util.Format.dateRenderer('d.m.Y')}, r:{type:'date', dateFormat:'d.m.Y'},b:'date'}
,{n:'Tidspunkt',			f:{},																c:{width:100},						r:{},b:'date'}
,{n:'Avkrysingsboks',		f:{xtype:'checkbox'},												c:{width:30,renderer:function(v){return v?'Ja':'Nei';}},	r:{type:'boolean'},b:'boolean'}
,{n:'Flervalg',				f:{},																c:{width:100},						r:{},b:'string'}
,{n:'Flervalg',				f:{},																c:{width:100,renderer:ex},	r:{},b:'string'}
,{n:'Epost',				f:{vtype:'email'},													c:{width:120,renderer:ex},	r:{type:'string'},b:'string'}
,{n:'Multi-valg',			f:{},																c:{width:100,renderer:ex},	r:{},b:'string'}
];

Ext.ux.grid.GridFilters.prototype.menuFilterText = 'Filter';
Ext.ux.grid.filter.BooleanFilter.prototype.yesText = 'Ja';
Ext.ux.grid.filter.BooleanFilter.prototype.noText = 'Nei';
Ext.ux.grid.filter.DateFilter.prototype.beforeText = 'Før dato';
Ext.ux.grid.filter.DateFilter.prototype.afterText = 'Etter dato';
Ext.ux.grid.filter.DateFilter.prototype.onText = 'På'; 



function getRec(d){
	var r= {name:d.d};
	var c = colz[d.t].r;
	for(o in c)
		r[o]=c[o];
	return r;
}
//*
Ext.apply(Ext.form.VTypes, {
	selectOnly:function(v,f){
		if(!f.store.proxy.data)return true;
		//zd=f.store.proxy.data;
		
		var p=f.store.proxy.data.p;
		//log('p: '+p);zp=p;zf=f;
		for(var i=0,l=p.length;i<l;i++){
			var r=p[i]; 
			//log(r.d +' == '+ v);
			if(r.d == v){
				//f.zid=r.id;
				return true;
			}
		}
	}
});

var SELECT_MULTIPLE_ID=-4;
/*
//*/
function getField(d,g){
	var f;
	if(d.t==9){/*
//*/
		var k=(d.sid||'')+'.'+d.d;
		var dsx = new Ext.data.Store({
		    proxy: new MSProxy(false,k,g),
		    reader: new Ext.data.JsonReader({
		        root: 'p',
		        id: 'id'
		    }, [
		        {name: 'id'},
		        {name: 'd'}
		    ])
		});
		
		/**/
		var fs;
		f = {
			xtype:'combo'
			,hideOnSelect:false
			,width:300,minChars:0,vtype: 'selectOnly',name:d.d,queryDelay:10,fieldLabel:d.n,allowBlank:d.r?false:true,k:k,
		    store: dsx,displayField:'d',typeAhead: false,triggerAction: 'all',emptyText:'Velg ...',selectOnFocus:true
		    //,applyTo: 'local-states'
		    ,listeners:{
		    	select:function(f,r,i){
		    		f.zid=r.id;f.setValue(r.data.o || r.data.d);
		    		var o = f.ownerCt;
					var id = r.id;

					//
					if(id==SELECT_MULTIPLE_ID && !o._fs){
						o._fs=true;
						var z = g.SD[k],l=z.length,items=[],index=o.items.indexOf(f)+1;
						for(var i=0;i<l;i++){
							var it = z[i],id=it.id;
							if(id>0){
								items.push({boxLabel: Ext.util.Format.ellipsis(it.d,40), name: '_m',inputValue:id});
							}
						}
						fs = o.insert(index,{
						    //id:'_multiple',
						    xtype: 'checkboxgroup',
							hideLabel:true,
						    fieldLabel: 'Velg flere...',
						    itemCls: 'x-check-group-alt',
						    columns: 3,
						    anchor:'-6',
						    boxMinWidth:790,
						    allowBlank:false,
						    hidden:false,
						    blankText:'Du må velge minst en fra gruppen',
						    items: items
						});
						o.doLayout(false,true);
					}else{
						if( id!=SELECT_MULTIPLE_ID && fs && fs.isVisible()){
							fs.allowBlank=true;
							fs.hide();
						}else if(id==SELECT_MULTIPLE_ID && !fs.isVisible()){
							fs.allowBlank=false;
							fs.show();
						}
					}
					//

		    	}
		    }
		};//eo f
		
	}else{
		f = {name:d.d,fieldLabel:d.n,allowBlank:d.r?false:true};
		var c = colz[d.t].f;
		for(o in c)
			f[o]=c[o];

		if(d.s){f.maxLength=d.s;
			var w=(7*d.s)+30;if(w>410){f.anchor='-66';}else{f.width=w;};
		}//else if(d.t==3){f.anchor='-36';}
			
		if(d.m)f.minLength=d.m;
	}
/*//*/
	
	f.value=d.dv;
	if(d.x)
		f.disabled=true;
	return f;
}
function getAllValues(f){
//
	var r = f.getValues();
	var t, a=f.items.items
	for(t in a){
		if('checkbox'==a[t].xtype){
			r[a[t].name]=a[t].checked;
		}
	}
	return r;
}

/**/
	function getRend(s){
	return function(a,b){log(s);return wsex(a);};
	}
	var rri=0;
function getCD(d,cfg){
	var cd = {header:d.n,dataIndex:d.d,sortable:true};
	if(isCDNumeric(d.t)){
		cd.align='right';
	}
	
	var c = colz[d.t].c;
		
	for(o in c)
		cd[o]=c[o];
	if(d.l)
		delete cd.renderer;
/*

//*/
	if(d.h)
		cd.hidden=d.h;
	if(d.w)
		cd.width=d.w;
	if(cfg && cfg.cols[d.d]){
		var cc=cfg.cols[d.d];
		if(!cc.s){
			if(cc.w)cd.width=cc.w;
			cd.hidden=cc.h;
		}
	}
	return cd;
}

function isCDNumeric(t){
	return (t == columnTypes.FLOAT || t == columnTypes.INTEGER);
}

/**
 * 
 * @param {Array} cd - Kolonne-definisjon fra controller (t, width, dataIndex, header)
 * @param {Array} cols - Kolonne-array (columns i grid)
 * @param {Array} plugins - Grid-plugins (trengs til booleans etc)
 */
function createEditorColumn(cd,cols,plugins,active){
	var f = Ext.form;
	var col = cd,
		type = cd.t;
	col.renderer=ex;
	if(type == columnTypes.INTEGER){ //INTEGER - heltall
		col.editor = new f.NumberField({allowDecimals:false});
	}
	else if(type == columnTypes.FLOAT){ //FLOAT - desimaltall
		col.editor = new f.NumberField({decimalSeparator:',',decimalPrecision:6});
	}
	else if(type == columnTypes.SHORTTEXT){ //SHORTTEXT - kort tekst
		col.editor = new f.TextField({maxLength:100/*,grow:true,growMax:100*/});
	}
	else if(type == columnTypes.LONGTEXT){ //LONGTEXT
		col.editor = new f.TextArea({});
		/*//
*/
	}
	else if(type == columnTypes.TIME){ //TIME
//		col.editor = new f.TimeField();
		col.editor = new f.TextField();
	}
	else if(type == columnTypes.DATE){ //DATE
		col.editor = new f.DateField({format: 'Y-m-d'});//d.m.Y
		//f.DateField
		col.renderer = function(v){return v ? (v.dateFormat ? v.dateFormat('d M, Y') : v) : '';};col._sr=1;
	}
	else if(type == columnTypes.TIMESTAMP){ //TIMESTAMP
//		col.editor = new f.TimeField();
		col.editor = new f.TextField();
	}
	else if(type == columnTypes.BOOLEAN){ //BOOLEAN
		col = new Ext.grid.CheckColumn(cd);
		delete col.renderer;col._sr=1;
		plugins[plugins.length]=col;
	}
	else if(type == columnTypes.OPTION){ //OPTION
		//log('CEC: '+cd.t +' -> ' +cd.options );
		//v=cd.options;
		col.editor= new Ext.form.ComboBox({
			typeAhead: true,
			triggerAction: 'all',
			emptyText:'Velg...',
			selectOnFocus:true,
			store:cd.options//exo(cd.options)//['S','M','L']
		});
		//col.editor.on('beforeselect',function(combo,record,index ){record.data[0]=revex(record.data[0]);return true;});

	}
	if(!active)
		col.editor = null;
	cols[cols.length]=col;

}



Ext.grid.CheckColumn = function(config){
    Ext.apply(this, config);
    if(!this.id){
        this.id = Ext.id();
    }
    this.renderer = this.renderer.createDelegate(this);
};

Ext.grid.CheckColumn.prototype ={
    init : function(grid){
        this.grid = grid;
        this.grid.on('render', function(){
            var view = this.grid.getView();
            view.mainBody.on('mousedown', this.onMouseDown, this);
        }, this);
    },

    onMouseDown : function(e, t){
        if(t.className && t.className.indexOf('x-grid3-cc-'+this.id) != -1){
            e.stopEvent();
            var index = this.grid.getView().findRowIndex(t);
            var record = this.grid.store.getAt(index);
            record.set(this.dataIndex, !record.data[this.dataIndex]);
        }
    },

    renderer : function(v, p, record){
        p.css += ' x-grid3-check-col-td'; 
        return '<div class="x-grid3-check-col'+(v?'-on':'')+' x-grid3-cc-'+this.id+'">&#160;</div>';
    }
};
Ext.reg('checkcolumn',Ext.grid.CheckColumn);


Ext.grid.RadioColumn = function(config){
    Ext.apply(this, config);
    if(!this.id){
        this.id = Ext.id();
    }
    this.renderer = this.renderer.createDelegate(this);
};

Ext.grid.RadioColumn.prototype = {
    init : function(grid){
        this.grid = grid;
        this.grid.on('render', function(){
            var view = this.grid.getView();
            view.mainBody.on('mousedown', this.onMouseDown, this);
        }, this);
    },

    onMouseDown : function(e, t){
        if(t.className && t.className.indexOf('x-grid3-cc-'+this.id) != -1){
            e.stopEvent();
            var index = this.grid.getView().findRowIndex(t);
            var record = this.grid.store.getAt(index);
            record.set(this.dataIndex, this.inputValue);
        }
    },

    renderer : function(v, p, record){
        p.css += ' x-grid3-radio-col-td'; 
        return '<div class="x-grid3-radio-col'+(v == this.inputValue?'-on':'')+' x-grid3-cc-'+this.id+'"> </div>';
    }
};




Ext.ns('Ps');
Ps.notValid=function(str,cb){
	Ext.Msg.show({
		title:App.NAME+': Feil',
		msg: (str?str:'')+'Kan ikke lagre før feil i feltene er rettet opp.',
		buttons: Ext.Msg.OK,
		icon: Ext.MessageBox.ERROR
	});
};	


//Ext.extend(X, Ext.ux.FileUploader, {processSuccess:function(a,b,c){alert('SUCCESS!!')}});

function saveStore(gp){
	var s = gp.store;
	var mr = s.getModifiedRecords();
	if(mr.length<1)//ingenting å lagre
		return;
	
	var st = gp.getBottomToolbar().cursor,
		cm =gp.getColumnModel();
	
	var cols = cm.getColumnCount();
	var jsonData = "[";
	for (var i = 0; i < mr.length; i++) {
		var r=mr[i];
		var update = r.getChanges(), rx=s.indexOf(r);
		
		//ekstra: validering - sjekker alle felt, ikke bare de som skal endres.
		for(var co=1;co<cols; co++) {//co=1, hopper over id-feltet
			if(!r || !cm.isCellEditable(co, rx))continue;
			var ed = cm.getCellEditor(co, rx);//ed er en Ext.grid.GridEditor / Ext.Editor
			if(!ed)continue;
			var uc = cm.getDataIndex(co);
			//console.info('setter value til: '+r.data[uc]);
			ed.field.setValue(r.data[uc]);
			//var valid = ed.field.isValid(true);
			var valid = ed.field.validateValue(r.data[uc]);//Ext.form.TextField.prototype.validateValue.call(ed.field, r.data[uc]);
			//console.info(uc+': '+r.data[uc]+' => '+r._valid[co] +'|'+ Ext.form.TextField.prototype.validateValue.call(ed.field, r.data[uc])+ ' - '+rx + ' / '+co +'\n\t*\t'+r._valid);
			//console.info(cm.getColumnHeader(co)+': '+r.data[uc]+' => '+valid);
			if(!valid){
				//ugyldig verdi - avbryt lagring. gi beskjed til bruker og sett fokus i felt med gal verdi.
				Ps.notValid('"'+r.data[uc]+'" er ikke en gyldig verdi for feltet "'+cm.getColumnHeader(co)+'".<br/><br/>',gp.startEditing(rx,co));
				return false;
			}
		}
		
		update['id'] = r.id;
		if (i > 0)
			jsonData += ',';
		jsonData += Ext.util.JSON.encode(update);
	}
	jsonData += ']';
	s.load({params:{start:st, limit:50,saveUpdate:jsonData}});
	s.commitChanges();
	return true;
}

function getOneRecordOrReturnFalse(selections){
    if(selections.length == 1){
    	return selections[0];
    }
	else{
		var msg;
		if(selections.length == 0)
			msg = 'Merk den aktuelle raden først';
		else
			msg = ('Velg kun 1 rad (du har valgt '+selections.length+' rader)');

		Ext.Msg.show({
		   title:'Kan ikke utføre handlingen',
		   msg: msg,
		   buttons: Ext.Msg.OK,
		   icon: Ext.MessageBox.INFO
		});
	}
	return false;
}



function isDefined( variable)
{
    return (typeof(window[variable]) == "undefined")?  false: true;
}






function c(x){
	for(y in x)
		if(!confirm(y+ ': '+x[y]))
			break;
}

Ext.onReady(function(){
	Ext.QuickTips.init();
});

Ext.example = function(){
    var msgCt;

    function createBox(t, s){
	    return ['<div class="msg" style="border: 1px solid #000;">',
			    '<div class="x-box-mc" style="padding: 6px;font-size:14px;"><h3>', t, '</h3>', ex(s), '</div>',
                '</div>'].join('');
    
    }
    return {
        msg : function(title, format){
            if(!msgCt){
                msgCt = Ext.DomHelper.insertFirst(document.body, {id:'msg-div'}, true);
            }
            msgCt.alignTo(document, 't-t');
            var s = String.format.apply(String, Array.prototype.slice.call(arguments, 1));
            var m = Ext.DomHelper.append(msgCt, {html:createBox(title, s)}, true);
            m.slideIn('t').pause(3).ghost("t", {remove:true});
        },

        init : function(){
        
        }
    };
}();

Ext.onReady(Ext.example.init, Ext.example);
var msg=Ext.example.msg;

/* Ext.grid.CheckColumn */
Ext.grid.CheckColumn = function(config){
    Ext.apply(this, config);
    if(!this.id){
        this.id = Ext.id();
    }
    this.renderer = this.renderer.createDelegate(this);
};
Ext.grid.CheckColumn.prototype ={
    init : function(grid){
        this.grid = grid;
        this.grid.on('render', function(){
            var view = this.grid.getView();
            view.mainBody.on('mousedown', this.onMouseDown, this);
        }, this);
    },

    onMouseDown : function(e, t){
        if(t.className && t.className.indexOf('x-grid3-cc-'+this.id) != -1){
            e.stopEvent();
            var index = this.grid.getView().findRowIndex(t);
            var record = this.grid.store.getAt(index);
            record.set(this.dataIndex, !record.data[this.dataIndex]);
        }
    },

    renderer : function(v, p, record){
        p.css += ' x-grid3-check-col-td'; 
        return '<div class=\'x-grid3-check-col'+(v?'-on':'')+' x-grid3-cc-'+this.id+'\'>&#160;</div>';
    }
};


function l(params,showFunctions){
	for(var i = 0; i<params.length;i++){
		var p = params[i];
		if(p){
			var str = i+' '+p+'=> ';
			for(x in p){
				if(typeof p[x] == 'function'){
					if(showFunctions)
						str+=(x+': '+p[x]+', ');
					else
						str+=('\t'+x+': FUNCTION\n ');				
				}else
					str+=('\t'+x+': '+p[x]+'\n ');
			}
			console.info(str);
		}
	}
}






//
function cfgGP(gp,cfg,gId,f){
//
	f=f||2;
	var cf=gp.colModel.config;
	var st = gp.getStore();
//
	var gridCF={
		groupField:st.groupField
		,sortField:st.sortInfo.field
		,sortDir:st.sortInfo.direction
		,singleLine:gp.getTool('plus').isVisible()
		,cols:{}
	};
	var filterCF=[];
	var cFi2 =gp.plugins[1];
	if(cFi2){
		var d=cFi2.getFilterData()
		if(d && d.length>0)
			filterCF=d;
	}
	for(var i=f,l=cf.length;i<l;i++){//starter på 2, 0->+, 1->x
		gridCF.cols[cf[i].dataIndex]={
			w:cf[i].width
			,h:cf[i].hidden?true:false
			,n:i
		};
	}
	var p ={tableId: gId,
			selected:true,
			gridCF:Ext.util.JSON.encode(gridCF),
			filterCF:Ext.util.JSON.encode(filterCF)};
	if(cfg && cfg.id)
		p.id=cfg.id;
	return p;
}
/**/
function saveGP(gp,cfg,gId,f){
	var p = cfgGP(gp,cfg,gId,f);
	p.editGridConfig=true;

	Ext.Ajax.request({
		url: gUrl(gId?{id:gId,p:''}:false),
		params: p,
		success: function(r){
			//fortsett med editProcedure
			var res = Ext.util.JSON.decode(r.responseText);
			if(res.success){
				cfg.id=res.id;
			}
		}//eo success
	});
}
//
function dll(gp,cfg,g,f){
	var p = cfgGP(gp,cfg,g?g.id:0,f);
	p.downloadPDF=true;
//
	var id = Ext.id();
	var frame = getDllFrame(id);
	var form = getDllForm(id,p,gUrl(g));

	var callback = function() {
		Ext.EventManager.removeListener(frame, 'load', callback, this);
		setTimeout(function() {document.body.removeChild(form);}, 100);
		setTimeout(function() {document.body.removeChild(frame);}, 110);
	};
	
	Ext.EventManager.on(frame, 'load', callback, this);
	form.submit();
}
function gUrl(g){
	return (CtrlURI[g.id] || CtrlURI[g] || '')+'?'+(g.p||'');
}
function dlls(rId,g,cmd,buildingId){
	var gId=g?(g.id?g.id:g):0;
	var p = {tableId:gId,id:rId};
	p[cmd||'downloadSinglePDF']=true;
	if(buildingId)
		p.buildingId=buildingId;
//
	var id = Ext.id();
	var frame = getDllFrame(id);
	var form = getDllForm(id,p,gUrl(g));
	
	var callback = function() {
		Ext.EventManager.removeListener(frame, 'load', callback, this);
		setTimeout(function() {document.body.removeChild(form);}, 100);
		setTimeout(function() {document.body.removeChild(frame);}, 110);
	};
	Ext.EventManager.on(frame, 'load', callback, this);
	form.submit();
}
function getDllFrame(id){
	var frame = document.createElement('iframe');
	frame.id = id;
	frame.name = id;
	frame.className = 'x-hidden';
	if(Ext.isIE) {frame.src = Ext.SSL_SECURE_URL;}
	document.body.appendChild(frame);
	if(Ext.isIE) {document.frames[id].name = id;}
	return frame;
}
function getDllForm(id,p,url){
	var form = Ext.DomHelper.append(document.body, {
		 tag:'form',method:'post',action:url||'?',target:id
	});
	document.body.appendChild(form);
	for(var o in p){
//
		var h=document.createElement('input');
		h.type = 'hidden';
		h.name = o;
		h.value = p[o];
		form.appendChild(h);
	}
	return form;
}

function dl_pdf(url,params){
	id=Ext.id();
	var frame = getDllFrame(id);
	var form = getDllForm(id,params||{},url);
	
	var callback = function() {
		Ext.EventManager.removeListener(frame, 'load', callback, this);
		setTimeout(function() {document.body.removeChild(form);}, 100);
		setTimeout(function() {document.body.removeChild(frame);}, 110);
	};
	Ext.EventManager.on(frame, 'load', callback, this);
	form.submit();

}
function log(s){
	console.info(s);
}
//
MSProxy = function(data,k,g){
    Ext.data.MemoryProxy.superclass.constructor.call(this);
    //log('n: '+n);log('k: '+k);log('g.SD[n]: '+g.SD[n]);
    //log(data + ' - '+ n+' - '+ k + ' - '+ g+ ' - ');
    if(data){
    	this.data = data;
	}else {
		this.g=g;this.k=k;

    }//

};

Ext.extend(MSProxy, Ext.data.DataProxy, {
    load : function(params, reader, callback, scope, arg){

    	if(!this.data)this.data={p:this.g.SD[this.k]};

        params = params || {};
        var result;
        try {
			var q = params.query.trim();
//log('MSProxy load: '+q + ' - length '+result.records.length);

			if(q && q.length){
	            result = reader.readRecords(this.data);
//filter - fjern de som ikke passer
				q=q.replace(/ /g,'.*?');
				var rs = result.records,rep = '<span class="_hl">$1</span>',nr = {records:[]};
	            for(var i=0;i<rs.length;i++){
	            	var r = rs[i];
					var rx = new RegExp('('+q+')', 'gi');
	            	//console.info(r.data.d.search(rx) +' -> '+ r.data.d);
	            	if(r.data.d.search(rx)!=-1){
	            		r.data.o = r.data.d;
	            		r.data.d=r.data.d.replace(rx,rep);
	            		nr.records.push(r);
	            	}
	           	result = nr;
	           	}
			}else{
				if(!this.res)this.res=reader.readRecords(this.data);
				result=this.res;
			}
        }catch(e){
            this.fireEvent("loadexception", this, arg, null, e);
            callback.call(scope, null, arg, false);
            return;
        }//*/
        callback.call(scope, result, arg, true);
    },
    update : function(params, records){}
});
/*
//*/
Ext.ux.Toast = function() {
    var msgCt;

    function createBox(t, s){
        return ['<div class="msg">',
                '<div class="x-box-tl"><div class="x-box-tr"><div class="x-box-tc"></div></div></div>',
                '<div class="x-box-ml"><div class="x-box-mr"><div class="x-box-mc"><h3>', t, '</h3>', s, '</div></div></div>',
                '<div class="x-box-bl"><div class="x-box-br"><div class="x-box-bc"></div></div></div>',
                '</div>'].join('');
    }

    return {
        msg : function(title, format){
            if(!msgCt){
                msgCt = Ext.DomHelper.insertFirst(document.body, {id:'msg-div',style:'position:absolute;z-index:10000'}, true);
            }
            var s = String.format.apply(String, Array.prototype.slice.call(arguments, 1));
            var m = Ext.DomHelper.append(msgCt, {html:createBox(title, s)}, true);
            msgCt.alignTo(document, 't-t');
            m.slideIn('t').pause(1.5).ghost("t", {remove:true});
        }
	}

}();

//store (w jsonReader) and json (repr one record)
function jsonToStore(s,v){
	var r = s.reader,o={},n,rec;
	o[r.meta.root]=[v];
	n=r.readRecords(o);
	rec=n.records[0];
	s.addSorted(rec);
	return rec;
};

Ext.apply(Ext.form.VTypes, {
    email:  function(v) {
    	return /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/.test(v);
    }
});
