isc.defineClass("OPINIATOR_ExportPeriod", isc.DynamicForm);
OPINIATOR_ExportPeriod.addProperties({
	
	// Superclass properties
    showShadow:true,
    shadowOffset:9,
    shadowSoftness:10,    
    fixedColWidths:false,
	numCols:2,
    // The Items
	// Prune out stuff we're removing/not using any more
    items: 
        [
			{
		        ID:"ResponsesTimePeriodID",
				name:"chartPeriod",
		        title:"Period",
		        titleAlign:"right",
		        align:"left",
		        startRow:true,
		        type:"enum",
		        valueMap: { 
		            "ALL_TIME": "All time", 
		            "LAST_YEAR": "Last Year",
		            "LAST_MONTH": "Last Month",
		            "LAST_WEEK": "Last Week",
		            "LAST_24H": "Last 24 hours",
					"CUSTOM": "Custom"
		            }, 
				defaultValue: "ALL_TIME",
		        width:120,
		        height:25
        	},
			
			{ height:10, startRow:true, _constructor:"RowSpacerItem" },
			
			{
		        ID:"ResponsesPeriodStartTimeID",
		        title:"Start",
		        name:"start",
		        startRow:true,
		        height:30,
		        type:"canvas",
		        showTitle:true,
		        showFocused:true,
		        showFocusedAsOver:false,
		        titleAlign:"right",
		        titleOrientation:"left",
		        align:"left",
		        textAlign:"left",
		        canvasConstructor:"OPINIATOR_DatePicker",
		        canvasProperties:{ID:"ResponsesPeriodStartTimePickerID"}
     	   },	  
			
		   //  End Time
        	{
		        ID:"ResponsesPeriodEndTimeID",
		        title:"End",
		        name:"end",
		        startRow:true,
		        height:30,
		        showTitle:true,
		        showFocused:true,
		        showFocusedAsOver:false,
		        titleAlign:"right",
		        titleOrientation:"left",
		        align:"left",
		        textAlign:"left",
		        type:"canvas",
		        canvasConstructor:"OPINIATOR_DatePicker",
		        canvasProperties:{ID:"ResponsesPeriodEndTimePickerID"}
    	    }			
			
        ],

    // Yup, probably need this.
    initWidget : function () 
        { 
			this.Super("initWidget", arguments);
			this.showCustomPeriod(false); 
		},
	
		// I assume we need this
    destroy: function()
        { this.Super("destroy", arguments); },
	
    // Lose references to data updates, leave custom date picker
	itemChange: function (item, newValue, oldValue) {
		var iname = item.getFieldName();
		
		if (newValue == "CUSTOM") {
			this.showCustomPeriod(true);
		} else {
			this.showCustomPeriod(false);
		}
								
	},		
	
	// Not sure if we need this
	callback: function (methodName)
        { return {target:this, methodName:methodName}; },

    // We probably need this	
	error: function (code, msg) {
        switch ( msg ) {
            default:
                OPINIATOR.warn(msg);
                break;
		}
	},
	// Good, we need this
	showCustomPeriod:function( flag ) {
		if (flag) {
			ResponsesPeriodStartTimeID.show();
			ResponsesPeriodStartTimePickerID.setDateTime(null);
			ResponsesPeriodEndTimeID.show();
			ResponsesPeriodEndTimePickerID.setDateTime(null);
		} else {
			ResponsesPeriodStartTimeID.hide();
			ResponsesPeriodEndTimeID.hide();
		}
		
	},
	getTimePeriod: function(){
		return ResponsesTimePeriodID.getValue();
	},
	
	getStartDate: function(){
		var startTime=ResponsesPeriodStartTimePickerID.getDateTime();	
		return new Date(startTime.getFullYear(),startTime.getMonth(),startTime.getDate());
	},
	
	getEndDate: function(){
		var endTime=ResponsesPeriodEndTimePickerID.getDateTime();		
		return new Date(endTime.getFullYear(),endTime.getMonth(),endTime.getDate());			
	}

	//Andrew: Removed, left here for reference reading dd menu values
	//	
	// Turn this into a get start/end date
//	getSurveyForCustom: function() {	
//	
//		var startTime=PeriodStartTimePickerID.getDateTime();
//		var endTime=PeriodEndTimePickerID.getDateTime();		
//		var d1=new Date(startTime.getFullYear(),startTime.getMonth(),startTime.getDate());
//		var d2=new Date(endTime.getFullYear(),endTime.getMonth(),endTime.getDate());	
//		if (d1 > d2) {
//			OPINIATOR.warn("Please input Start date < End date");			
//		}
//		else {	
//		
//			if (!isc.isA.Array(this.analytic.questions)) {
//				WebClientSvc.getSurveyAnalyticsByPeriod(this.analytic.questions.id, sId, orgId, "CUSTOM", PeriodStartTimePickerID.getDateTime(), PeriodEndTimePickerID.getDateTime(), this.callback("updateChart"), this.callback("error"));
//			}
//			else {
//				var perfId = this.analytic.questions[0].id;
//				
//				WebClientSvc.getSurveyAnalyticsByPeriod(perfId, sId, orgId, "CUSTOM", PeriodStartTimePickerID.getDateTime(), PeriodEndTimePickerID.getDateTime(), this.callback("updateChartPerformance"), this.callback("error"));
//				
//				var impId = this.analytic.questions[1].id;
//				
//				WebClientSvc.getSurveyAnalyticsByPeriod(impId, sId, orgId, "CUSTOM", PeriodStartTimePickerID.getDateTime(), PeriodEndTimePickerID.getDateTime(), this.callback("updateChartImportance"), this.callback("error"));
//			}
//		}
//	}
	
  
});

