jQuery.extend({
   postJSON: function( url, data, callback) {
      return jQuery.post(url, data, callback, "json");
   }
});


/**
 * jQuery.ScrollTo - Easy element scrolling using jQuery.
 * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 5/25/2009
 * @author Ariel Flesler
 * @version 1.4.2
 *
 * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
 */
;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);

// http://stackoverflow.com/questions/6275497/jquery-javascript-input-fields-user-pass-just-like-twitters-login

$.fn.defaultText=function(a){function d(){c.show();b.add(c).addClass(a.css)}
function e(){f.value.length?(c.hide(),b.add(c).removeClass(a.css)):d()}
a=$.extend({},{css:"dimmed"},a);if(!("text"in a))return this;var f=this[0],
b=this,g=b.offset(),c=$("<div>"+a.text+"</div>").css({position:"absolute",
top:g.top,left:g.left+4,cursor:"text"}).click(function(){b.focus();e()})
.addClass(a.css+" unselectable").appendTo("body");b.addClass(a.css).keyup(e)
.blur(function(){f.value.length||d()});return this};



// var httpApiRootPath = "/some/path"; - define in page <head> section



function searchParentAttr (e, attr)
{
  var p = e;
  while (p.length)
  {
    var attrValue = p.attr (attr);
    if (p.attr (attr))
      return p.attr (attr);

    p = p.parent ();
    if (!p.length)
      break;
  }
  return null;
}


function searchObjectId (e, objectType)
{
  var p = e;
  while (p.length)
  {
    var ot = p.attr ('data-object');
    if (ot === objectType)
      return p.attr ('id');

    p = p.parent ();
    if (!p.length)
      break;
  }
	
  return '';
}

 function searchObjectAttr (e, attr)
{
  var p = e;
  while (p.length)
  {
    if (p.attr (attr))
      return p;

    p = p.parent ();
    if (!p.length)
      break;
  }
	
  return null;
}

function dfMaximizeMainElement (aElementId)
{
  $("html,body").css ({"overflow": "hidden"});
  
  var contentElement = document.getElementById (aElementId); 
  var offsetLeft = 0;
  var offsetTop = 0;
  var fpd = document.getElementById (aElementId); 
  while (fpd)
  {
    offsetLeft += fpd.offsetLeft;
    offsetTop += fpd.offsetTop;
    fpd = fpd.offsetParent;
  }
  var newHeight = 600;
  if (window.innerWidth)
      newHeight = window.innerHeight - offsetTop;
  else
  if (document.documentElement)
      newHeight = document.documentElement.clientHeight - offsetTop;
  contentElement.style.height = newHeight + 'px';
  return newHeight;
}


// -----------
// uiHooks
// -----------

var e10_uiHooks = Array ();
function addUiHook (eventName, table, func)
{
	e10_uiHooks.push ({"eventName": eventName, "table": table, "func": func});
};


function callUiHook (eventName, table, e)
{
	for (var i = 0; i < e10_uiHooks.length; i++)
	{
		var hook = e10_uiHooks [i];
		//alert ('QQ: ' + hook ["eventName"] + ' t: ' + hook ["table"] + ' / ' + table);
		if ((hook ["eventName"] == eventName) && (hook ["table"] == table))
		{
			if (!hook ["func"].call (e))
				return false;
			//alert ("START!");
			return true;
		}
	}
	return false;
}


// -----------
// mainBrowser
// -----------

function mainBrowserInit (id)
{
	var mainBrowser = $("#" + id);
  mainBrowserRefreshLayout (id);
	
  $("#mainBrowser").delegate ("#mainListViewMenu li div.df2-menu-item-t1", "click", function(event) {
    menuItemClick ($(this));
  });

	$("#mainBrowser").delegate ("#mainListViewMenu li ul li", "click", function(event) {
    viewerMenuItemClick ($(this));
  });
	
	$("body").delegate ("ul.e10-form-tabs li", "click", function(event) {
		e10FormsTabClick ($(this));
	});
	
  $("body").delegate ("div.e10-panel-topmenu ul.e10-panel-menuTop li.active ", "click", function(event) {
    menuTopItemClick ($(this), event);
  });
	
  $("body").delegate ("div.e10-att-input button", "click", function(event) {
    e10AttWidgetSelect ($(this), event);
  });

	$(window).resize(function() {mainBrowserRefreshLayout ("mainBrowser")});
	var firstItem = $("#mainListViewMenu li:first div.df2-menu-item-t1");
	menuItemClick (firstItem);
}

function mainBrowserGoHome ()
{
	var activeMenuItem = $("#mainListViewMenu li:first div.df2-menu-item-t1");
	if (activeMenuItem.is ("div"))
		menuItemClick (activeMenuItem);
	else
	{
		var activeLink = $("body div.e10-panel-topmenu ul li.active");
		if (activeLink.is ('LI'))
		{
			viewerMenuLoadViewer (activeLink);
		}
		else
		{
			activeLink = $("body div.e10-panel-topmenu ul li.active a")[0];
			window.location = activeLink.href;
		}
	}
}


function mainBrowserRefreshLayout (id)
{
  var totalSizeY = dfMaximizeMainElement (id);
	
	var menuCell = $("#mainListViewMenuCell");
	var list = menuCell.find ("ul.df2-viewer-menu");
	//var tlbr = menuCell.find ("div.e10-mb-tlbr");
	
	var cellHeight = menuCell.height ();
	var listHeight = list.height ();
	var tlbrHeight = 0;//tlbr.height ();
	//tlbr.css ({position: 'absolute', top: cellHeight - tlbrHeight - 1, width: menuCell.width ()});
	list.css ({position: 'absolute', top: ((cellHeight - tlbrHeight - listHeight)/2)|0});
} // mainBrowserRefreshLayout


function menuItemClick (e)
{
	var table = e.parent().attr ("data-table");
	//if (table != undefined) 
	{
		$("#mainListViewMenuCell >ul >li").removeClass ("activeMainItem");
		e.parent().addClass ("activeMainItem");
		var funcName = e.parent().attr ("data-func");
		viewerMenuLoadViewer (e.parent());
		document.title = e.parent().find("div").first ().text() + ": " + e.text();
	}/*
	else
	{
	  $("#mainListViewMenu >li").removeClass ("active");
		e.addClass ("active");
		e.parent().find ("ul").slideToggle (50);
	}*/
} // menuItemClick


function menuTopItemClick (e, event)
{
	if (e.attr ('data-object'))
	{
		event.stopPropagation();
		event.preventDefault();
		
		viewerMenuLoadViewer (e);
	}
}


function e10doSizeHints (e)
{
	e.find ('.e10-wsh-h2b').each (
		function () 
		{
			var thisEl = $(this);
			var sizer = searchObjectAttr (thisEl, 'data-e10mxw');
			thisEl.height (sizer.height() - thisEl.position().top);
			if (thisEl.attr ('data-refreshLayout'))
			{
				window[thisEl.attr ('data-refreshLayout')](thisEl);
			}
			//alert ("test: " + sizer.height());
		}
	);
}

// -----
// forms
// -----

function mainFormInit (id)
{
	var mainForm = $("#" + id);
  mainFormRefreshLayout (id);
	
	/*
  $("#mainBrowser").delegate ("#mainListViewMenu li div.df2-menu-item-t1", "click", function(event) {
    menuItemClick ($(this));
  });

	$("#mainBrowser").delegate ("#mainListViewMenu li ul li", "click", function(event) {
    viewerMenuItemClick ($(this));
  });
	*/
}


function mainFormRefreshLayout (id)
{
  var formContainer = $("#mainEditFormContainer");

	var totalSizeY = formContainer.parent().innerHeight ();
  var totalSizeX = formContainer.parent().innerWidth ();

	formContainer.width (totalSizeX);
	formContainer.height (totalSizeY);
} // mainFormRefreshLayout


