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 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 = window.innerHeight - 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))
		{
			hook ["func"].call (e);
			//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));
	});
	
	$(window).resize(function() {mainBrowserRefreshLayout ("mainBrowser")});
	var firstItem = $("#mainListViewMenu li:first div.df2-menu-item-t1");
	menuItemClick (firstItem);
}


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


// -----
// 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));
		});

		e10ViewerDelegatesDone = true;
	}

  viewerRefreshLayout (id);
}


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-body 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 = viewerLinesToolbar.height ();

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

	viewerLinesList.height (contentY);

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

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

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

	if (viewerId != "mini")
	{
		viewerDetailList.css ({position: 'absolute', left: linesSizeX + viewerLinesContainer.position().left - detailSizeX, top: viewer.position().top + 20});
		viewerDetailReport.css ({position: 'absolute', left: linesSizeX + viewerLinesContainer.position().left, top: viewer.position().top});
		viewerDetailReport.show ();
	}
} // 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 - 6 -
											viewerDetailListTitle.height () - 
											viewerDetailListHeader.height () - 
											viewerDetailListTabs.height ();

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

	viewerDetailListContent.height (contentSizeY);

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


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 .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 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);
} // 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 docPK = listItem.attr ("data-pk");
	var urlPath = e10viewerNavPath (viewer, tableName, docPK, listItem);
	urlPath += '&fullCode=1';
	
	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');
			}
			//viewerRefreshLayoutListDetail (detailContent);
			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 == "close-lv-detail")
	{
		e10viewerCloseDetail (e);
		return;
	}

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

	alert ("action: " + actionType);
}

function e10ViewerAddRow (e)
{
	var table = searchParentAttr (e, "data-table");
	var addParams = searchParentAttr (e, "data-addparams");

	var fullTextSearch = e.parent().parent().find ("input").first().val ();

	var url = httpApiRootPath + "/api/form/" + table + "/new/?callback=?&fullTextSearch=" + fullTextSearch;
	if (addParams)
		url += '&' + addParams;
	//alert (url);
	//var browserContent = $("#mainBrowserContent");
	
  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));	
			e10ViewerCreateEditForm (e, data);
  }).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/report/" + table + "/html/" + pk;
	window.open (url, "test", "location=no,status=no,resizable");
}


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');

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

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

  $("#" + 'mainEditForm' + " input.e10-inputDate").datepicker ();


	df2FormsSetData ("mainEditForm", data);
		
	e10viewerLineDetail (viewerId, true);
	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 (e)
{
  var id = "mainEditForm"; //e.attr ("data-elid");

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

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


function df2collectEditFormData (form, data)
{
	var recData = {};
  var usedInputs = new Array ();
  
  var formElements = form.getElementsByTagName ('input');
  for (var i = 0; i < formElements.length; i++)
  {
    var element = formElements [i];
    var fieldName = element.name;
    var type = element.type;
    if (type == "checkbox" || type == "radio")
    {
			if (element.value == 'Y')
			{
				if (element.checked)
					recData [fieldName] = 'Y';
				else
					recData [fieldName] = 'N';
			}
			else
			{
				if (element.checked)
					recData [fieldName] = 1;
				else
					recData [fieldName] = 0;
			}
      usedInputs.push (fieldName);
      continue;
    }
		if (element.className.match(new RegExp('(\\s|^)e10-inputDate(\\s|$)')))
		{
			if (element.value != '')
			{
				var dp = element.value.split (".");
				recData [fieldName] = dp [2] + "-" + dp [1] + "-" + dp [0];
			}
			else
				recData [fieldName] = null;
			usedInputs.push (fieldName);
			continue;
		}
    recData [fieldName] = element.value;
    usedInputs.push (fieldName);
  }
  var formElements = form.getElementsByTagName ('select');
  for (var i = 0; i < formElements.length; i++)
  {
    var element = formElements [i];
    var fieldName = element.name;
		recData [fieldName] = element.value;
    usedInputs.push (fieldName);
  }

  formElements = form.getElementsByTagName ('textarea');
  for (var i = 0; i < formElements.length; i++)
  {
    var element = formElements [i];
    var fieldName = element.name;
		recData [fieldName] = element.value;
    usedInputs.push (fieldName);
  }

  for(var colName in data.recData)
  {
    if (usedInputs.indexOf (colName) == -1)
			recData [colName] = data.recData [colName];
  }

	var frmData = {"documentPhase": data.documentPhase, "recData": recData};
	return JSON.stringify (frmData);
} // 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");
						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 + " div.df2-frmTabs").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);
 
 //alert ("setData: " + JSON.stringify (data));
 
  $('#' + id + ' :input').each (
    function () 
    {
			var thisInput = $(this);
      if (thisInput.hasClass ("e10-inputLogical"))
      {
				var checkIt = false;

				if (thisInput.val () == 'Y')
				{
					if (data.recData [thisInput.attr ("name")] == 'Y')
						checkIt = true;
				}
				else
				if (data.recData [thisInput.attr ("name")])
					checkIt = true;

				if (checkIt)	
					thisInput.attr('checked', true);
				else
					thisInput.attr('checked', false);
      }
      else
      if (thisInput.hasClass ("e10-inputRadio"))
      {
				var checkIt = false;
				if (thisInput.val () == data.recData [thisInput.attr ("name")])
					checkIt = true;
				if (checkIt)	
					thisInput.attr('checked', true);
				else
					thisInput.attr('checked', false);
      }
      else
      if (thisInput.hasClass ("e10-inputDate"))
      {
				if (data.recData [thisInput.attr ("name")])
				{
					var ds = data.recData [thisInput.attr ("name")].date.substring (0, 10)
					dp = ds.split ("-");
					thisInput.val (dp [2] + "." + dp [1] + "." + dp [0]);
				}
				else
					thisInput.val ("");
      }
      else
				thisInput.val (data.recData [thisInput.attr ("name")]);
    }
  );
  //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();
    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)
{
  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;
}






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





