/// /// /// /// /// /// /******************************************** Generella detlar som körs på varje sida exempelvis binder man alla autocomplete här baserat på "data-värden" *********************************************/ var binding = function () { var initValues = null; var successTimeOutHandle = null; /********************************************************* Binder alla input med data-autocomplete attribut till jquerys autocomplete-widget. Källan för autocomplete anges i data-autocomplete: Källa för autokompleta data-autocomplete-value: id till en input där vald värde värde data-autocomplete-label: id till en input där vald label sparas data-validateonblur: function som validerar inmatat värden när man lämnar fältet lämnas tom om man inte vill utföra den valideringen **********************************************************/ var autoComplete = function () { $(":input[data-autocomplete]").each(function () { var txtBox = $(this), value = txtBox.attr("data-autocomplete-value"), label = txtBox.attr("data-autocomplete-label") var validationCallBack = txtBox.attr("data-validateonblur"); txtBox.autocomplete({ source: function (request, response) { txtBox.next('span').css("display", "inline-block") $.get(txtBox.attr("data-autocomplete"), request, function (result) { response(result); txtBox.next('span').css("display", "none") if (result[0] == undefined) { //Om man vill hantera tomma resultat } }, "json") .error(function () { txtBox.next('span').css("display", "none") alert("An unidentified error has occurred. Places could not be fetched Contact User Support IT if error remains") }); } , minLength: 2 , focus: function (evnet, ui) { return false; } , select: function (event, ui) { txtBox.val(ui.item.label); if (value != undefined) { $("#" + value).val(ui.item.value) } if (label != undefined) { $("#" + label).val(ui.item.label) } return false; } , open: function () { txtBox.data("isOpen", true) } , close: function () { txtBox.data("isOpen", false) /*Om vi inte längre är kvar i fältet kör ev valideing*/ if (txtBox.is(":focus") == false) { if (validationCallBack != undefined) { eval(validationCallBack); } } } }); /* Validation on Blure! */ if (validationCallBack != undefined) { txtBox.blur(function () { //txtBox.next('span.Loader').css("display", "none") eval(validationCallBack); }); } }); }, /******************************************************** Binder alla object med classen tooltip till customTooltip **********************************************************/ toolTip = function () { $('.tooltip').customTooltip({ yoffset: -15, xoffset: 5, animationSpeed: 100, openOn: "click", closeOn: "click" }); }, /******************************************************* Binder jquery datepicker till att input med attributet data-datepicker = true ********************************************************/ datePicker = function () { $(":input[data-datepicker = true]").each(function () { /*Om man anger datumet som new Date(Global.JNBMinDate) fungerar det inte i IE8*/ $(this).datepicker({ minDate: new Date(Global.JNBMinDate) }); }); }, /******************************************************** Binder dropDownCheckboxList till alla select med attributet data-dropDownCheckBoxList = true data-dropDownCheckBoxList-text: default-texten data-dropDownCheckBoxList-width: berdden på listan ********************************************************/ dropDownCheckBoxList = function () { $("select[data-dropDownCheckBoxList = true]").each(function () { createDropDownCheckBoxList($(this)); //span class="ui-dropdownchecklist-text" if ($(this).hasClass("input-validation-error")) { var container = $("#ddcl-" + $(this).attr("id")); $("span[class=ui-dropdownchecklist-text]", container).css("background", "#f8d9d9"); $("span[class=ui-icon-triangle-1-e]", container).css("background", "#f8d9d9"); } }); }, createDropDownCheckBoxList = function (selector, overrideEmptyText) { var text = selector.attr("data-dropDownCheckBoxList-text"), widht = selector.attr("data-dropDownCheckBoxList-width"), onComplete = selector.attr("data-dropDownCheckBoxList-oncomplete"); if (overrideEmptyText != undefined) text = overrideEmptyText; selector.dropdownchecklist({ icon: {}, width: widht, emptyText: text, maxDropHeight: 100, onComplete: function (selector) { if (onComplete != "") eval(onComplete) } }); /*VAlidation*/ }, /***************************************************** ******************************************************/ setTableLayout = function () { $("table.ReportTable tbody tr:even").addClass("Even"); $("table.ReportTable tbody tr:odd").addClass("Odd"); }, /********************************************************** Binder toggel funktionalitet till alla containers med classen ToggleContainer ***********************************************************/ bindToggleButton = function () { var openClass = "Open"; var hideClass = "Hide"; $('.ToggleContainer').each(function (k, v) { var isClientValidate = $(this).hasClass("WarningBoxToggleContainer"); var area = $('.ToggleArea', this); if (!isClientValidate) { area.hide(); } var allToggleButtons = $('.Toggle', this); $('.Toggle', this).click(function (e) { e.preventDefault(); if ($(this).hasClass(hideClass)) { if (isClientValidate) { ClientValidate.SetShow() } area.slideDown('medium', function () { allToggleButtons.removeClass(hideClass).addClass(openClass); }); } else { if (isClientValidate) { ClientValidate.SetHide() } area.slideUp('medium', function () { allToggleButtons.removeClass(openClass).addClass(hideClass); }); } $(document).trigger('click'); return false; }); }); }, /************************************************** Sätter fokus på första objectet med attributet data-setfocus ***************************************************/ setFocusOnFeild = function () { var i = 1; $("[data-setfocus]").first().focus(); }, /**************************************************************** Binder onbeforeunload för att kolla om sidan har ändrats och ge användaren möjlighet att spara sin ändringar innan man går vidare. *****************************************************************/ onUnload = function () { window.onbeforeunload = function () { var pageIsDirty = checkIfPagesIsDirty(); if (!Global.SkipDirtyCheck && pageIsDirty) { Global.SkipDirtyCheck = false; return Global.DirtyMessage; } } }, /***************************************************************** Hämtar alla inputs som ska spåras för förändring TODO: Hantera checkboxs *****************************************************************/ getInputFieldsWithDirtyFlag = function () { return $("[data-dirtyflag]") }, /***************************************************************** Spara init-värdet för alla inputs som ska ******************************************************************/ saveInitValues = function () { //initValues = new Object(); getInputFieldsWithDirtyFlag().each(function () { //initValues[$(this).attr("id")] = $(this).val(); $(this).attr("data-dirtyflag", $(this).val()); }); }, /**************************************************************** Kontroll om en sida har ändrats utan att sparas innan man lämnar den ****************************************************************/ checkIfPagesIsDirty = function () { var ret = false; if (Global.PageIsDirty) { ret = true; } else { getInputFieldsWithDirtyFlag().each(function () { var initValue = $(this).attr("data-dirtyflag"); if (initValue != undefined) { if ($(this).val() != initValue) { ret = true; return; } } }); } return ret; } /*************************************************** Hantera hur meddelanden om uppdatering visas och döljs. *****************************************************/ hideChangeInfoSuccess = function () { if (successTimeOutHandle != null) { clearTimeout(successTimeOutHandle); } successTimeOutHandle = setTimeout(function () { $("div.ChangeInfoSuccess").each(function () { var div = $(this); div.slideUp('fast', function () { div.hide(); }); }); }, 5000); }, /************************************************************** Hanterar menyn för språk ***************************************************************/ setCluture = function () { var cookieCulture = CookiesHelper.Read("Culture") $("#SetCulture").click(function (evt) { $("#LanguageMenu").toggle(); EventHelper.StopEventFromBubbleUp(evt); }); $("tr", "#LanguageMenu").click(function (evt) { var culture = $(this).attr("data-culture"); if (cookieCulture == culture) { $("#LanguageMenu").toggle(); } else { CookiesHelper.Write("Culture", culture); location.reload(true); } EventHelper.StopEventFromBubbleUp(evt); }); $("body").click(function () { var menuLayer = $("#LanguageMenu"); if (menuLayer.is(':visible')) { menuLayer.hide(); } }); }; /******************************************************* Publika metoder ********************************************************/ return { AutoComplete: autoComplete, DatePicker: datePicker, DropDownCheckBoxList: dropDownCheckBoxList, SetTableLayout: setTableLayout, // AnchorDisplayObject: anchorDisplayObject, ToggleButton: bindToggleButton, SetFocusOnFeild: setFocusOnFeild, ToolTip: toolTip, CreateDropDownCheckBoxList: createDropDownCheckBoxList, //SetJNBIdToSubMenuItems: setJNBIdToSubMenuItems, OnUnload: onUnload, SaveInitValues: saveInitValues, CheckIfPagesIsDirty: checkIfPagesIsDirty, HideChangeInfoSuccess: hideChangeInfoSuccess, SetCluture: setCluture } } (); /******************************************** Globala texter. Bör inte användas mer när språkstödet är implementerat Använd Translate([Text som mappar mot något i Resources.Strings]) *********************************************/ var Text = function () { return { UnhandledErrorMessage: "An unidentified error has occurred.Please try again on a later.. Contact User Support IT if error remains." } } (); /************************************************ Hjälpfunktion för att öppna hjälpen ************************************************/ var Help = function () { var openHelp = function (URL) { var width = 500, height = screen.availHeight -50; var top = 0, left = screen.availWidth - width - 20; var param = 'left=' + left + ',top=' + top + ',height=' + height + ', width=' + width + ',directories=0, location=0, menubar=0, toolbar=0,resizable=1,scrollbars=1'; var helpWindow = window.open(URL, 'HelpWindow', param); helpWindow.moveTo(left, top); }; return { OpenHelp: openHelp }; } (); /********************************************* Hjälpfunktioner för validering på klienten *********************************************/ var ClientValidate = function () { var ClientValidateErrorMessageHidden = "ClientValidateErrorMessageHidden", c = CookiesHelper.Read(ClientValidateErrorMessageHidden); var ShowError = typeof c !== 'undefined' ? eval(c) : true var showErrorIfInvalid = function () { var BrowserError = $("#BrowserError"); if ($("ul li", BrowserError).length > 1) { BrowserError.show() var head = $("a.Toggle", BrowserError) body = $("div.ToggleArea", BrowserError); head.removeClass("Hide").removeClass("Open"); if (ShowError) { head.addClass("Hide"); body.css("display", "none"); } else { head.addClass("Open"); body.css("display", "block"); } }; }, setHide = function () { CookiesHelper.Write(ClientValidateErrorMessageHidden, "true", null); }, setShow = function(){ CookiesHelper.Write(ClientValidateErrorMessageHidden, "false", null); }; return { ShowErrorIfInvalid: showErrorIfInvalid, SetHide: setHide, SetShow: setShow }; } (); /******************************************************* Hjälpfunktioner för att erbjuda sortering i tabeller *******************************************************/ var TableSort = function () { var init = function () { $(".TableSort").each(function () { var table = $(this); var container = table.parent("div.ScrollGrid"); var overlayId = loadingGUI.CreateOverlay(container); $("thead th.Sortable").each(function () { $(this).click(function () { $("#" + overlayId).fadeIn(); var col = $(this); var colIndex = col[0].cellIndex var rows = $("tbody tr", table); var dataType = $(this).attr("data-type"); if (dataType == undefined || dataType == "") dataType = "string"; else dataType = dataType.toLowerCase(); var newOrder = (col.hasClass('desc') == true) ? "asc" : "desc"; rows.sort(function (a, b) { var orgKeyA = $('td:eq(' + colIndex + ')', a).text().toUpperCase(); var orgKeyB = $('td:eq(' + colIndex + ')', b).text().toUpperCase(); var order; switch (dataType) { case "datetime": /* keyA = DateHelper.NewDate(orgKeyA); keyB = DateHelper.NewDate(orgKeyB); break;*/ case "date": keyA = DateHelper.NewDate(orgKeyA); keyB = DateHelper.NewDate(orgKeyB); break; case "int": if (isNaN(orgKeyA)) keyA = -1 else keyA = orgKeyA * 1; if (isNaN(orgKeyB)) keyB = -1 else keyB = orgKeyB * 1; break; case "decimal": break; default: /*string*/ keyA = orgKeyA keyB = orgKeyB } if (newOrder == "asc") { return (keyA < keyB) ? -1 : (keyA > keyB) ? 1 : 0; } else { return (keyA > keyB) ? -1 : (keyA < keyB) ? 1 : 0; } }); //sort*/ $.each(rows, function (index, row) { table.append(row); }); $("thead th.Sortable", table).removeClass("asc").removeClass("desc").removeClass("Active"); col.addClass("Active").addClass(newOrder); $("tbody tr td", table).removeClass("Active"); colIndex++; $("tbody tr td:nth-child(" + colIndex + ")", table).addClass("Active"); $("#" + overlayId).fadeOut(); }); //click }); //each thead th.Sortable }); //each .TableSort }; //init return { Init: init }; } (); /******************************************************* Hjälpfunktioner för att erbjuda filtrering i tabeller OBS OBS OBS OBS OBS !!!!!!! Fungerar ej. Tanken var att använda rx () men det medförde problem i övriga appen när det kom till IE 8. Ny implementering är inte klar *******************************************************/ var TableFilter = function () { var init = function () { $("table.TableFilter").each(function () { createDetailDiv(); var table = $(this), col = 0, tr = $("thead tr:last", table), row = $(""); row.insertAfter(tr); $("thead tr:first th", table).each(function () { if ($(this).hasClass('Filterble')) { var newCol = $(""); newCol.appendTo(row); var input = $("input", newCol); /* var keyup = Rx.Observable.fromEvent(input, 'keyup').select(function (ev) { return $(ev.target); }).throttle(500) .distinctUntilChanged(), filter = keyup.select(function (target) { return getSearchInfo(target); }); //.switchLatest(); //Behövs den? filter.subscribe(function (data) { var filterStatus = $("tbody").data("filter-status"); if (filterStatus == undefined) filterStatus = {}; filterStatus[data.column] = data.text; $("tbody").data("filter-status", filterStatus); doFilter(data.table); }, function (error) { alert('Error: ' + error) });*/ } else { var newCol = $(""); newCol.appendTo(row); } col++; }); //$("thead tr:first th", $(this)).each }); //End $("table.TableFilter").each }, //End Init doFilter = function (table) { var filterStatus = $("tbody", table).data("filter-status"); $("tbody tr", table).removeClass("FilterTableHide") if (filterStatus != undefined) { for (var col in filterStatus) { if (filterStatus[col] == "") continue; $("tbody tr", table).each(function () { var td = $("td", $(this))[col]; if (td.innerText.startsWith(filterStatus[col], true) == false) { $(this).addClass("FilterTableHide") } }); } } } getSearchInfo = function (target) { var text = $(target).val(), table = $(target).parents("table"), col = $(target).closest('tr').children().index($(target).closest("th")); return { 'table': table, 'column': col, 'text': text }; }, createDetailDiv = function () { $("table.TableFilter td a").each(function () { $(this).click(function (e) { var message = $(this).closest("td").attr("data-message"); var div = $("#LogDetailDiv"); $("textarea", div).text(message); $("input.IconButton.Close", div).click(function () { div.hide(); }); div.css("top", e.pageY + "px"); div.css("left", e.pageX - div.width() + "px"); div.show(); $("textarea", div).focus(); }); }); }; return { Init: init, CreateDetailDiv: createDetailDiv } } (); /********************************************************* Funktioner som körs vid dokument ready på alla sidor! *********************************************************/ $(document).ready(function () { ClientValidate.ShowErrorIfInvalid(); binding.AutoComplete(); binding.SetTableLayout(); //binding.AnchorDisplayObject(); binding.DatePicker(); binding.DropDownCheckBoxList(); binding.ToggleButton(); binding.SetFocusOnFeild(); binding.ToolTip(); binding.OnUnload(); binding.SetCluture(); TableSort.Init(); //TableFilter.Init(); TableFilter.CreateDetailDiv(); });