jQuery.ajaxSettings.traditional=true;

function wwwAlert(message) {
	alert(message);
}
function wwwOpen(url) {
	window.open(url);
	return false;
}
function wwwDialog(url) {
	window.open(url,"DIALOG", "width=900,height=500,scrollbars=yes,resizable=yes");
	return false;
}
function genPass() {
	var chars1 = "qwrtpsdfghjkzxcvbnm";
	var chars2 = "aeiouy";
	var result="";
	result = result + chars1.charAt(Math.random()*chars1.length);
	result = result + chars2.charAt(Math.random()*chars2.length);
	result = result + chars1.charAt(Math.random()*chars1.length);
	result = result + chars2.charAt(Math.random()*chars2.length);
	result = result + chars1.charAt(Math.random()*chars1.length);
	result = result + chars2.charAt(Math.random()*chars2.length);
	result = result + chars1.charAt(Math.random()*chars1.length);
	return result;
}
var typing = 0;
var willCheck = false;
var pickerUrl;
var search;
function smartSearch(psearch, purl) {
	if (search != psearch) {
		search = psearch;
		typing = new Date().getTime();
		if (!willCheck) {
			willCheck = true;
			setTimeout("checkSearch()", 200);
		}
	}
}
/* na ukazku?
function checkSearch() {
	if (new Date().getTime()-typing > 300) {
		willCheck = false;
		$('#suppliers-picker-listing').load(root+"/supplier/smart.action?search="+encodeURIComponent(search)+"&url="+encodeURIComponent(pickerUrl));
	} else {
		setTimeout("checkSearch()", 200);
	}
}
function showPicker() {
	$('#suppliers-picker-listing').load(root+"/supplier/smart.action?url="+encodeURIComponent(pickerUrl));
	$('#suppliers-picker-listing').show(500);
}
*/

