/**
 *
 *
 *
 */
var gDaysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];

function getDaysInMonth(y, m) {
	var dayCount = gDaysInMonth[m-1];
	if (m == 2) {
		if ((y % 4) == 0) {
			dayCount = 29;
			if ((y % 100) == 0 && (y % 400) != 0) {
				dayCount = 28;
			}
		}
	}
	return dayCount;
}
/**
 *
 * Update day selection 
 *
 */
function updateDays(eventObject) {

	var dateCtrl;

	if (typeof eventObject == "string") {
		dateCtrl = $('#'+eventObject);
	}
	else {
		dateCtrl = $(eventObject.target.parentNode);
	}

	var showdays = $('input[name="showdays"]',dateCtrl).val().toString().toLowerCase();
	if (showdays != 'yes') {
		return;
	}

	var id = dateCtrl.attr('id');
	var dateYear = $('#'+id+'-year');
	var dateMonth = $('#'+id+'-month');
	var dateDay = $('#'+id+'-day');

	var year = dateYear.val();
	var month = dateMonth.val();
	var currDay = dateDay.val() || 1;

	var allowEmpty = $('input[name="allowempty"]',dateCtrl).val().toString().toLowerCase();

	dateDay.empty();
	if (allowEmpty == "yes") {
		dateDay.append('<option value="0">----</option>');
	}
	for (d=1; d<=getDaysInMonth(year, month); d++) {
		dateDay.append('<option value="'+d+'">'+d+'</option>');
	}
	while (currDay > dateDay) --currDay;
	dateDay.val(currDay);
}
/**
 *
 *
 *
 */
function initDateControl(id) {

	var dateCtrl = $('#'+id);
	var dateYear = $('#'+id+'-year');
	var dateMonth = $('#'+id+'-month');
	var dateDay = $('#'+id+'-day');

	var init = $('input[name="initial"]', dateCtrl).val().split('-');

	init[0] = parseInt(init[0],10);
	init[1] = parseInt(init[1],10);
	init[2] = parseInt(init[2],10);

	dateYear.val(init[0]);
	dateMonth.val(init[1]);

	var showdays = $('input[name="showdays"]',dateCtrl).val().toString().toLowerCase();
	if (showdays == 'yes') {
		dateYear.change(updateDays);
		dateMonth.change(updateDays);

		updateDays(id);
		if (init[2] <= getDaysInMonth(init[0], init[1])) {
			dateDay.val(init[2]);
		}
		else {
			dateDay.val(1);
		}
	}

	/*
	dateCtrl.datePicker({	createButton: false,
							displayClose: true,
							verticalPosition: $.dpConst.POS_TOP,
							verticalOffset: dateCtrl.height()
						});
	
	dateCtrl.append('<a title="Choose date" class="dp-choose-date" href="#">Choose date</a>');
	$('a', dateCtrl)
	.bind(	'click',
			function()
			{
				$(this.parentNode).dpDisplay();
				this.blur();
				return false;
			}
	);
	dateCtrl.bind(
			'dateSelected',
			function(e, selectedDate, $td)
			{
				console.log('You selected ' + selectedDate);
			}
	);
	*/
}
/**
 * Initialize repeatable forms
 *
 *
 */
function initSubforms() {
	// collect subforms
	var subForms = $('div[id$="-subform-container"]');
	// doit for all
	subForms.each( function(idx, subform) {
		var sf = $(subform);
		var id = sf.attr('id').slice(0,-18); // length of '-subform-container' postfix


		var navi =  '<div id="' + id + '-control" class="frmSubFormControlPanel">';
		//navi += '<hr style="margin-top:0.5em; margin-bottom:0.5em" />';
		navi += '<button type="button" id="'+id+'-add" class="frmButton1" title="Add another subform"><span><span>+</span></span></button>';
		navi += '</div>';

		sf.append(navi);

		$("div[id='"+id+"-control'] > button").click(onAddSubFromPanel);

		var subPanels = $("div[id^='"+id+"']", subform);
		subPanels.each( function(pidx, pelem) {
			var sp = $(pelem);
			if ($('input[name="type"][value="subform"]', pelem).length > 0) {
				var idx = $('input[name="index"]', pelem).val();
				var pid = sp.attr('id');

				if (idx > 0) {
					navi =  '<div id="'+pid+'-control" class="frmSubFormControlPanel">';
					navi += '<button type="button" id="'+pid+'-remove" class="frmButton1" title="Remove subform"><span><span>-</span></span></button>';
					navi += '</div>';
	
					sp.prepend(navi);
					//sp.prepend('<hr style="margin-top:0.25em; margin-bottom:0.25em" />');
	
					$("div[id='"+pid+"-control'] > button").click(onRemoveSubFromPanel);
				}
			}
		});

	});
}

/**
 *
 * Add repeatable form part
 *
 *
 */
