// many of these objects & properties get overwriten when initialised
// they are listed here for documentation purposes

/* TO IMPROVE
 *
 * a) callback on css
 * b) prevent duplicate file loads
 * 
 */

var eFC = {
	revision: 0,
	data: {
		sectors: [],
		$: {
			extractData: function () {
				var data = {}
				$(".efcData:not(.efcXlation) li[title]").each(function (i,n) {
					data[n.title] = $.string(n.innerHTML).strip().str
				})
				return $.extend(eFC.data, data)
			}
		}
	},
	staticHostName: "",
	support: {
		validation: {}
	},
	elementExtensions: {},

	// define package bundles here
	packages: {
		load: ["core"],	// CORE IS A SPECIAL PACKAGE, IT ALWAYS LOADS FIRST
		core: [
			"/assets/js/lib/jquery.plugins/jquery.string.1.0-min.js",
			"/assets/js/lib/jquery.plugins/jquery.protify-0.2.js",
			"/assets/js/core/jquery.efc.js"
		],
		forms: [
			"/assets/js/support/validation.js"
		],
		homepage: ["/assets/js/pages/homepage.js"],
		advancedJobSearch: [
			"/assets/js/pages/advancedJobSearch.js",
			"/assets/js/lib/sessvars.js"
		],
		jobApplyDetails: ["/assets/js/pages/jobApplyDetails.js"],
		careerServices: ["/assets/js/pages/careerServices.js"],
		resumeResponse: ["/assets/js/pages/resumeResponse.js"],
		myEfcRegisterSignIn: [
			"/assets/js/pages/myEfcRegisterSignIn.js",
			"/assets/js/support/validation.js"
		],
		resume_form: ["/assets/js/pages/resume_form.js"],
		contactus: ["/assets/js/pages/contactus.js"],
		jobDetails: ["/assets/js/pages/jobDetails.js"],
		jobApplyLoginOrRegister: [
			"/assets/js/pages/jobApplyLoginOrRegister.js",
			"/assets/js/support/validation.js"
		],
		passwordChange: ["/assets/js/pages/passwordChange.js"],
		modal: [
			"/assets/css/support/modal.css",
			"/assets/js/support/modal.js",
			"/assets/js/lib/jquery.plugins/jquery.simplemodal-1.3.3.min.js"
		],
		webstore: [
			"/assets/js/support/modal.js",
			"/assets/js/support/numbers.js",
			"/assets/js/lib/jquery.plugins/jquery.color.js",
			"/assets/js/lib/jquery.plugins/jquery.url.packed.js",
			"/assets/js/lib/jquery.plugins/jquery.autocomplete.js",
			"/assets/js/lib/jquery.plugins/jquery.scrollTo-min.js",
			"/assets/js/v2/webstore/webstore.js",
			"/assets/js/pages/webstore-buildbasket.js",
			"/assets/js/pages/webstore-qjp.js",
			"/assets/js/pages/webstore-payment.js",
			"/assets/js/pages/webstore-success.js"
		],
		richTextEditor: ["/assets/ckeditor/ckeditor.js"],
		passwordStrength: ["/assets/js/v2/passwordStrength.js"],
		resumeSearchEndeca: [
			"/assets/js/resumeSearchEndeca/resumeSearchResultsEndeca-1.0.js",
			"/assets/js/lib/jquery.plugins/jquery-ba-bbq.min.js",
			"/assets/js/lib/jquery.plugins/jquery.ui/jquery-ui-1.7.2.custom.min.js",
			"/assets/js/lib/jquery.plugins/jquery.ui/selectToUISlider.jQuery.js",
			"/assets/js/lib/jquery.plugins/jquery.autocomplete.js",
			"/assets/js/lib/jquery.plugins/jquery.scrollTo-min.js",
			"/assets/js/support/numbers.js",
			"/assets/js/resumeSearchEndeca/resumeAdvancedSearchEndeca.js",
			"/assets/js/support/string.js",
			"/assets/css/resumeSearchEndeca/resumeSearchEndeca.css",
			"/assets/css/jquery.plugins/jquery.ui/jquery-ui-1.7.2.custom.css",
			"/assets/css/jquery.plugins/jquery.ui/ui.slider.extras.css",
			"/assets/css/jquery.plugins/jquery.autocomplete.css"
		],
		backOffice: [
			"/assets/js/support/modal.js",
			"/assets/js/pages/backOffice/login.js",
			"/assets/js/lib/jquery.plugins/jquery-deparam.js"
		],
		sessvars: ["/assets/js/lib/sessvars.js"],
		overlay: ["/assets/js/support/overlay.js"],
		editorialSignInSignUp: ["/assets/js/v2/editorialSignInSignUp/editorialSignInSignUp.js"]
	},
	
	definePackageFiles: function (packages, provideRelativeURL) {
		if (typeof packages == "string") packages = [packages];

		var jsLoad = [], cssLoad = [], coreFiles = [], jsFileArray,		// coreFiles is only for "core" package and is expected to be empty sometimes
			xpackage = "", prefix = "";									// jsFileArray will act as a reference to a target (jsLoad or coreFiles)
		
		if (!provideRelativeURL) prefix = document.location.protocol + "//" + eFC.staticHostName;

		if (packages) {
			if (!eFC.useOptimised) {
				for (var i = 0, len = packages.length; i < len; i++) {
					xpackage = packages[i], jsFileArray = jsLoad;
					
					if (xpackage == "core") jsFileArray = coreFiles
					
					if (eFC.packages[xpackage]) { // this is a valid package
						for (var x = 0, xlen = eFC.packages[xpackage].length; x < xlen; x++) {
							var file = eFC.packages[xpackage][x];
							
							if (/\.js$/.test(file)) jsFileArray.push(prefix + file + ((file.indexOf("?") < 0) ? "?" : "&") + eFC.revision);
							if (/\.css$/.test(file)) cssLoad.push(prefix + file + ((file.indexOf("?") < 0) ? "?" : "&") + eFC.revision);
						}
					}
				}
			} else {
				for (var i = 0, len = packages.length; i < len; i++) {
					xpackage = packages[i], jsFileArray = jsLoad;
					
					var jsAdded = false, cssAdded = false, jsFileArray = jsLoad;
					if (xpackage == "core") jsFileArray = coreFiles;
					
					if (xpackage.length) {				
						for (var x = 0, xlen = eFC.packages[xpackage].length; !(jsAdded && cssAdded) && x < xlen; x++) {
							var file = eFC.packages[xpackage][x];
							
							if (!jsAdded && /.js$/.test(file)) {
								jsFileArray.push(prefix + "/assets/js/packages/min/" + xpackage + ".js" + "?" + eFC.revision);
								jsAdded = true;
								continue;
							}
							if (!cssAdded && /.css$/.test(file)) {
								cssLoad.push(prefix + "/assets/css/packages/min/" + xpackage + ".css" + "?" + eFC.revision);
								cssAdded = true;
								continue;
							}
						}
					}
				}
			}
		}

		return {
			core: coreFiles,
			js: jsLoad,
			css: cssLoad			
		}
	},
	
	packageLoader: function (packages, onload, loadCSS) {
		var packageFiles = eFC.definePackageFiles(packages);

		if (!onload || typeof onload != "function") onload = function() {};
		if (!loadCSS) loadCSS = false;

		if (loadCSS && packageFiles.css.length) eFC.getCSS(packageFiles.css);
		
		// all this necessary because labjs doesnt like an empty array in ie
		if (packageFiles.core.length && packageFiles.js.length) {
			$LAB.script(packageFiles.core).wait().script(packageFiles.js).wait(onload);				
		} else {
			if (packageFiles.core.length) {
				$LAB.script(packageFiles.core).wait(onload);
			}
			if (packageFiles.js.length) {
				$LAB.script(packageFiles.js).wait(onload);
			}
		}		
	},

	// getCSS DOES NOT ensure any load order or provide a complete callback
	getCSS: function (files) {
		var timerFunc;
		
		if (!files.length) return false;
		if (typeof files === "string") files = [files];
		
		jQuery.each(files, function (i, file) {
			$("head").append($("<link rel='stylesheet' type='text/css' href='" + file + "' />"));
		});
			
		/* this code recurses until all sheets are loaded 
		(function () {
			var loadedSheets = jQuery.protify(jQuery.makeArray(document.styleSheets)).pluck("href").join("|") + "|", numFiles = files.length;
			
			files = jQuery.grep(files, function (file) {
				return new RegExp(file + "|", "i").test(loadedSheets);
			});	
			
			if (1==2 && files.length >= numFiles) {
				onload();
			} else {
				cycles++;
				if (cycles < maxCycles) setTimeout(arguments.callee, 25);	// recurse
			}
		})();
		*/
	},


	// xlations holds actual translations. xlations.$ hold translation methods
	xlations: {
		$: {
			extractXlations: function (){
				var xlations = {}
				$(".efcData.efcXlation li[title]").each(function (i, n) {
					xlations[n.title] = n.innerHTML
				})
				return $.extend(eFC.xlations, xlations)
			}
		}
	},

	// these properties manage eFC.onready queue
	readyFuncs: [],
	onready: function (F) { eFC.readyFuncs.push(F) },
	onreadyRun: function () { $.each(eFC.readyFuncs, function (i, func) { func.call(window) }) }

};


