Ext.BLANK_IMAGE_URL = 'http://jslib.quicquid.org/ext-2.2/resources/images/default/s.gif';

Ext.namespace('org.quicquid.finance.app');

org.quicquid.finance.app = function() {

    var cp = new Ext.state.CookieProvider();
    Ext.state.Manager.setProvider(cp);

  var userPrefs = {showHelp:cp.get("showHelp",true)};

    var dwidth = 800;

    Ext.QuickTips.init();
    Ext.apply(Ext.QuickTips.getQuickTip(), {
	    maxWidth: 250,
		minWidth: 100,
		showDelay: 25,
		trackMouse: false
		});

    function toexnode(n) {
        var yid = n[0];
        // Warn: some UK are quoted in dollars (maybe also euros?)
    	var country = yid.endsWith(".L") ? " &pound; GBP" : (yid.endsWith(".MI") ? "&euro; EUR" : (yid.endsWith(".DE") ? "&euro; EUR" : "$ USD"));
      return [n[0],country,n[1],n[2],n[3]];
    };

    function numRenderer(n,flag,css) {
        var test = Ext.type(flag) ? flag : n>=0;
        var color = test ? "green" : "red";
    	return "<span style='"+(css?css:"")+"color:"+color+"'>"+n+"</span>";
    };

    function numberRenderer(n) {return numRenderer(n.toFixed(1));}

    function sev2star(n) {
        var s = n >=0 ? " &uarr; &uarr; &uarr; &uarr; &uarr; &uarr; &uarr; &uarr; " : " &darr; &darr; &darr; &darr; &darr; &darr; &darr; &darr; ";
	var i = s.substring(0,sev2mag(n)*7);
    	return i;
    }

    function sev2mag(n) {return Math.min(8,Math.floor(Math.abs(n))-2);}

    function numGrouper(n) {
	var a = Math.abs(n);
	return a<5 ? "0% to 5%" : (a<10 ? "5% to 10%" : (a<20 ? "10% to 20%" : "More than 20%"));
    };

    function severityRenderer(n) {
    	return numRenderer(sev2star(n),n>=0,"font-size:160%;");
    }

    function percentRenderer(n) {
    	return numRenderer(n.toFixed(1)+"%",n>=0);
    };

    function Events(dt) {

      function cmp (a,b) {
	return Math.abs(b[2]) - Math.abs(a[2]);
      };
      dt.events = dt.events.sort(cmp).slice(0,100);

	function nameRenderer(yid,css,r,inx) {
	    var name = dt.stks[yid];
	    return "<span style='text-align:left'><a target=oqfid href=http://finance.yahoo.com/q/ta?s="+yid+">"+name+"</a></span>";
	};

	function nameSorter(yid) {
	    return dt.stks[yid];
	}

	var reader = new Ext.data.ArrayReader({}, [
        {name: 'name' ,sortType:nameSorter}
	,{name: 'currency'}
	,{name: 'days'   ,type: 'float'}
	,{name: 'sigma'  ,type: 'float' ,sortType:Math.abs ,sortDir:"DESC"}
	,{name: 'percent',type: 'float' ,sortType:Math.abs ,sortDir:"DESC"}
						   ]);

	var gstore = new Ext.data.GroupingStore({
		reader: reader
		,data: dt.events.map(toexnode)
		,sortInfo: {field: 'sigma', direction: "DESC"}
		,groupField:'sigma'
		,groupOnSort : true
	    });


	this.grid = new Ext.grid.GridPanel({
		store: gstore

		,columns:[
     	{header:'Name'         ,width:450,dataIndex:'name'   ,sortable:true,align:"left",renderer:nameRenderer,hideable:false}
	,{header:'Currency'    ,width:90,dataIndex:'currency',sortable:true,align:"right",tooltip:"The currency in which the stock is quoted.",hidden:true}
	,{header:'Trading Days',width:110,dataIndex:'days'    ,sortable:true,align:"right",tooltip:"The number of trading days (usually 5 days per week)."}
	,{header:'Severity'    ,width:90,dataIndex:'sigma'   ,sortable:true,align:"right",groupRenderer:sev2mag  ,renderer:severityRenderer,tooltip:"The severity of the event."}
	,{header:'% Change'    ,width:90,dataIndex:'percent' ,sortable:true,align:"right",groupRenderer:numGrouper,renderer:percentRenderer,tooltip:"The percent change of the value of the stock in the stated number of trading days."}
			   ]

		,view: new Ext.grid.GroupingView({
			 emptyGroupText:"Sorry, there are no significant events today!"
			,emptyText:"Sorry, there are no significant events today!"
			,forceFit:true
			,groupTextTpl: '{text} ({[values.rs.length]} {[values.rs.length > 1 ? "stocks" : "stock"]})'
		    }),

		frame:true,
		width: dwidth,
		height: 780,
		collapsible: false,
		animCollapse: false,
		title: dt.name
		,tabTip: dt.name + ' events.'+'<p>'+dt.numValid+' stocks analysed out of a total of '+dt.numTotal+'.<p>'+dt.events.length+' significant events detected.<p>Updated after market close on '+ Date.parseDate(dt.date,"Y-m-d").format('l, \\t\\he jS \\of F Y') +'.</p>'
		,iconCls: 'icon-grid'
		//,renderTo: events
	    });

    }

    var help = new Ext.Panel({
          id:"helpPanel"
	  ,collapsible:true
	  ,animCollapse: false
	  ,titleCollapse : true
	  //,applyTo: 'help'
          ,autoLoad: {url:'help.html',scripts:false}
	  ,width:dwidth
	  ,autoHeight:true
	  //,stateful:true
	  //,stateEvents:["collapse","expand"]
	  ,collapsed: ! userPrefs.showHelp
    });
    //function toexnode(n) {return {name:etfs[n[0]],yid:n[0],days:n[1],sigma:norm(n[2]),sigmaV:n[2],percent:norm(n[3]),href:"http://finance.yahoo.com/q/ta?s="+n[0]};}

    //function saveState() {cp.set("showHelp",! help.collapsed)}a
    //help.on("collapse",saveState);
    //help.on("expand",saveState);
    var events1 = new Events(org.quicquid.finance.data.us);
    var events2 = new Events(org.quicquid.finance.data.sp500);
    var events3 = new Events(org.quicquid.finance.data.ca256);
    //var events4 = new Events(org.quicquid.finance.data.eu);
    //var events5 = new Events(org.quicquid.finance.data.uk);
    //var events6 = new Events(org.quicquid.finance.data.uk100);

    var mar = '5 5 5 5';

    var tabs = new Ext.TabPanel({
	    region: "center",margins: mar
	    ,activeTab: 0
	    ,enableTabScroll : true
	    ,autoScroll: true
		,items: [{
		    title: 'What Is <b>Really</b> Going On In The Financial Markets?'
		    ,autoLoad: {url:'help.html',scripts:false}
		    ,autoScroll: true
		    }
		    ,events1.grid
		    ,events2.grid
		    ,events3.grid
		    //,events4.grid
		    //,events5.grid
		    ]});

    function loadTab(tabs,newTab,currentTab) {
	return true;
    }

    tabs.on("beforetabchange",loadTab);

    var viewport = new Ext.Viewport({
	    layout:'border'
	    ,items:[
		    tabs
		    ,{region:"east" ,width:220,collapsible: true,margins:mar,autoLoad: {url:'east.html',scripts:true}}
		    //,{region:"south",height:20,margins:mar,autoLoad: {url:'footer.html',scripts:false}}
		    ]});


};


Ext.onReady(org.quicquid.finance.app);