function onAddSubFromPanel(eventObject)
{
	var btn = $(eventObject.target);
	var idparts = btn.attr('id').match(/(.+)(\-add)/i);
	if (idparts && idparts.length > 1) {
		var idbase = idparts[1];

		var container = $("div[id='"+idbase+"-subform-container']");
		var firstOne = $("div[id='"+idbase+"_0']", container);
		var inpMax = $('input[name="maxOccurence"]', firstOne);
		var maxOcc = (inpMax.length > 0) ? inpMax.get(0).value : 0;
		if (0 == maxOcc)
			maxOcc = 1;
			
		var subForms = $('div > input[name="type"][value="subform"]', container);
		if (subForms.length < maxOcc) {

			var containerControl = $("div[id='"+idbase+"-control']");
	
			var lastform = $('div > input[name="type"][value="subform"]:last', container);
			if (lastform.length > 0) {
				lastform = lastform.parent();
	
				var lastidx = parseInt($('input[name="index"]',lastform).val());
	
				var clone = $("div[id='"+idbase+"_0']").clone();
				var newid = lastidx+1;
				var cloneid = idbase+"_"+newid;
	
				function rn(idx,el) {
					var element = $(el);
					$.each([ 'name', 'id' ], function(i, attrName) {
						if (element.attr(attrName)) {
							if (attrName == "id")
								element.attr(attrName, element.attr(attrName).replace(/([_-])0/, '$1'+newid));
							else {
								var name = element.attr(attrName);
								if (name == "index") {
									element.val(newid); 
								}
								else {
									element.attr(attrName, name.replace(/\[0\]/, '['+newid+']'));
								}
								
							}
						}
					});
					if (element.children().length) {
						element.children().each(rn);
					}
				}
				clone.each(rn);

				var navi =  '<div id="'+cloneid+'-control" class="frmSubFormControlPanel">';
				navi += '<button type="button" id="'+cloneid+'-remove" class="frmButton1" title="Remove subform"><span><span>-</span></span></button>';
				navi += '</div>';
				clone.prepend(navi);
				//clone.prepend('<hr style="margin-top:0.25em; margin-bottom:0.25em" />');
				containerControl.before(clone);

				$("div[id='"+cloneid+"-control'] > button").click(onRemoveSubFromPanel);


				var defaults = $('div[id="'+idbase+'-defaults"] > input',container);
				defaults.each(function(idx) {
					var inp = $(this);
					var ctrlId = this.name;

					ctrlId = ctrlId.substr(0, ctrlId.indexOf('-default'));

					var ctrl = $('#'+ctrlId+'-'+newid, container);
					if (ctrl.length == 0) {
						ctrl = $('#'+ctrlId+'-'+newid+'-'+this.value, container);
					}
					if (ctrl.length == 1) {
						var element = ctrl.get(0);
						if ('INPUT' == element.tagName) {
							if (element.type == 'radio' ||
								element.type == 'checkbox') {
								element.checked = true;
							}
							else {
								element.value = this.value;
							}
						}
						else if ('SELECT' == element.tagName) {
							if ('select-one' == element.type) {
								element.value = this.value;
							}
							else {
								$(element).each(function() {
									if ('OPTION' == this.tagName) {
										this.selected = false;
									}
								})
							}
						}
						else if ('DIV' == element.tagName) {
							var ctrlType = $('input[name="type"]', element);
							if (ctrlType.length == 1) {
								var typ = ctrlType.get(0);
								var t = typ.value.toUpperCase();

								if ('DATE' == t) {
									$('input[name="initial"]', element).val(this.value);
									initDateControl(element.id);
								}
							}
						}
					}
				});
			}
		}
	}
}

/**
 *
 *
 *
 */
function onRemoveSubFromPanel(eventObject)
{
	var btn = $(eventObject.target);
	var idparts = btn.attr('id').match(/(.+)(\-remove)/i);
	if (idparts && idparts.length > 1) {
		var idbase = idparts[1];

		$("div[id='"+idbase+"']").remove();
	}
}

/**
 *
 *
 *
 *
 */
 $(document).ready(function() {
 	// initialize tab controls

 	function pNode(index, element) {
 		return element.parentNode;
 	};

 	var tabs = $('div > input[name$="[type]"][value="tab"]').map(pNode);
 	tabs.each(function() {

 		var pages = $('div > input[name$="[type]"][value="tabpage"]', this).map(pNode);
 		var curr = $('input[name$="[currTab]"]', this).val();
 		var currIdx = curr ? pages.index($('div[id="'+curr+'"]',this).get(0)) : 0;
 		if (currIdx < 0)
 			currIdx = 0;

 		$('ul', this)
 			.tabs(	currIdx + 1,
 					{	
 						show: function(o, s, h) {
 							$('input[name$="[currTab]"]', o.parentNode.parentNode.parentNode)
 								//.val(o.hash.substr(1));
 								.val(s.id);
 							return true;
 						}
 					}
 			);
	});
	// initialize date controls
	var dates = $('div > input[type="hidden"][name="type"][value="date"]');
 	dates.each(function() {
 		initDateControl($(this.parentNode).attr("id"));
	});
	// initialize subforms
	initSubforms();

	// adjust tab heights
	/*
	tabs.each(function() {
		var tabId = $(this).attr("id");
		var minHeight = 0;
		var tabpanels = $('div[type="tabpanel"][belongsto="'+tabId+'"]');

		tabpanels.each( function() {
			if ($(this).outerHeight() > minHeight) {
				minHeight = $(this).outerHeight();
			}
		})
		.each( function() {
			this.style.height = minHeight+'px';
		});
		alert(minHeight);
	});
	*/

 });
 
