// /////////////////////////////////////////////////////////////////////////
// JobBasketManager is an JS object that encapsulates all job basket functionality.
// Call public methods on the singleton instance, for example:
// jbm.Init()
// Dependencies:
// CookieOption.js
// /////////////////////////////////////////////////////////////////////////

var JobBasketToggleState = {
	Add: 0,
	Remove: 1,
	Applied: 2
}

// Property Indexes
var JobBasketManagerProperties = {
	CookieName: 0,
	CookieDisabled: 1,
	MaxItems: 2,
	AddText: 3,
	AddImage: 4,
	RemoveText: 5,
	RemoveImage: 6,
	AppliedText: 7,
	AppliedImage: 8,
	BasketEmptyText: 9,
	BasketEmptyImage: 10,
	BasketFillText: 11,
	BasketFillImage: 12,
	BasketFullText: 13,
	BasketFullImage: 14,
	DeclineCookieName: 15,
	JobBasketPage: 16
}

function JobBasketManager()
{
        // INTERFACE ///////////////////////////////////////////////////////////
        JobBasketManager.prototype.Init = init;
        JobBasketManager.prototype.AddRemove = addRemove;
        JobBasketManager.prototype.AddRemoveById = addRemoveById;
        JobBasketManager.prototype.RemoveById = removeById;
        JobBasketManager.prototype.Empty = empty;
        JobBasketManager.prototype.SaveData = saveData;
        JobBasketManager.prototype.Update = update;
        JobBasketManager.prototype.Render = render;
        JobBasketManager.prototype.IsJobInCookie = isJobInCookie;

        // CONSTANTS ///////////////////////////////////////////////////////////
	
        // DATA ///////////////////////////////////////////////////////////
        
        var _jobIds = new Array();
		//this will contain either B, S or E for Bulk AOL, Screening Questions or External AOL
        var _jobTypes = new Array(); 
        var _jobTypesCount = new Array(3);  //BSE
        var _appliedFor = new Array();
        var _properties;
        var _bInitialised = false;
        
        // PUBLIC ///////////////////////////////////////////////////////////
        function init(clientId)
        {
            if(!_bInitialised)
            {
			    _properties = JobBasketManager_Properties;
                getData();
                render();
                initToggleControls();   
                _bInitialised = true;
            }
        }
		
		// attach onclick handlers to each toggle control
		function initToggleControls()
		{
			if (typeof(JobBasketManager_ToggleControls) != "undefined")
			{
				for (var i=0; i<JobBasketManager_ToggleControls.length; i++)
				{
					var clientId = JobBasketManager_ToggleControls[i];
					var toggle = document.getElementById(clientId);
					if (toggle != null)
					{
						var hdnJobId = document.getElementById(clientId+"_hdnJobId");
						if (hdnJobId != null)
						{
							var jobId = parseInt(hdnJobId.value);
							toggle.onclick = new Function("jbm.AddRemove(this, "+jobId+", null);return false;");
						}
						toggle.style.cursor = "pointer";
					}
				}
			}
		}

        function addRemove(btnRef, jobid, jobtype)
        {
            if(!acceptsCookies())
			{
			    alert(_properties[JobBasketManagerProperties.CookieDisabled]);
			    return;
			}

            getData();
            
			//evaluate if btnRef is a string or object
			var btn = btnRef;
			if(typeof(btnRef) == 'string')
				btn = document.getElementById(btnRef);
			
			var status = addRemoveById(jobid, jobtype)
			changeButtonState(btn, JobBasketToggleState.Remove);

			saveData();
			render();		
	    }
		
		//returns status
		function addRemoveById(jobId, jobType)
		{
			var exists = false;
			var offset = 0;
            //find if jobId in the array then update
            for(var i=0; i<_jobIds.length; i++)
            {
				if(parseInt(_jobIds[i]) != jobId)
				{ 	//remove via repopulation
					_jobIds[i-offset] = _jobIds[i];
					_jobTypes[i-offset] = _jobTypes[i];
					_appliedFor[i-offset] = _appliedFor[i];
				} else { 
					//skip during repopulation and maintain offset
					//alert('exists.. removing');
					offset++;
                    exists = true;
				}
            }

			if(exists)
			{
				//if exists trim the arrays down
				_jobIds = _jobIds.slice(0, _jobIds.length-offset);
				_jobTypes = _jobTypes.slice(0, _jobTypes.length-offset);
				_appliedFor = _appliedFor.slice(0, _appliedFor.length-offset);
				return JobBasketToggleState.Add;
			}
			else
            {
				//alert('does not exist.. adding');
                var newLength = _jobIds.length;
				
				//assertBasketLimits();
				if(newLength >= _properties[JobBasketManagerProperties.MaxItems]){
					
					if (confirm(_properties[JobBasketManagerProperties.BasketFullText]))
					{
	                    window.location = _properties[JobBasketManagerProperties.JobBasketPage];
                    	return;				
					}
					else
					{
    					return;
					}
					
					//alert(_properties[JobBasketManagerProperties.BasketFullText]);
					//return;
				}
                _jobIds[newLength] = jobId;
                _jobTypes[newLength] = jobType;
				//_jobTypesCount[jobtype]
				//alert('_jobIds[newLength]  :' + _jobIds[newLength]);
				//alert('jobid : ' + jobid );
                _appliedFor[newLength] = 0; //default not applied
				//alert(_jobIds.join(','));
				//alert(_appliedFor.join(','));
				return JobBasketToggleState.Remove;
            }
		}
        
        function removeById(jobId)
		{
			var exists = false;
			var offset = 0;
            //find if jobId in the array then update
            for(var i=0; i<_jobIds.length; i++)
            {
				if(parseInt(_jobIds[i]) != jobId)
				{ 	//remove via repopulation
					_jobIds[i-offset] = _jobIds[i];
					_jobTypes[i-offset] = _jobTypes[i];
					_appliedFor[i-offset] = _appliedFor[i];
				} else { 
					//skip during repopulation and maintain offset
					//alert('exists.. removing');
					offset++;
                    exists = true;
				}
            }

			if(exists)
			{
				//if exists trim the arrays down
				_jobIds = _jobIds.slice(0, _jobIds.length-offset);
				_jobTypes = _jobTypes.slice(0, _jobTypes.length-offset);
				_appliedFor = _appliedFor.slice(0, _appliedFor.length-offset);
				return JobBasketToggleState.Add;
			}

		}
        
		function update(jobid, appliedFor)
		{	
            getData();
            
            //find if jobId in the array
            for(var i=0; i < _jobIds.length; i++)
            {
                if(_jobIds[i] == jobid){
                    _appliedFor[i] = appliedFor;
                }
            }
            
            saveData();
			render();		
	    }

		//browser aware toggle
		function changeButtonState(btn, toggleState) {
            //change img contents
			//detach and reattach eventhandler
			if (btn == null) {
				return;
			}

			var text = "";
			var image = "";
			
			switch(toggleState)
			{
				case JobBasketToggleState.Remove:
				{
					text = _properties[JobBasketManagerProperties.RemoveText];
					image = _properties[JobBasketManagerProperties.RemoveImage];
					break;
				}
				case JobBasketToggleState.Applied:
				{
					text = _properties[JobBasketManagerProperties.AppliedText];
					image = _properties[JobBasketManagerProperties.AppliedImage];
					break;
				}
				case JobBasketToggleState.Add:
				default:
				{
					text = _properties[JobBasketManagerProperties.AddText];
					image = _properties[JobBasketManagerProperties.AddImage];
					break;
				}
			}
			
			var html = "";
			if (text != null && text.length > 0) {
				html += text;
			}
			if (image != null && image.length > 0) {
				html += image;
			}
			btn.innerHTML = html;
        }
		
        // PRIVATE ///////////////////////////////////////////////////////////

	    function getData(){
            //get data from cookie and store as array locally
            //var cookieData = "123,54322|0,1";
            var cookieData = getCookieByName(_properties[JobBasketManagerProperties.CookieName]);
		    //alert('getting cookie: ' + cookieData);

            if(		cookieData != null 
			   && 	cookieData != 'undefined' 
			   && 	cookieData != '' 
			   && 	cookieData != '||' ) //empty inited cookie may also have '|' delims 
			{
                var arrData     = cookieData.split('|'); //delim to split columns
				if(arrData.length > 2){
					_jobIds        	= arrData[0].split(','); //delim to split values
					_jobTypes    	= arrData[1].split(','); //delim to split values
					_appliedFor    	= arrData[2].split(','); //delim to split values
					return;
				}
            } 
			//set empties
			_jobIds        = new Array();
			_jobTypes	   = new Array();
			_appliedFor    = new Array();
	    }

		function empty()
		{
			_jobIds = new Array();
			_jobTypes = new Array();
			_appliedFor = new Array();
			
			saveData();
		}

	    function saveData(){
            //take data from array and store in cookie
            var cookieData = _jobIds.join(',') + '|' + _jobTypes.join(',') + '|' + _appliedFor.join(',') ;
            setCookieByName(_properties[JobBasketManagerProperties.CookieName], cookieData);
	    }

		// render controls
        function render()
        {
			renderStatusControls();
			renderToggleControls();
        }

		// render all registered status controls
		function renderStatusControls()
		{
			if (typeof(JobBasketManager_StatusControls) != "undefined")
			{
				for (var i=0; i<JobBasketManager_StatusControls.length; i++)
				{
					var clientId = JobBasketManager_StatusControls[i];
					var control = document.getElementById(clientId);
					if (control != null)
					{
						var text = "";
						var image = "";
						
						//render display
						if(_jobIds.length > 0)
						{
							var jobsNotAppliedFor = 0;
							for (var i=0; i<_jobIds.length; i++)
							{
								if (parseInt(_appliedFor[i]) != 1)
								{
									jobsNotAppliedFor++;
								}
							}
							
							// basket fill
							text = _properties[JobBasketManagerProperties.BasketFillText].replace(/\{0\}/g, jobsNotAppliedFor);
							image = _properties[JobBasketManagerProperties.BasketFillImage];
							
							// basket full (not implemented)
						}
						else
						{
							// basket empty
							text = _properties[JobBasketManagerProperties.BasketEmptyText].replace(/\{0\}/g, "0");
							image = _properties[JobBasketManagerProperties.BasketEmptyImage];
						}
						
						var html = "";
						if (text != null && text.length > 0) {
							html += text;
						}
						if (image != null && image.length > 0) {
							html += image;
						}
						control.innerHTML = html;
					}
				}
			}
		}
	    
		// render all registered toggle controls
		function renderToggleControls()
		{
			if (typeof(JobBasketManager_ToggleControls) != "undefined")
			{
				for (var i=0; i<JobBasketManager_ToggleControls.length; i++)
				{
					var clientId = JobBasketManager_ToggleControls[i];
					var toggle = document.getElementById(clientId);
					if (toggle != null)
					{
						var hdnJobId = document.getElementById(clientId+"_hdnJobId");
						if (hdnJobId != null)
						{
							var jobId = parseInt(hdnJobId.value);
							var jobStatus = getJobStatus(jobId);
							changeButtonState(toggle, jobStatus);  //set button state
						}
					}
				}
			}
		}
		
		function getJobStatus(jobId)
		{
			//get btnType from btn status
			for (var i=0; i<_jobIds.length; i++) {
				if (parseInt(_jobIds[i]) == jobId) {
					//means added.. check applied for
					if(parseInt(_appliedFor[i]) == 1) {
						return JobBasketToggleState.Applied;
					}
					else {
						return JobBasketToggleState.Remove;
					}
				}
			}
			//else add btn
			return JobBasketToggleState.Add;
		}
		
		function isJobInCookie(jobId)
		{
            for (var i=0; i<_jobIds.length; i++) {
            	if (parseInt(_jobIds[i]) == parseInt(jobId)) {
			        return true;
				}
			}
			return false;
		}

		//cookie tester
		function acceptsCookies(){
		    if (getCookieByName(_properties[JobBasketManagerProperties.DeclineCookieName]) != "decline") {
			    setCookieByName("cookietester", "cookietesterdata");
			    if(getCookieByName("cookietester") == "cookietesterdata" || getCookieByName(JobBasketManagerProperties.DeclineCookieName) != "decline")
			    {
				    deleteCookieByName("cookietester");
				    return true;
			    }
			}
			return false;
		}       
}

// create singleton class
var jbm = new JobBasketManager();

function JobBasketManager_Init(clientId)
{
	jbm.Init(clientId);
}
