/* Guru Desktop

    A flexible encapsulated desktop
    designed for reuse by plug-in modules   

    Dependencies:
        YUI 
            yahoo-dom-event.js
            container_core.js
            menu.js
            toolbar.js
            
    Requires:
        reset-fonts-grids.css
        menu.css 
        
        
TODO:    
        
    popup submenus cut off in IE
        according to Yahoo this is an IE bug 
        workarounds-don't use submenus or don't use IE            
*/

//namespacing object
var guruDesk =new Object();

//DEFINE CONSTANTS
guruDesk.AUTH_LVL_ADMIN = 2;
guruDesk.PRIORITY_LOW = 1;
guruDesk.PRIORITY_DEFAULT = 2;
guruDesk.PRIORITY_HIGH = 3;
guruDesk.CHANGE_SETTING_URL = "server/stgEdit.php";
guruDesk.GET_SETTINGS_URL = "server/stgGet.php";

//DESKTOP
function guruDesktop(loader, options) {
    //initialize desktop
    this.view = new desktopView();
    //set & initialize loader
    this.loader = loader;
    this.loader.initialize(this);
    //set option defaults for any missing options
    this.setOptions(options);
    //setup workspace
    this.workspace = document.getElementById(this.view.workspaceId);
    //create settings array
    if(this.options.settings) {
        this.settings = new Array();
        this.getSettingsCallback= new getSettingsCallback(this);
        this.changeSettingCallback = new changeSettingCallback(this);
    }
    //set up menu
    if(this.options.menu) {
        if(this.options.menubar) {
            this.menu = new YAHOO.widget.MenuBar(this.view.menuContainerId, { autosubmenudisplay: true, showdelay: 250, hidedelay:  750, lazyload: true});
        }
        else {
            this.menu = new YAHOO.widget.Menu(this.view.menuContainerId, { autosubmenudisplay: true, iframe: true, zindex: 201, container: document.body,showdelay: 250, hidedelay:  750, lazyload: true});
        }
    }
        
    //check for arbitrator
    if(this.options.arbitrator) {
        this.credentials = {name: '', userId: 0, authLevel: 0}; 
        this.arbitrator = new guruArbitrator(this);
    }
    else {
        this.credentials = {name: 'anonymous', userId: 0, authLevel: guruDesk.AUTH_LVL_ADMIN};
        this.load();
    }      
}

guruDesktop.prototype = {
   setOptions: function(options) {
        //set default options
        this.options = {arbitrator: true, userManager: true, messenger: true, menubar: true,menu: true,logging: false, settings: true};
        //override default for any specified options
        if(options) {
            if(options.arbitrator != null) {
                this.options.arbitrator = options.arbitrator;
            }
            if(options.userManager != null) {
                this.options.userManager = options.userManager;
            }
            if(options.messenger != null) {
                this.options.messenger = options.messenger;
            }            
            if(options.menubar != null) {
                this.options.menubar = options.menubar;
            }
            if(options.menu != null) {
                this.options.menu = options.menu;
            }
            if(options.logging != null) {
                this.options.logging = (options.logging || this.options.logging);
            }
            if(options.settings != null) {
                this.options.settings = options.settings;
            }

         }                  
   },
   unload: function() {
        if(this.menu) {
            this.menu.clearContent();
        }      
        if(this.options.settings) {
            this.settings = new Array();
        }
       if(this.workspace) {
            this.workspace.innerHTML = "";
        }
   },
   load: function() {
        //clear workspace
        this.workspace.innerHTML = "";
        //setup messenger
        if(this.options.messenger) {
            this.messenger = true;
        }
        //retrieve settings list
        if(this.options.settings) {
            YAHOO.util.Connect.asyncRequest('GET',guruDesk.GET_SETTINGS_URL, this.getSettingsCallback);
        }
        
        this.loader.load();

        //setup userManager
        if(this.options.userManager) {
            this.userManager = new guruUserManager(this);            
        }
        //setup core menu items
        if (this.menu) {
            //setup Options menu item
            if(this.options.settings) {
                this.menu.addItem({ text: "Options", onclick: { fn: this.loadEditSettings, scope: this}});
            }                
            //set arbitrator menu last
            //so Logout menu option the right-most option         
            if(this.arbitrator) {
                this.arbitrator.setMenu();
            }
            this.menu.render();
        }
        //load default workspace (feed mgr)
        this.loader.finalize();
   },
   loadEditSettings: function() {
        this.workspace.innerHTML = this.view.changeSetting(this.settings);
        //bind events for this view
        YAHOO.util.Event.addListener(this.view.submitChgStg, 'click', this.changeSetting, this);
        YAHOO.util.Event.addListener(this.view.fldStgName, 'change', this.settingSwitch, this);
   },
   unlock: function(credentials) {
        this.credentials = credentials;
        this.load();
   },
   changeSetting: function(e,oThis) {
      //validate setting change
        var nm = document.getElementsByName(oThis.view.fldStgName)[0].value;
        if (nm.length == 0) { 
            alert("Please supply a setting value");
        }
        else {                          
            YAHOO.util.Connect.setForm(oThis.view.frmChgStg);        
            YAHOO.util.Connect.asyncRequest('POST', guruDesk.CHANGE_SETTING_URL,oThis.changeSettingCallback);
            oThis.workspace.innerHTML = '';
            oThis.displayMessage("Changing '" + nm + "' setting");
        }     
    },
    settingSwitch: function(e,oThis) {
        var nm = document.getElementsByName(oThis.view.fldStgName)[0].value;
        var val = document.getElementsByName(oThis.view.fldStgVal)[0]; 
        if (nm.length > 0) {        
            for(var i=0;i<oThis.settings.length; i++) {
                if(oThis.settings[i].name==nm) {
                    val.value = oThis.settings[i].data;
                    break;
                }
            }
        }
        else {
            val.value = '';
        }
    },   
   displayMessage: function(messg, priority) {
        if(this.messenger) {
            var msg1=new msg.Message(messg,priority);            
        }
        else {
            alert(msg);
       }
    }
};

