//****************************************************************************************
//
//	Organisation.js
//
//	Manages the Organisation details 
//
//	Depends On:
//				
//
//	Copyright: 	David Horne, Tuross Technologies Australia P/L, 2009.
//				dkhorne@bigpond.net.au
//
//****************************************************************************************

//****************************************************************************************
//	DataSources
//****************************************************************************************

//	DSM.create("Organisation", "dsOrganisation", constants.appPath + constants.OrganisationProcessFile);
//	DSM.Create("Links", "dsLinks", constants.appPath + constants.OrganisationProcessFile);
//	DSM.Create("Documents", "dsDocuments", constants.appPath + constants.OrganisationProcessFile);
	
//****************************************************************************************
//	Agents
//****************************************************************************************

	


//****************************************************************************************
//	Support Data and functions
//****************************************************************************************


	var Tab_Text = "<a href='javascript:ProcessTab([DOCUMENT])' title='[DESCRIPTION]'>[TAB]</a>"	
	var Tab_On_Mid = "<div class='tab-on-mid'>[TAB]</div>"
	var Tab_On_First = "<div class='tab-on-first'></div>"
	var Tab_On_Left = "<div class='tab-on-left'></div>"
	var Tab_On_Right = "<div class='tab-on-right'></div>"
	var Tab_On_Last = "<div class='tab-on-last'></div>"
	
	var Tab_Off_First = "<div class='tab-off-first'></div>"
	var Tab_Off_Mid = "<div class='tab-off-mid'>[TAB]</div>"
	var Tab_Off_Last = "<div class='tab-off-last'></div>"
	var Tab_Off_End = "<div class='tab-off-end'></div>"

	var TheOrganisation;
	function CreateOrganisation(Code) {
		TheOrganisation = new Organisation("");
		TheOrganisation.Load(Code);
		return TheOrganisation;
	}


	function Organisation(Name) {
	
//*********************************
//	Properties
		this.Name = Name								//	Name of Organisation
		this.Code = Name.replace(/ /g, "_");			//	Code for Organisation
		this.Description = "";							//	Description of Organisation

		this.Security = {'UserName': ''};				//	Security details

		this.Links = [];								//	Array of Organisation links
		this.Links.push({'Label': 'Contact Us', 'Type': 'Link', 'Link': '', 'Offsite': true});
		this.Links.push({'Label': 'Email', 'Type': 'Email', 'Link': '', 'Offsite': true});
		this.Links.push({'Label': 'Visit Corporate Site', 'Type': 'Link', 'Link': '', 'Offsite': true});

		this.Documents = new Array();					//	Array of document names;
		this.iDocument = 0;								//	Current document number to be displayed
		this.Document;									//	Current document to be displayed
//*********************************
		
//*********************************
//	Methods
		this.Load = Organisation_Load;					//	Load the Organisation data
		this.Save = Organisation_Save;					//	Save the Organisation data
		this.SaveSecurity = Organisation_SaveSecurity;	//	Save the Organisation security data
		this.Init = Organisation_Init;					//	Set the initial data
		this.Display = Organisation_Display;			//	Display Organisation details
		this.Tabs = Organisation_Tabs;					//	Display Organisation tabs
		
		this.LoadDocument = Organisation_LoadDocument;	//	Loads the specified document for display
	}
	

//******************************************************************
//	Load a Organisation into the Organisation object
//******************************************************************
	function Organisation_Load(Code) {

		try {
			if (Code != null) {
				var Details = {"Code" : Code};
				var data = DSM.request(constants.appPath + constants.OrganisationProcessFile, "FetchOrganisation", "", Details, false);
				if (data.ok) {
					this.ID = data.data.ID;
					this.Name = data.data.Name;
					this.Code = data.data.Code;
					this.Description = data.data.Description;
					this.Security = data.data.Security;
					this.Links = data.data.Links;
					this.Documents = data.data.Documents.sort(DocumentSort);
					this.iDocument = (this.Documents.length > 0 ? 0 : -1);
				} else {
					message.raise("Organisation", "Unable to fetch Organisation - " + this.Name, "", true);
					return;
				}
			}
		}
		catch (err) {
			message.raise("Organisation", "Unable to load Organisation.", err.message, false);
		}

	}
	
	function DocumentSort(Doc1, Doc2) {
	    if ((Doc1.Sort == null) || (Doc2.Sort == null))
	        return (Doc1.DocumentName > Doc2.DocumentName ? 1 : -1)
	    else
	        return (Doc1.Sort > Doc2.Sort ? 1 : -1)
	}

//******************************************************************
//	Save the Organisation data
//******************************************************************
	function Organisation_Save() {
		try {
			var data = DSM.request(constants.appPath + constants.OrganisationProcessFile, "SaveOrganisation", "", this, false);
			if (data.ok) {
				this.ID = data.data.ID;
				this.Name = data.data.Name;
				this.Code = data.data.Code;
				this.Description = data.data.Description;
				this.Logo = data.data.Logo;
				this.Security = data.data.Security;
				this.Links = data.data.Links;
				this.Documents = data.data.Documents;
				this.iDocument = (this.Documents.length > 0 ? 0 : -1);
				message.raise("Organisation", "Information", "Organisation details saved.", "", false);
			} else {
				message.raise("Organisation", "Error", "Unable to fetch Organisation - " + this.Name, "", false);
				return;
			}
		}
		catch (err) {
			message.raise("Organisation", "Error", "Unable to save Organisation.", err.description, false);
		}
	}
	
	