// -------
// viewers
// -------
var g_formId = 1;
var e10ViewerDelegatesDone = false;

function initViewer (id)
{
	if (!e10ViewerDelegatesDone)
	{
		/* unused at this moment
		$("#" + id + " a.df2-toolbarButtonWithMenu").click (
			function ()
			{
				buttonMenu ($(this), $(this).attr ("id") + "-menu");
			}
			);*/
		$('body').delegate ('ul.e10-viewer-list >li', 'dblclick', function(event) {
			event.stopPropagation();
			event.preventDefault();
			viewerItemDblClick ($(this));
		});

		$("body").delegate ("ul.e10-viewer-list >li", "click", function(event) {
			viewerItemClick ($(this));
		});

		$('body').delegate ("ul.e10-viewer-list >li td.df2-list-item-pk", "click", function(event) {
			viewerItemLoadEmbed ($(this));
			event.stopPropagation();
		});

		$('body').delegate ("ul.e10-viewer-list ul.df2-viewer-item-embedded li", "click", function(event) {
			viewerItemClickEmbed ($(this));
			event.stopPropagation();
		});

		$('body').delegate ("ul.e10-tabs-nav li", "click", function(event) {
			e10viewerNav ($(this));
		});

		/* unused at this moment
		$('body').delegate ("a.df2-do-click", "click", function(event) {
			df2ViewerDoClick (event, $(this));
		});*/

		$('body').delegate ("div.df2-viewer button.df2-action-trigger", "click", function(event) {
			df2ViewerAction (event, $(this));
		});

		$('body').delegate ("div.df2-viewer span.df2-action-trigger", "click", function(event) {
			df2ViewerAction (event, $(this));
		});
		
		$("body").delegate ("div.e10-rows ul li.e10-rows-append button", "click", function(event) {
			e10AppendFormRow ($(this), event);
		});

		$("body").on ('change', "input.e10-ino-saveOnChange", function(event) {
			e10SaveOnChange ($(this), event);
		});
		
		$("body").on ('change', "select.e10-ino-saveOnChange", function(event) {
			e10SaveOnChange ($(this), event);
		});

		e10ViewerDelegatesDone = true;
	}

  viewerRefreshLayout (id);
	$('#' + id + ' div.e10-sv-search input').first ().focus ();
}


function buttonMenu (button, menuId)
{
  menu = $("#" + menuId);
  if (menu.css('display') == 'none')
  {
    menu.css ({left: button.position().left});
    menu.show ();
    button.parent().mouseleave (function (){$("#" + menuId).hide()});
  }
  else 
    menu.hide ();
}


function viewerRefreshLayout (id)
{
  var viewer = $('#' + id);
	var viewerId = viewer.attr ('data-viewer');
	
	
	var totalSizeY = viewer.parent().height ();
  var totalSizeX = viewer.parent().width();
	
	viewer.width (totalSizeX);
	viewer.height (totalSizeY);

	var viewerLinesContainer = $("#" + id + " >div.e10-sv-body");
	var viewerLinesToolbar = $("#" + id + " div.e10-sv-tlbr");
	var viewerLinesSearch = $("#" + id + "Search");
	var viewerLinesList = $("#" + id + "Items");
	var viewerDetailList = $("#" + id + "Details");
	var viewerDetailReport = $("#" + id + "Report");

	var linesSizeX = totalSizeX;
	if (viewerId != "mini")
		linesSizeX = (((totalSizeX / 5) * 2) | 0) - 0;
	var detailSizeX = totalSizeX - linesSizeX;

	viewerLinesContainer.width (linesSizeX);

	viewer.show ();

	var topRowSizeY = viewerLinesSearch.height ();

	var toolbarSizeY = 0;//viewerLinesToolbar.height ();

	var contentY = totalSizeY - topRowSizeY - toolbarSizeY - 0;
	viewerLinesContainer.height (totalSizeY);

	viewerLinesList.height (contentY);

	if (viewerId != "mini")
	{
		viewerDetailList.width (detailSizeX - 6);
		viewerDetailList.height (totalSizeY - 10);

		viewerDetailReport.width (detailSizeX - 1);
		viewerDetailReport.height (totalSizeY);
		
		viewerDetailReport.show ();

		var viewerDetailReportContent = viewerDetailReport.find ('div.e10-mv-lr-content');
		var viewerDetailReportToolbar = viewerDetailReport.find ('div.e10-sv-tlbr');
		viewerDetailReportContent.height (totalSizeY - viewerDetailReportToolbar.height ());

		viewerDetailList.css ({position: 'absolute', left: linesSizeX + viewerLinesContainer.position().left - detailSizeX, top: viewer.position().top + 4});
		viewerDetailReport.css ({position: 'absolute', left: linesSizeX + viewerLinesContainer.position().left, top: viewer.position().top});
	}
} // viewerRefreshLayout


function viewerRefreshLayoutListDetail (e)
{
	var viewerId = searchObjectId (e, 'viewer');
	var viewerDetailList = $("#" + viewerId + "Details");
	var sizeY = viewerDetailList.height ();
	
	var viewerDetailListTitle		= viewerDetailList.find ('div.e10-mv-ld-title');
	var viewerDetailListHeader	= viewerDetailList.find ('div.e10-mv-ld-header');
	var viewerDetailListTabs		= viewerDetailList.find ('div.e10-mv-ld-tabs');
	var viewerDetailListContent = viewerDetailList.find ('div.e10-mv-ld-content');
	//var viewerDetailListToolbar = viewerDetailList.find ('div.e10-mv-ld-tlbr');

	var contentSizeY = sizeY - 2 -
											viewerDetailListTitle.height () - 
											viewerDetailListHeader.height () - 
											viewerDetailListTabs.height ();

	if (viewerDetailListContent.hasClass ('e10-mv-ld-content-detail'))
	{
		//viewerDetailListTitle.show ();
		//viewerDetailListToolbar.show ();
		contentSizeY -= /*viewerDetailListToolbar.height () +*/ 4;
	}
	/*else
		viewerDetailListToolbar.hide ();*/

	viewerDetailListContent.height (contentSizeY);
	viewerDetailListContent.find ('div.df2-viewer').each (function () { 
			      var viewerId = $(this).attr ("id");
						initViewer (viewerId);
  });
	
	e10doSizeHints (viewerDetailListContent);
}


function e10viewerLineDetail (id, visibility)
{
	var viewerDetailList = $("#" + id + "Details");
	if (visibility && viewerDetailList.is (':visible'))
	{
		viewerRefreshLayoutListDetail (viewerDetailList);
		return;
	}
	else
	if (!visibility && !viewerDetailList.is (':visible'))
		return;
	
	var viewer = $('#' + id);
	var viewerLinesContainer = $("#" + id + " >div.e10-sv-body");
	var totalSizeX = viewer.parent().width();
	var linesSizeX = (((totalSizeX / 5) * 2) | 0) - 0;

	if (visibility)
	{
		viewerDetailList.show ();
		viewerRefreshLayoutListDetail (viewerDetailList);
		viewerDetailList.css ({left: linesSizeX + viewerLinesContainer.position().left, "-webkit-transition": "left 0.2s linear", "-moz-transition": "left .2s linear"});
	
		////viewerDetailList.css ({left: (linesSizeX + viewerLinesContainer.position().left)});
		//viewerDetailList.animate ({left: (linesSizeX + viewerLinesContainer.position().left)}, 150, function () {viewerRefreshLayoutListDetail (viewerDetailList)});
	}
	else
	{
		var detailSizeX = totalSizeX - linesSizeX;
		viewerDetailList.css ({left: linesSizeX + viewerLinesContainer.position().left - detailSizeX});
		viewerDetailList.hide ();
		//viewerDetailList.animate ({left: linesSizeX + viewerLinesContainer.position().left - detailSizeX}, 160, function (){viewerDetailList.hide ()});
	}
} // e10viewerLineDetail