function decorateTables(parent) {
    if (parent) {
        parent.find("table:not(.dont-decorate) > tr:even, table:not(.dont-decorate) > tbody > tr:even").addClass("even");
        parent.find("table:not(.dont-decorate) > tr:odd, table:not(.dont-decorate) > tbody > tr:odd").removeClass("even");
        parent.find("table:not(.dont-decorate) > tr, table:not(.dont-decorate) > tbody > tr, .mouse, button").mouseover(function(){ $(this).addClass("highlighted");});
        parent.find("table:not(.dont-decorate) > tr, table:not(.dont-decorate) > tbody > tr, .mouse, button").mouseout(function(){ $(this).removeClass("highlighted");});
    }
    else {
        $("table:not(.dont-decorate) > tr:even, table:not(.dont-decorate) > tbody > tr:even").addClass("even");
        $("table:not(.dont-decorate) > tr:odd, table:not(.dont-decorate) > tbody > tr:odd").removeClass("even");
        $("table:not(.dont-decorate) > tr, table:not(.dont-decorate) > tbody > tr, .mouse, button").live('mouseover', function(){ $(this).addClass("highlighted");});
        $("table:not(.dont-decorate) > tr, table:not(.dont-decorate) > tbody > tr, .mouse, button").live('mouseout', function(){ $(this).removeClass("highlighted");});
    }
}
function placeDetail() {
	var utilDetail = $('#util-detail');
	var wH = $(window).height();
	var wST = $(window).scrollTop();
	var dH = $(document).height();
	var uH = utilDetail.height() + 50;
	var pT = utilDetail.parent().offset().top;
	var freeH = wH - pT - uH;
	var uT;
	if (freeH >= 0) {
		uT = wST - pT;
		if (uT < 0) uT = 0;
	}
	else {
		//toto prilis nefunguje, takze ak je to vyssie ako okno, neposuvame
		uT = 0;
		//uT = wST + (freeH - pT) * (wST / dH );
	}
	utilDetail.css('top', parseInt(uT, 10) +"px");
}
function showDetail(url, params, source, callback, noHideUtil) {
	params['ajax']=true;
	$(".selected").removeClass("selected");
    var utilVisible = $('.visible-util');
    var utilDetail = $('#util-detail');
    utilVisible.hide();
    utilVisible.removeClass("visible-util");
    utilVisible.removeClass("floating-box");
    $(source).addClass("selected");
    $(".selected td:last").addClass("selected");

    utilDetail.load(url, params, function () {
        decorateTables();
        if (noHideUtil) {
            utilVisible.show();
            utilVisible.addClass("visible-util");
        }
    	var w = $('#util-wrapper').width() - 20;
       	utilDetail.addClass("floating-box").css('width', w + 'px').show(150, function() {
       		$(window).scroll(placeDetail);
       		$(window).resize(placeDetail);
       		placeDetail();
		       
		    tb_init('#util-detail a.thickbox');

       		if (callback) callback(params)

/*
        toto uz robi jQuery automaticky cez live
       		$("a.delete").click(function (e) {
            	if (confirmDelete()) {
            		//disablovani tlacitka
            		$(this).unbind("click");
            		$(this).click(function (e) {return false});
            		return true;
            	} else {
            		return false;
            	}
        	});
*/
       	});
        utilDetail.addClass("visible-util");
    });
}
function separateIdFromClasses(classes, prefix, separator) {
    if (classes == null || prefix == null) return null;
    classes = classes.split(/ +/);
    for (var i in classes) {
        if (classes[i].indexOf(prefix) == 0) {
            return separateId(classes[i], separator);
        }
    }
    return null;
}
function separateId(text, separator) {
    if (separator == null) separator = '-';
    if (text == null || text == '') return null;
    var position = text.lastIndexOf(separator);
    if (position == -1) return null;
    return text.substring(position + 1, text.length);
}
function tabCtrlShow(pageId) {
	var page  = $("#" + pageId);
	var label = $("#tabLabel-" + pageId);
	label.siblings(".tabLabel").removeClass("selected");
	label.addClass("selected");
	page.siblings(".tabPage").css("display", "none");
	page.css("display", "block");
}
$(function() {
	$("table:not(.dont-decorate) tr, .mouse").mouseover(
		function(){
			$(this).addClass("highlighted");
	}).mouseout(
		function(){
		$(this).removeClass("highlighted");
	});

	/*
	obsluha WYSIWYGu pro editaci textu v <div>ech
	*/
	
	var jWYSIWYG = false;
	
    /*
    ie 6 sends all buttons, even those which were not clicked. this changes the name of all buttons
    onload to _name, and changes it back only for the one, which user clicked (onclick event)
	 */
	if ($.browser.msie && $.browser.version < 7) {
	    //set all buttons name to _name
	    $("form .buttons button, form button").each(function () {
	        this.name = '_' + this.name;
	    });
	    //if user clicks then remove the leading '_' in name
	    $("form .buttons button, form button").click( function() {
	        if (this.name.indexOf('_') != -1) {
	            this.name = this.name.substring(1, this.name.length);
	        }
	    });
	}

	if (!isAndroid) $(".edit").dblclick(
		function() {
			if (!jWYSIWYG) {
				var tempHTML = $(this).html();
				$(this).html('<div class="buttons"><textarea id="wysiwyg" cols="20" rows="20"></textarea><button class="ok" id="wysiwygButton">uložit změny</button></div>');
				$("#wysiwyg").html(tempHTML).wysiwyg();
				jWYSIWYG = true;
			} else {
				alert("Nejdříve uložte práci v otevřeném editoru!");
			}
	        $("#wysiwygButton").click(
				function() {
					$.post(root+"/admin/updateHelp.action", {newContent: $("#wysiwyg").val(), id: helpTopic}, function (data) {
						$("#wysiwygButton").parent().parent().html($("#wysiwyg").val());
						jWYSIWYG = false;
					});
				}
			);
		}
	);

});
function trim(str) {
	if (typeof(str) == 'undefined') return '';
	return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}
function str2bigDecimal(str) {
    if (!str) return null;
	//posledna medzera je tvrda (160), nie 32
	try {
		return new BigDecimal(trim(str + '').replace(',', '.').replace(/(\s| )/g, ''));
	}
	catch (e) {
		return null;
	}
}
function bigDecimal2str(bd, scale) {
    if (!bd) return null;
	var str = bd.toString().replace('.', ',').replace(/(,.*?)0+$/, '$1').replace(/,$/, ',0');
	if (scale) {
        var i = str.indexOf(",");
        var sa = 0;
        if (i < 0) {
            str += ',';
        }
        else {
		    sa = str.length - i - 1;
        }
		while (scale > sa) { sa++; str += '0' }
	}
	return str;
}