function getSettingsCallback(component) {
   this.component = component;
}

getSettingsCallback.prototype = {
   success:  function(o) {
      var xml = o.responseXML.documentElement;
      var stgEls = xml.getElementsByTagName("setting");
      var name = null;
      var val = null;
      var aryMods = this.component.loader.moduleList();
      
      for (var i = 0; i < stgEls.length; i++) {
        //skip read only settings
        if (stgEls[i].getElementsByTagName("readOnly")[0].firstChild.nodeValue == '0') {
            //skip settings from unused modules
            for (var j = 0; j < aryMods.length; j++) {                      
                if(aryMods[j] == stgEls[i].getElementsByTagName("moduleId")[0].firstChild.nodeValue) {
                    name = stgEls[i].getElementsByTagName("settingName")[0].firstChild.nodeValue;
                    val = stgEls[i].getElementsByTagName("settingValue")[0].firstChild.nodeValue;
                    this.component.settings.push(new setting(name, val));
                    break;
                }
            }
        }
      }
      this.component.displayMessage("Settings retrieved successfully");            
   },
	failure: function(o) {
        this.component.displayMessage(o.responseText, PRIORITY_HIGH);       
    } 
};

function changeSettingCallback(component) {
   this.component = component;
}

changeSettingCallback.prototype = {
   success:  function(o) {
      var xml = o.responseXML.documentElement;
      var name = xml.getElementsByTagName("settingName")[0].firstChild.nodeValue;
      var val = xml.getElementsByTagName("settingValue")[0].firstChild.nodeValue;
      for (var i = 0; i < this.component.settings.length; i++) {
        if(this.component.settings[i].name == name) {
            this.component.settings[i].data = val;
            break;
        }
      }      
      this.component.displayMessage('"' + name + '" has been set to: ' + val);
   },
	failure: function(o) {
            this.component.displayMessage(o.responseText, PRIORITY_HIGH);       
    } 
};

//MODEL
function setting(name,data) {
    this.name=name;
    this.data=data;
}

//DESKTOP VIEW (DEFINES ELEMENT IDS)
function desktopView() {
    this.workspaceId = "desktopWorkspace";
    this.menuId = "desktopMenubar";
    this.menuContainerId = "menuContainer"        
    this.messageTrayId = "messageTray";
    //editing forms 
    this.frmChgStg = "frmChangeGuruSetting";    
    //editing form submit buttons
    this.submitChgStg = "submitChangeGuruSetting";
    //editing form fields
    this.fldStgVal = "fldGuruSettingValue";
    this.fldStgName = "fldGuruSettingName"; 
    //WAG customization
    this.leftSidebarId = "leftSidebar";
    this.righttSidebarId = "rightSidebar";       
};
desktopView.prototype = {
    changeSetting: function(settings) {
        var html = '<h2>Change Settings</h2><br>';
        html += '<form method="post" id="' + this.frmChgStg + '">';
        html += '<select name="' + this.fldStgName + '" ';
        html += 'id="' + this.fldStgName + '"><option value="" selected>Please select a setting...</option>';
   
        if (settings.length > 0) {
            for (var i = 0; i < settings.length; i++) {
                html += '<option value="' + settings[i].name + '">' + settings[i].name + '</option>';
            }
        }
        html += '</select><br><br>Setting Value<br>';
        html += '<input type="text" name="' + this.fldStgVal + '" size="50">';        
        html += '<br><br><input type="button" id="' + this.submitChgStg + '" value="Save Change"/></form>';
        return html;
    }
}