function e10viewerCloseDetail (e)
{
	var viewerId = searchObjectId (e, 'viewer');
	var activeItem = $("#" + viewerId + "Items li.active");
	if (activeItem.is ('LI'))
	{
		viewerItemClick (activeItem);
		if (activeItem.hasClass ('active'))
			viewerItemClick (activeItem);
	}
	else
		e10viewerLineDetail (viewerId, false);
}


function e10viewerNav (e)
{
	e.parent().find ('li.active').removeClass ('active');
	e.addClass ('active');
	
	var viewerId = searchObjectId (e, 'viewer');
	var listItems = $('#' + viewerId + 'Items');
	var activeListItem = listItems.find ('li.active:first');
	e10viewerSetDetail (viewerId, activeListItem);
}


function e10viewerNavPath (viewer, tableName, docPK, listItem)
{
	var detailNavTabs = viewer.find ('div.e10-mv-ld-tabs');
	var activeTab = detailNavTabs.find ('ul li.active');
	var apiPath = '';
	if (activeTab.is ('li'))
	{
		apiPath = activeTab.attr ('data-apipath');
		apiPath = apiPath.replace ('{pk}', docPK);
	}
	else
	{
		var detailId = 'default';
		if (listItem.attr ('data-detailid'))
			detailId = listItem.attr ('data-detailid');
		apiPath = "/api/detail/" + tableName + "/" + detailId + "/html/" + docPK + '?mismatch=1';
	}
	
	return httpApiRootPath + apiPath;
}


function viewerMenuItemClick (e)
{
	document.title = e.parent().parent().parent().find("div").first ().text() + ": " + e.text();
	
	$("#mainListViewMenuCell ul li ul li").removeClass ("active");
  e.addClass ("active");
	
	$("#mainListViewMenuCell >ul >li").removeClass ("activeMainItem");
  e.parent().parent().parent().addClass ("activeMainItem");
	
	viewerMenuLoadViewer (e);
} // viewerMenuItemClick


function viewerMenuLoadViewer (e)
{
	var objectType = e.attr ('data-object');

	if (objectType == 'viewer')
	{
		var tableName = e.attr ("data-table");
		var funcName = e.attr ("data-func");

		g_formId++;
		var newElementId = "mainListV" + g_formId;
		var urlPath = httpApiRootPath + "/api/viewer/" + tableName + "/" + funcName  + "/html?fullCode=1&newElementId=" + newElementId;

		var browserContent = $("#mainBrowserContent");


		var jqxhr = $.getJSON(urlPath, function(data) {
			browserContent.find("*:first").remove();
			browserContent.html (data.object.htmlCode);
			initViewer (newElementId);
			browserContent.fadeTo (30, 1);
			$('#' + newElementId + ' div.e10-sv-search input').first ().focus ();
		}).error(function() {alert("error: content not loaded (" + urlPath + ")");});
		browserContent.fadeTo (30, 0.6);
		return;
	}
	
	if (objectType == 'widget')
	{
		var className = e.attr ("data-class");

		g_formId++;
		var newElementId = "wdgtV" + g_formId;
		var urlPath = httpApiRootPath + "/api/widget/" + className + "/html?fullCode=1&newElementId=" + newElementId;

		var browserContent = $("#mainBrowserContent");

		browserContent.fadeTo (30, 0.6);
		var jqxhr = $.getJSON(urlPath, function(data) {
			//alert (JSON.stringify (data));	
			browserContent.find("*:first").remove();
			browserContent.html (data.object.htmlCode);
			//initViewer (newElementId);
			browserContent.fadeTo (30, 1);
		}).error(function() {alert("error: content not loaded (" + urlPath + ")");});
		return;
	}
	alert (objectType);
} // viewerMenuLoadView


function viewerItemClick (e)
{
	var viewerId = searchObjectId (e, 'viewer');
	var viewer = $('#' + viewerId);
	var viewId = viewer.attr ('data-viewer');
	
	//if (callUiHook ("viewerItemClick", tableName, $(e)))
	//	return;
	
	
	if ((viewId == 'mini') && (e.parent().attr('data-embedpath')))
	{
		viewerItemLoadEmbed (e.find ('table tr td.df2-list-item-pk').first());
		return;
	}

	if (e.hasClass ('active') && !e.hasClass ('opened'))
	{
		e.removeClass ('active');
		e10viewerLineDetail (viewerId, false);
		return;
	}
	
	// close embedded list
	e.parent ().find (">li ul.df2-viewer-item-embedded").html ("");
	e.parent ().find (">li td.df2-list-item-e").html ("");
	$('#' + viewerId + 'Items').removeClass ("opened");
	$('#' + viewerId + 'Items >li').removeClass ("opened");	

  $('#' + viewerId + 'Items >li').removeClass ("active");
  e.addClass ("active");
	
	e10viewerSetDetail (viewerId, e);
} // viewerItemClick


function e10viewerSetDetail (viewerId, listItem)
{
  var viewer = $("#" + viewerId);
  var tableName = searchParentAttr (listItem, 'data-table');
	
  var detail = $('#' + viewerId + 'Details');
	var detailHeader = detail.find ('div.e10-mv-ld-header');
	var detailContent = detail.find ('div.e10-mv-ld-content');
	var detailToolbar = detail.find ('div.e10-mv-ld-tlbr');
	var viewerDetailListTabs = detail.find ('div.e10-mv-ld-tabs');
  var docPK = listItem.attr ("data-pk");
	var urlPath = e10viewerNavPath (viewer, tableName, docPK, listItem);
	urlPath += '&fullCode=1';
	//alert (urlPath);
	var jqxhr = $.getJSON(urlPath, function(data) {
			detail.attr ('data-table', tableName);
			detail.attr ('data-pk', docPK);
			if (data.objectType == 'detail')
			{
				//alert (data.object.htmlContent);
				detail.attr ('data-addparams', '');
				detailHeader.html (data.object.htmlHeader);
				detailContent.html (data.object.htmlContent);
				detailContent.addClass ('e10-mv-ld-content-detail');
				detailContent.removeClass ('e10-mv-ld-content-navigation');
				detailToolbar.html (data.object.htmlButtons);
			}
			else
			{
				detail.attr ('data-addparams', data.object.addParams);
				detailContent.html (data.object.htmlCode);
				detailHeader.html (data.object.htmlHeader);
				detailContent.removeClass ('e10-mv-ld-content-detail');
				detailContent.addClass ('e10-mv-ld-content-navigation');
				
				detailToolbar.html (data.object.htmlButtons);
			}
			//viewerRefreshLayoutListDetail (detailContent);
			viewerDetailListTabs.show ();
			e10viewerLineDetail (viewerId, true);
  }).error(function() {alert("error: content not loaded (" + urlPath + ")");});
}


function viewerItemDblClick (e)
{
	var viewerId = searchObjectId (e, 'viewer');
  var viewer = $('#' + viewerId);
  var tableName = viewer.attr ("data-table");
  var docPK = e.attr ("data-pk");
	
	if (callUiHook ("viewerItemDblClick", tableName, $(e)))
		return;
}