/**
   umi encodovat obsah policka do url, tak aby se to dalo poslat napr. gettem 
 */
jQuery.fn.encodedVal = function() {
    if (!this.val()) return this.val();
    return encodeURIComponent(this.val());
};

jQuery.fn.isVisible = function() {
	if (this.is('body')) return true;
	if (!this.is(":visible")) return false;
	if (this.parent().size() == 0) return true;
	return this.parent().isVisible();
};

jQuery.fn.removeCalendar = function() {
    this.next('img.calendar-icon').remove();
    return this;
};

jQuery.fn.appendDateCalendar = function() {
    this.after("<img src=\"" + root + "/images/calendar.png\" alt=\"Calendar\" onclick=\"showCalendar(this, '%d. %m. %Y')\" class=\"calendar-icon\"/>");
    return this;
};

jQuery.fn.appendDateTimeCalendar = function() {
    this.after("<img src=\"" + root + "/images/calendar.png\" alt=\"Calendar\" onclick=\"showCalendarWithFormat(this, '%d. %m. %Y %H:%M')\" class=\"calendar-icon\"/>");
    return this;
};

var ma_ajaxRequests = {};

/* v pripade, ze predchadzajuce volanie s rovnakym ajaxId skonci neskor, ignoruje sa (nevola sa callback)
 */
function ajax(ajaxId, options) {
	if (! ma_ajaxRequests[ajaxId]) ma_ajaxRequests[ajaxId] = 0;
	var counter = ++ma_ajaxRequests[ajaxId];
	if (options['complete']) {
		var callbackComplete = options['complete'];
		options['complete'] = function(XMLHttpRequest, textStatus) {
			if (counter == ma_ajaxRequests[ajaxId]) callbackComplete(XMLHttpRequest, textStatus);
		};
	}
	if (options['success']) {
		var callbackSuccess = options['success'];
		options['success'] = function(data, textStatus) {
			if (counter == ma_ajaxRequests[ajaxId]) callbackSuccess(data, textStatus);
		};
	}
	if (options['error']) {
		var callbackError = options['error'];
		options['error'] = function(XMLHttpRequest, textStatus, errorThrown) {
			if (counter == ma_ajaxRequests[ajaxId]) callbackError(XMLHttpRequest, textStatus, errorThrown);
		};
	}
	$.ajax(options);
}

/* nahrada load, na rozdiel od neho v pripade ze poziadavok, ktory bol zavolany skor skonci az po dalsom poziadavku
 * nepreplacne novsi obsah starsim (a nezavola callback)
 * 
 * options: options pre ajax (timeout, cache)
 * callback: function(responseText, status, XMLHttpRequest)
 */
jQuery.fn.loadSafe = function(url, params, callback, options) {

	var this_obj = this.get(0);
	if (!this_obj) return;
	
	var self = this;
	
	var ajax_options = {
			url: url,
			data: params,
			type: 'GET',
			dataType: 'html',
			timeout: 15000
	};
	
	if (options) {
		for (var o in ['timeout', 'cache', 'type']) {
			if (typeof(options[o]) != 'undefined') 
				ajax_options[o] = options[o];
		}
	}
	
	if (typeof(this_obj.__ajax_counter) == 'undefined') this_obj.__ajax_counter = 0;
	var ajax_id = ++this_obj.__ajax_counter;
	
	ajax_options.complete = function(res, status) {
		if (ajax_id == this_obj.__ajax_counter) {
			if ( status == "success" || status == "notmodified" ) {
				self.html(res.responseText);
			}
			if (jQuery.isFunction(callback)) {
				self.each(callback, [res.responseText, status, res]);
			}
		}
	};
	
	$.ajax(ajax_options);
	
	return this;
};

(function($) {
	$.postdatas = function(options){
		var settings=$.extend({
			url:"",
			datas:[]
		}, options);

		var form = $("<form>");
		form.attr({
			action:settings.url,
			method:"POST"
		}).css({
			display:'none'
		});
		for(i=0;i<settings.datas.length;i++){
			$('<input type="hidden" name="'+settings.datas[i].name+'" value="'+settings.datas[i].value+'" />').appendTo(form);
		}
		form.appendTo('body');
		form.submit();
	};
})(jQuery);

