/*
portal_items = type Portal, derived from Panel w/column layout
                \ portal_col1 (portalcolumn)
                \ portal_col2 (portalcolumn)
                \ portal_col3 (portalcolumn)
*/
//=============================================================================

Ext.namespace('AvPortal');
AvPortal.AppState = function() {
return {
  restoreState : function() {
      this.restorePanels();
      var oLoading = Ext.get('msgLoading');
      if (oLoading)
      {
        oLoading.hide();
        oLoading.setVisibilityMode(Ext.Element.DISPLAY);
        oLoading.hide();
      }
    }//end restoreState
  , restorePanels : function() {
    var oPanels = this.getVisPanels();

    var portal = Ext.ComponentMgr.get("portal_items");
    var portal_col1 = Ext.ComponentMgr.get("portal_col1");
    var portal_col2;
    var portal_col3;
    if (portalNumCols > 1) { portal_col2 = Ext.ComponentMgr.get("portal_col2"); }
    if (portalNumCols > 2) { portal_col3 = Ext.ComponentMgr.get("portal_col3"); }

    var col1Ids = [];
    var col2Ids = [];
    var col3Ids = [];
    
    var col1Titles = [];
    var col2Titles = [];
    var col3Titles = [];

    var col1Contents = [];
    var col2Contents = [];
    var col3Contents = [];

    //used to add items from other cols if layout/cols is changed
    for (var a = 0; a < oPanels.panels.length; a++)
    {
      if (parseInt(oPanels.panels[a].col, 10) === 0)
      {
        if (col1Ids[parseInt(oPanels.panels[a].colorder, 10)] !== null)
        {
          col1Ids[col1Ids.length] = oPanels.panels[a].panel_id;
          col1Titles[col1Titles.length] = oPanels.panels[a].panel_title;
          col1Contents[col1Contents.length] = oPanels.panels[a].panel_content;
        }
        else
        {
          col1Ids[parseInt(oPanels.panels[a].colorder, 10)] = oPanels.panels[a].panel_id;
          col1Titles[parseInt(oPanels.panels[a].colorder, 10)] = oPanels.panels[a].panel_title;
          col1Contents[parseInt(oPanels.panels[a].colorder, 10)] = oPanels.panels[a].panel_content;
        }
      }//end col 0 (first col)
      if (parseInt(oPanels.panels[a].col, 10) === 1)
      {
        if (portalNumCols > 1)
        {
          if (col2Ids[parseInt(oPanels.panels[a].colorder, 10)] !== null)
          {
            col2Ids[col2Ids.length] = oPanels.panels[a].panel_id;
            col2Titles[col2Titles.length] = oPanels.panels[a].panel_title;
            col2Contents[col2Contents.length] = oPanels.panels[a].panel_content;
          }
          else
          {
            col2Ids[parseInt(oPanels.panels[a].colorder, 10)] = oPanels.panels[a].panel_id;
            col2Titles[parseInt(oPanels.panels[a].colorder, 10)] = oPanels.panels[a].panel_title;
            col2Contents[parseInt(oPanels.panels[a].colorder, 10)] = oPanels.panels[a].panel_content;
          }
        }
        else
        {
          col1Ids[col1Ids.length] = oPanels.panels[a].panel_id;
          col1Titles[col1Titles.length] = oPanels.panels[a].panel_title;
          col1Contents[col1Contents.length] = oPanels.panels[a].panel_content;
        }
      }//end col 1 (second col)
      if (parseInt(oPanels.panels[a].col, 10) === 2)
      {
        if (portalNumCols > 2)
        {
          if (col3Ids[parseInt(oPanels.panels[a].colorder, 10)] !== null)
          {
            col3Ids[col3Ids.length] = oPanels.panels[a].panel_id;
            col3Titles[col3Titles.length] = oPanels.panels[a].panel_title;
            col3Contents[col3Contents.length] = oPanels.panels[a].panel_content;
          }
          else
          {
            col3Ids[parseInt(oPanels.panels[a].colorder, 10)] = oPanels.panels[a].panel_id;
            col3Titles[parseInt(oPanels.panels[a].colorder, 10)] = oPanels.panels[a].panel_title;
            col3Contents[parseInt(oPanels.panels[a].colorder, 10)] = oPanels.panels[a].panel_content;
          }
        }
        else if (portalNumCols > 1)
        {
          col2Ids[col2Ids.length] = oPanels.panels[a].panel_id;
          col2Titles[col2Titles.length] = oPanels.panels[a].panel_title;
          col2Contents[col2Contents.length] = oPanels.panels[a].panel_content;
        }
        else
        {
          col1Ids[col1Ids.length] = oPanels.panels[a].panel_id;
          col1Titles[col1Titles.length] = oPanels.panels[a].panel_title;
          col1Contents[col1Contents.length] = oPanels.panels[a].panel_content;
        }
      }//end col 2 (third col)
    }
    //TEST/DEBUG:
    //console.log(oPanels);
    //var showStr1 = "col1Ids:"; for (var s1 = 0; s1 < col1Ids.length; s1++) { showStr1 += '\n' + col1Ids[s1]; } console.log(showStr1);
    //var showStr2 = "col2Ids:"; for (var s2 = 0; s2 < col2Ids.length; s2++) { showStr2 += '\n' + col2Ids[s2]; } console.log(showStr2);
    //var showStr3 = "col3Ids:"; for (var s3 = 0; s3 < col3Ids.length; s3++) { showStr3 += '\n' + col3Ids[s3]; } console.log(showStr3);
    for (var col1Ct = 0; col1Ct < col1Ids.length; col1Ct++)
    {
      var panId1 = col1Ids[col1Ct];
      if (typeof(panels[panId1]) === 'object')//can be undefined when no privs
      {
        var panel1 = new Ext.ux.Portlet(panels[panId1]);
        if (!isGA && !isSA) { panel1.draggable = false; }
        if (panel1.id === 'panel_board' && !showBoard) { panel1.setVisible(false); }
        if (panel1.id === 'panel_messages' && !showMsg) { panel1.setVisible(false); }
        if (col1Titles[col1Ct] && col1Titles[col1Ct].length > 0) { panel1.title = col1Titles[col1Ct]; }
        portal_col1.add(panel1);
      }
    }
    for (var col2Ct = 0; col2Ct < col2Ids.length; col2Ct++)
    {
      var panId2 = col2Ids[col2Ct];
      if (typeof(panels[panId2]) === 'object')//can be undefined when no privs
      {
        var panel2 = new Ext.ux.Portlet(panels[panId2]);
        if (!isGA && !isSA) { panel2.draggable = false; }
        if (panel2.id === 'panel_board' && !showBoard) { panel2.setVisible(false); }
        if (panel2.id === 'panel_messages' && !showMsg) { panel2.setVisible(false); }
        if (col2Titles[col2Ct] && col2Titles[col2Ct].length > 0) { panel2.title = col2Titles[col2Ct]; }
        portal_col2.add(panel2);
      }
    }
    for (var col3Ct = 0; col3Ct < col3Ids.length; col3Ct++)
    {
      var panId3 = col3Ids[col3Ct];
      if (typeof(panels[panId3]) === 'object')//can be undefined when no privs
      {
        var panel3 = new Ext.ux.Portlet(panels[panId3]);
        if (!isGA && !isSA) { panel3.draggable = false; }
        if (panel3.id === 'panel_board' && !showBoard) { panel3.setVisible(false); }
        if (panel3.id === 'panel_messages' && !showMsg) { panel3.setVisible(false); }
        if (col3Titles[col3Ct] && col3Titles[col3Ct].length > 0) { panel3.title = col3Titles[col3Ct]; }
        portal_col3.add(panel3);
      }
    }
    portal_col1.doLayout();
    if (portalNumCols > 1) { portal_col2.doLayout(); }
    if (portalNumCols > 2) { portal_col3.doLayout(); }
    portal.doLayout();

    }//end restorePanels
  , getVisPanels : function() {
      var JSONtxt = "";
      JSONtxt = Ext.getDom("oPanels").value;
      var oPanels;
      if (JSONtxt !== null && JSONtxt.length > 0) { oPanels = eval('(' + JSONtxt + ')'); }
      //get default from hidden field if not previously set:
      if(!oPanels) { oPanels = eval('(' + Ext.getDom("defaultPanels").value + ')'); }
      return oPanels;
    }//end getVisPanels
  , getVisPanelsCurr : function() {
      var JSONtxt = this.getVisPanelsJSON();
      var oPanels;
      if (JSONtxt !== null && JSONtxt.length > 0) { oPanels = eval('(' + JSONtxt + ')'); }
      return oPanels;
    }//end getVisPanelsCurr
  , getVisPanelsJSON : function() {
      var portal = Ext.ComponentMgr.get("portal_items");
      var portalCols = portal.items.length;
      var colOrder = 0;
      var JSONtxt = '{"panels": [ ';
      while(true)
      {
        var bFound = false;
        for (var colNum = 0; colNum < portalCols; colNum++)
        {
          var p = portal.items.itemAt(colNum).items.itemAt(colOrder);
          if (p)
          {
            JSONtxt += '{"panel_id": "' + p.id + '", "col": "' + colNum + '", "colorder": "' + colOrder + '" }, ';
            //alert('panel_id: ' + p.id + '\ncontainer id: ' + p.ownerCt.id + '\ncol: ' + colNum + '\ncolorder: ' + colOrder);
            bFound = true;
          }
        }
        if(!bFound) { break; }
        colOrder++;
      }
      JSONtxt = JSONtxt.replace(/\}, $/,'} ');
      JSONtxt += '] }';
      return JSONtxt;
  }//end getVisPanelsJSON
  , getVisPanelsXML : function(saveType) {
      var portal = Ext.ComponentMgr.get("portal_items");
      var portalCols = portal.items.length;
      var colOrder = 0;
      var XMLtxt = "<panels>";
      var panelsFound = 0;
      while(true)
      {
        var bFound = false;
        for (var colNum = 0; colNum < portalCols; colNum++)
        {
          var p = portal.items.itemAt(colNum).items.itemAt(colOrder);
          if (p)
          {
            XMLtxt += '<panel panel_id="'+ p.id +'" col="'+ colNum +'" colorder="'+ colOrder +'" />';
            bFound = true;
            panelsFound++;
          }
        }
        if(!bFound) { break; }
        colOrder++;
      }
      XMLtxt += "</panels>";
      //0 save type must have all available panels present
      if (saveType === 0 && (panelsFound !== 10))
      {
        alert("Global layout must contain all available panels.");
        return "";
      }
      return XMLtxt;
  }//end getVisPanelsXML
  , savePortalState : function(saveType) {
      var XMLtxt = this.getVisPanelsXML(saveType);
      if (XMLtxt !== "<panels></panels>" && XMLtxt !== "") { this.setVisPanels(XMLtxt,saveType); }
    }//end savePortalState
  , setVisPanels : function(XMLtxt,saveType) {
      if (XMLtxt !== "<panels></panels>" && XMLtxt !== "")
      {
        Ext.Ajax.request({url: '/member/HomePage_ajax.asp?m=saveSettings&t=' + saveType + '&x=' + escape(XMLtxt),
          method: 'GET',
          callback: this.setVisPanelsCallback});
      }
    }//end setVisPanels
  , setVisPanelsCallback : function(opts, success, resp) {
      if (resp.responseText !== "OK")
      {
        alert("Error:\n\n" + resp.responseText);
      }
      else
      {
        alert("The layout has been saved.");
      }
    }//end setVisPanelsCallback
  , resetVisPanels : function(isSA) {
      if (isSA === 0 || isSA === 1)
      {
        Ext.Ajax.request({url: '/member/HomePage_ajax.asp?m=resetSettings&s=' + isSA,
          method: 'GET',
          callback: this.resetVisPanelsCallback});
      }
    }//end resetVisPanels
  , resetVisPanelsCallback : function(opts, success, resp) {
      if (resp.responseText !== "OK")
      {
        alert("Error:\n\n" + resp.responseText);
      }
      else
      {
        setTimeout('window.location.reload()',300);
      }
    }//end resetVisPanelsCallback
  };//end return
};//end AvPortal.AppState