isc.defineClass("OPINIATOR_AnalyticTabs", OPINIATOR_TabSet);
OPINIATOR_AnalyticTabs.addProperties({    
	tabs:
        [		
        {
        ID:"PerformanceTabID",
        title:"Performance", 
        openPane: function ( parent, pane, analytics ) 
            { 
            if ( !isc.isAn.Object(pane) )
                { pane = OPINIATOR_PerformancePane.create({width:"100%", height:"100%"}); }
            
			pane.setAnalytics(analytics);
            return pane;
			
            }
        },
        {
        ID:"VulnerabilityTabID",
        title:"Vulnerability", 
        openPane: function ( parent, pane, analytics ) 
            { 
            if ( !isc.isAn.Object(pane) )
                { pane = OPINIATOR_VulnerabilityPane.create({width:"100%", height:"100%"}); }
            pane.setAnalytics(analytics);
            return pane;
            }
        },
        {
        ID:"KPIID",
        title:"KPI", 
        openPane: function ( parent, pane, analytics ) 
            { 
            //if ( !isc.isAn.Object(pane) )
                //{ 
			pane = OPINIATOR_KPIPane.create({width:"100%", height:"100%"}); 
			pane.setAnalytics(analytics);						
			
			var period =  OPINIATOR_KPIPeriod.create({width: 100, _parentPane: pane});
			
			var exportButton = OPINIATOR_Button.create({                    
                    layoutAlign:"right",
                    title: "Export",
					target:this,
                    width: 80,
                    icon: "icons/16/export.png",  
                    click: function ()
                        {																		
							HTMLFlow.create({
							    ID: "iframe",
							    name: "iframe",
							    contentsType: "page",
							    autoDraw: true,
							    visibility: "hidden"
							  });
							
							var str = pane.exportData();
							if (sId != null ) {
								str += '&sId=' + sId;
							}

							if (orgId != null) {
								str += '&orgId=' + orgId;
							}
							
							str += "&period=" + periodKPI;
							iframe.setContentsURL(str);
                        }
            });            		
			
			var vlayout = isc.VLayout.create({
				ID:"_KPIAreaID",
				members:[ { height:1, startRow:true, editorType:"rowSpacer"}, 
							period, pane,
							{ height:1, startRow:true, editorType:"rowSpacer"},
							 exportButton]
            });

            return vlayout;
            }
        },
        {
        ID:"OEID",
        title:"Open Ended", 
        openPane: function ( parent, pane, analytics ) 
            {
			pane = OPINIATOR_OpenEndedPane.create({width:"100%", height:"100%"});
            pane.setAnalytics(analytics);
			
			var exportButton = OPINIATOR_Button.create({
                    layoutAlign:"right",
                    title: "Export",
					target:this,
                    width: 80,
                    icon: "icons/16/export.png",
                    click: function ()
                        {
							HTMLFlow.create({
							    ID: "iframe",
							    name: "iframe",
							    contentsType: "page",
							    autoDraw: true,
							    visibility: "hidden"
							 });
							 var url = exportURL + '?';
							 if (sId != null) {
								url += '&sId=' + sId;
							 } else if (orgId != null) {
								url += '&orgId=' + orgId;
							 }
							 
							 // get all catergory's IDs.
							 var arrays = [];
							 for (var i = 0; i < pane._tcats.length; i++) {
								arrays.push(pane._tcats[i].id);
							 }
							
							 url += '&catId=' + encodeURIComponent(arrays.join(',')) + '&_startRow=' + _startRow + '&_endRow=' + _endRow;
							 
							 iframe.setContentsURL(url);
                        }
            });
			
			var vlayout = isc.VLayout.create({
				ID:"_OpenEndedAreaID",
				members:[pane, exportButton]
            });
            return vlayout;
            }
        }
        ,
		{
        ID:"RESID",
        title:"Responses", 
        openPane: function ( parent, pane, analytics ) 
            {
			
        	var exportPeriod = OPINIATOR_ExportPeriod.create({width: 214});
        	
			var exportButton = OPINIATOR_Button.create({
                    layoutAlign:"left",
                    title: "Export CSV",
					target:this,
                    width: 110,
                    icon: "icons/16/export.png",
                    click: function ()
                        {
							HTMLFlow.create({
							    ID: "iframe",
							    name: "iframe",
							    contentsType: "page",
							    autoDraw: true,
							    visibility: "hidden"
							 });

							 var url = exportcsvURL + '?';
							 if (sId != null) {
								url += '&sId=' + sId;
							 } else if (orgId != null) {
								url += '&orgId=' + orgId;
							 }
							 
							 if(exportPeriod.getTimePeriod() != null){
								 url += '&tp=' + exportPeriod.getTimePeriod();
								 if(exportPeriod.getTimePeriod() == 'CUSTOM'){
								 	var startDate = exportPeriod.getStartDate();
									var endDate = exportPeriod.getEndDate();
									url += '&sD=' + startDate.getDate();
									url += '&sM=' + (startDate.getMonth()+1);
									url += '&sY=' + startDate.getFullYear();
									url += '&eD=' + endDate.getDate();
									url += '&eM=' + (endDate.getMonth()+1);
									url += '&eY=' + endDate.getFullYear();
								 }
							 }
							 
							 iframe.setContentsURL(url);
                        }
            });
			
			var vlayout = isc.VLayout.create({
				ID:"_ResponsesAreaID",
				styleName:"response-button",
				members:[exportPeriod,exportButton]
            });
            return vlayout;
            }
        }
        ],

    initWidget: function ()
        {
        this.Super("initWidget", arguments);
        },

    destroy: function ()
        {
        this.Super("destroy", arguments);
        }
	
 });