function viewerItemLoadEmbed (e)
{
	var viewerId = searchObjectId (e, 'viewer');
  var viewer = $('#' + viewerId);

	var mainListItem = e.parent().parent().parent().parent();
	var mainListItemEmbeddInfo = mainListItem.find ("td.df2-list-item-e");

	var thisListItem = e.parent().parent().parent().parent();

	//if (!e.hasClass ("active"))
	{
		$('#' + viewerId + 'Items >li').removeClass ("active");
		$('#' + viewerId + 'Items >li').removeClass ("opened");
		$('#' + viewerId + 'Items').removeClass ("opened");
		//--e.parent().parent().parent().parent().addClass ("active");
		
		$('#' + viewerId + 'Items >li td.df2-list-item-e').html ("");
	}

  var docPK = e.parent().parent().parent().parent().attr ("data-pk");
  e10viewerSetDetail (viewerId, e.parent().parent().parent().parent());

	var embeddedList = e.parent().parent().parent().parent().find ("ul");
	if (embeddedList.html () != '')
	{
		embeddedList.html ("");
		mainListItemEmbeddInfo.html ("");
		embeddedList.hide ();
		e.parent().parent().parent().parent().removeClass ("opened");
		
		e.parent().parent().parent().parent().addClass ("active");
	}
	else
  {
		$('#' + viewerId + 'Items >li').removeClass ("active");
		e.parent().parent().parent().parent().removeClass ("active");
		$('#' + viewerId + 'Items >li').find ("ul").html ("").hide ();
		
		thisListItem.removeClass ("active");
		
		var fullTextSearch = viewer.find ("div.e10-sv-search input").first().val ();
		var embedPath = searchParentAttr (e, 'data-embedpath');
		var urlPath2 = httpApiRootPath + "/api/viewer/" + embedPath + "/html" + "?epk=" + docPK +"&callback=?&embedded=1&fullTextSearch=" + fullTextSearch;
    var jqxhr = $.getJSON(urlPath2, function(data) {
	      embeddedList.html (data.object.htmlItems);
				mainListItemEmbeddInfo.html (data.embeddInfo);
				embeddedList.show ();

				$('#' + viewerId + 'Items').addClass ("opened");
				thisListItem.addClass ("opened");
				thisListItem.addClass ("active");
    }).error(function() {alert("error123: content not loaded (" + urlPath2 + ")");});
  }
} // viewerItemLoadEmbed


function viewerItemClickEmbed (e)
{
  var tableName = e.parent ().attr ("data-table");

  e.parent().find ("li").removeClass ("activeEmbedd");
  e.addClass ("activeEmbedd");

	var viewerId = searchObjectId (e, 'viewer');
	e10viewerSetDetail (viewerId, e);
}


function viewerRefresh (e, focusPK)
{
	var viewerId = searchObjectId (e, 'viewer');
  var viewer = $('#' + viewerId);
	var viewerType = viewer.attr ('data-viewertype');
  var viewerLines = $('#' + viewerId + 'Lines');
  viewerLines.fadeTo (50, 0.4);
  var tableName = viewer.attr ("data-table");
  var viewerHandle = viewer.attr ("data-vhandle");
  var viewerOptions = viewer.attr ("data-viewer");
	
	e10viewerCloseDetail (e);
	var urlPath = '';
  if (viewerType == 'navigation')
	{
		var pk = searchParentAttr (viewer.parent (), 'data-pk');
		var parentViewerId = searchObjectId (viewer.parent (), 'viewer');
		var parentViewer = $('#' + parentViewerId);
		urlPath = e10viewerNavPath (parentViewer, tableName, pk, e);
		//alert (urlPath);
	}
	else
	  urlPath = httpApiRootPath + '/api/' + viewerType + '/' + tableName + '/' + viewerOptions + '/html' + "?callback=?";

  df2FillViewerLines (viewerId, urlPath, focusPK);
}

function df2viewerFocusPK (viewerId, pk)
{
  var oneRow = $('#' + viewerId + 'Items li[data-pk="' + pk + '"]').first ();
  if (oneRow.is ("li"))
  {
    oneRow.parent().scrollTo (oneRow);
    viewerItemClick (oneRow);
  }
}

var g_incSearchTimer = 0;
var g_inIncSearch = 0;

function fireOnclick(e, objID) 
{
	if (g_inIncSearch && g_incSearchTimer)
		return;

	if (g_inIncSearch)
	{
		g_incSearchTimer = setTimeout (function () {fireOnclick (e)}, 80); 
		return;
	}
	
	if (g_incSearchTimer)
	{
		clearTimeout (g_incSearchTimer);
		g_incSearchTimer = 0;
	}
	
  viewerRefresh (e);
}

function df2CreateDialog (urlPath)
{
	//var browser = $("#mainBrowser");
	//browser.remove();
	var viewer = $("#mainListView");
	viewer.remove ();

	var browserContent = $("#mainBrowserContent");
		  //browserContent.fadeTo (30, 0.4);
	
  var jqxhr = $.getJSON(urlPath, function(data) {
	    browserContent.html (data.mainCode);
	    /*if (data.headerCode)
	      detailHeader.html (data.headerCode);
	    else
	      detailHeader.html ("");*/
	    //detail.fadeTo (1, 1.0);
			mainFormInit ("mainEditForm");
  }).error(function() {alert("error: content not loaded (" + urlPath + ")");});
	
	/*
  $('#pageContent').append("<div id='modalDlg'></div><div id='modalDlgContent'></div>");
  
  $("#modalDlg").fadeIn (40, .8);
  
  var blockerPosX = $("#mainListView").position().left + "px";
  var blockerPosY = $("#mainListView").position().top + "px";
  var blockerSizeX = $("#mainListView").width () + 'px';
  var blockerSizeY = $("#mainListView").height () + 'px';
  
  $("#modalDlg").css ({'position': 'absolute', 'left': blockerPosX, 'top': blockerPosY, 
		      "width": blockerSizeX, "height": blockerSizeY});

  $("#modalDlgContent").html (data);
  var sizeX = $("#modalDlgContent").width ();
  var sizeY = $("#modalDlgContent").height ();
  
  var sx = $("#mainListView").offset().left + (($("#mainListView").width () - sizeX) / 2) | 0 + "px";
  var sy = 0 | 0 + "px";

  $("#modalDlgContent").hide ().css ({'position': 'absolute', 'left': sx, 'top': sy});
  $("#modalDlgContent").slideDown (200);
  
  $("#modalDlgContent input").first().focus();
	*/
}

function df2ViewerAction (event, e)
{
	var actionType = e.attr ("data-action");
	if (actionType == "fulltextsearch")
		return;
	if (actionType == "fulltextsearchclear")
	{
		var inp = e.parent().parent().find ("input").first();
		inp.val ("");
		fireOnclick (inp, 'testclk2');
		return;
	}
	var table = searchParentAttr (e, "data-table");//e.attr ("data-table");
	
	if (callUiHook (actionType, table, $(e)))
		return;

	if (actionType == "newform")
	{
		e10ViewerAddRow (e);
		return;
	}

	if (actionType == "editform")
	{
		e10ViewerEditRow (e);
		return;
	}

	if (actionType == "saveform")
	{
		df2saveForm (e);
		return;
	}

	if (actionType == "deleteform")
	{
		e10ViewerDeleteRow (e);
		return;
	}

	if (actionType == "close-lv-detail")
	{
		e10viewerCloseDetail (e);
		return;
	}

	if (actionType == "print")
	{
		e10ViewerPrintDetail (e);
		return;
	}

	alert ("action: " + actionType);
}

function e10ViewerAddRow (e)
{
	var viewerId = searchObjectId (e, 'viewer');
	var viewer = $('#' + viewerId);
	var table = searchParentAttr (e, "data-table");
	var addParams = searchParentAttr (e, "data-addparams");

	var fullTextSearch = viewer.find ("div.e10-sv-search input").first().val ();

	var url = httpApiRootPath + "/api/form/" + table + "/new/?callback=?&fullTextSearch=" + fullTextSearch;
	if (addParams)
		url += '&' + addParams;
	
  var jqxhr = $.getJSON (url, function(data) {
			e10ViewerCreateEditForm (e, data);
  }).error(function() {alert("error: content not loaded (" + url + ")");});
}


