/**
 * @author frukt kuubis
 */

var FormElement = (function(params, value){
	var _types = ['title', 'subtitle', 'text', 'textarea', 'select', 'checkbox', 'radio', 'hidden', 'accommodation', 'discount'];
	var _element = null;
	var _value = value || '';
	var _params = {
		id: '',
		parent_id: 0,
		field_name:'',
		value_group_id: 0,
		type: 0,
		name: '',
		description: '',
		'class': '',
		is_required: 0,
		is_email: 0,
		is_numeric: 0,
		values: [],
		dates: {}
	};
	_params = jQuery.extend(_params, params);
	_initialize();
	//console.log(_params);
	function _initialize(){
		var type = _params.type-1;
		if(!isNumeric(_params.type)){ return false; }
		var functionName = '_addElement'+ucFirst(_types[type]);
		eval('_element = '+functionName+'();');
	}
	
	function _addElementTitle(){
		var element = $('<h1></h1>').attr('id', _params.field_name+"_"+currentTab).text(_params.name).addClass(_params['class']);
		return $(element).get(0);
	}
	
	function _addElementSubtitle(){
		var element = $('<h2></h2>').attr('id', _params.field_name+"_"+currentTab).text(_params.name).addClass(_params['class']);
		return $(element).get(0);
	}
	
	function _addElementText(){
		var element = $('<div></div>').attr('id', _params.field_name+"_"+currentTab).addClass('field-row').append(
			(_params.is_required == 1 ? $('<span></span>').addClass('label').append($('<strong></strong>').text(_params.name)) : $('<span></span>').addClass('label').text(_params.name))
		).append(
			$('<input type="text"/>').attr({
				'name': _params.field_name+"_"+currentTab, 'value': (_value ? _value : _params.values[0]), 'rel':printvalues()
			}).addClass('text')
		).append(
			$('<div></div>').addClass('clear')
		);
		
		if(_params.description != '' && _params.description != 0){
		 	$('span:first', element).append($('<span></span>').addClass('desc').text(_params.description))
		}
		
		return $(element).get(0);
	}
	
	function _addElementTextarea(){
		var element = $('<div></div>').attr('id', _params.field_name+"_"+currentTab).addClass('field-row').append(
			(_params.is_required == 1 ? $('<span></span>').addClass('label').append($('<strong></strong>').text(_params.name)) : $('<span></span>').addClass('label').text(_params.name))
		).append(
			$('<textarea></textarea>').addClass('text').attr({
				'name': _params.field_name+"_"+currentTab, 'rel':printvalues()
			}).text(_value)
		).append(
			$('<div></div>').addClass('clear')
		);
		
		if(_params.description != '' && _params.description != 0){
		 	$('span:first', element).append($('<span></span>').addClass('desc').text(_params.description))
		}
		
		return $(element).get(0);
	}
	
	function _addElementSelect(){
		// TODO: bind change event
		var element = $('<div></div>').attr('id', _params.field_name+"_"+currentTab).addClass('field-row').append(
			(_params.is_required == 1 ? $('<span></span>').addClass('label').append($('<strong></strong>').text(_params.name)) : $('<span></span>').addClass('label').text(_params.name))
		).append(
			$('<select></select>').attr({'name': _params.field_name+"_"+currentTab, 'rel':printvalues()}).bind('change', function(){
				Form.displayElementsBySelection(_params.field_name, $(this).val());
			})
		).append(
			$('<div></div>').addClass('clear')
		);
		
		if(_params.description != '' && _params.description != 0){
		 	$('span:first', element).append($('<span></span>').addClass('desc').text(_params.description))
		}
		
		jQuery.each(_params.values, function(key, value){
			if (value != "") {
				var checked = key == _value ? true : false;
				$('select', $(element)).append($('<option></option>').attr({
					'value': key,
					'selected': checked
				}).text(value));
			}
		});
		
		return $(element).get(0);
	}
	
	function _addElementCheckbox(){
		// TODO: bind change event
		var checked = ((_value == 'on' && _value != 0) ? true : false);
		var element = $('<div></div>').attr('id', _params.field_name+"_"+currentTab).addClass('field-row').append(
			(_params.is_required == 1 ? $('<span></span>').addClass('label').append($('<strong></strong>').text(_params.name)) : $('<span></span>').addClass('label').text(_params.name))
		).append(
			$('<input type="checkbox" />').attr({
				'name': _params.field_name+"_"+currentTab, 'value': _params.values[0], 'checked': checked, 'rel':printvalues()
			}).bind("click", function(){ 
				if($(this).checked){
					Form.displayElementsBySelection(_params.field_name, $(this).val());
				}
			})
		).append(
			$('<div></div>').addClass('clear')
		);
		
		if(_params.description != '' && _params.description != 0){
		 	$('span:first', element).append($('<span></span>').addClass('desc').text(_params.description))
		}
		
		return $(element).get(0);
	}
	
	function _addElementRadio(){

		// TODO: bind change event
		var element = $('<div></div>').attr('id', _params.field_name+"_"+currentTab).addClass('field-row').append(
			(_params.is_required == 1 ? $('<span></span>').addClass('label left').append($('<strong></strong>').text(_params.name)) : $('<span></span>').addClass('label left').text(_params.name))
		).append(
			$('<div></div>').addClass('left')
		).append(
			$('<div></div>').addClass('clear')
		);
		
		if(_params.description != '' && _params.description != 0){
		 	$('span:first', element).append($('<span></span>').addClass('desc').text(_params.description))
		}
		
		jQuery.each(_params.values, function(key, value){
			if (value != "") {
				var checked = (key == _value ? true : false);
				
				$('div.left', $(element)).append($('<input type="radio"/>').attr({
					'name': _params.field_name+"_"+currentTab,
					'value': key,
					'checked': checked,
					'rel': printvalues()
				}).bind("click", function(){
					$(':radio', $(this).parent()).attr('checked', false);
					Form.displayElementsBySelection(_params.field_name, $(this).val());
					$(this).attr('checked', true);
				})).append(
					$('<label></label>').attr('for', _params.field_name+'_'+currentTab).text(value)
				).append('<br/>')
			}
		});
		
		return $(element).get(0);
	}
	
	function _addElementHidden(){
		
	}
	
	function _addElementAccommodation(){
		var element = $('<div></div>').attr('id', _params.field_name+"_"+currentTab).addClass('field-row').append(
			(_params.is_required == 1 ? $('<span></span>').addClass('label left').append($('<strong></strong>').text(_params.name)) : $('<span></span>').addClass('label left').text(_params.name))
		).append($('<div></div>').addClass('left').append(
			$('<select></select>').attr({'name': _params.field_name+"_"+currentTab}).bind('change', function(){
				var keys = _arrayKeys(_params.dates);
				var start = $('select[name='+$(this).attr('name')+'_start]').val();
				start = start instanceof String == true ? start : keys[0];
				var end = $('select[name='+$(this).attr('name')+'_end]').val();
				end = end instanceof String == true ? end : keys[keys.length-1];
				_setBookedRooms(_params.field_name, $(this).val(), start, end);
			})
		).append($('<br/>'))
		).append(
			$('<div></div>').addClass('clear')
		);
		
		if(_params.description != '' && _params.description != 0){
		 	$('span:first', element).append($('<span></span>').addClass('desc').text(_params.description))
		}
		
		jQuery.each(_params.values, function(key, value){
			if (value != "") {
				var optgroup = $('<optgroup></optgroup>').attr({'label': value.name});
				
				if(!value.rooms){ return; }
				jQuery.each(value.rooms, function(i, room){
					var checked = room.id == _value ? true : false;
					optgroup.append($('<option></option>').attr({'value': room.id, 'selected': checked}).text(room.name))//+" ("+room.num_taken+"/"+room.num_rooms+")"))
				});
				
				$("select", element).attr({'rel': printvalues()}).append(optgroup);
			}
		});
		
		var counter = 0;
		for(var i in _params.dates){ counter++;}
		if(counter > 0){
			var startElement = $('<select></select>').attr({
				'name': _params.field_name+"_"+currentTab+"_start"
			}).bind('change', function(){
				var name = $(this).attr('name').split('_');
				name.pop();
				name = name.join('_');
				
				var keys = _arrayKeys(_params.dates);
				var endDates = jQuery.extend({}, _params.dates);
				//if(keys.length > 1){ delete endDates[0]; }
				
				var index = $(this).val();
				var hasValue = false;
				jQuery.each(keys, function(key, item){
					if(!hasValue){ delete endDates[item]; }
					if(index == item){ hasValue = true; }
				});
				
				// get previous value
				var value = $('select[name='+name+'_end]', $(this).parent()).val();
				
				// add all dates
				OptionClass.set($('select[name='+name+'_end]', $(this).parent()), endDates);
				
				// get offset by element value and remove elements below it
				//var index = OptionClass.getIndexByValue($(this), $(this).val());
				//OptionClass.remove($('select[name='+name+'_end]', $(this).parent()), 0, index+1);
				
				// set previous value
				$('select[name='+name+'_end]', $(this).parent()).val(value);
				
				delete endDates;
				delete keys;
				
				// set booked rooms
				var room = $('#' + name + ' select:first').val();
				_setBookedRooms(name, room, $('select[name='+name+'_start]', $(this).parent()).val(), $('select[name='+name+'_end]', $(this).parent()).val());
			}).css('display', 'none');

			$('div.left', element).append(startElement);
			
			//$('div.left', element).append($('<span></span>').text(' - '));
			
			var endElement = $('<select></select>').attr({
				'name': _params.field_name+"_"+currentTab+"_end"
			}).bind('change', function(){
				var name = $(this).attr('name').split('_');
				name.pop();
				name = name.join('_');
				
				var keys = _arrayKeys(_params.dates);
				var startDates = jQuery.extend({}, _params.dates);
				//if(keys.length > 1){ delete startDates[keys[keys.length-1]]; }
				
				var index = $(this).val();
				var hasValue = false;
				jQuery.each(keys, function(key, item){
					if(index == item){ hasValue = true; }
					if(hasValue){ delete startDates[item]; }
				});
				
				// get previous value
				var value = $('select[name='+name+'_start]', $(this).parent()).val();

				// add all dates
				OptionClass.set($('select[name='+name+'_start]', $(this).parent()), startDates);
				
				// get offset by element value and remove elements below it
				//var index = OptionClass.getIndexByValue($(this), $(this).val());
				//OptionClass.remove($('select[name='+name+'_start]', $(this).parent()), (index-1), $('option', $('select[name='+name+'_start]', $(this).parent())).length);
				
				// set previous value
				$('select[name='+name+'_start]', $(this).parent()).val(value);
				
				delete startDates;
				delete keys;
				
				// set booked rooms
				var room = $('#' + name + ' select:first').val();
				_setBookedRooms(name, room, $('select[name='+name+'_start]', $(this).parent()).val(), $('select[name='+name+'_end]', $(this).parent()).val());
			}).css('display', 'none');
			
			$('div.left', element).append(endElement);
			
			var keys = _arrayKeys(_params.dates);
			var start = jQuery.extend({}, {startdate: Form.getElementValueByName(_params.field_name+"_start")});
			start = jQuery.extend({}, _params.dates);
			var end = jQuery.extend({}, _params.dates);
			if(keys.length > 1){ delete start[keys[keys.length-1]]; }
			if(keys.length > 1){ delete end[keys[0]]; }

			OptionClass.set(startElement, start);
			OptionClass.set(endElement, end);
			
			var startElementValue = Form.getElementValueByName(_params.field_name + '_start');
			if(startElementValue && startElementValue.length > 0){
				startElementValue = startElementValue.split('.');
				startElementValue = startElementValue.reverse().join('-');
			}
			$('option[value="' + startElementValue + '"]', startElement).attr('selected', 'selected');
			$(startElement).val(startElementValue);
			
			var endElementValue = Form.getElementValueByName(_params.field_name + '_end');
			if(endElementValue && endElementValue.length > 0){
				endElementValue = endElementValue.split('.');
				endElementValue = endElementValue.reverse().join('-');
			}
			$('option[value="' + startElementValue + '"]', endElement).attr('selected', 'selected');
			$(endElement).val(endElementValue);

			delete start;
			delete end;
			
			// set booked rooms on create
			_setBookedRooms(_params.field_name, $('select[name='+_params.field_name+'_'+currentTab+']', element).val(), $(startElement).val(), $(endElement).val());
		}
		return $(element).get(0);
	}
	
	function _addElementDiscount(){
		var discounts = Form.getDiscountsByCurrentTab();
		var checked = (discounts.length > 0 && jQuery.inArray(_value, discounts) > -1 ? true : false);
		var element = $('<div></div>').attr('id', _params.field_name+"_"+currentTab).addClass('field-row').append(
			$('<span></span>').addClass('label').text(_params.name)
		).append(
			$('<input type="checkbox" />').attr({
				'name': _params.field_name+"_"+currentTab, 'value': _params.values[0], 'checked': checked
			})
		).append(
			$('<div></div>').addClass('clear')
		);
		
		return $(element).get(0);
	}
	
	function printvalues(){
		var relValue = '';
		if(_params.is_required == 1){ relValue += 'required'; }
		if(_params.is_numeric == 1){ relValue += relValue.length > 0 ? ' number': 'number'; }
		if(_params.is_email == 1){ relValue += relValue.length > 0 ? ' email' : 'email'; }
		
		return relValue;
	}
	
	function _setDatePickerRange(input){
		var dates = _arrayKeys(_params.dates);
		/*var start = dates[0].split('-');
		var end = dates[dates.length-1].split('-');*/
		var start = _stringToDate(dates[0]);
		var end = _stringToDate(dates[dates.length-1]);
		
		var name = $(input).attr('name').split('_');
		name.pop();
		name = name.join('_');
		
		if(/\_start$/.test(input.name)){
			return {
				minDate: start, //start[0], start[1]-1, start[2]
				maxDate: end //($('input[name='+name+'_end]').val().length > 0 ? $('input[name='+name+'_end]').datepicker("getDate") : new Date(dates[dates.length-1])) //end[0], end[1]-1, end[2]
			}
		}else if(/\_end$/.test(input.name)){
			return {
				minDate: start, //($('input[name='+name+'_start]').val().length > 0 ? $('input[name='+name+'_start]').datepicker("getDate") : new Date(dates[0])), //start[0], start[1]-1, start[2]
				maxDate: end //end[0], end[1]-1, end[2] 
			}
		}
	}
	
	function _stringToDate(string){
		if(!string || string.length < 1){ return false; }
		var exp = string.split('-');
		return new Date(exp[0], exp[1]-1, exp[2]);
	}
	
	function _arrayKeys(array){
		if(!array){ return false; }
		var result = [];
		jQuery.each(array, function(key, value){
			result[result.length] = key;
		});
		return result;
	}
	
	function _setBookedRooms(name, 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 confId = Form.getConfId();
		var data = {
			'name': name,
			'room': roomId,
			'start': start,
			'end': end,
			'index': currentTab,
			'conf': confId
		};
		jQuery.post(wwwroot+'/extensions/ext_regsys/admin/book.php', data, function(response){
			_params.dates = response;
			//console.log(response);
			// TODO: clear start end posts
			/*var start = $('input[name='+name+'_start]').val();
			if(_params.dates[0] > start){ $(start).val(''); }
			
			var end = $('input[name='+name+'_end]').val();
			if(_params.dates[_params.dates.length-1] > end){ $(end).val(''); }*/
			//console.log('input[name='+name+'_'+data.index+'_start]'+data.start);
		}, 'json');
	}
	
	return {
		id: _params.id,
		parent: _params.parent_id,
		value_group_id: _params.value_group_id,
		type: _params.type,
		name: _params.name,
		description: _params.description,
		'class': _params['class'],
		value: _value,
		values: _params.values,
		is_required: _params.is_required,
		is_email: _params.is_email,
		is_numeric: _params.is_numeric,
		element: _element
	}
});

var OptionClass = (function(){
	function _setOptions(select, options){
		if(!options || options.length < 1 || !select){ return false; }
		// remove all previous options
		$('option', $(select)).remove();
		
		// add options
		jQuery.each(options, function(key, value){
			$('<option></option>').attr({
				'value': key
			}).text(value).appendTo($(select));
		});
	}
	
	function _removeOptions(select, offset, count){
		if(!isNumeric(offset) || !isNumeric(count) || !select){ return false; }
		var removeCount = 0;
		$('option', $(select)).each(function(key, value){
			if(key >= offset && removeCount < count){ $(value).remove(); removeCount++; }
		});
	}
	
	function _getIndexByValue(select, value){
		if(!select || !value || value.length < 1){ return false; }
		var index = false;
		$('option', $(select)).each(function(key, option){
			if($(option).val() == value){ index = key; return false; }
		});
		return index;
	}
	
	return {
		getIndexByValue: function(select, value){
			return _getIndexByValue(select, value);
		},
		
		set: function(select, options){
			_setOptions(select, options);
		},
		
		remove: function(select, offset, count){
			_removeOptions(select, offset, count);
		}
	}
})();

