/* 
** The main javascript file that manages Product Selector Cookie
	@author Ibrahim Bediz
 */
var PSTCookieManager = Class.create();
PSTCookieManager.prototype = {
	
	initialize: function(pstCookie, anchorForSaveSettings){
		this.pstCookie = pstCookie;
		this.anchorForSaveSettings = anchorForSaveSettings;
		this.numberOfCriterias = 0;
	},
	resetSaveSettingLink: function(){
		this.anchorForSaveSettings.innerHTML = this.anchorForSaveSettings.readAttribute('alt');
	},
	//saves filter to the cookie
	saveFilter: function(cookieName, expireDays){
		if (this.pstCookie.isCookiesEnabled()){
			if (!this.isFilterInInitialState()){
				//if the cookies exist then remove them
				if (!this.pstCookie.checkCookie(cookieName)){
					this.pstCookie.removeCookie(cookieName);
				}
				
				// Kind of a zipping is implemented below. 
				var questionsIdCookieString = '';								// Question ids will be taken from this string when cookies are loaded back.
				 																// Order of these ids will be used in each criteria cookie.
				 																 
				var criteriaIdCookieStringArrayByQuestion = new Array();		// Criteria ids will be taken from the strings of these array which are respectively belongs to 
																				// questions in the same order.
																				
				var allCriteriasCookieString = '';
				var questionsArray = productSelector.questions;
				for(var i=0; i<questionsArray.length; i++){
					var question = questionsArray[i];
					questionsIdCookieString += question.id + ':';
					
					var criterias = question.criterias;
					var criteriasLength = criterias.length;
					for (var j = 0; j < criteriasLength; j++){
						var criteria = criterias[j];
						if(criteriaIdCookieStringArrayByQuestion[i] == null) {
							criteriaIdCookieStringArrayByQuestion[i] = criteria.id + ':';
						}
						else {
							criteriaIdCookieStringArrayByQuestion[i] += criteria.id + ':';
						}
						
						var criteriaHtmlObj = criteria.getHTMLObject();
						var checkState = criteriaHtmlObj.checked == true ? 1 : 0;
						var ableState = criteriaHtmlObj.disabled == true ? 1 : 0;
						var statusState = criteria.status == null ? 0 
								  : criteria.status == true ? 1 : 0;
						var lastState = criteria.lastState == true ? 1 : 0;
						
						// There might be more than 10 criterias in a question,
						// so make it 2digit all the time.
						var checkboxCriteriaIndex = j < 10 ? '0' + j : j;		
						
						var cookieString = checkboxCriteriaIndex + '' + i + '' + checkState + '' + ableState + '' + statusState + '' + lastState;
						allCriteriasCookieString += cookieString;

					}
					
					var radioQ = 'input.' + questionsArray[i].id + '-radio';
					var radios = $$(radioQ);
					for (var j = 0; j < radios.length; j++){
						var criteria = radios[j];
						if(criteriaIdCookieStringArrayByQuestion[i] == null) {
							criteriaIdCookieStringArrayByQuestion[i] = criteria.id + ':';
						}
						else {
							criteriaIdCookieStringArrayByQuestion[i] += criteria.id + ':';
						}
						
						var checkState = criteria.checked == true ? 1 : 0;
						var ableState = criteria.disabled == true ? 1 : 0;
						var statusState = criteria.status == null ? 0 
																  : criteria.status == true ? 1 : 0;
						var lastState = criteria.lastState == true ? 1 : 0;

						var radioCriteriaIndex = j + criteriasLength;
						// There might be more than 10 criterias in a question,
						// so make it 2digit all the time.
						radioCriteriaIndex = radioCriteriaIndex < 10 ? '0' + radioCriteriaIndex : radioCriteriaIndex;
						
						var cookieString = radioCriteriaIndex + '' + i + '' + checkState + '' + ableState + '' + statusState + '' + lastState;
						allCriteriasCookieString += cookieString;
					}
				}
				
				// Save the cookies that are constructed above.
				var batchCookieString = '';
				batchCookieString += questionsIdCookieString.substring(0, questionsIdCookieString.length-1) + '&';	// Remove the last ':'.
				for(var i=0; i<criteriaIdCookieStringArrayByQuestion.length; i++) {
					var criteriaIdCookieString = criteriaIdCookieStringArrayByQuestion[i];
					batchCookieString += criteriaIdCookieString.substring(0, criteriaIdCookieString.length-1) + '&';
				}
				batchCookieString += allCriteriasCookieString;
				this.pstCookie.setBatchCookie(cookieName, batchCookieString, expireDays);
				
				this.saveInputValueToCookie('selectedColours', cookieName, expireDays);
				
				if(this.anchorForSaveSettings)
					this.anchorForSaveSettings.innerHTML = this.anchorForSaveSettings.readAttribute('rel');;
				
			}else{
				showPSTFilterInInitialStateMessage();
			}
		}else{
			showPSTCookieDisabledMessage();
		}
	},
	
	//resets filter 	
	resetFilter: function(cookieName){
		this.clearFilterCheckBoxes();
		productSelector.reset();
		this.removeCookie(cookieName);
		refreshSelectAllSelectNoneLinks();
	},
	//clears the cookie
	removeCookie: function(cookieName){
		//if cookie exists, remove it
		if (!this.pstCookie.checkCookie(cookieName)){
			this.pstCookie.removeCookie(cookieName);
		}
	},
	//loads filter selections from cookie
	loadFilter: function(cookieName){		
		
		var isPageFromBack = $("restoreFromCookieOrBack");
	
		if (isPageFromBack.value == "false"){
			
			if (!this.pstCookie.checkCookie(cookieName)){
				
				var checkedItemList = this.pstCookie.loadCheckedItems(cookieName);
				//check if selected criterias exist in filter
				//check if there's any change in products coming with selected criterias
				if (!this.isCheckedItemsAlive(cookieName, checkedItemList) || !this.isFilterUpToDate()){
					showPSTFilterChangedMessage();
					return false;
				}
				
				productSelector.resetAllCheckBoxes();
				this.restoreSlider();
				this.pstCookie.restoreAllCriterias(cookieName);
				this.restoreRadioBoxes();
				this.restoreInputValueFromCookie('selectedColours', cookieName);
				
		  		productSelector.showProducts();
			}		
		}
		else {	// if isPageFromBack is true, make it false for page refreshes
			
			productSelector.resetAllCheckBoxes();
			this.restoreSlider();
			this.restoreRadioBoxes();
			this.restoreSelectedCheckBoxes();
			
			isPageFromBack.value = "false";
		}
	},

	//checks if selected products are up to date
	isFilterUpToDate: function(){
		var questions = productSelector.questions;
		var numberOfCriterias = 0;
		for(var j = 0; j < questions.length; j++) {
			var criterias = questions[j].criterias;
			numberOfCriterias = numberOfCriterias + criterias.length;
		}
		
		if(numberOfCriterias == this.numberOfCriterias) {
			return true;
		}
		
		return false;
	},

	isCheckedItemsAlive: function(cookieName, checkedItemsList){
		for (i=0; i<checkedItemsList.length; i++){
			var checkedItem = checkedItemsList[i];
			if (!this.isCheckedItemExistInCriterias(checkedItem)){
				this.pstCookie.removeCustomCookie(cookieName, checkedItem);
				return false;
			}
		}
		return true;		
	},
	isCheckedItemExistInCriterias: function(checkedItem){
		var questionsArray = productSelector.questions;
		for(var i=0; i<questionsArray.length; i++){
			var question = questionsArray[i];
			var criterias = question.criterias;
			for (var j=0; j<criterias.length; j++){
				var idObj = criterias[j].getHTMLObject();
				if($(checkedItem)) {
					if ($(checkedItem).type=="checkbox"){
						if (checkedItem == idObj.id){
							return true;
						}	
					}else if (($(checkedItem).type)=="radio"){
						//Because radio boxes don't exist in criterias, it's taken from DOM and return true 
						return true;
					}
				}
			}				
		}
		return false;
	},
	//checks if the visitor is new 
	isNewVisitor: function(){
		//if the cookie doesn't exist
		if (this.pstCookie.checkCookie("OldVisitor")){
			this.pstCookie.setCustomCookie("OldVisitor","yes",30);
			return true;
		}else{
			return false;
		}
	},
	//restores checkboxes
	restoreCheckBoxes: function(checkedItemList, clear){
		var questionsArray = productSelector.questions;
		for(var i=0; i<questionsArray.length; i++){
			var initialState = questionsArray[i].checkedByDefault=='true' ? true : false;
			var question = questionsArray[i];
			var childs = question.criterias;
			for (var j=0; j<childs.length; j++){
				var idObj = childs[j].getHTMLObject();
				if (clear){
					this.enableCheckBox(idObj);
					this.enableLabel(idObj.id);
					initialState ? idObj.checked = true : idObj.checked = false;				
				}else{
					if (!this.isInCheckedItems(idObj, checkedItemList)){
						idObj.checked = false;
					}else{
						idObj.checked = true;
					}
				}				
			}
		}
	},
	
	enableCheckBox: function(checkBox){
		checkBox.disabled = false;
	},
	
	enableLabel: function(id){
		if ($(id + '-label')){
			$(id + '-label').className = '';
		}		
	},
	
	isFilterInInitialState: function(){
		var questionsArray = productSelector.questions;
		for(var i=0; i<questionsArray.length; i++){
			var question = questionsArray[i];
			var initialState = questionsArray[i].checkedByDefault=='true' ? true : false;
			if (question!=null){
				var childs = question.criterias;
				for (var j=0; j<childs.length; j++){
					var idObj = childs[j].getHTMLObject();
					
					// First control checkByDefault by criteria based.
					var checkByDefaultCriteriaBased = idObj.getAttribute('rel') == 'true' ? true : false;
					if(checkByDefaultCriteriaBased != null && checkByDefaultCriteriaBased != ''){
						if(idObj.checked != checkByDefaultCriteriaBased){
							return false;
						}
					}
					else if (idObj.checked != initialState){
						return false;
					}	
				}
			}
			
		}
		return true;
	},

	
	restoreRadioBoxes: function(){
		var questionsArray = productSelector.questions;
		for(var i=0; i<questionsArray.length; i++){
			var radioQ = 'input.' + questionsArray[i].id + '-radio';
			var radios = $$(radioQ);
			
			for (var j=0; j<radios.length; j++){
				var idObj = radios[j];
				if (idObj.checked){
					restoreSelectedQuestionType(idObj, 'r'+(j+1));
				}
			}
		}
	},
	
	clearFilterCheckBoxes:function(){
		this.restoreCheckBoxes('', true);
	},
	
	//checks whether an item checked or not
	isInCheckedItems: function(idObj, checkedItemList){
		for(var i=0; i<checkedItemList.length; i++){
			if (idObj.id==checkedItemList[i]){
				return true;
			}
		}
		return false;
	},
	//restores slider
	restoreSlider: function(){
		
	},
	//checks if there're any selected checkbox
	isAnyCheckBoxSelected: function() {
		return this.isAnyComponentSelected('-criteria');
	},
	
	//checks if there are any selected radio
	isAnyRadioButtonSelected: function(){
		return this.isAnyComponentSelected('-radio');
	},
	
	isAnyComponentSelected:function(specificComponentType){
		var questionsArray = productSelector.questions;
		for(var i=0; i<questionsArray.length; i++){
			var specificQ = 'input.' + questionsArray[i].id + specificComponentType;
			var question = productSelector.getQuestion('div.tvoe-question');
			var childs = question.criterias;
			for (var j=0; j<childs.length; j++){
				var idObj = childs[j].getHTMLObject();
				if (idObj.checked){
					return true;
				}
			}
		}
  	  		
		return false;
	},
	
	saveInputValueToCookie: function(elementId, cookieName, expireDays) {
		if($(elementId)) {
			this.pstCookie.removeCookie(cookieName + elementId);	// Clear previous one.
			this.pstCookie.setCustomCookie(cookieName + elementId, $(elementId).value, expireDays);
		}
	},
	
	restoreInputValueFromCookie: function(elementId, cookieName) {
		if($(elementId)) {
			var elementValue = this.pstCookie.getCustomCookie(cookieName + elementId);
			if(elementValue == null) {		// It comes 'null' if the cookie is empty.
				elementValue = '';
			}
			$(elementId).value = elementValue;
		}
	},
	
	restoreSelectedCheckBoxes: function() {
		
		var checkedCriterias = $("checkedCriteriaIds");
		var checkedCriteriaArray = new Array();
		
		if(checkedCriterias.value != null && checkedCriterias.value != '') {
			checkedCriteriaArray = checkedCriterias.value.split("&");
		}
		
		//Empty checkedCriteriaIds element
		checkedCriterias.value = "";
		
		for(var i=0; i<checkedCriteriaArray.length; i++) {
			var criteriaId = checkedCriteriaArray[i];
			
			if(criteriaId != null && criteriaId != '') {
				
				var checkbox = $(criteriaId);
				if (checkbox)
					checkbox.checked = true;
				
				var fakeCheckbox = $(criteriaId + "-fakeCheckBox");
				if (fakeCheckbox)
					fakeCheckbox.className = fakeCheckbox.checkedClass;
				
				questionAndCriteria = criteriaId.split("-");
				productSelector.click(true,questionAndCriteria[0],questionAndCriteria[1]);
			}
		}
		productSelector.currentProducts = productSelector.getCurrentProducts();
	}
	
}