//=============================================================================
var avPortalSetup = function() {
  //-----------------------------
  //portal columns (empty)

  var portal_col_width = 0.99;
  if (portalNumCols === 2) { portal_col_width = 0.50; }
  if (portalNumCols === 3) { portal_col_width = 0.33; }

  var portal_col1 = {
    id: 'portal_col1',
    columnWidth: portal_col_width,
    style:'padding: 0px 10px 0px 5px'
  };

  if (portalNumCols > 1)
  {
    var portal_col2 = {
      id: 'portal_col2',
      columnWidth: portal_col_width,
      style:'padding: 0px 10px 0px 5px'
    };
  }

  if (portalNumCols > 2)
  {
    var portal_col3 = {
      id: 'portal_col3',
      columnWidth: portal_col_width,
      style:'padding: 0px 10px 0px 5px'
    };
  }

  var portal_items_add;
  if (portalNumCols === 1) { portal_items_add = [portal_col1]; }
  if (portalNumCols === 2) { portal_items_add = [portal_col1, portal_col2]; }
  if (portalNumCols === 3) { portal_items_add = [portal_col1, portal_col2, portal_col3]; }

  var portal_items = {
    id: 'portal_items',
    xtype: 'portal',
    margins: '5 0 5 5',
    items: portal_items_add
  };

  //-----------------------------
  var vp = new Ext.Panel({
    renderTo: 'contentArea',
    autoWidth: true,
    autoHeight: true,
    monitorResize: true,
    border: false,
    bodyBorder: false,
    header: false,
    hideBorders: true,
    id: 'portal_mhp',
    items: [portal_items]
  });

};//end of setup
//=============================================================================
//=============================================================================