function e10ViewerEditRow (e)
{
	var table = searchParentAttr (e, "data-table");
	var pk = searchParentAttr (e, "data-pk");

	var url = httpApiRootPath + "/api/form/" + table + "/edit/" + pk + "?callback=?";

	var browserContent = $("#mainBrowserContent");
	
  var jqxhr = $.getJSON (url, function(data) {
			//alert (JSON.stringify (data.recData));	
			e10ViewerCreateEditForm (e, data);
  }).error(function() {alert("error: content not loaded (" + url + ")");});
}


function e10ViewerDeleteRow (e)
{
	var table = searchParentAttr (e, "data-table");
	var pk = searchParentAttr (e, "data-pk");

	var url = httpApiRootPath + "/api/form/" + table + "/delete/" + pk + "?callback=?";
	var jqxhr = $.getJSON (url, function(data) {
			viewerRefresh (e);
  })
  .error(function() {alert("error: content not loaded (" + url + ")");});
}


function e10ViewerPrintDetail (e)
{
	var table = searchParentAttr (e, "data-table");
	var pk = searchParentAttr (e, "data-pk");

	var url = httpApiRootPath + "/api/formreport/" + table + "/html/" + pk;
	window.open (url, "test", "location=no,status=no,resizable");
}


function e10AppendFormRow (button, event)
{
	var table = searchParentAttr (button, "data-table");
	var list = button.attr ('data-list');
	var pk = searchParentAttr (button, "data-pk");
	var rowNumber = button.attr ('data-row');
	
	var rows = button.parent().parent();
	
	//var url = httpApiRootPath + "/api/form/" + table + "/listappend/" + list + "?callback=?&rowNumber=" + rowNumber;
	
	var url = httpApiRootPath + "/api/list/" + table + '/' + list + '/append/' + pk  + "?callback=?&rowNumber=" + rowNumber;
	
	var jqxhr = $.getJSON (url, function(data) {
			//alert (JSON.stringify (data));
			rows.find ("li:last-child").remove ();
			rows.find ("li:last-child").after (data.object.htmlContent);
			e10DecorateFormWidgets (rows);
  }).error(function() {alert("error: content not loaded (" + url + ")");});
}

function e10SaveOnChange (input, event)
{
  var id = "mainEditForm"; //srcEl.attr ("data-elid");

	var e = $("#" + id);
	var codeTarget = e.parent().parent();
  //var formElement = document.getElementById (id);
  var formData = df2collectEditFormData (e, $.myFormsData [id]);
  var jsonData = JSON.stringify (formData);
	
	// alert (JSON.stringify ($.myFormsData [id]));
	//alert (jsonData); return;
	
	var table = e.attr ("data-table");
	
	var url = httpApiRootPath + "/api/form/" + table + "/save?callback=?";
  // alert (formPostData);

	var jqxhr = $.postJSON (url, jsonData, function(data) {
	    //alert (JSON.stringify (data));
			codeTarget.html (data.mainCode);
			df2FormsSetData ("mainEditForm", data);
			e10DecorateFormWidgets ($("#" + 'mainEditForm'));
  })
  .error(function() {alert("error: content not loaded (" + url + ")");});
}

function e10DecorateFormWidgets (e)
{
	e.find ("ul.e10-form-tabs").each (function () {initTabs ($(this).attr ("id"))});

  e.find ("input.e10-inputDate").datepicker ();
	e.find ("select.e10-inputEnumMultiple").each (function () { $(this).chosen();});
  e.find ("select.e10-inputReference").each (function () { $(this).chosen();});
}

function e10ViewerCreateEditForm (e, data)
{
	var viewerId = searchObjectId (e, 'viewer');
	
  var detail = $('#' + viewerId + 'Details');
	var detailContent = detail.find ('div.e10-mv-ld-content')
	var detailToolbar = detail.find ('div.e10-mv-ld-tlbr');
	var viewerDetailListTabs		= detail.find ('div.e10-mv-ld-tabs');

	detailContent.addClass ('e10-mv-ld-content-detail');
	detailContent.removeClass ('e10-mv-ld-content-navigation');
	
	viewerDetailListTabs.hide ();

	//$("#mainListViewDetailsHeader").find("*:first").remove();
	//$("#mainListViewDetailsHeader").html (data.headerCode);
	
	detailContent.html (data.mainCode);
	detailToolbar.html (data.buttonsCode);


	df2FormsSetData ("mainEditForm", data);
		
	e10viewerLineDetail (viewerId, true);
	viewerRefreshLayoutListDetail (detail);

/*
  $("#" + 'mainEditForm' + " input.e10-inputDate").datepicker ();
	$("#" + 'mainEditForm' + " select.e10-inputEnumMultiple").each (function () { $(this).chosen();		});
  $("#" + 'mainEditForm' + " select.e10-inputReference").each (function () { $(this).chosen();		});
*/
	e10DecorateFormWidgets ($("#" + 'mainEditForm'));
	
	viewerRefreshLayoutListDetail (detail);

	$("#mainEditForm input").first().focus();
} // e10ViewerCreateEditForm


function showDocLink (e)
{
  g_formId++;
  
  var newFormId = "nejakyForm" + g_formId;
  var url = e.attr ("data-apipath") + "?pagePart=1&callback=?&formId=" + newFormId;
  var otherParams = e.attr ("data-params");
  if (otherParams)
    url = url + "&" + otherParams;

  var addParams = e.parent().parent().parent().attr ("data-addparams");
  if (addParams)
    url = url + "&" + addParams;
  
  var sx = ($(window).width() / 10 * 9) | 0 + "px";
  var sy = ($(window).height() / 10 * 9) | 0 + "px";
  var titleDlg = "Dokument";
  
  var jqxhr = $.getJSON(url, function(data) {
    df2CreateDialog (newFormId, data.editDlgCode);
    
    /*
	    var dialog = $('<div id="div_' + newFormId + '"></div>').html(data.editDlgCode).dialog ({modal: true, 
		width: sx,
		height: sy,
		draggable: true, resizable: false,
		close: function (event, ui) {$(this).dialog ("destroy").empty ();}
		});*/
	    df2FormsInit (newFormId, data);
  })    
  .error(function() {alert("error: content not loaded (" + url + ")");});
}

function df2ViewerDoClick (event, e)
{
  var action = e.attr ("data-action");
  if (action == 'edit')
  {
    if (event.which == 1)
    {
      event.stopPropagation();
      event.preventDefault();
      showDocLink (e); 
      return true;
    }
    return false;
  }

  if (action == 'new')
  {
      event.stopPropagation();
      event.preventDefault();
    showDocLink (e); 
    return true;
  }

  if (action == 'save')
  {
      event.stopPropagation();
      event.preventDefault();
    df2saveForm (e); 
    return true;
  }

  if (action == 'action')
  {
      event.stopPropagation();
      event.preventDefault();
    df2ViewerRunActionBegin (e); 
    return true;
  }

  var apiPath = e.attr ("data-apipath");
  alert ("do-click: " + e.text() + ", action=" + action + ", apipath=" + apiPath);
} // df2ViewerDoClick


function df2saveForm (srcEl, successFunction)
{
  var id = "mainEditForm"; //srcEl.attr ("data-elid");

	var e = $("#" + id);

  //var formElement = document.getElementById (id);
  var formData = df2collectEditFormData (e, $.myFormsData [id]);
  var jsonData = JSON.stringify (formData);
	
	// alert (JSON.stringify ($.myFormsData [id]));
	//alert (jsonData); return;
	
	var table = e.attr ("data-table");
	
	var url = httpApiRootPath + "/api/form/" + table + "/save?callback=?";
  // alert (formPostData);

	var jqxhr = $.postJSON (url, jsonData, function(data) {
	    //alert (JSON.stringify (data));
		if (successFunction)
			successFunction (e, data.recData ['ndx'])
		else
			viewerRefresh (e, data.recData ['ndx']);
	    //initForm (newFormId, data);
  })    
  .error(function() {alert("error: content not loaded (" + url + ")");});
}


