/**
 * @author frukt kuubis
 */

var global_valfield=null;
var tabcount=1;
var tab=1;
var tabcnt=null;

var currentTab = 1;
var tabCount = 1;

var Form = (function(){
	var _elementData = [];
	var _elementValues = [];
	var _elements = [];
	
	var _steps = ['invoice', 'form', 'payment'];
	var _currentStep = _steps[0];
	
	function _initialize(formData){
		_elementData = formData[0];
		_elementValues = formData[2];
	}
	
	function _getConferenceSteps(){
		var steps = [];
		$('ul.conference-steps li').each(function(key, element){
			steps.push($(element).attr('id').replace('Step', ''));
		});
		return steps;
	}
	
	function _getFieldsByParent(parentId,groupId){
		if(!isNumeric(parentId)){ return false; }
		var fields = [];
		jQuery.each(_elementData, function(key, element){
			if(element.parent_id == parentId && element.value_group_id == groupId){ fields[fields.length] = element; } 
		});

		return fields;
	}
	
	function _getFieldIdByName(fieldName){
		if(!fieldName){ return false; }
		var elementId = 0;
		jQuery.each(_elementData, function(key, element){
			if(element.field_name == fieldName){ elementId = element.id; }
		});
		return elementId;
	}
	
	function _getElementValueByName(fieldName){
		if(_elementValues == null || _elementValues[currentTab-1] == null){ return ''; }
		return _elementValues[currentTab-1][fieldName];
	}
	
	function _addElement(fieldName, groupId){
		if(!isNumeric(fieldName) || !isNumeric(groupId)){ return false; }
		$('#'+fieldName+"_"+currentTab+"_child").remove();
		var fieldId = _getFieldIdByName(fieldName);
		var elements = _getFieldsByParent(fieldId, groupId);
		
		if(elements.length < 1){ return false; }
		var element = $('<div></div>').attr('id', fieldName+"_"+currentTab+"_child");
		
		for(var i in elements){
			var elementValue = _getElementValueByName(elements[i].field_name);//_elementValues[elements[i].field_name];
			_elements[elements[i].field_name+'_'+currentTab] = new FormElement(elements[i], elementValue);
			$(element).append(_elements[elements[i].field_name+'_'+currentTab].element);
			$(element).insertAfter("#"+fieldName+"_"+currentTab);

			if (elements[i].type == 5 || elements[i].type == 7) {
				_addElement(elements[i].field_name, (elementValue == false ? 1 : elementValue));
			}
		}
	}
	
	function _removeElementById(id){
		if(!isNumeric(id)){ return false; }
		$(_elements[id].element).remove();
		delete _elements[id];
	}
	
	function _renderElements(id){
		if(_elementData.length < 1){ return false; }
		for(var i in _elementData){
			if(_elementData[i].parent_id > 0){ continue; }
			
			if(_elementData[i].type == 10){
				var elementValue = _elementData[i].id;
			}else{
				var elementValue = _getElementValueByName(_elementData[i].field_name);//_elementValues[_elementData[i].field_name];
			}
			
			_elements[_elementData[i].field_name+'_'+currentTab] = new FormElement(_elementData[i], (elementValue == false ? '' : elementValue));
			$(id).append(_elements[_elementData[i].field_name+'_'+currentTab].element);
			if(_elementData[i].type == 5 || _elementData[i].type == 7){
				_addElement(_elementData[i].field_name, (elementValue == false ? 1 : elementValue));
			}
			
			if((_elementData[i].type == 6 || _elementData[i].type == 7) && $.browser.msie){
				$("#"+_elementData[i].field_name+'_'+currentTab+' input').each(function(key, item){
					item.checked = (elementValue == 'on' || elementValue == key+1) ? true : false;
				});
			}
		}
	}
	
	function _addTab(){
		var tabLinks = $('#tabsContent a');
		var tabNewNum = tabLinks.length+1;
		currentTab = tabNewNum > 0 ? tabNewNum : 1;

		// insert new tab link
		$($('<a></a>').attr({'href':'#', 'id':'tabLink_'+tabCount}).text(tabNewNum).bind('click', function(){
			var exp = this.id.split('_');
			Form.showTab(exp[1]);
		})).insertBefore($('#tabsContent div.clear'));
		
		// append new tab div
		$('#form').append($('<div></div>').attr('id', 'tab_'+tabCount));
		
		_renderElements('#tab_'+tabCount);
		Form.showTab(tabCount);
		tabCount++;
		
		// scroll to top
		window.scrollTo(0, 0);
	}
	
	function _deleteTab(){
		if($('#tabsContent a[id^=tabLink]').length < 2){ return false; }
		
		$("#tab_"+currentTab).remove();
		$("#tabLink_"+currentTab).remove();
		
		$('#tabsContent a[id^=tabLink]').each(function(i, item){
			$(item).text((i+1)).removeClass('selected');
		});
		
		var tabId = $('#tabsContent a[id^=tabLink]').get(0);
		tabId = $(tabId).attr('id').split('_');
		tabId = tabId[1];
		_showTab(tabId);
		
		// scroll to top
		window.scrollTo(0, 0);
	}
	
	function _showTab(tabId){
		$('#tabsContent a').removeClass('selected');
		$('#registrationForm div[id^=tab_]').css('display', 'none');
		$('#tab_'+tabId).css('display', '');
		$('#tabLink_'+tabId).addClass('selected');
		currentTab = tabId;
	}
	
	function _goToStep(stepName){
		// update steps array
		_steps = _getConferenceSteps();

		// validate form
		var result = validatediv(_currentStep);
		if(result === false){ return false; }
		
		_showStep(stepName);
	}
	
	function _showStep(stepName){
		// show step container div
		$('div.step-container').addClass('hidden');
		$('#'+stepName).removeClass('hidden');
		
		// set step style to selected
		$('ul.conference-steps li').removeClass('selected');
		$('#'+stepName+'Step').addClass('selected');
		
		_currentStep = stepName;
		
		// show/hide form-buttons
		if(stepName == 'form'){ 
			$('#form-buttons').removeClass('hidden');
			_showTab(1);
		}else{
			$('#form-buttons').addClass('hidden');
		}
		
		// show/hide prev/next/complete buttons
		var index = jQuery.inArray(_currentStep, _steps);
		
		$('#prevButton, #nextButton').removeClass('hidden')
		$('#completeButton').addClass('hidden');
		if(index < 1){ $('#prevButton').addClass('hidden'); }
		if(index >= _steps.length-1){ 
			$('#nextButton').addClass('hidden');
			$('#completeButton').removeClass('hidden');
		}
	}
	
	function _setBookedRooms(roomId, start, end){
		// parse window location for conferece id
		var confId = 0;
		var url = window.location.href.split('?')[1].split('&');
		for(var i in url){
			var exp = url[i].split('=');
			if(exp[0] == 'conf' || exp[0] == 'hash'){ confId = exp[1]; }
		}				
		
		var data = {
			'room': roomId,
			'start': start,
			'end': end,
			'index': currentTab,
			'conf': confId
		};
		jQuery.post(wwwroot+'/extensions/ext_pk_regsys/admin/book.php', data);
	}
	
	return {
		isRequiredText: '',
		isWrongFormat: '',
		initialize: function(formData){ _initialize(formData); },
		displayElementsBySelection: function(fieldId, displayGroup){ _addElement(fieldId, displayGroup); },
		removeElementById: function(id){ _removeElementById(id); },
		addTab: function(){ _addTab(); },
		deleteTab: function(){ _deleteTab(); },
		showTab: function(tabId){ _showTab(tabId); },
		prevStep: function(){
			var prevStep = jQuery.inArray(_currentStep, _steps)-1;
			if(prevStep < 0){ return false; }
			_showStep(_steps[prevStep]);
			//_goToStep(_steps[prevStep]);
		},
		nextStep: function(){
			var nextStep = jQuery.inArray(_currentStep, _steps)+1;
			if(nextStep > _steps.length-1){ return false; }
			_goToStep(_steps[nextStep]);
		},
		edit: function(){
			if(_elementValues == null){ return false; }
			for(var i in _elementValues){
				Form.render('#tab_'+(i+1));
			}
		},
		render: function(id){
			if(_elementData.length < 1){ return false; }
			if($(id).length < 1){ _addTab(); }
			_steps = _getConferenceSteps();
			_showStep($('#invoice').length > 0 ? 'invoice' : 'form');
		},
		submit: function(){
			var result = validatediv(_currentStep);
			if(result === false){ return false; }
			$('#registrationForm').get(0).submit();
		},
		getDiscountsByCurrentTab: function(){
			if(!_elementValues || !_elementValues[currentTab-1]){ return false; }
			return (_elementValues[currentTab-1]['bargains'] ? _elementValues[currentTab-1]['bargains'] : []);
		},
		//setBookedRoom: function(roomId, start, end){ _setBookedRooms(roomId, start, end); },
		getElementValueByName: function(name){ return _getElementValueByName(name);	}
	}
})();