var appState;

function LoadPortal() {
	avPortalSetup();
	appState = new AvPortal.AppState();
	appState.restoreState();
	setTimeout(function(){
		loadWeather();
	},500);
}

//=============================================================================
//=============================================================================
var dlgModuleEdit = function() {
  var dialogME;
  return {
    showDialog : function()
    {
      //need to recreate it every time because different items may be checked/unchecked depending on if they've closed any panels
      //if (!dialogME)
      dialogME = new Ext.Window({
        html: dlgModuleEdit.editDialogContent()
        , title: 'Edit Modules'
        , closable: true
        , collapsible: false
        , resizable: false
        , modal: true
        , constrain: false
        , draggable: true
        , shadow: true
        , shim: true
        , animateTarget : "edit_modules"
        , visible: false
        , width: 450
        , height: 450
        , minWidth: 450
        , minHeight: 450
        //, y: 10
        , listeners: { beforeclose: dlgModuleEdit.beforeClose }
        , buttons: [
          { text:'Update', handler:dlgModuleEdit.handleSave },
          { text:'Cancel', handler:dlgModuleEdit.handleCancel }
        ]
        , buttonAlign:'right'
      });

      dialogME.show(Ext.getDom('edit_modules'));
      if (Ext.getDom('headerHide')) { Ext.getDom('headerHide').style.visibility = "hidden"; }
      //this is here because function "HM_f_PageClick" in HMScriptDOM.js gets called on every page on mouse down by default and pulls flash headers in front of the dialog
      var bodyEl = Ext.get(window.document);
      bodyEl.on('mousedown', function (){ if (Ext.getDom('headerHide')) { Ext.getDom('headerHide').style.visibility = "hidden"; } });
    }//end showDialog
    ,
	handleSave : function() {
		var oPanels =  appState.getVisPanelsCurr();
		var portal = Ext.getCmp("portal_items");
      var portal_col1 = Ext.getCmp("portal_col1");
      if (portalNumCols > 1) { var portal_col2 = Ext.getCmp("portal_col2"); }
      if (portalNumCols > 2) { var portal_col3 = Ext.getCmp("portal_col3"); }

      var whichForm = Ext.getDom('frmEditModules');
		if (whichForm) {
			if (whichForm.elements) {
				for (var a = 0; a < whichForm.elements.length; a++ ) {
					if (whichForm.elements[a].type === "checkbox") {
						var isPresent = false;
						for (var i = 0; i < oPanels.panels.length; i++) {
							if (oPanels.panels[i].panel_id === whichForm.elements[a].value) { isPresent = true; }
						}//end var i
						//if checked, add it (default, to col 1) if it wasn't present previously
						if (whichForm.elements[a].checked && !isPresent) {
							if (Ext.getCmp(whichForm.elements[a].value)) {
								portal_col1.add(Ext.getCmp(whichForm.elements[a].value));
								Ext.getCmp(whichForm.elements[a].value).show();
							} else {
								var oPortlet=new Ext.ux.Portlet(panels[whichForm.elements[a].value]);
								portal_col1.add(oPortlet);
								portal_col1.show(oPortlet);
							}
						}
              //if un-checked, remove it if it was present previously
              else if (!whichForm.elements[a].checked && isPresent)
              {
                var rPanel = portal_col1.findById(whichForm.elements[a].value);
                if (rPanel)
                {
                  if (rPanel.id === 'panel_acct') { portal_col1.remove(rPanel, true); }
                  else {
							rPanel.hide();
							portal_col1.remove(rPanel, false);
						}
                }
                if (portalNumCols > 1)
                {
                  rPanel = portal_col2.findById(whichForm.elements[a].value);
                  if (rPanel)
                  {
                    if (rPanel.id === 'panel_acct') { portal_col2.remove(rPanel, true); }
                    else {
								rPanel.hide();
								portal_col2.remove(rPanel, false);
							}
                  }
                }
                if (portalNumCols > 2)
                {
                  rPanel = portal_col3.findById(whichForm.elements[a].value);
                  if (rPanel)
                  {
                    if (rPanel.id === 'panel_acct') { portal_col3.remove(rPanel, true); }
                    else {
								rPanel.hide();
								portal_col3.remove(rPanel, false);
							}
                  }
                }
              }
            }//end if checkbox
          }//end for var a
        }//end if whichForm.elements
      }//end if whichForm

      if (Ext.getDom('headerHide')) { Ext.getDom('headerHide').style.visibility = "visible"; }
      //dialogME.hide();
      dialogME.close(true);
      dialogME.destroy();//must re-create each time
      delete dialogME

      portal_col1.doLayout();
      
      if (portalNumCols > 1) { portal_col2.doLayout(); }
      if (portalNumCols > 2) { portal_col3.doLayout(); }
      portal.doLayout();

    }//end handleSave
    ,
    handleCancel : function()
    {
      if (Ext.getDom('headerHide')) { Ext.getDom('headerHide').style.visibility = "visible"; }
      //dialogME.hide();
      dialogME.close(true);
      dialogME.destroy();//must re-create each time
      delete dialogME;
    }//end handleCancel
    ,
    beforeClose : function()
    {
      if (Ext.getDom('headerHide')) { Ext.getDom('headerHide').style.visibility = "visible"; }
    }
    ,
    editDialogContent : function ()
    {
      var oPanels =  appState.getVisPanelsCurr();
      var oPanelsDefault = eval('(' + Ext.getDom("defaultPanels").value + ')');

      var panelSelections = "";
      for (var a = 0; a < oPanelsDefault.panels.length; a++)
      {
        var isPresent = false;
        for (var i = 0; i < oPanels.panels.length; i++)
        {
          if (oPanels.panels[i].panel_id && oPanelsDefault.panels[a].panel_id)
          {
            if (oPanels.panels[i].panel_id.toLowerCase() === oPanelsDefault.panels[a].panel_id.toLowerCase()) { isPresent = true; }
          }
        }

        var panelTitle = panels[oPanelsDefault.panels[a].panel_id].title;
        panelSelections += '<div style="margin: 0 0 1em 2em;">';
        panelSelections += '<input type="checkbox" value="'+ oPanelsDefault.panels[a].panel_id +'" name="frm_'+ oPanelsDefault.panels[a].panel_id +'" id="frm_'+ oPanelsDefault.panels[a].panel_id +'"';
        if (isPresent) { panelSelections += ' checked="checked"'; }
        panelSelections += ' /> ';
        panelSelections += panelTitle;
        panelSelections += '</div>';
      }

      return ['<div style="background-color: #fff; width: 100%; height: 100%;">',
              '<div style="margin: 1em 0 1em 1em;">Check the modules below that you\'d like to include on the page.</div>',
              '<form id="frmEditModules">',
              panelSelections,
              '</form>',
              '</div>'].join('');
    }//end editDialogContent

  };//end of return

}();//end dlgModuleEdit


//=============================================================================
//=============================================================================
function portalSettingsSave(type){
  switch (type)
  {
    case 0:
    case 1:
    case 2:
      appState.savePortalState(type);
      break;
    default:
      break;
  }
}

function portalSettingsReset(isSA){
  if (confirm("This will reset all settings to the default layout.  Are you sure?"))
  {
    appState.resetVisPanels(isSA);
  }
}

//=============================================================================