function df2collectEditFormData (form, data)
{
	var newData = {};
  var usedInputs = new Array ();
	var thisInputValue = null;
	
  var formElements = form.find (':input');
  for (var i = 0; i < formElements.length; i++)
  {
    var thisInput = $(formElements [i]);
		if (!thisInput.attr ("name"))
			continue;

    var thisInputName = thisInput.attr ('name');

		var dataMainPart = 'recData';
		var dataSubPart = null;
		var dataRowPart = null;
		var dataColumnPart = null;
		
		var nameParts = thisInputName.split ('.');
		if (nameParts.length == 1)
			dataColumnPart = thisInputName;
		else
		if (nameParts.length == 2)
		{
			dataMainPart = nameParts [0];
			dataColumnPart = nameParts [1];
		}
		else
		if (nameParts.length == 4)
		{
			dataMainPart = nameParts [0];
			dataSubPart = nameParts [1];
			dataRowPart = nameParts [2];
			dataColumnPart = nameParts [3];
		}

		thisInputValue = null;

    if (thisInput.hasClass ("e10-inputLogical"))
    {
			if (thisInput.attr ('value') == 'Y')
			{
				if (thisInput.is (':checked'))
					thisInputValue = 'Y';
				else
					thisInputValue = 'N';
			}
			else
			{
				if (thisInput.is (':checked'))
					thisInputValue = 1;
				else
					thisInputValue = 0;
			}
    }
		else
    if (thisInput.hasClass ("e10-inputRadio"))
    {
			if (thisInput.is(':checked'))
				thisInputValue = thisInput.attr ('value');
			else
				continue;
    }
		else
		if (thisInput.hasClass ("e10-inputDate"))
		{
			if (thisInput.val () != '')
			{
				var dp = thisInput.val ().split (".");
				thisInputValue = dp [2] + "-" + dp [1] + "-" + dp [0];
			}
			else
				thisInputValue = '0000-00-00';
		}
		else
		if (thisInput.hasClass ("e10-inputMoney"))
		{
			if (thisInput.val () != '')
			{
				var sv = thisInput.val ();
				sv = sv.replace (",", ".");
				thisInputValue = parseFloat (sv);
			}
			else
				thisInputValue = 0.0;
		}
		else
		if (thisInput.hasClass ("e10-inputEnum"))
		{
			if (thisInput.hasClass ("e10-inputEnumMultiple"))
			{
				if (thisInput.val ())
					thisInputValue = thisInput.val ().join ('.');
				else
					thisInputValue = '';
			}
			else
				thisInputValue = thisInput.val ();
		}
		else
			thisInputValue = thisInput.val ();
		
		if (thisInputValue === null)
			continue;

		if (!newData [dataMainPart])
			newData [dataMainPart] = {};

		if (dataMainPart == 'recData')
		{
			newData [dataMainPart][dataColumnPart] = thisInputValue;
	    usedInputs.push (dataColumnPart);
		}
		else
		{
			if (nameParts.length == 2)
			{
				if (!newData [dataMainPart][dataColumnPart])
					newData [dataMainPart][dataColumnPart] = {};
				newData [dataMainPart][dataColumnPart] = thisInputValue;
			}
			else
			{
				if (!newData [dataMainPart][dataSubPart])
					newData [dataMainPart][dataSubPart] = {};
				if (!newData [dataMainPart][dataSubPart][dataRowPart])
					newData [dataMainPart][dataSubPart][dataRowPart] = {};
				newData [dataMainPart][dataSubPart][dataRowPart][dataColumnPart] = thisInputValue;
			}
		}
  }

	//alert (JSON.stringify (newData.recData));

  for (var colName in data.recData)
  {
    if (usedInputs.indexOf (colName) == -1)
		{
			if ((data.recData [colName] != null) && (data.recData [colName].date))
				newData.recData [colName] = data.recData [colName].date.substring (0, 10);
			else
				newData.recData [colName] = data.recData [colName];
		}
  }

	newData ["documentPhase"] = data.documentPhase;
	
//	alert ("getData2: " + JSON.stringify (newData.recData));
	
	return newData;
} // df2collectEditFormData

// ---------
// tabWidget
// ---------

function initTabs (id)
{
	
  /*var barCode = "";
  $("#" + id + " >div").each (function () { 
			      var tabId = $(this).attr ("id");
			      barCode = barCode + "<li class='df2-frmTab' data-pageid='" + tabId + "'>" + 
					$(this).attr ("data-page-label") + "</li>";
  });
  $("#" + id + "-bar").html (barCode);
  $("#" + id + "-bar >li").first().addClass ("left active");*/

  $("#" + id + " >li").each (function () { 
		
			      var tabId = $(this).attr ("id");
						//alert (tabId);
						var tabContentId = tabId + '-tc';
						if ($(this).hasClass ('active'))
							$('#' + tabContentId).show ();
						else
							$('#' + tabContentId).hide ();
  });

}


// -------
// actions
// -------

function df2ViewerRunActionBegin (e)
{
  g_formId++;
  
  var newFormId = "nejakyForm" + g_formId;
  
  var apiPath = e.attr ("data-apipath");
  var url = apiPath + "/begin.json?callback=?&formId=" + newFormId;

  var otherParams = e.attr ("data-params");
  if (otherParams)
    url = url + "&" + otherParams;
  
  var titleDlg = "Akce";
  
  var jqxhr = $.getJSON(url, function(data) {
	    df2CreateDialog (newFormId, data.formCode);
	    $("#" + newFormId).attr ("data-params", otherParams);
	    
	    $("#" + "modalDlgContent").delegate ("a.df2-do-click", "click", function(event) {
	      df2DoActionClick (event, $(this));
	    });

  })    
  .error(function() {alert("error: content not loaded (" + url + ")");});
} // df2ViewerRunActionBegin


function df2runActionRun (e)
{
  var id = e.attr ("data-elid");

  var formElement = document.getElementById (id);
  var formPostData = df2collectFormData (formElement);
  var otherParams = formElement.getAttribute ("data-params");
  
  var url = e.attr ("data-apipath");
  url += "/run.json?callback=?";
  if (otherParams)
    url = url + "&" + otherParams;

  $("#" + id).fadeTo (50, .3);

    var jqxhr = $.postJSON(url, formPostData, function(data) {
	  //alert (data.formCode);
	  df2runActionClose (id);
	  viewerRefresh (e, data.newDocPK);
    }).error(function() {alert("error: content not loaded (" + url + ")");});
} // df2runActionRun


function df2runActionClose (id)
{
    $("#" + id).parent().remove ();
    $("#modalDlg").remove ();
}


function df2DoActionClick (event, e)
{
  var action = e.attr ("data-action");
  if (action == 'cancel')
  {
    event.stopPropagation();
    event.preventDefault();
    var id = e.attr ("data-elid");
    df2runActionClose (id);
    return true;
  }

  if (action == 'action-run')
  {
    event.stopPropagation();
    event.preventDefault();
    df2runActionRun (e);
    return true;
  }

  var apiPath = e.attr ("data-apipath");
  alert ("do-click: " + e.text() + ", action=" + action + ", apipath=" + apiPath);
}

// -----
// forms
// -----

$.myFormsData = {};


