YAHOO.namespace("SolSurf.main");
YAHOO.namespace("SolSurf.inits");
YAHOO.namespace("SolSurf.loaded");


//create the dependency loader and insert dependencies
function initLoader(server, port, path, page) {
//	YAHOO.util.Event.onAvailable('bd', function() {YAHOO.util.Dom.addClass('bd', 'pre-load')});
	YAHOO.SolSurf.main.loader = new YAHOO.util.YUILoader({
		base: path + 'js/yui/build/',
		loadOptional: true,
		onSuccess: function() { YAHOO.SolSurf.inits.main(server, port, path, page); },
		onFailure: function() { alert("A fatal error occured while loading this page: JavaScript/CSS sources did not load."); },
		timeout: 10000,
		combine: false,
		allowRollup: true
	});
	
	//add custom sources as modules to loader
	//SolSurf Variables
	YAHOO.SolSurf.main.loader.addModule({
		name: 'solvars',
		type: 'js',
		varName: "YAHOO.SolSurf.loaded.vars",
		path: "../../variables.js",
		requires: ["yahoo"]
	});
	//SolSurf Logger
	YAHOO.SolSurf.main.loader.addModule({
		name: 'sollogger',
		type: 'js',
		varName: "YAHOO.SolSurf.loaded.mainLogger",
		path: "../../logger.js",
		requires: ["yahoo","event","animation","logger","solvars"]
	});
	//SolSurf Custom Events
	YAHOO.SolSurf.main.loader.addModule({
		name: 'solevents',
		type: 'js',
		varName: "YAHOO.SolSurf.loaded.events",
		path: "../../events.js",
		requires: ["yahoo","event","sollogger"]
	});
	//SolSurf UI Operations
	YAHOO.SolSurf.main.loader.addModule({
		name: 'solui',
		type: 'js',
		varName: "YAHOO.SolSurf.loaded.ui",
		path: "../../uiOperations.js",
		requires: ["yahoo","dom","solvars","sollogger","solevents"]
	});
	//SolSurf Profiler Viewer
	YAHOO.SolSurf.main.loader.addModule({
		name: 'solprofileviewer',
		type: 'js',
		varName: "YAHOO.SolSurf.loaded.profileViewer",
		path: "../../profileViewer.js",
		requires: ["yahoo","dom","event","profilerviewer","solvars","sollogger","solevents"]
	});
	//SolSurf Wait Overlay
	YAHOO.SolSurf.main.loader.addModule({
		name: 'solpnlwait',
		type: 'js',
		varName: "YAHOO.SolSurf.loaded.pnlWait",
		path: "../../pnlWait.js",
		requires: ["yahoo","container","profiler","event","solvars","sollogger"]
	});
	//SolSurf Error Overlay
	YAHOO.SolSurf.main.loader.addModule({
		name: 'solpnlerror',
		type: 'js',
		varName: "YAHOO.SolSurf.loaded.pnlError",
		path: "../../pnlError.js",
		requires: ["yahoo","container","profiler","event","solvars","sollogger"]
	});
	//SolSurf Message Overlay
	YAHOO.SolSurf.main.loader.addModule({
		name: 'solpnlmessage',
		type: 'js',
		varName: "YAHOO.SolSurf.loaded.pnlMessage",
		path: "../../pnlMessage.js",
		requires: ["yahoo","container","profiler","event","solvars","sollogger"]
	});
	//SolSurf Registration Form Overlay
	YAHOO.SolSurf.main.loader.addModule({
		name: 'solpnlregister',
		type: 'js',
		varName: "YAHOO.SolSurf.loaded.pnlRegister",
		path: "../../pnlRegister.js",
		requires: ["yahoo","container","connection","profiler","event","solvars","sollogger","solpnlerror"]
	});
	//SolSurf Administration Tabs
	YAHOO.SolSurf.main.loader.addModule({
		name: 'soltabadmin',
		type: 'js',
		varName: "YAHOO.SolSurf.loaded.tabAdmin",
		path: "../../tabAdmin.js",
		requires: ["yahoo","connection","tabview","profiler","event","solvars","sollogger","solpnlerror"]
	});
	//SolSurf Drag and Drop Utility
	YAHOO.SolSurf.main.loader.addModule({
		name: 'ddutil',
		type: 'js',
		varName: "YAHOO.SolSurf.loaded.ddUtil",
		path: "../../dragDropUtil.js",
		requires: ["yahoo","dom","event","dragdrop"]
	});
	//SolSurf CSS
	YAHOO.SolSurf.main.loader.addModule({
		name: "solcss",
		type: "css",
		path: "../../../Styles/global.css"
	});
	
	//load modules via loader utility
	YAHOO.SolSurf.main.loader.require(["utilities", "container", "connection", "logger", "button", "calendar", "tabview", "editor", "profilerviewer", "ddutil", "solvars", "sollogger", "solevents", "solui", "solprofileviewer", "solpnlwait", "solpnlerror", "solpnlmessage", "solcss"]);
	YAHOO.SolSurf.main.loader.insert();
}