isc.defineClass("OPINIATOR_AnalyticsViewer", isc.HLayout);
OPINIATOR_AnalyticsViewer.addProperties({
    styleName:"defaultCanvas",
    width:"100%",

    // private properties
    _selector: null,
    _viewport: null,

    initWidget : function () 
        {

        this._viewport = OPINIATOR_AnalyticTabs.create({ID:"AnalyticTabsID"});

        // Initially load the viewer disabled since there won't be a selection
        this._viewport.disable();
        this._viewport.hide();

        this._selector = OPINIATOR_SurveySelector.create({ 
            ID: "AnalyticSelectorID",
            target:this,
            width:230,

            onSurveyOpen: function ( surveyid )
                { this.target.openSurveyAnalytics(surveyid); },


            onOrgUnitOpen: function ( orgid )
                { this.target.openOrgAnalytics(orgid); }
            });
		
		// loading tree into tree grid
		if ( loadFirstTime ) {
			this._selector.refresh();
			loadFirstTime = false;			
		} else {
			this._selector.setSurveyTree();
			this._selector._getTreeGrid().setData(globalTree);
		}

        this.members = [this._selector, this._viewport];
        this.resizeBarClass = OPINIATOR_ResizeBar;

        this.Super("initWidget", arguments);
        },

    destroy: function()
        {
        delete this._selector.target;
        delete this._selector;
        delete this._viewport;
        delete this._analytics;
        this.Super("destroy", arguments);
        },

    openSurveyAnalytics: function ( analytics )
        {
        if ( isc.isA.Number(analytics) )
            {
            this._viewport.show();
            this._viewport.showBusy(true, OPINIATOR.BUSY_DELAY);
            var surveyid = analytics;
			sId = surveyid;
			orgId = null;
            WebClientSvc.getSurveyAnalytics(surveyid, this.callback("openSurveyAnalytics"), this.callback("error"));
            return;
            }

        this._viewport.openPanes(analytics);
        this._viewport.showBusy(false);
        this._viewport.enable(true);
        this._pollForAnalyticsChange(analytics);
        },

    openOrgAnalytics: function ( analytics )
        {
        if ( isc.isA.Number(analytics) )
            {
            this._viewport.show();
            this._viewport.showBusy(true, OPINIATOR.BUSY_DELAY);
            var orgid = analytics;
			orgId = orgid;
			sId = null;
            WebClientSvc.getOrgUnitAnalytics(orgid, this.callback("openOrgAnalytics"), this.callback("error"));
            return;
            }

        this._viewport.openPanes(analytics);
        this._viewport.showBusy(false);
        this._viewport.enable(true);
        this._pollForAnalyticsChange(analytics);
        },

    _pollForAnalyticsChange: function ( analytics )
        {
        this._analytics = analytics;
        WebClientSvc.pollForAnalyticsChange(analytics.type, analytics.id, analytics.lastUpdated, 
                                            this.callback("_onAnalyticsChanged"), this.callback("error"));
        },

    _onAnalyticsChanged: function ( status )
        {
        if ( isc.isAn.Object(status) )
            {
            if ( !this.destroyed && this._sameAnalytics(status) )
                {
                // Booleans returned from WebServices are Boolean objects not boolean
                // so you must get the valueOf() them to figure out the boolean value.
                if ( status.hasChanges.valueOf() )
                    { 
                    if ( status.type == "SURVEY" )
                        { this.openSurveyAnalytics(status.id); }
                    else if ( status.type == "ORG" )
                        { this.openOrgAnalytics(status.id); }
						_isChange=true;
                    }
                else
                    {
                    	this._pollForAnalyticsChange(this._analytics);
						isChange=false;
                    }
                }
            }
        },

    _sameAnalytics : function ( changed )
        { return ( this._analytics.type == changed.type && this._analytics.id == changed.id ); },

    error: function (code, msg)
        {
        this._viewport.showBusy(false);
        switch ( msg )
            {
            case "DeletedState":
                OPINIATOR.warn("The survey or organization has been deleted by another user.");
                this.selector.refresh();
                this.hide();
                break;

            default:
                OPINIATOR.warn(msg);
                break;
            }
        },

    callback: function (methodName)
        { return {target:this, methodName:methodName}; }

});