if (typeof window != "undefined") {
	// xtract any translations & data this page may hold
	eFC.onready(function () { eFC.xlations.$.extractXlations(); eFC.data.$.extractData() })
	
	// load any requested packages requested from the qs
	$(function () {

		// strips out the query string that this script was called with
		var src = $.grep($("script"), function (el, i) { return el.src.match(/efcBase\.js/) })[0].src;
		
		// get the current static hostname
		eFC.staticHostName = $("<a/>").attr("href", src)[0].host;
		if (!eFC.staticHostName) eFC.staticHostName = document.location.host;
	
		$.each(src.replace(/.+\?/,"").split("&"), function (i, pair) {
			// extract relevant info
		    if (pair.match(/^packages=/)) $.merge(eFC.packages.load, pair.replace(/^packages=/, "").split(","));
			if (pair.match(/^r=/)) eFC.revision = pair.replace(/^r=/, "");
			if (pair.match(/^opt=/)) eFC.useOptimised = true;
		})
	
		eFC.packageLoader(eFC.packages.load, eFC.onreadyRun);
	});

	/*! LAB.js (LABjs :: Loading And Blocking JavaScript)
	    v1.2.0 (c) Kyle Simpson
	    MIT License
	*/
	(function(p){var q="string",w="head",L="body",M="script",u="readyState",j="preloaddone",x="loadtrigger",N="srcuri",E="preload",Z="complete",y="done",z="which",O="preserve",F="onreadystatechange",ba="onload",P="hasOwnProperty",bb="script/cache",Q="[object ",bw=Q+"Function]",bx=Q+"Array]",e=null,h=true,i=false,k=p.document,bc=p.location,bd=p.ActiveXObject,A=p.setTimeout,be=p.clearTimeout,R=function(a){return k.getElementsByTagName(a)},S=Object.prototype.toString,G=function(){},r={},T={},bf=/^[^?#]*\//.exec(bc.href)[0],bg=/^\w+\:\/\/\/?[^\/]+/.exec(bf)[0],by=R(M),bh=p.opera&&S.call(p.opera)==Q+"Opera]",bi=("MozAppearance"in k.documentElement.style),bj=(k.createElement(M).async===true),v={cache:!(bi||bh),order:bi||bh||bj,xhr:h,dupe:h,base:"",which:w};v[O]=i;v[E]=h;r[w]=k.head||R(w);r[L]=R(L);function B(a){return S.call(a)===bw}function U(a,b){var c=/^\w+\:\/\//,d;if(typeof a!=q)a="";if(typeof b!=q)b="";d=((/^\/\//.test(a))?bc.protocol:"")+a;d=(c.test(d)?"":b)+d;return((c.test(d)?"":(d.charAt(0)==="/"?bg:bf))+d)}function bz(a){return(U(a).indexOf(bg)===0)}function bA(a){var b,c=-1;while(b=by[++c]){if(typeof b.src==q&&a===U(b.src)&&b.type!==bb)return h}return i}function H(t,l){t=!(!t);if(l==e)l=v;var bk=i,C=t&&l[E],bl=C&&l.cache,I=C&&l.order,bm=C&&l.xhr,bB=l[O],bC=l.which,bD=l.base,bn=G,J=i,D,s=h,m={},K=[],V=e;C=bl||bm||I;function bo(a,b){if((a[u]&&a[u]!==Z&&a[u]!=="loaded")||b[y]){return i}a[ba]=a[F]=e;return h}function W(a,b,c){c=!(!c);if(!c&&!(bo(a,b)))return;b[y]=h;for(var d in m){if(m[P](d)&&!(m[d][y]))return}bk=h;bn()}function bp(a){if(B(a[x])){a[x]();a[x]=e}}function bE(a,b){if(!bo(a,b))return;b[j]=h;A(function(){r[b[z]].removeChild(a);bp(b)},0)}function bF(a,b){if(a[u]===4){a[F]=G;b[j]=h;A(function(){bp(b)},0)}}function X(b,c,d,g,f,n){var o=b[z];A(function(){if("item"in r[o]){if(!r[o][0]){A(arguments.callee,25);return}r[o]=r[o][0]}var a=k.createElement(M);if(typeof d==q)a.type=d;if(typeof g==q)a.charset=g;if(B(f)){a[ba]=a[F]=function(){f(a,b)};a.src=c;if(bj){a.async=i}}r[o].insertBefore(a,(o===w?r[o].firstChild:e));if(typeof n==q){a.text=n;W(a,b,h)}},0)}function bq(a,b,c,d){T[a[N]]=h;X(a,b,c,d,W)}function br(a,b,c,d){var g=arguments;if(s&&a[j]==e){a[j]=i;X(a,b,bb,d,bE)}else if(!s&&a[j]!=e&&!a[j]){a[x]=function(){br.apply(e,g)}}else if(!s){bq.apply(e,g)}}function bs(a,b,c,d){var g=arguments,f;if(s&&a[j]==e){a[j]=i;f=a.xhr=(bd?new bd("Microsoft.XMLHTTP"):new p.XMLHttpRequest());f[F]=function(){bF(f,a)};f.open("GET",b);f.send("")}else if(!s&&a[j]!=e&&!a[j]){a[x]=function(){bs.apply(e,g)}}else if(!s){T[a[N]]=h;X(a,b,c,d,e,a.xhr.responseText);a.xhr=e}}function bt(a){if(typeof a=="undefined"||!a)return;if(a.allowDup==e)a.allowDup=l.dupe;var b=a.src,c=a.type,d=a.charset,g=a.allowDup,f=U(b,bD),n,o=bz(f);if(typeof d!=q)d=e;g=!(!g);if(!g&&((T[f]!=e)||(s&&m[f])||bA(f))){if(m[f]!=e&&m[f][j]&&!m[f][y]&&o){W(e,m[f],h)}return}if(m[f]==e)m[f]={};n=m[f];if(n[z]==e)n[z]=bC;n[y]=i;n[N]=f;J=h;if(!I&&bm&&o)bs(n,f,c,d);else if(!I&&bl)br(n,f,c,d);else bq(n,f,c,d)}function Y(a){if(t&&!I)K.push(a);if(!t||C)a()}function bu(a){var b=[],c;for(c=-1;++c<a.length;){if(S.call(a[c])===bx)b=b.concat(bu(a[c]));else b[b.length]=a[c]}return b}D={script:function(){be(V);var a=bu(arguments),b=D,c;if(bB){for(c=-1;++c<a.length;){if(B(a[c]))a[c]=a[c]();if(c===0){Y(function(){bt((typeof a[0]==q)?{src:a[0]}:a[0])})}else b=b.script(a[c]);b=b.wait()}}else{for(c=-1;++c<a.length;){if(B(a[c]))a[c]=a[c]()}Y(function(){for(c=-1;++c<a.length;){bt((typeof a[c]==q)?{src:a[c]}:a[c])}})}V=A(function(){s=i},5);return b},wait:function(a){be(V);s=i;if(!B(a))a=G;var b=H(t||J,l),c=b.trigger,d=function(){try{a()}catch(err){}c()};delete b.trigger;var g=function(){if(J&&!bk)bn=d;else d()};if(t&&!J)K.push(g);else Y(g);return b}};if(t){D.trigger=function(){var a,b=-1;while(a=K[++b])a();K=[]}}else D.trigger=G;return D}function bv(a){var b,c={},d={"UseCachePreload":"cache","UseLocalXHR":"xhr","UsePreloading":E,"AlwaysPreserveOrder":O,"AllowDuplicates":"dupe"},g={"AppendTo":z,"BasePath":"base"};for(b in d)g[b]=d[b];c.order=!(!v.order);for(b in g){if(g[P](b)&&v[g[b]]!=e)c[g[b]]=(a[b]!=e)?a[b]:v[g[b]]}for(b in d){if(d[P](b))c[d[b]]=!(!c[d[b]])}if(!c[E])c.cache=c.order=c.xhr=i;c.which=(c.which===w||c.which===L)?c.which:w;return c}p.$LAB={setGlobalDefaults:function(a){v=bv(a)},setOptions:function(a){return H(i,bv(a))},script:function(){return H().script.apply(e,arguments)},wait:function(){return H().wait.apply(e,arguments)}};(function(a,b,c){if(k[u]==e&&k[a]){k[u]="loading";k[a](b,c=function(){k.removeEventListener(b,c,i);k[u]=Z},i)}})("addEventListener","DOMContentLoaded")})(window);
};