//******************************************************************
//	Save the Security data
//******************************************************************
	function Organisation_SaveSecurity() {
		try {
			var data = DSM.request(constants.appPath + constants.OrganisationProcessFile, "SaveSecurity", "", this, false);
			if (data.ok) {
				this.ID = data.data.ID;
				this.Name = data.data.Name;
				this.Code = data.data.Code;
				this.Description = data.data.Description;
				this.Logo = data.data.Logo;
				this.Security = data.data.Security;
				this.Links = data.data.Links;
				this.Documents = data.data.Documents;
				this.iDocument = (this.Documents.length > 0 ? 0 : -1);
				message.raise("Organisation", "Information", "Security details saved.", "", false);
			} else {
				message.raise("Organisation", "Error", "Unable to fetch Organisation - " + this.Name, "", false);
				return;
			}
		}
		catch (err) {
			message.raise("Organisation", "Error", "Unable to save Organisation Security.", err.description, false);
		}
	}
	
	
//******************************************************************
//	Initialise Organisation data
//******************************************************************
	function Organisation_Init(DefaultDocumentName) {
		this.iDocument = (this.Documents.length > 0 ? 0 : -1);
		for (var i = 0; i < this.Documents.length; i++) {
			if (this.Documents[i].DocumentName == DefaultDocumentName)
				this.iDocument = i;
		}
	}

//******************************************************************
//	Display Organisation at target
//******************************************************************
	function Organisation_Display(Links) {
		Links =(Links != null ? Links : true);
		try {
//			DOM.setInnerHTML("organisation-logo", HTML.Render("Logo", "Image", false, "src='" + constants.appPath + this.Logo + "' alt='" + this.Name + "'"));
			DOM.setInnerHTML("organisation-name", this.Name);

			DOM.setInnerHTML("organisation-description", this.Description);

			if (Links) {
				var strLinks = "";
				var Link;
				for (var i = 0; i < constants.GeneralLinks.length; i++) {
					Link = constants.GeneralLinks[i];
					strLinks += (strLinks != "" ? "&nbsp;|&nbsp;" : "") + HTML.Render("Links" + i, Link.Type, false, "href='" + Link.Link + "' text='" + Link.Label + "'" + (Link.Offsite ? " target='_blank'" : ""));
				}

				for (var i = 0; i < this.Links.length; i++) {
					Link = this.Links[i];
					if (Link.Link != "")
						strLinks += (strLinks != "" ? "&nbsp;|&nbsp;" : "") + HTML.Render("Links" + i, Link.Type, false, "href='" + Link.Link + "' text='" + Link.Label + "'" + (Link.Offsite ? " target='_blank'" : ""));
				}

				DOM.setInnerHTML("organisation-links", strLinks);
			}
		}
		catch (err) {}
	}

//******************************************************************
//	Display Organisation tabs
//******************************************************************
	function Organisation_Tabs(All) {
		var strTabs = "", strTabText;
		var IsOn, LeftOn, RightOn, IsFirst, IsLast;
		
		for (var i = 0; i < this.Documents.length; i++) {
			if (((All != null) && All) || this.Documents[i].Enabled) {
				LeftOn = ((i - 1) == this.iDocument);
				IsOn = (i == this.iDocument);
				RightOn = ((i + 1) == this.iDocument);
				IsFirst = (i == 0);
				IsLast = (i == (this.Documents.length - 1));
				
				strTabText = Tab_Text.replace(/\[COMPANYOBJ\]/g, this.ObjectName);
				strTabText = strTabText.replace(/\[DOCUMENT\]/g, i);
				strTabText = strTabText.replace(/\[DESCRIPTION\]/g, this.Documents[i].Description);
				strTabText = strTabText.replace(/\[TAB\]/g, this.Documents[i].Title);
				
				if (IsFirst)
					strTabs += (IsOn ? Tab_On_First : Tab_Off_First);
				
				strTabs += (IsOn ? Tab_On_Mid : Tab_Off_Mid).replace(/\[TAB\]/g, strTabText)
				
				if (!IsLast)
					strTabs += (IsOn ? Tab_On_Right : (RightOn ? Tab_On_Left : Tab_Off_End));
				else
					strTabs += (IsOn ? Tab_On_Last : Tab_Off_Last);
			}
		}
		
		DOM.setInnerHTML("tabs", strTabs);
	}

//******************************************************************
//	Load and display the specified document
//******************************************************************
	function Organisation_LoadDocument(iDocument) {

		if (this.iDocument < 0) return;

		this.iDocument = (iDocument != null ? iDocument : this.iDocument);
		
		if ((this.iDocument >= 0) && (this.iDocument < this.Documents.length)) {
			this.Document = CreateDocument("TheDocument", this.Name, this.Code, this.Documents[this.iDocument]);
			if (this.Document != null) {
				this.Tabs();
				this.Document.Set();
//				this.Document.Display();
			}
		} else {
			message.raise("Organisation Document", "Unable to load and display current document (" + this.iDocument + ")");
		}
	}	