function setFocusDelayed(){
  global_valfield.focus();
}

function setfocus(valfield){
  // todo: activate invalid div
	var name = $(valfield).attr('name');
	if(name){
		var exp = name.split('_');
		var tabId = exp[1];
		Form.showTab(tabId);
	} 
	
	// save valfield in global variable so value retained when routine exits
  global_valfield = valfield;
  setTimeout('setFocusDelayed()', 100);
}

function ucFirst(string){
	string=""+string;
	return (string.substr(0, 1).toUpperCase() + string.substr(1));
}

function isNumeric(string){
	string = string+'';
	return (string && string.match(/^\d+$/));
}

function validatediv(div_id){
	var conclusion = true;
	var allelements = $('#'+div_id+' input, #'+div_id+' textarea, #'+div_id+' select');
	var focused = null;
	var loaded = "";

	// set style to default
	$('#tabsContent a').removeClass('error');
	
	jQuery.each(allelements, function(o, elem){
		$('#'+$(elem).attr('name')+' span.errmess').remove();
		$(elem).removeClass('error');
		
		var type = $(elem).attr('type');
		if(/^required/.test($(elem).attr('rel')) && (type == 'radio' || type == 'checkbox')){
			if($('input:checked', $(elem).parent()).length < 1){
				appendSpan($(elem).parent(), Form.isRequiredText);
				if(focused == null){ focused = elem; }
				conclusion = false;
			}
		}else if(/^required/.test($(elem).attr('rel')) && (type == 'text' || type == 'textarea' || type == 'select-one') && $(elem).val().length < 1){
			appendSpan($(elem), Form.isRequiredText);
			if(focused == null){ focused = elem; }
			conclusion = false;
		}else if(/email$/.test($(elem).attr('rel')) && $(elem).val().length > 0 && !$(elem).val().match(/^([a-z0-9._-](\+[a-z0-9])*)+@[a-z0-9.-]+\.[a-z]{2,6}$/i)){
			appendSpan($(elem), Form.isWrongFormat);
			if(focused == null){ focused = elem; }
			conclusion = false;
		}else if(/number/.test($(elem).attr('rel')) && $(elem).val().length > 0 && !$(elem).val().match(/^([0-9.,]+)$/)){
			appendSpan($(elem), Form.isWrongFormat);
			if(focused == null){ focused = elem; }
			conclusion = false;
		}
	});
	
	if(focused != null){ setfocus(focused); }
	return conclusion;
}

function appendSpan(element, text){
	$($("<span></span>").attr('class','errmess').text(text)).insertAfter($(element));
	$(element).addClass('error');
	var name = $(element).attr('name');
	if(!name){ return false; }
	
	var exp = name.split('_');
	$('#tabLink_'+exp[1]).addClass('error');
}

function getvalues(){
	var indiv = new Array();
 	var indiv_2 = new Array();
	var tabdivs = document.getElementById('form');
	indiv = tabdivs.getElementsByTagName('div');
	for(var gh = 0; gh < indiv.length; gh++){
		indiv_2 = indiv[gh].getElementsByTagName('div');
		for (var gg = 0; gg < indiv_2.length; gg++) {
			$('#'+indiv[gh].id).append(indiv_2[gg].innerHTML);
		}
		$('#regist_form').append(indiv[gh].innerHTML);
	}
}