function df2FormsInit (id, data)
{
  //var $formElement = $("#" + id);
  //$.myFormsData [id] = $.extend ({}, data);
 
  $("#" + id + " ul.e10-form-tabs").each (function () {initTabs ($(this).attr ("id"))});
  $("#" + id + " .df2-inputDate").datepicker ();
  
  df2FormsSetData (id, data);
  
  /*
  $("#" + id + " a.df2-toolbarButtonWithMenu").click (
    function ()
    {
      buttonMenu ($(this), $(this).attr ("id") + "-menu");
    }
  );
  */

  $("#modalDlgContent"/* + id*/).delegate ("a.df2-do-click", "click", function(event) {
    df2FormsDoClick (event, $(this));
  });
  
  $("#modalDlgContent").delegate ("li.df2-frmTab", "click", function(event) {
    df2FormsTabClick ($(this));
  });
  
} // df2FormsInit


function df2FormsSetData (id, data)
{
  var $formElement = $("#" + id);
  $.myFormsData [id] = $.extend ({}, data);
 
  $('#' + id + ' :input').each (
    function () 
    {
			var thisInput = $(this);
			if (!thisInput.attr ("name"))
				return;
			var thisInputName = thisInput.attr ("name");
			
			var dataMainPart = 'recData';
			var dataSubPart = null;
			var dataRowPart = null;
			var dataColumnPart = null;

			var nameParts = thisInputName.split ('.');
			if (nameParts.length == 1)
				dataColumnPart = thisInputName;
			else
			if (nameParts.length == 2)
			{
				dataMainPart = nameParts [0];
				dataColumnPart = nameParts [1];
			}
			else
			if (nameParts.length == 3)
			{
				dataMainPart = nameParts [0];
				dataSubPart = nameParts [1];
				dataColumnPart = nameParts [2];
			}
			else
			if (nameParts.length == 4)
			{
				dataMainPart = nameParts [0];
				dataSubPart = nameParts [1];
				dataRowPart = nameParts [2];
				dataColumnPart = nameParts [3];
			}
			
			var thisInputValue = null;
			if (dataMainPart == 'recData')
				thisInputValue = data [dataMainPart][dataColumnPart];
			else
			if (nameParts.length == 2)
				thisInputValue = data [dataMainPart][dataColumnPart];
			else
			if (nameParts.length == 3)				
				thisInputValue = data [dataMainPart][dataSubPart][dataColumnPart];
			else
			{
				if ((data [dataMainPart][dataSubPart] != undefined) && (data [dataMainPart][dataSubPart][dataRowPart] != undefined) && (data [dataMainPart][dataSubPart][dataRowPart][dataColumnPart] != undefined))
					thisInputValue = data [dataMainPart][dataSubPart][dataRowPart][dataColumnPart];
			}
			
      if (thisInput.hasClass ("e10-inputLogical"))
      {
				var checkIt = false;

				if (thisInput.val () == 'Y')
				{
					if (thisInputValue == 'Y')
						checkIt = true;
				}
				else
				if (thisInputValue)
					checkIt = true;

				if (checkIt)	
					thisInput.attr('checked', true);
				else
					thisInput.attr('checked', false);
      }
      else
      if (thisInput.hasClass ("e10-inputRadio"))
      {
				if (thisInput.attr ('value') == thisInputValue)
					thisInput.attr('checked', true);
      }
      else
      if (thisInput.hasClass ("e10-inputDate"))
      {
				if (thisInputValue)
				{
					var ds = thisInputValue.date.substring (0, 10);
					dp = ds.split ("-");
					thisInput.val (dp [2] + "." + dp [1] + "." + dp [0]);
				}
				else
					thisInput.val ("");
      }
      else
      if (thisInput.hasClass ("e10-inputEnum"))
      {
				if (thisInput.hasClass ("e10-inputEnumMultiple"))
				{
					if (thisInputValue)
						thisInput.val (thisInputValue.split('.'));
				}
				else
					thisInput.val (thisInputValue);
				thisInput.trigger("liszt:updated");
			}
      else
				thisInput.val (thisInputValue);
    }
  );
  //df2FormsRefreshInfoTexts (id);
} // df2FormsSetData


function df2runFormClose (id)
{
  $("#" + id).parent().remove ();
  $("#modalDlg").remove ();
}

function e10FormsTabClick (e)
{
  var pageid = e.attr ("id");
    //alert (pageid);

  if (pageid)
  {
    var activeTab = e.parent().find ("li.active").first();
    activeTab.removeClass ("active");
    
    $("#" + activeTab.attr ('id') + '-tc').hide();
    
    e.addClass ("active");
    $("#" + pageid + '-tc').show();
		e10doSizeHints ($("#" + pageid + '-tc'));
    return true;
  }
  
  return false;
}


function df2FormsDoClick (event, e)
{
  var action = e.attr ("data-action");
  if (action == 'cancel')
  {
    event.stopPropagation();event.preventDefault();
    var id = e.attr ("data-elid");
    df2runFormClose (id); 
    return true;
  }

  if (action == 'save')
  {
    event.stopPropagation();
    event.preventDefault();
    df2saveForm (e); 
    return true;
  }

/*
  if (action == 'action')
  {
      event.stopPropagation();
      event.preventDefault();
    df2runActionBegin (e); 
    return true;
  }
*/
  var apiPath = e.attr ("data-apipath");
  alert ("do-click: " + e.text() + ", action=" + action + ", apipath=" + apiPath);
}


function df2FormsRefreshInfoTexts (id)
{
  var thisForm = $("#" + id);
  var docPath = thisForm.attr ("data-docpath");
  $("#" + id + " div.df2-formInfoText").each (
    function () 
    {
      var widgetRole = $(this).attr ("data-widgetRole");

      if (widgetRole)
      {
	var url = "/api/parts/" + widgetRole + "/" + docPath + "?pagePart=1";
	//$(this).load (url);
	var infoTextElement = $(this);
	var jqxhr = $.getJSON(url, function(data) {
	    infoTextElement.html (data.mainCode);
	    })
	    .error(function() {alert("error: content not loaded (" + url + ")");});
      }
    }
  );
}


// -------------
// reportBrowser
// -------------


function initReportBrowser (id)
{
  var refreshBtn = $("#" + id + " " + "#" + id + "ToolbarButtonRefresh");
  refreshBtn.click (function (event) {reloadReportBrowser (id);});
  refreshBtn.html ("<img src='/share/styles/default/icons/16x16/control_play_blue.png'/> Zobrazit");
  
  reloadReportBrowser (id);
}

function reloadReportBrowser (id)
{
  var e = $("#" + id);
  var reportId = e.attr ("data-report");
  var reportTable = e.attr ("data-table");
  var url = "/api/report/" + reportTable + "/" + reportId + ".html?pagePart=1";
  
  var c = $("#" + id + "Content");
  
  var form = document.getElementById (id + 'ToolbarForm');
  var formPostData = df2collectFormData (form);
  c.fadeTo (20, 0.4);
  c.load (url, formPostData, function () {$(this).fadeTo (1, 1.0)});

  var refreshBtn = $("#" + id + " " + "#" + id + "ToolbarButtonRefresh");
  refreshBtn.html ("<img src='/share/styles/default/icons/16x16/arrow_refresh.png'/> Obnovit");
}


// -------------
// forms support
// -------------


function df2collectFormData (form)
{ // DEPRECATED
  var frmData = "frmId=myForm";

	var formElements = form.find ('input');
  for (var i = 0; i < formElements.length; i++)
  {
    var element = formElements [i];
    var type = element.type;
    if (type == "checkbox" || type == "radio")
    {
      if (element.checked)
      {
	frmData += "&" + element.name + "=" + encodeURI (element.value);
      }
	continue;
    }
    frmData += "&" + element.name + "=" + encodeURI (element.value);
  }
	formElements = form.find ('select');
  for (var i = 0; i < formElements.length; i++)
  {
    var element = formElements [i];
    frmData += "&" + element.name + "=" + encodeURI (element.value);
  }

	formElements = form.find ('textarea');
  for (i = 0; i < formElements.length; i++)
  {
    var element = formElements [i];
    frmData += "&" + element.name + "=" + encodeURI (element.value);
  }

  return frmData;
} // df2collectFormData