function runIfConfirmed(msg, fn) {
    if (confirm(msg)) {
        fn();
    }
}
function escapeStringJs(s) {
	if (typeof(s) != 'string') return s;
	return s.replace(/(['"\\])/g, '\\$1').replace(/\n/g, '\\n').replace(/\r/g, '\\r');
}

function escapeStringHtml(s) {
	if (typeof(s) != 'string') return s;
	return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}

function unescapeStringHtml(s) {
	if (typeof(s) != 'string') return s;
	return s.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&amp;/g, '&');
}

function addToHref(el, param, content) {
    if (!el || !el.href) {
        return true;
    }
    var url = el.href;
    if (url.indexOf(param) != -1) {
        url = url.substr(0, url.indexOf(param));
    }
    if (url.indexOf('?') == -1) {
        url += '?';
    } else if (url.lastIndexOf('&') != url.length -1) {
        url += '&';
    }
    url += param + "=" + encodeURIComponent(content);
    return el.href = url;
}

var dataChanged = false;

function watchFormForChanges(el) {
	el = $(el);
	el.find('input, select, textarea').change(function(e) {
		dataChanged = true;
	});
	$('a').click(function(e) {
		if (dataChanged) {
			return confirm('Pozor, ve formuláři byly provedeny změny, které ještě nejsou uloženy.\nPokud budete pokračovat, neuložené změny budou ztraceny.\n\nOpravdu si přejete pokračovat a z obrazovky přejít jinam?');
		}
	})
}

function groupedCookie(cookie, value, expires) {
    var serializedCookies = $.cookie('groupedCookies');
    var cookies = {};
    var now = new Date().getTime();
    if (serializedCookies) {
        var parts = serializedCookies.split('<');
        for (var i in parts) {
            var cookie_parts = parts[i].split('>');
            var cookie_expires = unescapeStringHtml(cookie_parts[2]);
            if (cookie_parts.length != 3 || cookie_expires < now) continue;
            cookies[unescapeStringHtml(cookie_parts[0])] = [unescapeStringHtml(cookie_parts[1]), cookie_expires];
        }
    }
    if (typeof value != 'undefined') {
        if (!expires) expires = 1;
        cookies[cookie] = [value, now + expires * 24 * 60 * 60 * 1000];
        serializedCookies = '';
        for (var c in cookies) {
            var v = cookies[c];
            if (serializedCookies != '') serializedCookies += '<';
            serializedCookies += escapeStringHtml(c) + '>' + escapeStringHtml(v[0]) + '>' + escapeStringHtml(v[1]);
        }
        $.cookie('groupedCookies', serializedCookies, {expires: 31, path: '/', secure: false});
    }
    else {
        return cookies[cookie] ? cookies[cookie][0] : null;
    }
}

function visualizeWorkflow(workflowId, processId) {
    var data = {ajaxWorkflowDefinition:''};
    if (workflowId) data['workflowId'] = workflowId;
    if (processId) data['workflowProcess.workflowProcessId'] = processId;
    ajax('visualizeWorkflow-' + workflowId + '-' + processId, {
        url: root + '/admin/wf/show.action',
        data: data,
        dataType: 'json',
        timeout: 30000,
        type: 'POST',
        success: function(data) {
            if (!data) return;
            var w = parseInt($(window).width()*4/5);
            var h = parseInt($(window).height()*3/4);
            $('#workflowContentHelper').remove();
            var content = $('<div id="workflowContentHelper" style="overflow: auto"></div>').attr('title', data.title);
            $('body').prepend(content);
            $('#workflowContentHelper').wfRender(data, w);
            $('#workflowContentHelper').dialog({
                modal: true,
                width: w,
                height: h
            });
            $('#workflowContentHelper').width(w+'px').height(h+'px').css({
                padding: '0'
            });
        },
        error: function (req, status) {
            alert('error occured - ' + status);
        }
    });
    return false;
}


function loginForever() {
	$('p.logged-user #logged-username').load(root + '/admin/user/remember.action #logged-username');
}

function mimicConsoleIfNeeded() {
    if (window.console) return;

    window.console = new function() {
        this.log = function(what) {
        }
    }
}