/**
 * Initialize the environment
 */
YAHOO.SolSurf.inits.main = function(server, port, path, page) {
	//initialize namespaces
	YAHOO.namespace("SolSurf.main.logger");
	YAHOO.namespace("SolSurf.main.event");
	YAHOO.namespace("SolSurf.main.container");
	
	//initialize the environment
	YAHOO.SolSurf.inits.logger();
	YAHOO.SolSurf.main.logger.mainLogger.custfunc.log("Namespaces created.", "info", null, false);
	YAHOO.SolSurf.inits.vars();
	YAHOO.SolSurf.main.vars.server = server;
	YAHOO.SolSurf.main.vars.port = port;
	YAHOO.SolSurf.main.vars.contextPath = path;
	var parts = page.split('/');
	parts = parts[parts.length-1].split('.');
	YAHOO.SolSurf.main.vars.page = parts[0];
	YAHOO.SolSurf.main.logger.mainLogger.custfunc.log("Server set to: "+YAHOO.SolSurf.main.vars.server, "info", null, false);
	YAHOO.SolSurf.main.logger.mainLogger.custfunc.log("Port set to: "+YAHOO.SolSurf.main.vars.port, "info", null, false);
	YAHOO.SolSurf.main.logger.mainLogger.custfunc.log("Path set to: "+YAHOO.SolSurf.main.vars.contextPath, "info", null, false);
	YAHOO.SolSurf.main.logger.mainLogger.custfunc.log("Page set to: "+YAHOO.SolSurf.main.vars.page, "info", null, false);
	YAHOO.SolSurf.inits.events();
	YAHOO.SolSurf.inits.UI();
	YAHOO.SolSurf.inits.profileViewer();

	//subscribe to server communication events
	YAHOO.SolSurf.main.event.onComStart.subscribe(YAHOO.SolSurf.main.UI.toggleCom);
	YAHOO.SolSurf.main.event.onComEnd.subscribe(YAHOO.SolSurf.main.UI.toggleCom);
	//subscribe to work events
	YAHOO.SolSurf.main.event.onWorkStart.subscribe(YAHOO.SolSurf.main.UI.toggleWork);
	YAHOO.SolSurf.main.event.onWorkEnd.subscribe(YAHOO.SolSurf.main.UI.toggleWork);
	
	YAHOO.tool.Profiler.registerFunction('YAHOO.SolSurf.inits.pnlWait');
	YAHOO.SolSurf.inits.pnlWait();
	YAHOO.tool.Profiler.registerFunction('YAHOO.SolSurf.inits.pnlError');
	YAHOO.SolSurf.inits.pnlError();
	YAHOO.tool.Profiler.registerFunction('YAHOO.SolSurf.inits.pnlMessage');
	YAHOO.SolSurf.inits.pnlMessage();

	YAHOO.SolSurf.main.event.onWorkStart.fire();

	
	//prepare registration form page
	if (YAHOO.SolSurf.main.vars.page == "Register") {
		YAHOO.SolSurf.main.event.onWorkStart.fire();
		var path = YAHOO.SolSurf.main.vars.contextPath;
		var scripts = YAHOO.SolSurf.main.vars.scripts;
		var sURLs = [
		             	path+scripts.root+scripts.container.pnlRegister,
		             	path+scripts.root+scripts.calendar.main
		             ];
		YAHOO.util.Get.script(sURLs, { 
			onSuccess: function(o) {
				YAHOO.tool.Profiler.registerFunction('YAHOO.SolSurf.inits.pnlRegister');
				YAHOO.SolSurf.inits.pnlRegister();
				YAHOO.tool.Profiler.registerFunction('YAHOO.SolSurf.inits.calendar');
				YAHOO.SolSurf.inits.calendar('pnl-register');
				YAHOO.SolSurf.main.event.onWorkEnd.fire();
			},
			onFailure: function(o) {
				YAHOO.SolSurf.main.container.pnlError.custfunc.show("Sorry, there was an error while trying to load the page.");
				YAHOO.SolSurf.main.event.onWorkEnd.fire();
			}
		});
	}
	
	//prepare admin page
	if (YAHOO.SolSurf.main.vars.page == "Admin") {
		YAHOO.SolSurf.main.event.onWorkStart.fire();
		var path = YAHOO.SolSurf.main.vars.contextPath;
		var scripts = YAHOO.SolSurf.main.vars.scripts;
		var sURLs = [
		             	path+scripts.root+scripts.admin,
		             	path+scripts.root+scripts.tabs.tabAdmin,
		             	path+scripts.root+scripts.calendar.admin,
		             	path+scripts.root+scripts.editor.news,
		             	path+scripts.root+scripts.editor.surfReport
		             ];
		YAHOO.util.Get.script(sURLs, { 
			onSuccess: function(o) {
				YAHOO.tool.Profiler.registerFunction('YAHOO.SolSurf.inits.admin');
				YAHOO.SolSurf.inits.admin();
				YAHOO.tool.Profiler.registerFunction('YAHOO.SolSurf.inits.tabAdmin');
				YAHOO.SolSurf.inits.tabAdmin();
				YAHOO.SolSurf.main.event.onWorkEnd.fire();
			},
			onFailure: function(o) {
				YAHOO.SolSurf.main.container.pnlError.custfunc.show("Sorry, there was an error while trying to load the page.");
				YAHOO.SolSurf.main.event.onWorkEnd.fire();
			}
		});
	}

	//prepare confirmation overlay
	if (YAHOO.util.Dom.getElementsByClassName('confirmEnabled').length>0) {
		YAHOO.SolSurf.main.event.onWorkStart.fire();
		var path = YAHOO.SolSurf.main.vars.contextPath;
		var scripts = YAHOO.SolSurf.main.vars.scripts;
		var sURLs = [
		             	path+scripts.root+scripts.container.pnlConfirm
		             ];
		YAHOO.util.Get.script(sURLs, { 
			onSuccess: function(o) {
				YAHOO.tool.Profiler.registerFunction('YAHOO.SolSurf.inits.pnlConfirm');
				YAHOO.SolSurf.inits.pnlConfirm();
				YAHOO.SolSurf.main.event.onWorkEnd.fire();
			},
			onFailure: function(o) {
				YAHOO.SolSurf.main.container.pnlError.custfunc.show("Sorry, there was an error while trying to load the page.");
				YAHOO.SolSurf.main.event.onWorkEnd.fire();
			}
		});
	}

	//prepare drag/drop
	if (YAHOO.util.Dom.getElementsByClassName('ddEnabled').length>0) {
		YAHOO.SolSurf.main.event.onWorkStart.fire();
		var path = YAHOO.SolSurf.main.vars.contextPath;
		var scripts = YAHOO.SolSurf.main.vars.scripts;
		var sURLs = [
		             	path+scripts.root+scripts.dragDrop
		             ];
		YAHOO.util.Get.script(sURLs, { 
			onSuccess: function(o) {
				YAHOO.tool.Profiler.registerFunction('YAHOO.SolSurf.inits.dragDrop');
				YAHOO.SolSurf.inits.dragDrop();
				YAHOO.SolSurf.main.event.onWorkEnd.fire();
			},
			onFailure: function(o) {
				YAHOO.SolSurf.main.container.pnlError.custfunc.show("Sorry, there was an error while trying to load the page.");
				YAHOO.SolSurf.main.event.onWorkEnd.fire();
			}
		});
	}
	
	//prepare calendar
	var elDatePickers = YAHOO.util.Dom.getElementsByClassName('datePicker');
	if (elDatePickers.length > 0) {
		YAHOO.SolSurf.main.event.onWorkStart.fire();
		var path = YAHOO.SolSurf.main.vars.contextPath;
		var scripts = YAHOO.SolSurf.main.vars.scripts;
		var sURLs = [
		             	path+scripts.root+scripts.calendar.main
		             ];
		YAHOO.util.Get.script(sURLs, { 
			onSuccess: function(o) {
				YAHOO.tool.Profiler.registerFunction('YAHOO.SolSurf.inits.calendar');
				YAHOO.SolSurf.inits.calendar();
				YAHOO.SolSurf.main.event.onWorkEnd.fire();
			},
			onFailure: function(o) {
				YAHOO.SolSurf.main.container.pnlError.custfunc.show("Sorry, there was an error while trying to load the page.");
				YAHOO.SolSurf.main.event.onWorkEnd.fire();
			}
		});
	}
	YAHOO.SolSurf.main.logger.mainLogger.custfunc.log(elDatePickers.length + " datePicker elements found.", "debug", null, false);
	
	
	//detect and fix IE display bugs
	YAHOO.SolSurf.main.ieFixes = function (root) {
		if (YAHOO.env.ua.ie > 0) {
			YAHOO.util.Event.onDOMReady(function() {
				if (root === undefined || root === null) root = document;
				//fix :before css pseudo-class for required class
				var elements = YAHOO.util.Dom.getElementsByClassName('required', 'label', root);
				if (elements != null && elements.length > 0) {
					for (var i=0; i<elements.length; i++) {
						elements[i].innerHTML = '<span class="required-text">*</span>' + elements[i].innerHTML;
					}
				}
				//fix :after css pseudo-class for label tags
				var forms = root.getElementsByTagName('form');
				if (forms != null && forms.length > 0) {
					for (var i=0; i<forms.length; i++) {
						var labels = forms[i].getElementsByTagName('label');
						if (labels != null && labels.length > 0) {
							for (var j=0; j<labels.length; j++) {
								labels[j].innerHTML = labels[j].innerHTML + ':';
							}
						}
					}
				}
				var forms = YAHOO.util.Dom.getElementsByClassName('pseudo-form', 'div', root);
				if (forms != null && forms.length > 0) {
					for (var i=0; i<forms.length; i++) {
						var labels = forms[i].getElementsByTagName('label');
						if (labels != null && labels.length > 0) {
							for (var j=0; j<labels.length; j++) {
								labels[j].innerHTML = labels[j].innerHTML + ':';
							}
						}
					}
				}
			});
		}
	};
	YAHOO.SolSurf.main.ieFixes();

	YAHOO.SolSurf.main.event.onWorkEnd.fire();
	YAHOO.SolSurf.main.logger.mainLogger.custfunc.log("Sol Surfers page loaded.", "info", null, true);
};