function df2FillViewerLines (viewerId, url, focusPK)
{
	g_inIncSearch++;
	var viewer = $('#' + viewerId);
	var form = viewer.find ('div.e10-sv-body');
  if (form)
  {
    var formPostData = df2collectFormData (form);
    var jqxhr = $.postJSON(url, formPostData, function(data) {
	    var viewerLines = $('#' + viewerId + 'Items');
			//var name = $("#mainListViewLabelHeaderCell >div");
			//var footer = $("#mainListViewLabelFooterCell >div");
			
	    viewerLines.fadeTo (10, 1.0);
	    viewerLines.html (data.object.htmlItems);
			viewerLines.scrollTop (0);
			 /*if (data.name)
	      name.html (data.name);
	    else
	      name.html ("");*/
	    /*if (data.footerCode)
	      footer.html (data.footerCode);
	    else
	      footer.html ("");*/

			if ((focusPK) && (focusPK != ""))
				df2viewerFocusPK (viewerId, focusPK);
			g_inIncSearch--;
    }).error(function() {alert("error TTTRRR: content not loaded (" + url + ")");});
  }
  else
  {
    var jqxhr = $.getJSON(url, function(data) {
	    var viewerLines = $('#' + viewerId + 'Items');
	    viewerLines.fadeTo (10, 1.0);
	    viewerLines.html (data.object.htmlItems);
			//alert ("focusPK: " + focusPK);
			if ((focusPK) && (focusPK != ""))
				df2viewerFocusPK (viewerId, focusPK);
			g_inIncSearch--;
    }).error(function() {alert("error: content not loaded (" + url + ")");});
  }
  return true;
}


/* attachments */

function e10AttWidgetSelect (srcElement, event)
{
	var fn = srcElement.attr ('data-fn');
	
	var thisInput = srcElement.parent().parent();
	
	//alert (thisInput.data ('testmmbr'));
	
	var grid = thisInput.find ("div.e10-att-input-grid");
	var detail = thisInput.find ("div.e10-att-input-detail");
	var upload = thisInput.find ("div.e10-att-input-upload");
	
	if (fn == '#')
	{
		detail.hide();
		upload.hide();
		grid.show();
	}
	else
	if (fn == '+')
	{
		detail.hide();
		grid.hide();
		upload.show();
	}
	else
	{
		var sx = detail.width () - 2;
		var sy = detail.height () - 2;
		var imgUrl = httpApiRootPath + "/imgs/-h" + sy + "/-w" + sx + "/att/" + fn;
		if (detail.html () == '')
			detail.html ("<img src='" + imgUrl + "'/>");
		else
		{
			var img = detail.find ('img');
			img.attr ('src', imgUrl);
		}
		if (detail.is (':hidden'))
		{
			detail.show();
			grid.hide();
			upload.hide();
		}
	}
}


function e10AttWidgetRefreshLayout (el)
{
	//alert ('e10AttWidgetRefreshLayout');
	var totalSizeY = el.height ();
	var menuSizeY = el.find ('div.e10-att-input-menu').height ();
	var sizeY = totalSizeY - menuSizeY - 1;
	var grid = el.find ('div.e10-att-input-grid');
	var detail = el.find ('div.e10-att-input-detail');
	var upload = el.find ('div.e10-att-input-upload');
	grid.height (sizeY);
	detail.height (sizeY);
	upload.height (sizeY);
	
	if (grid.is (':hidden') && detail.is (':hidden') && upload.is (':hidden'))
		grid.show ();
	
	//el.data ('testmmbr', "test 123");
	
}


function e10AttWidgetFileSelected (input) 
{
	var infoPanel = $(input).parent().find ('div.e10-att-input-files');
	
	var info = '<table>';
	for (var i = 0; i < input.files.length; i++)
	{
		var file = input.files[i];
    var fileSize = 0;
		if (file.size > 1024 * 1024)
			fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
		else
			fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';
		info += '<tr>' + '<td>' + file.name + "</td><td class='number'>" + fileSize + '</td><td>-</td></tr>';
	}
	info += '</table>';
	infoPanel.html (info);
}
			

function e10AttWidgetUploadFile (button) 
{
	var table = searchParentAttr (button, 'data-table');
	var pk = searchParentAttr (button, 'data-pk');
	
	var infoPanel = button.parent().parent().find ('div.e10-att-input-files');
	var input = button.parent().parent().find ('input:first').get(0);
	infoPanel.attr ('data-fip', input.files.length);
	for (var i = 0; i < input.files.length; i++)
	{
		var file = input.files[i];
		var url = httpApiRootPath + "/upload/e10.base.attachments/" + table + '/' + pk + '/' + file.name;
		e10AttWidgetUploadOneFile (url, file, infoPanel, i);
 	}	
}


function e10AttWidgetUploadOneFile (url, file, infoPanel, idx)
{
	var xhr = new XMLHttpRequest();
	xhr.upload.addEventListener ("progress", function (e) {e10AttWidgetUploadProgress (e, infoPanel, idx);}, false);
	//xhr.upload.addEventListener ("load", function (e) {e10AttWidgetUploadDone (e, infoPanel, idx);}, false);
	xhr.onload = function (e) {e10AttWidgetUploadDone (e, infoPanel, idx);};
	xhr.open ("POST", url);
	xhr.setRequestHeader ("Cache-Control", "no-cache");  
	xhr.setRequestHeader ("Content-Type", "application/octet-stream");
	xhr.send(file);  

	/*
req.upload.addEventListener("progress", updateProgress, false);  
req.upload.addEventListener("load", transferComplete, false);  
req.upload.addEventListener("error", transferFailed, false);  
req.upload.addEventListener("abort", transferCanceled, false);  
	*/	

}

function e10AttWidgetUploadDone (e, infoPanel, idx) 
{
	var cell = infoPanel.find ('table tr:eq('+idx+') td:eq(2)');
	cell.css ({"background-color": "green"});
	var fip = parseInt (infoPanel.attr ('data-fip')) - 1;
	infoPanel.attr ('data-fip', fip);
	
	if (fip == 0)
	{
		//alert ('done!');
		// -- reload widget
		e10AttWidgetReload (infoPanel);
	}
}

function e10AttWidgetReload (e) 
{
	var thisInput = searchObjectAttr (e, 'data-table');
	var table = searchParentAttr (e, 'data-table');
	var pk = searchParentAttr (e, 'data-pk');
	// api/list/table/attachments/widget/1234
	var url = httpApiRootPath + "/api/list/" + table + '/attachments/widget/' + pk;
	//alert (url);
	var jqxhr = $.getJSON (url, function(data) {
		//alert (data.object.htmlContent);
		thisInput.html (data.object.htmlContent);
		e10AttWidgetRefreshLayout (thisInput);
  }).error(function() {alert("error: content not loaded (" + url + ")");});
	
}


function e10AttWidgetUploadProgress (e, infoPanel, idx) 
{
	if (e.lengthComputable) 
	{
		var percentage = Math.round((e.loaded * 100) / e.total);
		var cell = infoPanel.find ('table tr:eq('+idx+') td:eq(2)');
		cell.text (percentage + ' % ');
	}
}

/* rows */

function e10RowsEditRefreshLayout (el)
{
	//alert ('e10AttWidgetRefreshLayout');
	var totalSizeY = el.height ();
	//var menuSizeY = el.find ('div.e10-att-input-menu').height ();
	var sizeY = totalSizeY /*- menuSizeY*/ - 2;
	var grid = el.find ('>ul');
	grid.height (sizeY);
}


/*******************************/





