var wNoResults = wTherearecurrentlynorowstodisplay;//"There are currently no rows to display."; var wNoResultsCriteria = wTherearenoresultsfor0; //"There are no results for {criteria}."; var WLDateFormat = jsDateFormat; var WLLongDateFormat = jsWLLongDateFormat; var WLLongDateTimeFormat = JsWLLongDateTimeFormat; var regex = new RegExp(/{(.*?)}/i); var wWorkingDataTablePatientList = JSON.parse('{}'); var wMasterDataTable = JSON.parse('{}'); var wWorkingDataTable = JSON.parse('{}'); var wDataTableCounter = JSON.parse('{}'); var wFilteringDataTable = JSON.parse('{}'); var wSystemConfiguredFilteringe = JSON.parse('{}'); var wFilteringSentence = JSON.parse('{}'); var wSortingDataTable = JSON.parse('{}'); var wGridCellCtrls = JSON.parse('{}'); var wDynamicGridCellCtrls = JSON.parse('{}'); var wGridAttributes = JSON.parse('{}'); var wGridObj = JSON.parse('{}'); var ShiftClicked = false; var ActiveTabLoading = true; var wGridRefreshTimer = {}; //var wGridRefreshTimerCounter = JSON.parse('{}'); //var refreshInterval = 0; //var refreshCounterInterval = 60000; function RegisterTableData(GuidID, jSonData, ColumnCtrls, DynamicColumnCtrls, GridAttributes) { this.GuidID = GuidID; this.ActiveTabName=""; this.ActiveDataGuidName = GuidID; this.GridRefreshTimerCounter = JSON.parse('{}'); this.ActiveTabLoading = true; //set ActiveTab(val){ // ActiveDataGuidName = GuidID; // if (val !== undefined && val != null && val != "") { // ActiveDataGuidName = GuidID + "_" + val; // } // this.ActiveTabName = value; //} if (GridAttributes.PrimaryKey != null) { this.PrimaryKey = GridAttributes.PrimaryKey; } if (GridAttributes.ActiveTabLoading != null) { this.ActiveTabLoading = GridAttributes.ActiveTabLoading ActiveTabLoading = GridAttributes.ActiveTabLoading; } wGridObj[this.GuidID] = this; if (jSonData == null){ jSonData = JSON.parse('{}'); } wMasterDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)] = jSonData wWorkingDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)] = jSonData; wFilteringSentence[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)] = ""; //wFilteringDataTable[GuidID] = JSON.parse('{"first_name": ["andrew", "Drema"], "first_name": ["andrew", "Drema"],"requested_date":{"End": "-10","Start": "1982-10-10"}}'); //wFilteringDataTable[GuidID] = JSON.parse('{"last_name": "reschedule", "filler_order_number": [8114, 8115],"requested_date":{"End": "-10","Start": "1982-10-10"}}'); //wFilteringDataTable[GuidID] = JSON.parse('{"last_name": "reschedule", "requested_date":{"End": "-10","Start": "1982-10-10"}}'); wFilteringDataTable[this.GuidID] = JSON.parse('{}'); wGridCellCtrls[this.GuidID] = ColumnCtrls; wDynamicGridCellCtrls[this.GuidID] = DynamicColumnCtrls; wGridAttributes[this.GuidID] = GridAttributes; if (GridAttributes.SortBy != null) { wSortingDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)] = GridAttributes.SortBy; SortWL(this.GuidID, this.ActiveDataGuidName); } else if (wGridAttributes[this.GuidID]["GroupByData"]) { SortWL(this.GuidID, this.ActiveDataGuidName); } else if (GridAttributes.DownloadingData){ BuildGridLoadingspinner(this.GuidID, this.ActiveDataGuidName); } else { BuildGridResults(this.GuidID, this.ActiveDataGuidName); } //FilterWL(GuidID) //this.GenerateWLPerPages(); GenerateWLPerPages(this.GuidID, this.ActiveDataGuidName) GenerateWLPages(this.GuidID, this.ActiveDataGuidName) } RegisterTableData.prototype.SetActiveTabName = function (aTabName) { this.ActiveTabName = aTabName; this.ActiveDataGuidName = this.GuidID + "_" + aTabName; var wGrid = $('#' + this.GuidID + ''); wGrid.attr('ActiveTabName', aTabName); } RegisterTableData.prototype.MasterData = function () { return wMasterDataTable; } RegisterTableData.prototype.attr = function (attributeName, value) { var wGrid = $('#' + this.GuidID + ''); var GridAttrValue = ""; if (!value) { GridAttrValue = wGrid.attr(attributeName); } else { wGrid.attr(attributeName, value); GridAttrValue = value; } return GridAttrValue; } RegisterTableData.prototype.ShowLoader = function () { var wWLRows = ""; var GuidID = this.GuidID; var wGrid = $('#' + GuidID + ''); var wGridColumns = $('#' + GuidID + ' thead tr th'); var wGridArea = $('#' + GuidID + ' tbody'); wWLRows += ""; wWLRows += ""; wWLRows += "
"; wWLRows += ""; wWLRows += ""; $(wGridArea[0]).empty(); $(wGridArea[0]).append(wWLRows); GenerateSpinner(); }; RegisterTableData.prototype.GridPatientList = function (aTabName, PatientList) { var wDatObjectName = this.GuidID; if (aTabName !== undefined && aTabName != null && aTabName != "") { wDatObjectName = this.GuidID + "_" + aTabName; } wWorkingDataTablePatientList[wDatObjectName] = PatientList } RegisterTableData.prototype.UpdateData = function (wJsonData, aSearchCriteria, StayOnCurrentPage) { this.UpdateGridData('', wJsonData, aSearchCriteria, StayOnCurrentPage); } RegisterTableData.prototype.UpdateGridCountData = function (aTabName, wDataCount) { var wGrid = $('#' + this.GuidID + ''); wDataTableCounter[wDatContainerName] = null; var wDatContainerName = this.GuidID; if (aTabName !== undefined && aTabName != null && aTabName != "") { wDatContainerName = this.GuidID + "_" + aTabName; } wDataTableCounter[wDatContainerName] = wDataCount; } RegisterTableData.prototype.UpdateGridData = function (aTabName, wJsonData, aSearchCriteria, StayOnCurrentPage) { //var wJsonStringData = JSON.stringify(wJsonData); //wJsonStringData = wJsonStringData.replace(/\"/g, "\\"").replace(/\'/g, "\\'") //wJsonData = JSON.parse(wJsonStringData); $('#' + this.GuidID + ' tfoot').show(); StayOnCurrentPage = (StayOnCurrentPage == null || StayOnCurrentPage == "" ? false : (typeof StayOnCurrentPage !== 'undefined' ? StayOnCurrentPage : false)); var wGrid = $('#' + this.GuidID + ''); var CurrentWLPage = wGrid.attr('Current-page') * 1; if (wJsonData == "[]") { jSonData = JSON.parse('{}'); } if (aTabName == this.ActiveTabName) { $(document).trigger('WLUpdate', { GuidID: this.GuidID, WLData: wJsonData }); } var wDatObjectName = this.GuidID; if (aTabName !== undefined && aTabName != null && aTabName != "") { wDatObjectName = this.GuidID + "_" + aTabName; } wMasterDataTable[wDatObjectName] = wJsonData; wWorkingDataTable[wDatObjectName] = wJsonData; wFilteringSentence[this.GuidID] = ""; if (aSearchCriteria != null && aSearchCriteria != "") { this.SearchCriteria = aSearchCriteria; } if (this.ActiveTabLoading) { if (aTabName == this.ActiveTabName) { FilterWL(this.GuidID, this.ActiveDataGuidName); SortWL(this.GuidID, this.ActiveDataGuidName) GenerateWLPerPages(this.GuidID, this.ActiveDataGuidName); //BuildGridResults(this.GuidID) GenerateWLPages(this.GuidID, this.ActiveDataGuidName); if (StayOnCurrentPage) { changePage(this.GuidID, CurrentWLPage, this.ActiveDataGuidName) } else { changePage(this.GuidID, 1, this.ActiveDataGuidName) } } } else { FilterWL(this.GuidID); SortWL(this.GuidID) GenerateWLPerPages(this.GuidID) //BuildGridResults(this.GuidID) GenerateWLPages(this.GuidID) if (StayOnCurrentPage) { changePage(this.GuidID, CurrentWLPage) } else { changePage(this.GuidID, 1) } } }; RegisterTableData.prototype.GridRefreshTimer = function (aTabName) { var wDatObjectName = this.GuidID; if (aTabName !== undefined && aTabName != null && aTabName != "") { wDatObjectName = this.GuidID + "_" + aTabName; } wGridRefreshTimer[wDatObjectName] = setTimeout("UpdateTabGridTimer('" + this.GuidID + "', '" + aTabName + "')", refreshCounterInterval); }; RegisterTableData.prototype.LoadingGridResults = function () { var wWLRows = ""; var wGrid = $('#' + this.GuidID + ''); var wGridColumns = $('#' + this.GuidID + ' thead tr th'); var wGridArea = $('#' + this.GuidID + ' tbody'); var GuidID = this.GuidID; var CurrentGroupByDataValue; var GroupBy = (wGridAttributes[GuidID]["GroupByData"] != null && Object.keys(wGridAttributes[GuidID]["GroupByData"]).length > 0 ? true : false); $(wGridArea[0]).empty(); wWLRows += ""; wWLRows += ""; wWLRows += "
"; wWLRows += ""; wWLRows += ""; $(wGridArea[0]).empty(); $(wGridArea[0]).append(wWLRows); GenerateSpinner(); }; RegisterTableData.prototype.RebuildResults = function () { SortWL(this.GuidID, this.ActiveDataGuidName); GenerateWLPerPages(this.GuidID, this.ActiveDataGuidName); BuildGridResults(this.GuidID, this.ActiveDataGuidName); GenerateWLPages(this.GuidID, this.ActiveDataGuidName); }; RegisterTableData.prototype.findAndRemove = function (aColumn, aValue, aRebuildResults) { jsonMasterData = wMasterDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)]; $.each(jsonMasterData, function (index, result) { if (result != undefined) { if (result[aColumn] == aValue) { //Remove from array jsonMasterData.splice(index, 1); } } }); jsonData = wWorkingDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)]; $.each(jsonData, function (index, result) { if (result != undefined) { if (result[aColumn] == aValue) { //Remove from array jsonData.splice(index, 1); return false; } } }); if (aRebuildResults !== undefined && aRebuildResults) { this.RebuildResults(); } } RegisterTableData.prototype.AddRow = function (row, aRebuildResults) { jsonMasterData = wMasterDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)]; jsonMasterData.push(row); jsonData = wWorkingDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)]; jsonData.push(row); if (aRebuildResults === Boolean && aRebuildResults) { this.RebuildResults(); } } RegisterTableData.prototype.GetCount = function () { jsonData = wWorkingDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)]; return jsonData.length; } RegisterTableData.prototype.Find = function (aValue) { return this.FindBy(this.PrimaryKey, aValue); } RegisterTableData.prototype.FindBy = function (aColumnName, aValue) { if (aColumnName == null) { console.log("No Column Defined"); return null; } return Enumerable.From(wWorkingDataTable[this.ActiveDataGuidName]).Where("$." + aColumnName + "=='" + aValue + "'").ToArray(); }; RegisterTableData.prototype.Where = function (aQuery) { return Enumerable.From(wWorkingDataTable[this.ActiveDataGuidName]).Where(aQuery).ToArray(); }; RegisterTableData.prototype.SentencedFilterCritera = function () { return wFilteringSentence[this.GuidID]; }; RegisterTableData.prototype.AppliedSort = function () { return wSortingDataTable[this.GuidID]; }; RegisterTableData.prototype.ApplySort = function (aSort) { if (wSortingDataTable[this.ActiveDataGuidName] == null) { wSortingDataTable[this.ActiveDataGuidName] = JSON.parse('{}'); } wSortingDataTable[this.GuidID] = JSON.parse('{}'); wSortingDataTable[this.GuidID] = aSort wSortingDataTable[this.ActiveDataGuidName] = aSort; SortWL(this.GuidID, this.ActiveDataGuidName) }; RegisterTableData.prototype.AppliedFilter = function () { return wFilteringDataTable[this.GuidID]; }; RegisterTableData.prototype.ApplyFilter = function (aQuery) { wFilteringDataTable[this.GuidID] = JSON.parse('{}'); wFilteringDataTable[this.GuidID] = aQuery FilterWL(this.GuidID, this.ActiveDataGuidName); }; RegisterTableData.prototype.ApplySystemFilter = function (aQuery) { wSystemConfiguredFilteringe[this.GuidID] = JSON.parse('{}'); wSystemConfiguredFilteringe[this.GuidID] = aQuery }; RegisterTableData.prototype.SystemFilter = function () { return wSystemConfiguredFilteringe[this.GuidID]; }; RegisterTableData.prototype.AddFilter = function (aQueryElement) { //wFilteringDataTable[this.GuidID].push(aQueryElement); jsonFilterData = wFilteringDataTable[this.GuidID]; $.each(aQueryElement, function (Key, Data) { if (Data != null && Data != "") { jsonFilterData[Key] = Data; //$.extend(wFilteringDataTable[this.GuidID], aQueryElement); } else { delete jsonFilterData[Key]; } }); FilterWL(this.GuidID, this.ActiveDataGuidName); }; RegisterTableData.prototype.RemoveFilter = function (aKey) { jsonFilterData = wFilteringDataTable[this.GuidID]; //$.each(jsonFilterData, function (index, result) { // if (result[aQueryElement]) { // //Remove from array // jsonFilterData.splice(index, 1); // } //}); delete jsonFilterData[Key]; FilterWL(this.GuidID, this.ActiveDataGuidName); }; RegisterTableData.prototype.SerializeData = function () { var wSerializedGridData = JSON.parse('{}'); //wSerializedGridData.WLData = wWorkingDataTable[this.GuidID]; wSerializedGridData.WLData = wMasterDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)]; wSerializedGridData.WLSort = wSortingDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)]; wSerializedGridData.WLColumnData = wGridCellCtrls[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)]; wSerializedGridData.WLDynamicColumnData = wDynamicGridCellCtrls[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)]; wSerializedGridData.WLAttributes = wGridAttributes[this.GuidID]; wSerializedGridData.GridObj = wGridObj[this.GuidID]; var wGrid = $('#' + this.GuidID + ''); wSerializedGridData.CurrentPage = wGrid.attr('Current-page') * 1; return wSerializedGridData; }; RegisterTableData.prototype.RebuildGrid = function (SerializedData) { wMasterDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)] = SerializedData.WLData wWorkingDataTable[(this.ActiveTabLoading ? this.ActiveDataGuidName : this.GuidID)] = SerializedData.WLData; wSortingDataTable[this.GuidID] = SerializedData.WLSort; wGridCellCtrls[this.GuidID] = SerializedData.WLColumnData; wDynamicGridCellCtrls[this.GuidID] = SerializedData.WLDynamicColumnData; wGridAttributes[this.GuidID] = SerializedData.WLAttributes; wGridObj[this.GuidID] = SerializedData.GridObj; SortWL(); GenerateWLPerPages(this.GuidID, this.ActiveDataGuidName); changePage(this.GuidID, this.ActiveDataGuidName, SerializedData.CurrentPage); }; //RegisterTableData.prototype.Remove = function (aID, aColumnName) { // var wColumnName = aColumnName; // if (wColumnName == null) { // wColumnName = this.PrimaryKey; // } // if (wColumnName == null) { // console.log("No Column Defined"); // return; // } // var wGridData = wWorkingDataTable[this.GuidID]; // var wRecords = this.FindBy(wColumnName, aID); // $.each(wRecords, function (key, data) { // var wIndex = wGridData.indexOf(data); // if (wIndex > -1) { // delete wGridData[wIndex]; // } // }); // this.RebuildResults(); //}; $(document).ready(function () { $(function () { $(document).keypress(function (e) { ShiftClicked = e.shiftKey; }); $(document).keyup(function (e) { ShiftClicked = false; }); }); }); function UpdateTabGridTimer(GuidID, aTabName){ var wDatObjectName = GuidID; if (aTabName !== undefined && aTabName != null && aTabName != "") { wDatObjectName = GuidID + "_" + aTabName; } var wTabCounter= 0; if (SearchResults.GridRefreshTimerCounter.hasOwnProperty(wDatObjectName)){ wTabCounter = SearchResults.GridRefreshTimerCounter[wDatObjectName]; } wTabCounter++; SearchResults.GridRefreshTimerCounter[wDatObjectName] = wTabCounter; var wrefreshTabIntervalId = wGridRefreshTimer[wDatObjectName]; if (wTabCounter >= refreshInterval) { UpdateTabWLResults(GuidID, aTabName); } else { if(refreshInterval > 0){ if ($("#UpdateTimer").length != 0) { if(refreshIntervalId != null ){ clearTimeout(wrefreshTabIntervalId); } wGridRefreshTimer[wDatObjectName] = setTimeout("UpdateTabGridTimer('" + GuidID + "', '" + aTabName + "')", refreshCounterInterval); } } } if(SearchResults.ActiveTabName == aTabName){ if (wTabCounter > 0 && $('.update-data-button').length > 0 && $('.update-data-button').hasClass('disabled')) { $('.update-data-button').removeClass('disabled'); } if (wTabCounter > 0 && $('.update-data-button').length > 0 && $('.update-data-button').is(':hidden')) { $('.update-data-button').show(); } $("#UpdateTimer")[0].innerHTML = String.format(wWL0MinAgo, wTabCounter); } } function UpdateTabWLResults(aGuidID, aTabName){ var wDatObjectName = aGuidID; if (aTabName !== undefined && aTabName != null && aTabName != "") { wDatObjectName = aGuidID + "_" + aTabName; } var wUpdatingTab = $('div.row-tabs-wrapper ul.my-tabs a[tabname="'+aTabName+'"]') var DataURL = wUpdatingTab.attr("update-src")+"NULL/DataOnly/"; var wTabLoadingImg = wUpdatingTab.children('img'); wTabLoadingImg.show(); if(SearchResults.ActiveTabName == aTabName){ $('.update-data-button image').addClass("imageRotate"); $('.update-data-button').addClass('disabled'); $("#UpdateTimer")[0].innerHTML = ""; } $.ajax({ type: "POST", url: DataURL, GuidID:aGuidID, TabLoadingImg:wTabLoadingImg, TabLoading:wUpdatingTab, refreshCounterInterval:refreshCounterInterval }).done(function(data) { var wTabName = this.TabLoading.attr('TabName'); if (SearchResults.ActiveTabName == wTabName) { if ($('.update-data-button image').hasClass("imageRotate")) { $('.update-data-button image').removeClass("imageRotate"); } if (!$('.update-data-button image').hasClass("disabled")){ $('.update-data-button').addClass('disabled'); } $("#UpdateTimer")[0].innerHTML = ""; } var wDatObjectName = this.GuidID; if (wTabName !== undefined && wTabName != null && wTabName != "") { wDatObjectName = this.GuidID+ "_" + wTabName; } SearchResults.UpdateGridData(wTabName, data.WLData); //UpdateTabCounter(this.TabLoading); clearTimeout(wGridRefreshTimer[wDatObjectName]); SearchResults.GridRefreshTimerCounter[wDatObjectName] = 0; wGridRefreshTimer[wDatObjectName] = setTimeout("UpdateTabGridTimer('"+this.GuidID+"', '"+wTabName+"')", refreshCounterInterval); if (SearchResults.ActiveTabName == wTabName) { SearchResults.RebuildResults(wTabName); ApplyMyView(); } this.TabLoadingImg.hide(); SearchResults.UpdateGridCountData(wTabName, data.length); UpdateTabCounter(this.TabLoading); }).error(function(data) { this.TabLoadingImg.hide(); if(SearchResults.ActiveTabName == wTabName && $('.update-data-button image').hasClass("imageRotate")){ $('.update-data-button image').removeClass("imageRotate"); $("#UpdateTimer")[0].innerHTML = String.format(wWL0MinAgo, wTabCounter); } }); } function NoResults(GuidID, DataGuidName) { DataContainer = GuidID; if (DataGuidName !== undefined && DataGuidName != null) { DataContainer = DataGuidName } var wNoResultsGrid = wNoResults; if (wGridAttributes[GuidID].NoResultsSentence != null && wGridAttributes[GuidID].NoResultsSentence != null) { wNoResultsGrid = wGridAttributes[GuidID].NoResultsSentence; } if (wGridObj[GuidID].SearchCriteria != null && wGridObj[GuidID].SearchCriteria != "") { wNoResultsGrid = String.format(wNoResultsCriteria, "" + wGridObj[GuidID].SearchCriteria+"")//wNoResultsCriteria.replace("{criteria}", wGridObj[GuidID].SearchCriteria) } return wNoResultsGrid; } var mWorkingDesiredColumnValue; function GenerateCellValue(GuidID, DataRow, DesiredColumnValue, CellFormat, CellCtrlData, DynamicData, DataContainer) { wDataContainer = GuidID; if (DataContainer !== undefined && DataContainer != null) { wDataContainer = DataContainer } if (CellFormat == null || CellFormat == "") { CellFormat = WLLongDateTimeFormat; } mWorkingDesiredColumnValue = DesiredColumnValue; var WLData = wWorkingDataTable[wDataContainer]; if (!DesiredColumnValue || DesiredColumnValue == "") { return ""; } var ctrlCtrl = DesiredColumnValue; var match; var matches = []; while ((match = regex.exec(ctrlCtrl)) !== null) { matches.push(match); var wColumnName = match[1]; var wData = DataRow[wColumnName]; var wColumnData = (DataRow[wColumnName]?DataRow[wColumnName]:" "); if (wColumnName.toLowerCase().indexOf("date") > -1 && DataRow[wColumnName] != null && (Object.prototype.toString.call((new Date(parseInt(DataRow[wColumnName].substr(6))).toString() == "Invalid Date" ? "" : new Date(parseInt(DataRow[wColumnName].substr(6))))) == "[object Date]" && DataRow[wColumnName] != "01-01-0001")) { if (wColumnData.indexOf("/Date(") > -1) { wColumnData = wColumnData.replace("/Date(", "").replace(")/", ""); if (parseFloat(wColumnData) < -2208900000000) { wColumnData = ""; } else { var d = new Date(parseFloat(wColumnData)); var timeZoneOffset = d.getTimezoneOffset(); if (timeZoneOffset >= 0 && DataContainer != "PACSMediaRequests" && (moment([d.getFullYear(), d.getDate(), d.getMonth() + 1]).isUTC() || wColumnName == "DateOfBirth" || wColumnName == "birth_date" || wColumnName == "created_date" || wColumnName == "ScheduledDate" || wColumnName == "scheduled_start_date" || wColumnName == "DisplayDate")) { wColumnData = dateFormat(new Date(parseFloat(wColumnData)), CellFormat, true); } else if (timeZoneOffset < 0 && DataContainer != "PACSMediaRequests" && (moment([d.getFullYear(), d.getDate(), d.getMonth() + 1]).isUTC() || wColumnName == "created_date" || wColumnName == "ScheduledDate" || wColumnName == "scheduled_start_date" || wColumnName == "DisplayDate")) { wColumnData = dateFormat(new Date(parseFloat(wColumnData)), CellFormat, true); } else { wColumnData = dateFormat(new Date(parseFloat(wColumnData)), CellFormat, false); } } } else { var idx = wData.indexOf("T"); var isNonOffsetDate = true; if (idx > -1) { if (wData.indexOf("-", idx) > -1) { isNonOffsetDate = false; } if (wData.indexOf("+", idx) > -1) { isNonOffsetDate = false; } if (wData.indexOf(".", idx) > -1) { isNonOffsetDate = false; } } else if (wData.toLowerCase().endsWith('am') || wData.toLowerCase().endsWith('pm') || wData.toLowerCase().endsWith(wTimeAM) || wData.toLowerCase().endsWith(wTimePM)) { isNonOffsetDate = false; } else if (wColumnName == "DateOfBirth") { isNonOffsetDate = false; } wColumnData = dateFormat(new Date(wColumnData), CellFormat, isNonOffsetDate); // wColumnData = dateFormat(new Date(wColumnData), CellFormat, false); } } if (typeof wColumnData == "string") { if (wColumnData.search(" -1 && (Object.prototype.toString.call((new Date(parseInt(DataRow[wColumnName].substr(6))).toString() == "Invalid Date" ? "" : new Date(parseInt(DataRow[wColumnName].substr(6))))) == "[object Date]" && DataRow[wColumnName] != "01-01-0001")) { if (wColumnData.indexOf("/Date(") > -1) { wColumnData = wColumnData.replace("/Date(", "").replace(")/", ""); var d = new Date(parseFloat(wColumnData)); var timeZoneOffset = d.getTimezoneOffset(); if (timeZoneOffset >= 0 && (moment([d.getFullYear(), d.getDate(), d.getMonth() + 1]).isDST() || wColumnName == "birth_date" || wColumnName == "scheduled_start_date" || wColumnName == "DisplayDate")) { wColumnData = dateFormat(new Date(parseFloat(wColumnData)), CellFormat, true); } else if (timeZoneOffset < 0 && (moment([d.getFullYear(), d.getDate(), d.getMonth() + 1]).isDST() || wColumnName == "scheduled_start_date" || wColumnName == "DisplayDate")) { wColumnData = dateFormat(new Date(parseFloat(wColumnData)), CellFormat, true); } else { wColumnData = dateFormat(new Date(parseFloat(wColumnData)), CellFormat, false); } } else { var idx = wData.indexOf("T"); var isNonOffsetDate = true; if (idx > -1) { if (wData.indexOf("-", idx) > -1) { isNonOffsetDate = false; } if (wData.indexOf("+", idx) > -1) { isNonOffsetDate = false; } if (wData.indexOf(".", idx) > -1) { isNonOffsetDate = false; } } wColumnData = dateFormat(new Date(wColumnData), CellFormat, isNonOffsetDate); } } if (typeof wColumnData == "string") { if (wColumnData.search("-1) { wStringReplaceValue = wStringReplaceValue.replace(/\"/g, "\"") } if (wStringReplaceValue.search("\'") > -1) { if (aPlaceHolder == "patient_name") { wStringReplaceValue = wStringReplaceValue.replace(/\'/g, "\\'"); } else { wStringReplaceValue = wStringReplaceValue.replace(/\'/g, "\'"); } } } } } return wStringReplaceValue; } function BuildGridLoadingspinner(GuidID, aDataGuidName) { wDataContainer = GuidID; if (ActiveTabLoading && aDataGuidName !== undefined && aDataGuidName != null) { wDataContainer = aDataGuidName } var WLData = wWorkingDataTable[wDataContainer]; if (WLData.length <= 0) { var wWLRows = ""; var wGrid = $('#' + GuidID + ''); var wGridColumns = $('#' + GuidID + ' thead tr th'); var wGridArea = $('#' + GuidID + ' tbody'); wWLRows += ""; wWLRows += ""; wWLRows += "
"; wWLRows += ""; wWLRows += ""; $(wGridArea[0]).empty(); $(wGridArea[0]).append(wWLRows); GenerateSpinner(); } else { BuildGridResults(GuidID, wDataContainer); } } function BuildGridResults(GuidID, aDataGuidName) { wDataContainer = GuidID; if (ActiveTabLoading && aDataGuidName !== undefined && aDataGuidName != null) { wDataContainer = aDataGuidName } var WLData = wWorkingDataTable[wDataContainer]; if (WLData === undefined) { if (wDataContainer != GuidID) { WLData = wWorkingDataTable[GuidID]; } } var wWLRows = ""; var wGrid = $('#' + GuidID + ''); var wGridColumns = $('#' + GuidID + ' thead tr th'); var wGridArea = $('#' + GuidID + ' tbody'); var WLPerPage = wGrid.attr('Rows-per-page') * 1; if (WLPerPage > WLData.length) { WLPerPage = WLData.length; } if (wGridAttributes[GuidID].hasOwnProperty("FullResultSetDisplayed") && wGridAttributes[GuidID]["FullResultSetDisplayed"] == true) { WLPerPage = WLData.length; wGrid.attr('Rows-per-page', WLPerPage); } if (WLData.length <= 0) { wWLRows += ""; wWLRows += ""; wWLRows += NoResults(GuidID); // "there are currently no rows to display."; //wNoResultsCriteria//wNoResults wWLRows += ""; wWLRows += ""; } else { var WLPage = wGrid.attr('Current-page') * 1; var wRowsPerPage = Math.ceil(WLData.length/WLPerPage); if (wRowsPerPage < WLPage) { wGrid.attr('Current-page', 1); WLPage = wGrid.attr('Current-page') * 1; } var CurrentGroupByDataValue; var GroupBy = (wGridAttributes[GuidID]["GroupByData"] != null && Object.keys(wGridAttributes[GuidID]["GroupByData"]).length > 0 ? true: false) ; if (wGridAttributes[GuidID]["GroupByData"] && wGridAttributes[GuidID]["GroupByData"]["Action"]) { var wBaseGroupByAction = null; if ((typeof wGridAttributes[GuidID]["GroupByData"]["Action"]) == "string") { wBaseGroupByAction = wGridAttributes[GuidID]["GroupByData"]["Action"]; } else { $.each(wGridAttributes[GuidID]["GroupByData"]["Action"], function (key, data) { if ((typeof data) == "string") { wBaseGroupByAction += data; }else{ } }); } } var wGroupItemsCollapsed = ""; for (var i = ((WLPage - 1) * WLPerPage) ; i < ((WLPage - 1) * WLPerPage) + WLPerPage && i < WLData.length; i++) { if (GroupBy) { wGroupItemsCollapsed = (wGridAttributes[GuidID]["GroupByData"]["Collapsed"] != null && (wGridAttributes[GuidID]["GroupByData"]["Collapsed"].toString().toLowerCase() == "true" || wGridAttributes[GuidID]["GroupByData"]["Collapsed"].toString().toLowerCase() == "y") ? "display: none;" : ""); if (CurrentGroupByDataValue != 0 && WLData[i][wGridAttributes[GuidID]["GroupByData"]["GroupBy"]] != CurrentGroupByDataValue) { var wGroupTitleValue = GenerateCellValue(GuidID, WLData[i], wGridAttributes[GuidID]["GroupByData"]["Title"], "", null, null, wDataContainer); var wGroupCellValue = GenerateCellValue(GuidID, WLData[i], wGridAttributes[GuidID]["GroupByData"]["Text"], "", null, null, wDataContainer); CurrentGroupByDataValue = WLData[i][wGridAttributes[GuidID]["GroupByData"]["GroupBy"]]; //style=\"border-top-color: "+StyleColor+ "; border-top-width: 1px; border-top-style: solid;\" wWLRows += ""; //todo: changed title to data-original-title wWLRows += ""; wWLRows += "" + wGroupCellValue + ""; if (wBaseGroupByAction && wBaseGroupByAction != null && wBaseGroupByAction != "") { var wGroupByAction = GenerateCellValue(GuidID, WLData[i], wBaseGroupByAction, "", null, null, wDataContainer, wDataContainer); wWLRows += "" + wGroupByAction + ""; } wWLRows += ""; wWLRows += ""; } } var wDynamicClass=""; if (wGridAttributes[GuidID]["RowClass"] != null && Object.keys(wGridAttributes[GuidID]["RowClass"]).length > 0) { $.each(wGridAttributes[GuidID]["RowClass"], function (key, data) { var wFieldValue = GenerateCellValue(GuidID, WLData[i], key, null, null, null, wDataContainer); if (wFieldValue in data) { wDynamicClass += data[wFieldValue] + " "; } }); } var wDynamicStyle = ""; if (wGridAttributes[GuidID]["RowStyle"] != null && Object.keys(wGridAttributes[GuidID]["RowStyle"]).length > 0) { $.each(wGridAttributes[GuidID]["RowStyle"], function (key, data) { var wFieldValue = GenerateCellValue(GuidID, WLData[i], key, null, null, null, wDataContainer); if (wFieldValue in data) { wDynamicStyle += data[wFieldValue] + " "; } }); } wWLRows += ""; $.each(wGridColumns, function (key, data) { var columnName = $(data).find('a').attr('ColumnName'); if (columnName == null) { columnName = $(data).find('span').attr('ColumnName'); } if (columnName == null) { columnName = $(data).attr('ColumnName'); } //if (columnName == null) { // columnName = $(data).find('a').attr('columnname'); //} //if (columnName == null) { // columnName = $(data).attr('columnname'); //} if (columnName == null) { columnName = ""; } var columnValue = $(data).find('a').attr('ColumnValue'); if (columnValue == null) { columnValue = $(data).find('span').attr('ColumnValue'); } if (columnValue == null) { columnValue = ""; } var wDisplayFormat = ""; if ($(data).attr('DisplayFormat') != null && $(data).attr('DisplayFormat') != "") { wDisplayFormat = $(data).attr('DisplayFormat'); } var wTitleCellValue = ""; if ($(data).attr('TitleValue') != null && $(data).attr('TitleValue') != "") { wTitleCellValue = $(data).attr('TitleValue'); } var wTitleFormat = ""; if ($(data).attr('TitleFormat') != null) { wTitleFormat = $(data).attr('TitleFormat'); } //var wfieldDataValue = GenerateCellValue(GuidID, WLData[i], (columnValue != "" ? columnValue : "{"+columnName+"}"), wDisplayFormat, wTitleValue, wTitleFormat, wDynamicGridCellCtrls[GuidID][columnName]); var wClassValue = ""; wTitleFormat = (wTitleFormat == "" && columnName.indexOf("date") > -1 && columnName.indexOf("birth") == -1 ? WLLongDateTimeFormat : wTitleFormat); wDisplayFormat = (wDisplayFormat == "" && columnName.indexOf("date") > -1 ? (columnName.indexOf("birth") > -1 ? WLDateFormat : WLLongDateFormat) : wDisplayFormat); //do we want non birth date date fields to alwasy have an extended date value dispalyed. //if ((wTitleValue == null || wTitleValue == "") && columnName.indexOf("date") > -1 && columnName.indexOf("birth") == -1) { // wTitleValue = (columnValue != "" ? columnValue : "{" + columnName + "}"); //} var wTitleValue = GenerateCellValue(GuidID, WLData[i], wTitleCellValue, wTitleFormat, null, null, wDataContainer); var wCellValue = GenerateCellValue(GuidID, WLData[i], (columnValue != "" ? columnValue : "{" + columnName + "}"), wDisplayFormat, wGridCellCtrls[GuidID][columnName], wDynamicGridCellCtrls[GuidID][columnName], wDataContainer); if ($(data).attr('class') != null && $(data).attr('class') != "") { wClassValue = $(data).attr('class'); } var wStyleValue = ""; if ($(data).attr('style') != null && $(data).attr('style') != "") { wStyleValue = $(data).attr('style'); } //todo: changed title to data-original-title wWLRows += ""; wWLRows += wCellValue.replace(/]*>( |\s)<\/a>/ig, ""); wWLRows += ""; }); wWLRows += ""; } } //wGridArea.val(wWLRows); //wGridArea[0].innerHTML = wWLRows; //$(wGridArea).val(wWLRows); $(wGridArea[0]).empty(); $(wGridArea[0]).append(wWLRows); //GenerateSpinner(); var wPreviouseAttachmentList; $('#' + GuidID + ' tbody [data-toggle="popover-attachments"]').popover({ html: true, trigger: 'click', content: function () { var wAttachmentResultHTML = $(this).attr("Attachment_Result_List"); if (wAttachmentResultHTML === undefined || wAttachmentResultHTML == "") { $.ajax({ type: "POST", url: $(this).data('loadurl'), AttachmentRow: $('#Attachment_list'), popoverIcon: $(this), success: function (data) { this.popoverIcon.attr("Attachment_Result_List", data); this.AttachmentRow.html(data); this.popoverIcon.next().find('#Attachment_list').html(data); var popover = this.popoverIcon.data('bs.popover'); //popover({ placement: 'right' }); //popover.$tip.addClass(popover.options.placement); //if (popover !== undefined) { // popover.setContent(); // //popover.options.content = popover.options.content; // //var tip = popover.tip(); // //if (tip.is(':visible')) { // // tip.find('#Attachment_list').html(data); // //} //} this.popoverIcon.parent().find('[id^="popover"].popover:visible').popover('reposition'); } }); } else { $(this).next().find('#Attachment_list').html(wAttachmentResultHTML) } if (wPreviouseAttachmentList !== undefined) { $(wPreviouseAttachmentList).find('[id^="popover"].popover:visible').popover('hide'); } wPreviouseAttachmentList = $(this).parent(); return $(this).next().html();//$(this).parent().find('.popover').html(); } }); $('#' + GuidID + ' tbody [data-toggle="popover"]').popover({ html: true, trigger: 'click', content: function () { var row = $(this).parent().parent().parent().children().not('.overflow'); var icons = $(this).parent().parent().find('.popovercontent').html(); var contents = '
'; for (var i = 0; i < row.length; i++) { if (!$(row.get(i)).is('.no-summary, .more-info-icons, .quick-launch-icons, .column-hidden, :visible')) { var $td = $(row.get(i)); var $th = $td.closest('table').find('th').eq(i); contents += "" + $th.text() + "
" + $td.html() + "

"; } } contents += '
'; return icons + contents; } }); $('[data-toggle="WLtooltip"]').tooltip({ container: 'body' }); $('#' + GuidID + ' tbody [data-toggle^="popover-"]').popover({ html: true, trigger: 'click', content: function () { //var contents = '
'; //contents = "-Attachments-" //contents += '
'; return $(this).parent().children()[1].innerHTML; } }); } function changePage(GuidID, aPage, aDataGuidName) { wDataContainer = GuidID; if (ActiveTabLoading && aDataGuidName !== undefined && aDataGuidName != null) { wDataContainer = aDataGuidName } $('#' + GuidID+ '').attr('Current-page', aPage); var WLData = wWorkingDataTable[wDataContainer]; var pagingSize = $('#' + "SearchResults").attr('Rows-per-page'); $(".my-pageable-grid-table .RowsPerPage option[value=" + pagingSize + "]").prop('selected', 'selected'); $('.my-pageable-grid-table #RowsPerPage option').each(function () { if ($(this).val() == pagingSize) { $('#' + GuidID + '').attr('Rows-per-page', pagingSize); $(".my-pageable-grid-table .RowsPerPage option[value=" + pagingSize + "]").prop('selected', 'selected'); return false; } else { $('#' + "SearchResults").attr('Rows-per-page', 10); } }); BuildGridResults(GuidID, wDataContainer); GenerateWLPages(GuidID, wDataContainer); if (typeof WLGenericTabSelectedPage == 'function') { WLGenericTabSelectedPage(aPage); } } function ClosePopover() { $('[id^="popover"].popover:visible').popover('hide'); } $(".my-pageable-grid-table .RowsPerPage").change(function () { var WLPerPage = parseInt($(this)[0].value); if (typeof WLGenericTabSelectedRowsPerPage == 'function') { WLGenericTabSelectedRowsPerPage(WLPerPage); } var wGrid = $(this).closest('table'); var GuidID = wGrid.attr('id'); var wTabName = wGrid.attr('ActiveTabName'); var wDataContainer = GuidID; if (wTabName !== undefined) { wDataContainer = GuidID + "_" + wTabName; } wGrid.attr('Rows-per-page', WLPerPage); BuildGridResults(GuidID, wDataContainer); GenerateWLPages(GuidID, wDataContainer); GenerateWLPerPages(GuidID, wDataContainer); var WLPage = wGrid.attr('Current-page')*1; if (WLPage > 1) { changePage(GuidID, 1, wDataContainer) } }); function GenerateWLPages(GuidID, aDataGuidName) { wDataContainer = GuidID; if (ActiveTabLoading && aDataGuidName !== undefined && aDataGuidName != null) { wDataContainer = aDataGuidName } var WLData = wWorkingDataTable[wDataContainer]; if (WLData === undefined) { if (wDataContainer != GuidID) { WLData = wWorkingDataTable[GuidID]; } } var WLTotalRows = WLData.length; var wGrid = $('#' + GuidID + ''); var WLPerPage = wGrid.attr('Rows-per-page') * 1; var WLPage = wGrid.attr('Current-page') * 1; var wGridFooterPages = $('#' + GuidID + ' tfoot .PageCount'); if (WLData.length <= WLPerPage) { $('#' + GuidID + ' tfoot').hide(); return } else { $('#' + GuidID + ' tfoot').show(); } if (wGridAttributes[GuidID].hasOwnProperty("FullResultSetDisplayed") && wGridAttributes[GuidID]["FullResultSetDisplayed"] == true) { $('#' + GuidID + ' tfoot').hide(); } wWLPages = ""; if (WLPage > 1) { //var wWLPages = "
  • « Previous
  • "; var wWLPages = "
  • " + wArrowPrev + "
  • ";//« Prev } i = 1; var wPageCount = Math.ceil(WLTotalRows / WLPerPage); var wSparsePages = false; var wSparseSeparator = "..."; if (wGridAttributes[GuidID].PageSpacingCount != null) { if (wPageCount > wGridAttributes[GuidID].PageSpacingCount) { wSparsePages = true; } if (wGridAttributes[GuidID].PageSpacingSeparator != null) { wSparseSeparator = wGridAttributes[GuidID].PageSpacingSeparator; } var StartCount = 1; var MidCount = 3; var EndCount = 1; if (wGridAttributes[GuidID].PageSpacingFormat != null) { if (wGridAttributes[GuidID].PageSpacingFormat.length > 0) { StartCount = wGridAttributes[GuidID].PageSpacingFormat[0].length; } if (wGridAttributes[GuidID].PageSpacingFormat.length > 1) { MidCount = wGridAttributes[GuidID].PageSpacingFormat[1].length; } if (wGridAttributes[GuidID].PageSpacingFormat.length > 2) { EndCount = wGridAttributes[GuidID].PageSpacingFormat[2].length; } } } while (i <= Math.ceil(WLTotalRows / WLPerPage)) { Appliedclass = ""; if (i == WLPage) { Appliedclass = " class=\"active\""; } if (wSparsePages) { if (WLPage == 1) { if (StartCount < MidCount) { StartCount = MidCount; } } else if (WLPage >= (wPageCount - MidCount - 1)) { if (EndCount < MidCount - 1) { EndCount = MidCount - 1; } } if (i > StartCount && i < (WLPage - Math.floor(MidCount * .5)) && i < (wPageCount + 1) - EndCount) { if (wSparseSeparator != null && wSparseSeparator != "") { wWLPages += "
  • " + wSparseSeparator + ""; wWLPages += "
  • "; } i = (WLPage - Math.floor(MidCount * .5)); continue; } else if (i > WLPage + Math.floor(MidCount * .5) && i < ((wPageCount + 1) - EndCount) && i > StartCount) { if (wSparseSeparator != null && wSparseSeparator != "") { wWLPages += "
  • " + wSparseSeparator + ""; wWLPages += "
  • "; } i = ((wPageCount + 1) - EndCount); continue; } } wWLPages += "" + i + ""; i++; } if (WLPage < i - 1) { wWLPages += "
  • " + wArrowNext + "
  • ";//Next » } wGridFooterPages[0].innerHTML = wWLPages; //$('#' + GuidID +' ul.pagination').menu(); } function SetTotalRow(GuidID, aDataGuidName) { wDataContainer = GuidID; if (ActiveTabLoading && aDataGuidName !== undefined && aDataGuidName != null) { wDataContainer = aDataGuidName } var WLMasterData = wMasterDataTable[wDataContainer]; var WLData = wWorkingDataTable[wDataContainer]; var WLLengthCount = WLMasterData.length; if (typeof ActiveBaseFilterCount == 'function') { var wActiveSystemCriteria = null; if (wlSystemCriteria !== undefined && wlSystemCriteria != null && wlSystemCriteria.hasOwnProperty(GuidID) && wlSystemCriteria[GuidID] != null) { wActiveSystemCriteria = wlSystemCriteria[GuidID]; } WLLengthCount = ActiveBaseFilterCount(wFilteringDataTable[GuidID], wMasterDataTable[wDataContainer], wActiveSystemCriteria) } if (WLData.length <= 0) { $('#' + GuidID + ' .TotalRowCount').hide(); } else { $('#' + GuidID + ' .TotalRowCount').show(); if (WLData.length < WLLengthCount) { $('#' + GuidID + ' .TotalRowCount')[0].innerHTML = String.format(wResultsoftotalrows, WLData.length, WLLengthCount)//" of " + WLData.length + " of total:" +WLLengthCount; } else { $('#' + GuidID + ' .TotalRowCount')[0].innerHTML = String.format(wResultsofrows, WLData.length)//" of " + WLData.length + " Rows"; } } } function GenerateWLPerPages(GuidID, aDataGuidName) { wDataContainer = GuidID; if (ActiveTabLoading && aDataGuidName !== undefined && aDataGuidName != null) { wDataContainer = aDataGuidName } var WLData = wWorkingDataTable[wDataContainer]; if (WLData === undefined) { if (wDataContainer != GuidID) { WLData = wWorkingDataTable[GuidID]; } } var WLTotalRows = WLData.length; var wGrid = $('#' + GuidID + ''); if (wGridAttributes[GuidID].hasOwnProperty("FullResultSetDisplayed") && wGridAttributes[GuidID]["FullResultSetDisplayed"] == true) { wGrid.attr('Rows-per-page',WLTotalRows); } var WLPerPage = wGrid.attr('Rows-per-page'); var WLPage = wGrid.attr('Current-page'); var WLDefaultPerPage = true; var select = $('#' + GuidID + ' tfoot .RowsPerPage')[0]; if (WLData.length <= WLPerPage) { $('#' + GuidID + ' tfoot').hide(); return; } if (WLData.length <= 0) { $(select).hide(); } else { $(select).show(); } select.innerHTML = ""; lastCount = 0; i = 5; while (i < WLTotalRows) { lastCount = i; var opt = document.createElement('option'); opt.value = i; opt.innerHTML = i; if (WLPerPage == i) { opt.selected = true; WLDefaultPerPage = false; } select.appendChild(opt); switch (i) { case 5: i += 5 break; case 10: i += 15 break; case 25: i += 25 break; default: i += 50 break; } } if (lastCount < WLTotalRows) { var opt = document.createElement('option'); opt.value = WLTotalRows; if (WLPerPage == WLTotalRows) { opt.selected = true; WLDefaultPerPage = false; } opt.innerHTML = WLTotalRows; select.appendChild(opt); } if (WLDefaultPerPage && wlSystemCriteria !== undefined && wlSystemCriteria != null && wlSystemCriteria.hasOwnProperty('Rows-per-page')) { var DefaultValue = wlSystemCriteria['Rows-per-page'] * 1; if (DefaultValue > 1 && DefaultValue == WLPerPage) { var opt = document.createElement('option'); opt.value = DefaultValue; opt.selected = true; opt.innerHTML = DefaultValue; select.appendChild(opt); } } SetTotalRow(GuidID, aDataGuidName); } $(".my-data-table").on("click", "tr.sub-heading", function (e) { if (e.target.tagName == "A" || e.target.tagName == "BUTTON") { return; } GroupID = $(this).attr('grouped-id') if (GroupID && GroupID != "") { $("tr[groupbyidvalue='" + GroupID + "']").toggle(); } }); //$(".my-data-table ").on("click", "tr.sub-heading", ToggleCollapseGroupedRows); //var ToggleCollapseGroupedRows = function () { // GroupID = $(this).attr('grouped-id'); // if (GroupID && GroupID != "") { // $("tr[groupbyidvalue='" + GroupID + "']").toggle(); // } //} $(".my-pageable-grid-table th a").click(function () { var wGrid = $(this).closest('table'); var GuidID = wGrid.attr('id'); var wTabName = wGrid.attr('ActiveTabName'); var wDataContainer = GuidID; if (ActiveTabLoading && wTabName !== undefined) { wDataContainer = GuidID + "_" + wTabName; } wSortingDataTable[wDataContainer] = JSON.parse('{}'); if (wSortingDataTable[wDataContainer] == null) { wSortingDataTable[wDataContainer] = JSON.parse('{}'); } var ColumnSortOrder = "ASC"; SortOrder = "ASC"; SortType = "Alph"; selectedColumn = $(this).attr('ColumnName') if ($(this).attr('sortByColumn') !== undefined) { selectedColumn = $(this).attr('sortByColumn'); } //$("#" + GuidID + ".my-custom-grid-table th a").each(function () { $("#" + GuidID + ".my-pageable-grid-table.my-data-table th a").each(function () { if (selectedColumn == $(this).attr('ColumnName')) { if (selectedColumn.toLowerCase().indexOf("date") > -1) { SortType = "Numeric"; if ($(this).find('span.glyphicon-sort-by-order').length != 0) { ColumnSortOrder = "DESC"; SortOrder = "DESC"; } } else { if ($(this).find('span.glyphicon-sort-by-alphabet').length != 0) { ColumnSortOrder = "DESC"; SortOrder = "DESC"; } } } }); wSortingDataTable[wDataContainer][selectedColumn] = JSON.parse("\"" + ColumnSortOrder + "\""); $.each($("#" + GuidID + " .glyphicon"), function (key, data) { var wSortingColumnHeader = $(data).parent().parent(); if ($(data).parent().attr('OriginalStyleWidth')) { var wOriginalWidth = wSortingColumnHeader.attr('OriginalStyleWidth'); if (wOriginalWidth !== undefined && wOriginalWidth != null && wOriginalWidth != "") { wSortingColumnHeader.width(wSortingColumnHeader.attr('OriginalStyleWidth')); } } wSortingColumnHeader.removeAttr('OriginalStyleWidth'); }); if (!ShiftClicked) { $(".my-pageable-grid-table th a .glyphicon").remove(); } else { $("[ColumnName=" + selectedColumn + "] .glyphicon").remove(); } var wWorkingColumn = $(this); var wCurrentWidth = wWorkingColumn.parent().width(); var wAppliedStyleWidth = true; if (wCurrentWidth == "") { wCurrentWidth = wWorkingColumn.parent()[0].offsetWidth; wAppliedStyleWidth = false; } var wCurrentParentOffsetHeight = wWorkingColumn.parent()[0].offsetHeight; $(this)[0].innerHTML += ""; if (wCurrentParentOffsetHeight < wWorkingColumn.parent()[0].offsetHeight) { wCurrentParentOffsetHeight = wWorkingColumn.parent()[0].offsetHeight; if (wAppliedStyleWidth) { wWorkingColumn[0].setAttribute("OriginalStyleWidth", wCurrentWidth); } wWorkingColumn.parent().width(wCurrentWidth + 40); if (wCurrentParentOffsetHeight > wWorkingColumn.parent()[0].offsetHeight) { wCurrentParentOffsetHeight = wWorkingColumn.parent()[0].offsetHeight; wWorkingColumn.parent().width(wCurrentWidth + 20); if (wCurrentParentOffsetHeight < wWorkingColumn.parent()[0].offsetHeight) { wWorkingColumn.parent().width(wCurrentWidth + 40); } } } SortWL(GuidID, wDataContainer) }); function SortWL(GuidID, aDataGuidName) { wDataContainer = GuidID; if (ActiveTabLoading && aDataGuidName !== undefined && aDataGuidName != null) { wDataContainer = aDataGuidName } var counter = 1; var sortScript = ""; if (wGridAttributes[GuidID]["GroupByData"]) { counter = 2; var GroupBySortData = "$." + wGridAttributes[GuidID]["GroupByData"]["GroupBy"]; sortScript = Enumerable.From(wWorkingDataTable[wDataContainer]).OrderByDescending(GroupBySortData) //wWorkingDataTable[GuidID] = Enumerable.From(wWorkingDataTable[GuidID]).GroupBy(GroupBySortData).ToArray() } if (wSortingDataTable[wDataContainer] != null) { $.each(wSortingDataTable[wDataContainer], function (key, data) { if (key.toLowerCase().indexOf('date') > -1) { var wDisplayFormat = (key.toLowerCase().indexOf("birth") > -1 ? WLDateFormat : WLLongDateFormat); sortby = function (x) { return new Date(parseInt(x[key].substr(6))) ; }; } else { sortby = "$." + key; } if (data.toUpperCase() == "DESC") { if (counter == 1) { sortScript = Enumerable.From(wWorkingDataTable[wDataContainer]).OrderByDescending(sortby); } else { sortScript = sortScript.ThenByDescending(sortby); } } else { if (counter == 1) { sortScript = Enumerable.From(wWorkingDataTable[wDataContainer]).OrderBy(sortby); } else { sortScript = sortScript.ThenBy(sortby); } } }); if (this.PrimaryKey != null && this.PrimaryKey != "") { if (sortScript = "") { sortScript = Enumerable.From(wWorkingDataTable[wDataContainer]).OrderByDescending("$." + this.PrimaryKey); } else { sortScript = sortScript.ThenByDescending("$." + this.PrimaryKey); } } } if (sortScript != "") { //wWorkingDataTable[GuidID]= Enumerable.From(sortScript).ToArray(); wWorkingDataTable[wDataContainer]= sortScript.ToArray(); } BuildGridResults(GuidID, wDataContainer); } function FilterWL(GuidID, aDataGuidName) { wDataContainerName = GuidID; if (ActiveTabLoading && aDataGuidName !== undefined && aDataGuidName != null) { wDataContainerName = aDataGuidName } SearchCriteria = wFilteringDataTable[GuidID]; var wFilteredData = FilterWLData(GuidID, SearchCriteria, wDataContainerName); var wGrid = $('#' + GuidID + ''); var WLPerPage = wGrid.attr('Rows-per-page'); if (WLPerPage % 5 == 0 || WLPerPage == wFilteredData.Data.length) { wGrid.attr('Rows-per-page', WLPerPage); } wFilteringSentence[GuidID] = wFilteredData.Sentence; wWorkingDataTable[wDataContainerName] = wFilteredData.Data; SortWL(GuidID, wDataContainerName); GenerateWLPerPages(GuidID, wDataContainerName) GenerateWLPages(GuidID, wDataContainerName) } function FilterWLData(GuidID, SearchCriteria, FullGuidDataName) { var wFilterData = JSON.parse('{}'); wFilterData.Data = []; if (SearchCriteria != null) { if (wMasterDataTable != null) { var wDataSet = null; if (wMasterDataTable.hasOwnProperty(FullGuidDataName)) { wDataSet = wMasterDataTable[FullGuidDataName]; } else if (wMasterDataTable.hasOwnProperty(GuidID)) { wDataSet = wMasterDataTable[GuidID]; } var wResult = FilterData(SearchCriteria, wDataSet) wFilterData.Data = wResult.Data; //wFilteringSentence[FullGuidDataName]= "Patients {0}with {1}{2}exams {3} for {4}.".format((SearchCriteria['patient_name']== null ? "" : "matching \"" +SearchCriteria['patient_name']+ "\" "), (SearchCriteria['status_code'] == null ? "": "" + SearchCriteria['status_code']+ " "), wModalityCriteria, wDayRangeCriteria, (SearchCriteria['requested_by_person_key']== null || SearchCriteria['requested_by_person_key'].length == OrderingProviderList.length ? "all providers" : "" +SearchCriteria['requested_by_person_key'].length + " provider" +(SearchCriteria['requested_by_person_key'].length > 1 ? "s": ""))); wFilterData.Sentence = wResult.FilterSentence; } } return wFilterData; } function FilterData(SearchCriteria, WLData) { var wFilterToolBarText = wTodayBRYesterday;//"Today &
    Yesterday"; var wFilterText = wTodayandYesterday;//"today and yesterday"; var wFilterRange = "-1/0"; var WFilteredStatus; var wStatusFilterCriteriaName; var wStatusCriteriaName; if (SearchCriteria.hasOwnProperty('portal_status_code') && SearchCriteria.portal_status_code != null && SearchCriteria.portal_status_code != "") { WFilteredStatus = SearchCriteria.portal_status_code; } if (SearchCriteria.hasOwnProperty('status_code') && SearchCriteria.status_code != null && SearchCriteria.status_code != "") { if (Array.isArray(SearchCriteria.status_code)) { if (Array.isArray(WFilteredStatus)) { WFilteredStatus = WFilteredStatus.concat(SearchCriteria.status_code); } else if (WFilteredStatus != "" && WFilteredStatus !== undefined) { var wCurrentFilteredStatus = WFilteredStatus; WFilteredStatus = SearchCriteria.status_code; WFilteredStatus.push(wCurrentFilteredStatus) } else { WFilteredStatus = SearchCriteria.status_code; } } else { if (Array.isArray(WFilteredStatus)) { WFilteredStatus.push(SearchCriteria.status_code) } else { WFilteredStatus = [WFilteredStatus, SearchCriteria.status_code]; } WFilteredStatus = SearchCriteria.status_code; } $.each(WFilteredStatus, function (index, data) { if (Array.isArray(wStatusFilterCriteriaName)) { wStatusFilterCriteriaName.push(TranslateStatusCode(data)) } else { wStatusFilterCriteriaName = [wStatusFilterCriteriaName, TranslateStatusCode(data)]; } }); wStatusCriteriaName = wStatusFilterCriteriaName.filter(function (x) { if (x !== undefined) { return x; } }); } if (WFilteredStatus != null && WFilteredStatus != "") { if (Array.isArray(WFilteredStatus)) { if ($.isInArray('Completed', WFilteredStatus) || $.isInArray('Approved', WFilteredStatus) || $.isInArray('Signed1', WFilteredStatus) || $.isInArray('ExamDoneTechOnly', WFilteredStatus) || $.isInArray('ExtReportVerified', WFilteredStatus) || $.isInArray('Dictated', WFilteredStatus) || $.isInArray('TentativelySigned1', WFilteredStatus) || $.isInArray('Transcribed', WFilteredStatus) || $.isInArray('ExamDone', WFilteredStatus) || $.isInArray('RepeatDone', WFilteredStatus) || $.isInArray('ReportDrafted', WFilteredStatus) || $.isInArray('OrderSigned', WFilteredStatus) || $.isInArray('OrderPendingApproval', WFilteredStatus) || $.isInArray('Pending Approval', WFilteredStatus) || $.isInArray('To be Scheduled', WFilteredStatus)) { if ($.isInArray('Scheduled', WFilteredStatus)) { wFilterToolBarText = wTodayplusminusDay;//"Today
    +/- 1 day";//"Today
    +/- 1 day"; wFilterText = wTodayYesterdayTomorrow;//"today, yesterday, and tomorrow "; var wFilterRange = "-1/1"; } else { wFilterToolBarText = wTodayBRYesterday;//"Today &
    Yesterday"; wFilterText = wTodayandYesterday;//"today and yesterday"; var wFilterRange = "-1/0"; } } else if ($.isInArray('Scheduled', WFilteredStatus)) { wFilterToolBarText = wTodayBRTomorrow;//"Today &
    Tomorrow"; wFilterText = wTodayandTomorrow;//"today and tomorrow"; var wFilterRange = "1/1"; } } else { if (WFilteredStatus == "Completed" || WFilteredStatus == "Approved" || WFilteredStatus == "Signed1" || WFilteredStatus == "ExamDoneTechOnly" || WFilteredStatus == "ExtReportVerified" || WFilteredStatus == "Dictated" || WFilteredStatus == "TentativelySigned1" || WFilteredStatus == "Transcribed" || WFilteredStatus == "ExamDone" || WFilteredStatus == "RepeatDone" || WFilteredStatus == "ReportDrafted" || WFilteredStatus == "OrderSigned" || WFilteredStatus == "OrderPendingApproval" || WFilteredStatus == "Pending Approval" || WFilteredStatus == "To be Scheduled") { wFilterToolBarText = wTodayBRYesterday;//"Today &
    Yesterday"; wFilterText = wTodayandYesterday;//"today and yesterday"; } else if (WFilteredStatus == "Scheduled") { wFilterToolBarText = wTodayBRTomorrow;//"Today &
    Tomorrow"; wFilterText = wTodayandTomorrow;//"today and tomorrow"; } } } var query = ""; var wExtraSerachCriteria = ""; var wDayRangeCriteria = ""; var wModalityCriteria = ""; if (SearchCriteria['modality_type'] != null) { if (Array.isArray(SearchCriteria['modality_type'])) { wModalityCriteria = Enumerable.From(SearchCriteria['modality_type']).Join(ProcedureGroupList, "selection=>selection", "ProcedureGroup=>ProcedureGroup.Value", "(selection,ProcedureGroup)=>{Value:ProcedureGroup.Value, Text:ProcedureGroup.Text}").Select("$.Text").ToArray().join(",") + " "; } else { wModalityCriteria = SearchCriteria['modality_type'].join(",") + " "; } } //(SearchCriteria['modality_type']== null ? "": "" +SearchCriteria['modality_type'].join(",") + " "); if (wModalityCriteria != "") { pos = wModalityCriteria.lastIndexOf(','); if (pos > 0) { wModalityCriteria = String.format(wExamtypelist, wModalityCriteria.substring(0, pos), wModalityCriteria.substring(pos + 1))//wModalityCriteria.substring(0, pos) + " and " + wModalityCriteria.substring(pos + 1) + " "; } } var wIncludeIfCCed = false; if (SearchCriteria.IncludeIfCCed != null) { wIncludeIfCCed = (SearchCriteria.IncludeIfCCed.toLowerCase() == "true"); } $.each(SearchCriteria, function (key, data) { //debugger; if (key == "IncludeIfCCed" || key == "FilterCriteriaSentence" || key == "patient_name") { return true; } //if ((key == "requested_by_person_key" || key == "modality_type") && data == "SELECTED ALL") { // return true; //} if (data == undefined || data == "") { return; } var wSpecificSearchCriteria = false; if (key == "patient_name" || key == "status_code" || key == "requested_by_person_key" || key == "modality_type") { wSpecificSearchCriteria = true; } filter = ""; if (SearchCriteria[key] != null && SearchCriteria[key] != "" && SearchCriteria[key] != "[]" && SearchCriteria[key].toString() != "SELECTED ALL") { if (query != "") { filter = " && "; } if (key[0] != key[0].toUpperCase() || key == "UMStatusCode" || key == "UMResolutionCode") { if (Array.isArray(SearchCriteria[key])) { if (WLData.length > 0 && Array.isArray(WLData[0][key])) { filter += " ("; $.each(data, function (index, data) { if (index > 0) { filter += " || "; } if (filter != "" && filter != " && (" && !filter.endsWith('|| ')) { filter += " || "; } if (data.toLowerCase() == "null") { filter += "Enumerable.From($." + key + ").Any('$==null')"; } else { filter += "Enumerable.From($." + key + ").Any('$==\"" + data + "\"')"; } }); filter += ") "; } else { filter += " ("; $.each(data, function (index, data) { if (index > 0) { filter += " || "; } if (data.toLowerCase() == "null") { filter += "$." + key + "==null"; } else { filter += "$." + key + "=='" + data + "'"; } //filter += "$." + key + "=='" + data + "'"; }); if (key == "requested_by_person_key" && wIncludeIfCCed) { $.each(data, function (index, data) { if (index > 0) { filter += " || "; } if (filter != "" && filter != " && (" && !filter.endsWith('|| ')) { filter += " || "; } filter += "Enumerable.From($.cc_doctor_key).Any('$==\"" + data + "\"')"; }); } filter += ") "; if (!wSpecificSearchCriteria) { wExtraSerachCriteria += wWLFilterCriteriaAnd + " " + data.length + "" + key + (data.length > 1 ? "s" : ""); //Add applied Filter } } } else if (typeof (SearchCriteria[key]) == "object") { SubQuery = ""; SubFilter = ""; $.each(SearchCriteria[key], function (CriteriaKey, data) { if (SubQuery != "") { SubFilter = " && "; } var Days = false; if (data % 1 === 0) { if (data == 0) { data = 1; } Days = true; data = dateFormat(new Date(new Date().setDate(new Date().getDate() + Number(data))), "mm/dd/yyyy"); //todo:date format } //new Date(parseInt(x[mDayRangeColumn].substr(6))) switch (CriteriaKey.toLowerCase()) { case "contains": SubFilter += "$." + key + "=='%" + data + "%'"; if (!wSpecificSearchCriteria) { wExtraSerachCriteria += String.format(wWLFilterCriteriaColumnContains, key, data)//"and " + key + " contains" + data;//Add applied Filter } break; case "start": SubFilter += "new Date(parseInt($." + key + ".substr(6))) >= new Date('" + data + "')"; wDayRangeCriteria += " " + (Days ? String.format(wWLFilterCriteriaWithinThe01Days, (data.toString()[0] == "-" ? wWLDayFilterPreviousCriteria : wWLDayFilterLastCriteria, (data.toString()[0] == "-" || data.toString()[0] == "+" ? data.toString().substr(1) : data))) : String.format(wWLFilterCriteriaGreaterThen0, dateFormat(new Date(data), jsDateFormat)));//Add applied Filter //SubFilter += "$." + key + " >= '" + data + "'"; break; case "end": SubFilter += "new Date(parseInt($." + key + ".substr(6))) <= new Date('" + data + "')"; wDayRangeCriteria += " " + (Days ? String.format(wWLFilterCriteriaWithinThe01Days, (data.toString()[0] == "-" ? wWLDayFilterPreviousCriteria : wWLDayFilterLastCriteria), (data.toString()[0] == "-" || data.toString()[0] == "+" ? data.toString().substr(1) : data)) : String.format(wWLFilterCriteriaLessThen0, dateFormat(new Date(data), jsDateFormat)));//Add applied Filter //SubFilter += "$." + key + " <= '" + data + "'"; break; } SubQuery += SubFilter; }); filter += SubQuery } else if (WLData.length > 0 && Array.isArray(WLData[0][key])) { filter += "Enumerable.From($." + key + ").Any('$==\"" + data + "\"')"; } else { if (data.toLowerCase() == "null") { filter += "$." + key + "==null"; } else { filter += "$." + key + "=='" + data + "'"; } //filter += "$." + key + "=='" + data + "'"; if (!wSpecificSearchCriteria) { wExtraSerachCriteria += String.format(wWLFilterCriteriaColumnMatching, key, data)//"and " + key + " matching" + data;//Add applied Filter } } } else { SubFilter = ""; if (typeof mDayRangeColumn === 'undefined') { mDayRangeColumn = "requested_date"; } switch (key) { case "DayRange": var wStatusSpecficRangeColumn = mDayRangeColumn; if (SearchCriteria.portal_status_code != null) { if (($.inArray('Completed', SearchCriteria.portal_status_code) > -1 || $.inArray('Approved', SearchCriteria.portal_status_code) > -1)) { wStatusSpecficRangeColumn = "performed_date"; } } else if (SearchCriteria.status_code != null) { if ($.inArray('Dictated', SearchCriteria.status_code) > -1 || $.inArray('ExamDone', SearchCriteria.status_code) > -1 || $.inArray('ExamDoneTechOnly', SearchCriteria.status_code) > -1 || $.inArray('ExtReportVerified', SearchCriteria.status_code) > -1 || $.inArray('RepeatDone', SearchCriteria.status_code) > -1 || $.inArray('ReportDrafted', SearchCriteria.status_code) > -1 || $.inArray('Signed1', SearchCriteria.status_code) > -1 || $.inArray('TentativelySigned1', SearchCriteria.status_code) > -1 || $.inArray('Transcribed', SearchCriteria.status_code) > -1) { wStatusSpecficRangeColumn = "performed_date"; } } var wRange = data if ($.isArray(data) && data.length > 0) { wRange = data[0]; } //if (data % 1 === 0) { // data = dateFormat(new Date(new Date().setDate(new Date().getDate() + Number(data * -1))), "mm/dd/yyyy"); //} switch (wRange) { case "0": case 0: case "-1": case -1: wDayRangeCriteria = wFilterText;//"today and tomorrow"; var StartDate = dateFormat(new Date(new Date().setDate(new Date().getDate() - 1)), "mm/dd/yyyy"); var EndDate = dateFormat(new Date(new Date().setDate(new Date().getDate() + 2)), "mm/dd/yyyy"); if (wFilterRange == "-1/0") { StartDate = dateFormat(new Date(new Date().setDate(new Date().getDate() - 1)), "mm/dd/yyyy"); EndDate = dateFormat(new Date(new Date().setDate(new Date().getDate() + 1)), "mm/dd/yyyy"); } else if (wFilterRange == "-1/1") { StartDate = dateFormat(new Date(new Date().setDate(new Date().getDate() - 1)), "mm/dd/yyyy"); EndDate = dateFormat(new Date(new Date().setDate(new Date().getDate() + 2)), "mm/dd/yyyy"); } SubFilter += "new Date(parseInt($." + wStatusSpecficRangeColumn + ".substr(6))) >= new Date('" + StartDate + "')"; SubFilter += " && "; SubFilter += "new Date(parseInt($." + wStatusSpecficRangeColumn + ".substr(6))) <= new Date('" + EndDate + "')"; break; default: if (SearchCriteria.portal_status_code != null) { var StatusDateFilter = ""; if ($.inArray('Scheduled', SearchCriteria.portal_status_code) > -1) { var StartDate = dateFormat(new Date(new Date().setDate(new Date().getDate() + Number(data * -1))), "mm/dd/yyyy"); if (StatusDateFilter != "") { StatusDateFilter += " && "; } StatusDateFilter += "new Date(parseInt($." + wStatusSpecficRangeColumn + ".substr(6))) >= new Date('" + StartDate + "')"; if (wDayRangeCriteria != "") { wDayRangeCriteria += " " + wWLFilterCriteriaAnd + " "; } wDayRangeCriteria = wWLDayFilterNextCriteria; } if ($.inArray('Completed', SearchCriteria.portal_status_code) > -1 || $.inArray('Approved', SearchCriteria.status_code) > -1 || $.inArray('OrderSigned', SearchCriteria.status_code) > -1 || $.inArray('To be Scheduled', SearchCriteria.portal_status_code) > -1 || $.inArray('OrderDrafted', SearchCriteria.status_code) > -1 || $.inArray('Order Drafted', SearchCriteria.portal_status_code) > -1 || $.inArray('OrderPendingApproval', SearchCriteria.status_code) > -1 || $.inArray('Pending Approval', SearchCriteria.portal_status_code) > -1) { var StartDate = dateFormat(new Date(new Date().setDate(new Date().getDate() + Number(data * -1))), "mm/dd/yyyy"); if (StatusDateFilter != "") { StatusDateFilter += " && "; } StatusDateFilter += "new Date(parseInt($." + wStatusSpecficRangeColumn + ".substr(6))) >= new Date('" + StartDate + "')"; if (wDayRangeCriteria != "") { wDayRangeCriteria += " " + wWLFilterCriteriaAnd + " "; } wDayRangeCriteria += wWLDayFilterPreviousCriteria; } SubFilter += StatusDateFilter; } else if (SearchCriteria.status_code != null) { var StatusDateFilter = ""; if ($.inArray('Scheduled', SearchCriteria.status_code) > -1) { var StartDate = dateFormat(new Date(new Date().setDate(new Date().getDate() + Number(data * -1))), "mm/dd/yyyy"); if (StatusDateFilter != "") { StatusDateFilter += " && "; } StatusDateFilter += "new Date(parseInt($." + wStatusSpecficRangeColumn + ".substr(6))) >= new Date('" + StartDate + "')"; if (wDayRangeCriteria != "") { wDayRangeCriteria += " " + wWLFilterCriteriaAnd + " "; } wDayRangeCriteria = wWLDayFilterNextCriteria; } if ($.inArray('Dictated', SearchCriteria.status_code) > -1 || $.inArray('ExamDone', SearchCriteria.status_code) > -1 || $.inArray('ExamDoneTechOnly', SearchCriteria.status_code) > -1 || $.inArray('ExtReportVerified', SearchCriteria.status_code) > -1 || $.inArray('RepeatDone', SearchCriteria.status_code) > -1 || $.inArray('ReportDrafted', SearchCriteria.status_code) > -1 || $.inArray('Signed1', SearchCriteria.status_code) > -1 || $.inArray('TentativelySigned1', SearchCriteria.status_code) > -1 || $.inArray('Transcribed', SearchCriteria.status_code) > -1 || $.inArray('OrderSigned', SearchCriteria.status_code) > -1 || $.inArray('OrderDrafted', SearchCriteria.status_code) > -1 || $.inArray('OrderPendingSigned', SearchCriteria.status_code) > -1) { var StartDate = dateFormat(new Date(new Date().setDate(new Date().getDate() + Number(data * -1))), "mm/dd/yyyy"); if (StatusDateFilter != "") { StatusDateFilter += " && "; } StatusDateFilter += "new Date(parseInt($." + wStatusSpecficRangeColumn + ".substr(6))) >= new Date('" + StartDate + "')"; if (wDayRangeCriteria != "") { wDayRangeCriteria += " " + wWLFilterCriteriaAnd + " "; } wDayRangeCriteria += wWLDayFilterPreviousCriteria } SubFilter += StatusDateFilter; } else { wDayRangeCriteria = wWLDayFilterPreviousAndNextCriteria; var StartDate = dateFormat(new Date(new Date().setDate(new Date().getDate() + Number(data * -1))), "mm/dd/yyyy"); var EndDate = dateFormat(new Date(new Date().setDate(new Date().getDate() + (Number(data) + 1))), "mm/dd/yyyy"); SubFilter += "new Date(parseInt($." + wStatusSpecficRangeColumn + ".substr(6))) >= new Date('" + StartDate + "')"; SubFilter += " && "; SubFilter += "new Date(parseInt($." + wStatusSpecficRangeColumn + ".substr(6))) <= new Date('" + EndDate + "')"; } wDayRangeCriteria = String.format(wWLDayFilterCriteria, wDayRangeCriteria, wRange); break; } filter += SubFilter; //SubFilter += "new Date(parseInt($." + mDayRangeColumn + ".substr(6))) >= new Date('" +data + "')"; break; default: // Copy of lowercase filter, duplicated filter criteria in case where upper case does need ot be ahndled differently if (Array.isArray(SearchCriteria[key])) { if (WLData.length > 0 && Array.isArray(WLData[0][key])) { filter += " ("; $.each(data, function (index, data) { if (index > 0) { filter += " || "; } if (filter != "" && filter != " && (" && !filter.endsWith('|| ')) { filter += " || "; } filter += "Enumerable.From($." + key + ").Any('$==\"" + data + "\"')"; }); filter += ") "; } else { filter += " ("; $.each(data, function (index, data) { if (index > 0) { filter += " || "; } //filter += "$." + key + "=='" + data + "'"; if (data.toLowerCase() == "null") { filter += "$." + key + "==null"; } else { filter += "$." + key + "=='" + data + "'"; } }); if (key == "requested_by_person_key" && wIncludeIfCCed) { $.each(data, function (index, data) { if (index > 0) { filter += " || "; } if (filter != "" && filter != " && (" && !filter.endsWith('|| ')) { filter += " || "; } filter += "Enumerable.From($.cc_doctor_key).Any('$==\"" + data + "\"')"; }); } filter += ") "; if (!wSpecificSearchCriteria) { wExtraSerachCriteria += "and " + data.length + "" + key + (data.length > 1 ? "s" : ""); //Add applied Filter } } } else if (typeof (SearchCriteria[key]) == "object") { SubQuery = ""; SubFilter = ""; $.each(SearchCriteria[key], function (CriteriaKey, data) { if (SubQuery != "") { SubFilter = " && "; } var Days = false; if (data % 1 === 0) { Days = true; data = dateFormat(new Date(new Date().setDate(new Date().getDate() + Number(data))), "mm/dd/yyyy"); //todo:date format } //new Date(parseInt(x[mDayRangeColumn].substr(6))) switch (CriteriaKey.toLowerCase()) { case "contains": SubFilter += "$." + key + "=='%" + data + "%'"; if (!wSpecificSearchCriteria) { wExtraSerachCriteria += "and " + key + " contains" + data;//Add applied Filter } break; case "start": SubFilter += "new Date(parseInt($." + key + ".substr(6))) >= new Date('" + data + "')"; wDayRangeCriteria += "" + (Days ? " within the " + (data.toString()[0] == "-" ? "previous " : "last ") + (data.toString()[0] == "-" || data.toString()[0] == "+" ? data.toString().substr(1) : data) + " days" : "greater then " + dateFormat(new Date(data), jsDateFormat));//Add applied Filter //SubFilter += "$." + key + " >= '" + data + "'"; break; case "end": SubFilter += "new Date(parseInt($." + key + ".substr(6))) <= new Date('" + data + "')"; wDayRangeCriteria += "" + (Days ? " within the " + (data.toString()[0] == "-" ? "previous " : "last ") + (data.toString()[0] == "-" || data.toString()[0] == "+" ? data.toString().substr(1) : data) + " days" : "less then " + dateFormat(new Date(data), jsDateFormat));//Add applied Filter //SubFilter += "$." + key + " <= '" + data + "'"; break; } SubQuery += SubFilter; }); filter += SubQuery } else if (WLData.length > 0 && Array.isArray(WLData[0][key])) { filter += "Enumerable.From($." + key + ").Any('$==\"" + data + "\"')"; } else { //filter += "$." + key + "=='" + data + "'"; if (data.toLowerCase() == "null") { filter += "$." + key + "==null"; } else { filter += "$." + key + "=='" + data + "'"; } if (!wSpecificSearchCriteria) { wExtraSerachCriteria += "and " + key + " matching" + data;//Add applied Filter } } break; } } if (filter == " && " || filter == " || ") { filter = "" } } query += filter; }); query = query.replaceAll('&& &&', '&&'); query = query.replaceAll('|| ||', '||'); if (query.endsWith('&& ')) { query = query.substring(0, query.lastIndexOf('&&')); } if (query.endsWith('|| ')) { query = query.substring(0, query.lastIndexOf('||')); } query = query.trim(); var FilteredData = Enumerable.From(WLData).Where(query).ToArray(); if (SearchCriteria.patient_name != null) { FilteredData = Enumerable.From(FilteredData).Where(function (x) { return (x.patient_name.toLowerCase().indexOf(SearchCriteria.patient_name.toLowerCase()) !== -1) }).ToArray() wExtraSerachCriteria += "and " + SearchCriteria.patient_name + " contains" + SearchCriteria.patient_name; } var wRequestedByCriteriaName = ""; if (SearchCriteria['requested_by_person_key'] != null && SearchCriteria['requested_by_person_key'] != "SELECTED ALL" && SearchCriteria['requested_by_person_key'].length <= 2) { var wRequestedQuery = ""; var wRequestedByNamesArry = Enumerable.From(OrderingProviderList).Where(function (x) { return Enumerable.From(SearchCriteria['requested_by_person_key']).Contains(x.Value) }).Select("$.Text").ToArray() if (SearchCriteria['requested_by_person_key'].length > 0) { if (wRequestedByNamesArry.length == 0) { try { if (ProviderFilterList !== undefined) { wRequestedByNamesArry = Enumerable.From(ProviderFilterList).Where(function (x) { return Enumerable.From(SearchCriteria['requested_by_person_key']).Contains(x.Value) }).Select("$.Text").ToArray() } } catch (e) { console.log('ProviderFilterList not defined'); } } } var wRequestedByCriteriaName = (wRequestedByNamesArry == null ? "" : "" + wRequestedByNamesArry.join("~")); if (wRequestedByCriteriaName != "") { pos = wRequestedByCriteriaName.lastIndexOf('~'); if (pos > 0) { wRequestedByCriteriaName = wRequestedByCriteriaName.substring(0, pos) + " or " + wRequestedByCriteriaName.substring(pos + 1); } wRequestedByCriteriaName = wRequestedByCriteriaName.replace(new RegExp('~', 'g'), ","); } } var ProcedureGroupListlength = ""; var ProcedureGroupListlengthValue = ""; var StatusList = ""; //var wRequestedByFilter = (SearchCriteria['requested_by_person_key'] == null || SearchCriteria['requested_by_person_key'].length == OrderingProviderList.length ? "all providers" : "" + (SearchCriteria['requested_by_person_key'].length > 2 || (wRequestedByCriteriaName != null && wRequestedByCriteriaName != "") ? SearchCriteria['requested_by_person_key'].length + " provider" + (SearchCriteria['requested_by_person_key'].length > 1 ? "s" : "") : wRequestedByCriteriaName) + (wIncludeIfCCed ? " including cc doctors" : "")) var wRequestedByFilter = ""; if (SearchCriteria['requested_by_person_key'] == null || SearchCriteria['requested_by_person_key'] == "SELECTED ALL") { wRequestedByFilter = wAllProviders; } else { if (SearchCriteria['requested_by_person_key'].length > 2) { if (wIncludeIfCCed) { wRequestedByFilter = String.format(wIncludingccdoctors, String.format(wProviders, SearchCriteria['requested_by_person_key'].length)); } else { wRequestedByFilter = String.format(wProviders, SearchCriteria['requested_by_person_key'].length); } } else { if (wIncludeIfCCed) { wRequestedByFilter = String.format(wIncludingccdoctors, wRequestedByCriteriaName); } else { wRequestedByFilter = wRequestedByCriteriaName; } } } if ($.inArray('Completed', SearchCriteria.portal_status_code) > -1 || ($.inArray('Approved', SearchCriteria.portal_status_code) > -1 && $.inArray('Completed', SearchCriteria.portal_status_code) > -1)) { ProcedureGroupListlength = "completed exams"; ProcedureGroupListlengthValue = " completed "; //$.ajax({ type: "POST", url: BaseRootURL + '/AJAX/CountersAction', data: { counter_type_code: "completed_tab_rp" } }); //LogMyCounter("completed_tab_rp"); } else if ($.inArray('Scheduled', SearchCriteria.portal_status_code) > -1) { ProcedureGroupListlength = "scheduled exams"; ProcedureGroupListlengthValue = "scheduled "; //LogMyCounter("scheduled_tab_rp"); } else if ($.inArray('In Progress', SearchCriteria.portal_status_code) > -1) { ProcedureGroupListlength = "in progress exams"; ProcedureGroupListlengthValue = " in progress "; wDayRangeCriteria = ""; //LogMyCounter("inprogress_tab_rp"); } else if ($.inArray('OrderSigned', SearchCriteria.status_code) > -1) { ProcedureGroupListlength = "ordered exams"; ProcedureGroupListlengthValue = " ordered "; } else { var WFilteredStatus; if (SearchCriteria.hasOwnProperty('portal_status_code') && SearchCriteria.portal_status_code != null && SearchCriteria.portal_status_code != "") { WFilteredStatus = SearchCriteria.portal_status_code; } if (SearchCriteria.hasOwnProperty('status_code') && SearchCriteria.status_code != null && SearchCriteria.status_code != "") { if (Array.isArray(SearchCriteria.status_code)) { if (Array.isArray(WFilteredStatus)) { WFilteredStatus = WFilteredStatus.concat(SearchCriteria.status_code); } else if (WFilteredStatus != "" && WFilteredStatus !== undefined) { var wCurrentFilteredStatus = WFilteredStatus; WFilteredStatus = TranslateStatusCode(SearchCriteria.status_code); WFilteredStatus.push(wCurrentFilteredStatus) } else { WFilteredStatus = TranslateStatusCode(SearchCriteria.status_code); } } else { if (Array.isArray(WFilteredStatus)) { WFilteredStatus.push(TranslateStatusCode(SearchCriteria.status_code)) } else { WFilteredStatus = [WFilteredStatus, TranslateStatusCode(SearchCriteria.status_code)]; } WFilteredStatus = TranslateStatusCode(SearchCriteria.status_code); } } if (Array.isArray(WFilteredStatus)) { StatusList = WFilteredStatus.toString(); } else { StatusList = WFilteredStatus; } ProcedureGroupListlength = String.format(wSingleExamType, StatusList);//StatusList+" exams"; ProcedureGroupListlengthValue = " " + StatusList + " "; } //var wModalityTypeFilter = (SearchCriteria['modality_type'] == null ? ProcedureGroupListlength : (SearchCriteria['modality_type'].length == ProcedureGroupList.length ? ProcedureGroupListlengthValue+" all exam types" : ProcedureGroupListlengthValue + (SearchCriteria['modality_type'].length > 0 ? wModalityCriteria + " exams" : + ""))); var wModalityTypeFilter = "" if (SearchCriteria['modality_type'] == null || SearchCriteria['modality_type'].length == ProcedureGroupList.length || SearchCriteria['modality_type'] == "SELECTED ALL") { wModalityTypeFilter = wAllexamtypes; } else if (SearchCriteria['modality_type'].length > 2) { wModalityTypeFilter = String.format(wExamtypes, SearchCriteria['modality_type'].length); } else { wModalityTypeFilter = String.format(wPortalSearchSummarySentenceExamType, wModalityCriteria); } //var wModalityTypeFilter = (SearchCriteria['modality_type'] == null || SearchCriteria['modality_type'].length == ProcedureGroupList.length ? ProcedureGroupListlength : ProcedureGroupListlengthValue + (SearchCriteria['modality_type'].length > 0 ? wModalityCriteria + " exams" : + "")); //var Sentence = "Patients {0}with {1}{2} {3} by {4}.".format((SearchCriteria['patient_name'] == null ? "" : "matching \"" + SearchCriteria['patient_name'] + "\" "), (SearchCriteria['status_code'] == null ? "" : ""), wModalityTypeFilter, wDayRangeCriteria, wRequestedByFilter); var Sentence = String.format(wPortalSearchSummarySentence, (SearchCriteria['patient_name'] == null ? "" : "" + String.format(wPortalSearchSummarySentenceMatchName, SearchCriteria['patient_name']) + ""), (wStatusCriteriaName == null ? "" : String.format(wPortalSearchSummarySentenceStatus, wStatusCriteriaName)), wModalityTypeFilter, wDayRangeCriteria, wRequestedByFilter); return { Data: FilteredData, FilterSentence: Sentence }; } /*-------------------------------------------------------------------------- * linq.js - LINQ for JavaScript * ver 2.2.0.2 (Jan. 21th, 2011) * * created and maintained by neuecc * licensed under Microsoft Public License(Ms-PL) * http://neue.cc/ * http://linqjs.codeplex.com/ *--------------------------------------------------------------------------*/ Enumerable = (function () { var Enumerable = function (getEnumerator) { this.GetEnumerator = getEnumerator; } // Generator Enumerable.Choice = function () // variable argument { var args = (arguments[0] instanceof Array) ? arguments[0] : arguments; return new Enumerable(function () { return new IEnumerator( Functions.Blank, function () { return this.Yield(args[Math.floor(Math.random() * args.length)]); }, Functions.Blank); }); } Enumerable.Cycle = function () // variable argument { var args = (arguments[0] instanceof Array) ? arguments[0] : arguments; return new Enumerable(function () { var index = 0; return new IEnumerator( Functions.Blank, function () { if (index >= args.length) index = 0; return this.Yield(args[index++]); }, Functions.Blank); }); } Enumerable.Empty = function () { return new Enumerable(function () { return new IEnumerator( Functions.Blank, function () { return false; }, Functions.Blank); }); } Enumerable.From = function (obj) { if (obj == null) { return Enumerable.Empty(); } if (obj instanceof Enumerable) { return obj; } if (typeof obj == Types.Number || typeof obj == Types.Boolean) { return Enumerable.Repeat(obj, 1); } if (typeof obj == Types.String) { return new Enumerable(function () { var index = 0; return new IEnumerator( Functions.Blank, function () { return (index < obj.length) ? this.Yield(obj.charAt(index++)) : false; }, Functions.Blank); }); } if (typeof obj != Types.Function) { // array or array like object if (typeof obj.length == Types.Number) { return new ArrayEnumerable(obj); } // JScript's IEnumerable if (!(obj instanceof Object) && Utils.IsIEnumerable(obj)) { return new Enumerable(function () { var isFirst = true; var enumerator; return new IEnumerator( function () { enumerator = new Enumerator(obj); }, function () { if (isFirst) isFirst = false; else enumerator.moveNext(); return (enumerator.atEnd()) ? false : this.Yield(enumerator.item()); }, Functions.Blank); }); } } // case function/object : Create KeyValuePair[] return new Enumerable(function () { var array = []; var index = 0; return new IEnumerator( function () { for (var key in obj) { if (!(obj[key] instanceof Function)) { array.push({ Key: key, Value: obj[key] }); } } }, function () { return (index < array.length) ? this.Yield(array[index++]) : false; }, Functions.Blank); }); }, Enumerable.Return = function (element) { return Enumerable.Repeat(element, 1); } // Overload:function(input, pattern) // Overload:function(input, pattern, flags) Enumerable.Matches = function (input, pattern, flags) { if (flags == null) flags = ""; if (pattern instanceof RegExp) { flags += (pattern.ignoreCase) ? "i" : ""; flags += (pattern.multiline) ? "m" : ""; pattern = pattern.source; } if (flags.indexOf("g") === -1) flags += "g"; return new Enumerable(function () { var regex; return new IEnumerator( function () { regex = new RegExp(pattern, flags) }, function () { var match = regex.exec(input); return (match) ? this.Yield(match) : false; }, Functions.Blank); }); } // Overload:function(start, count) // Overload:function(start, count, step) Enumerable.Range = function (start, count, step) { if (step == null) step = 1; return Enumerable.ToInfinity(start, step).Take(count); } // Overload:function(start, count) // Overload:function(start, count, step) Enumerable.RangeDown = function (start, count, step) { if (step == null) step = 1; return Enumerable.ToNegativeInfinity(start, step).Take(count); } // Overload:function(start, to) // Overload:function(start, to, step) Enumerable.RangeTo = function (start, to, step) { if (step == null) step = 1; return (start < to) ? Enumerable.ToInfinity(start, step).TakeWhile(function (i) { return i <= to; }) : Enumerable.ToNegativeInfinity(start, step).TakeWhile(function (i) { return i >= to; }) } // Overload:function(obj) // Overload:function(obj, num) Enumerable.Repeat = function (obj, num) { if (num != null) return Enumerable.Repeat(obj).Take(num); return new Enumerable(function () { return new IEnumerator( Functions.Blank, function () { return this.Yield(obj); }, Functions.Blank); }); } Enumerable.RepeatWithFinalize = function (initializer, finalizer) { initializer = Utils.CreateLambda(initializer); finalizer = Utils.CreateLambda(finalizer); return new Enumerable(function () { var element; return new IEnumerator( function () { element = initializer(); }, function () { return this.Yield(element); }, function () { if (element != null) { finalizer(element); element = null; } }); }); } // Overload:function(func) // Overload:function(func, count) Enumerable.Generate = function (func, count) { if (count != null) return Enumerable.Generate(func).Take(count); func = Utils.CreateLambda(func); return new Enumerable(function () { return new IEnumerator( Functions.Blank, function () { return this.Yield(func()); }, Functions.Blank); }); } // Overload:function() // Overload:function(start) // Overload:function(start, step) Enumerable.ToInfinity = function (start, step) { if (start == null) start = 0; if (step == null) step = 1; return new Enumerable(function () { var value; return new IEnumerator( function () { value = start - step }, function () { return this.Yield(value += step); }, Functions.Blank); }); } // Overload:function() // Overload:function(start) // Overload:function(start, step) Enumerable.ToNegativeInfinity = function (start, step) { if (start == null) start = 0; if (step == null) step = 1; return new Enumerable(function () { var value; return new IEnumerator( function () { value = start + step }, function () { return this.Yield(value -= step); }, Functions.Blank); }); } Enumerable.Unfold = function (seed, func) { func = Utils.CreateLambda(func); return new Enumerable(function () { var isFirst = true; var value; return new IEnumerator( Functions.Blank, function () { if (isFirst) { isFirst = false; value = seed; return this.Yield(value); } value = func(value); return this.Yield(value); }, Functions.Blank); }); } // Extension Methods Enumerable.prototype = { /* Projection and Filtering Methods */ // Overload:function(func) // Overload:function(func, resultSelector) // Overload:function(func, resultSelector) CascadeBreadthFirst: function (func, resultSelector) { var source = this; func = Utils.CreateLambda(func); resultSelector = Utils.CreateLambda(resultSelector); return new Enumerable(function () { var enumerator; var nestLevel = 0; var buffer = []; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { while (true) { if (enumerator.MoveNext()) { buffer.push(enumerator.Current()); return this.Yield(resultSelector(enumerator.Current(), nestLevel)); } var next = Enumerable.From(buffer).SelectMany(function (x) { return func(x); }); if (!next.Any()) { return false; } else { nestLevel++; buffer = []; Utils.Dispose(enumerator); enumerator = next.GetEnumerator(); } } }, function () { Utils.Dispose(enumerator); }); }); }, // Overload:function(func) // Overload:function(func, resultSelector) // Overload:function(func, resultSelector) CascadeDepthFirst: function (func, resultSelector) { var source = this; func = Utils.CreateLambda(func); resultSelector = Utils.CreateLambda(resultSelector); return new Enumerable(function () { var enumeratorStack = []; var enumerator; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { while (true) { if (enumerator.MoveNext()) { var value = resultSelector(enumerator.Current(), enumeratorStack.length); enumeratorStack.push(enumerator); enumerator = Enumerable.From(func(enumerator.Current())).GetEnumerator(); return this.Yield(value); } if (enumeratorStack.length <= 0) return false; Utils.Dispose(enumerator); enumerator = enumeratorStack.pop(); } }, function () { try { Utils.Dispose(enumerator); } finally { Enumerable.From(enumeratorStack).ForEach(function (s) { s.Dispose(); }) } }); }); }, Flatten: function () { var source = this; return new Enumerable(function () { var enumerator; var middleEnumerator = null; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { while (true) { if (middleEnumerator != null) { if (middleEnumerator.MoveNext()) { return this.Yield(middleEnumerator.Current()); } else { middleEnumerator = null; } } if (enumerator.MoveNext()) { if (enumerator.Current() instanceof Array) { Utils.Dispose(middleEnumerator); middleEnumerator = Enumerable.From(enumerator.Current()) .SelectMany(Functions.Identity) .Flatten() .GetEnumerator(); continue; } else { return this.Yield(enumerator.Current()); } } return false; } }, function () { try { Utils.Dispose(enumerator); } finally { Utils.Dispose(middleEnumerator); } }); }); }, Pairwise: function (selector) { var source = this; selector = Utils.CreateLambda(selector); return new Enumerable(function () { var enumerator; return new IEnumerator( function () { enumerator = source.GetEnumerator(); enumerator.MoveNext(); }, function () { var prev = enumerator.Current(); return (enumerator.MoveNext()) ? this.Yield(selector(prev, enumerator.Current())) : false; }, function () { Utils.Dispose(enumerator); }); }); }, // Overload:function(func) // Overload:function(seed,func) // Overload:function(seed,func,resultSelector) Scan: function (seed, func, resultSelector) { if (resultSelector != null) return this.Scan(seed, func).Select(resultSelector); var isUseSeed; if (func == null) { func = Utils.CreateLambda(seed); // arguments[0] isUseSeed = false; } else { func = Utils.CreateLambda(func); isUseSeed = true; } var source = this; return new Enumerable(function () { var enumerator; var value; var isFirst = true; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { if (isFirst) { isFirst = false; if (!isUseSeed) { if (enumerator.MoveNext()) { return this.Yield(value = enumerator.Current()); } } else { return this.Yield(value = seed); } } return (enumerator.MoveNext()) ? this.Yield(value = func(value, enumerator.Current())) : false; }, function () { Utils.Dispose(enumerator); }); }); }, // Overload:function(selector) // Overload:function(selector) Select: function (selector) { var source = this; selector = Utils.CreateLambda(selector); return new Enumerable(function () { var enumerator; var index = 0; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { return (enumerator.MoveNext()) ? this.Yield(selector(enumerator.Current(), index++)) : false; }, function () { Utils.Dispose(enumerator); }) }); }, // Overload:function(collectionSelector) // Overload:function(collectionSelector) // Overload:function(collectionSelector,resultSelector) // Overload:function(collectionSelector,resultSelector) SelectMany: function (collectionSelector, resultSelector) { var source = this; collectionSelector = Utils.CreateLambda(collectionSelector); if (resultSelector == null) resultSelector = function (a, b) { return b; } resultSelector = Utils.CreateLambda(resultSelector); return new Enumerable(function () { var enumerator; var middleEnumerator = undefined; var index = 0; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { if (middleEnumerator === undefined) { if (!enumerator.MoveNext()) return false; } do { if (middleEnumerator == null) { var middleSeq = collectionSelector(enumerator.Current(), index++); middleEnumerator = Enumerable.From(middleSeq).GetEnumerator(); } if (middleEnumerator.MoveNext()) { return this.Yield(resultSelector(enumerator.Current(), middleEnumerator.Current())); } Utils.Dispose(middleEnumerator); middleEnumerator = null; } while (enumerator.MoveNext()) return false; }, function () { try { Utils.Dispose(enumerator); } finally { Utils.Dispose(middleEnumerator); } }) }); }, // Overload:function(predicate) // Overload:function(predicate) Where: function (predicate) { predicate = Utils.CreateLambda(predicate); var source = this; return new Enumerable(function () { var enumerator; var index = 0; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { while (enumerator.MoveNext()) { if (predicate(enumerator.Current(), index++)) { return this.Yield(enumerator.Current()); } } return false; }, function () { Utils.Dispose(enumerator); }) }); }, OfType: function (type) { var typeName; switch (type) { case Number: typeName = Types.Number; break; case String: typeName = Types.String; break; case Boolean: typeName = Types.Boolean; break; case Function: typeName = Types.Function; break; default: typeName = null; break; } return (typeName === null) ? this.Where(function (x) { return x instanceof type }) : this.Where(function (x) { return typeof x === typeName }); }, // Overload:function(second,selector) // Overload:function(second,selector) Zip: function (second, selector) { selector = Utils.CreateLambda(selector); var source = this; return new Enumerable(function () { var firstEnumerator; var secondEnumerator; var index = 0; return new IEnumerator( function () { firstEnumerator = source.GetEnumerator(); secondEnumerator = Enumerable.From(second).GetEnumerator(); }, function () { if (firstEnumerator.MoveNext() && secondEnumerator.MoveNext()) { return this.Yield(selector(firstEnumerator.Current(), secondEnumerator.Current(), index++)); } return false; }, function () { try { Utils.Dispose(firstEnumerator); } finally { Utils.Dispose(secondEnumerator); } }) }); }, /* Join Methods */ // Overload:function (inner, outerKeySelector, innerKeySelector, resultSelector) // Overload:function (inner, outerKeySelector, innerKeySelector, resultSelector, compareSelector) Join: function (inner, outerKeySelector, innerKeySelector, resultSelector, compareSelector) { outerKeySelector = Utils.CreateLambda(outerKeySelector); innerKeySelector = Utils.CreateLambda(innerKeySelector); resultSelector = Utils.CreateLambda(resultSelector); compareSelector = Utils.CreateLambda(compareSelector); var source = this; return new Enumerable(function () { var outerEnumerator; var lookup; var innerElements = null; var innerCount = 0; return new IEnumerator( function () { outerEnumerator = source.GetEnumerator(); lookup = Enumerable.From(inner).ToLookup(innerKeySelector, Functions.Identity, compareSelector); }, function () { while (true) { if (innerElements != null) { var innerElement = innerElements[innerCount++]; if (innerElement !== undefined) { return this.Yield(resultSelector(outerEnumerator.Current(), innerElement)); } innerElement = null; innerCount = 0; } if (outerEnumerator.MoveNext()) { var key = outerKeySelector(outerEnumerator.Current()); innerElements = lookup.Get(key).ToArray(); } else { return false; } } }, function () { Utils.Dispose(outerEnumerator); }) }); }, // Overload:function (inner, outerKeySelector, innerKeySelector, resultSelector) // Overload:function (inner, outerKeySelector, innerKeySelector, resultSelector, compareSelector) GroupJoin: function (inner, outerKeySelector, innerKeySelector, resultSelector, compareSelector) { outerKeySelector = Utils.CreateLambda(outerKeySelector); innerKeySelector = Utils.CreateLambda(innerKeySelector); resultSelector = Utils.CreateLambda(resultSelector); compareSelector = Utils.CreateLambda(compareSelector); var source = this; return new Enumerable(function () { var enumerator = source.GetEnumerator(); var lookup = null; return new IEnumerator( function () { enumerator = source.GetEnumerator(); lookup = Enumerable.From(inner).ToLookup(innerKeySelector, Functions.Identity, compareSelector); }, function () { if (enumerator.MoveNext()) { var innerElement = lookup.Get(outerKeySelector(enumerator.Current())); return this.Yield(resultSelector(enumerator.Current(), innerElement)); } return false; }, function () { Utils.Dispose(enumerator); }) }); }, /* Set Methods */ All: function (predicate) { predicate = Utils.CreateLambda(predicate); var result = true; this.ForEach(function (x) { if (!predicate(x)) { result = false; return false; // break } }); return result; }, // Overload:function() // Overload:function(predicate) Any: function (predicate) { predicate = Utils.CreateLambda(predicate); var enumerator = this.GetEnumerator(); try { if (arguments.length == 0) return enumerator.MoveNext(); // case:function() while (enumerator.MoveNext()) // case:function(predicate) { if (predicate(enumerator.Current())) return true; } return false; } finally { Utils.Dispose(enumerator); } }, Concat: function (second) { var source = this; return new Enumerable(function () { var firstEnumerator; var secondEnumerator; return new IEnumerator( function () { firstEnumerator = source.GetEnumerator(); }, function () { if (secondEnumerator == null) { if (firstEnumerator.MoveNext()) return this.Yield(firstEnumerator.Current()); secondEnumerator = Enumerable.From(second).GetEnumerator(); } if (secondEnumerator.MoveNext()) return this.Yield(secondEnumerator.Current()); return false; }, function () { try { Utils.Dispose(firstEnumerator); } finally { Utils.Dispose(secondEnumerator); } }) }); }, Insert: function (index, second) { var source = this; return new Enumerable(function () { var firstEnumerator; var secondEnumerator; var count = 0; var isEnumerated = false; return new IEnumerator( function () { firstEnumerator = source.GetEnumerator(); secondEnumerator = Enumerable.From(second).GetEnumerator(); }, function () { if (count == index && secondEnumerator.MoveNext()) { isEnumerated = true; return this.Yield(secondEnumerator.Current()); } if (firstEnumerator.MoveNext()) { count++; return this.Yield(firstEnumerator.Current()); } if (!isEnumerated && secondEnumerator.MoveNext()) { return this.Yield(secondEnumerator.Current()); } return false; }, function () { try { Utils.Dispose(firstEnumerator); } finally { Utils.Dispose(secondEnumerator); } }) }); }, Alternate: function (value) { value = Enumerable.Return(value); return this.SelectMany(function (elem) { return Enumerable.Return(elem).Concat(value); }).TakeExceptLast(); }, // Overload:function(value) // Overload:function(value, compareSelector) Contains: function (value, compareSelector) { compareSelector = Utils.CreateLambda(compareSelector); var enumerator = this.GetEnumerator(); try { while (enumerator.MoveNext()) { if (compareSelector(enumerator.Current()) === value) return true; } return false; } finally { Utils.Dispose(enumerator) } }, DefaultIfEmpty: function (defaultValue) { var source = this; return new Enumerable(function () { var enumerator; var isFirst = true; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { if (enumerator.MoveNext()) { isFirst = false; return this.Yield(enumerator.Current()); } else if (isFirst) { isFirst = false; return this.Yield(defaultValue); } return false; }, function () { Utils.Dispose(enumerator); }) }); }, // Overload:function() // Overload:function(compareSelector) Distinct: function (compareSelector) { return this.Except(Enumerable.Empty(), compareSelector); }, // Overload:function(second) // Overload:function(second, compareSelector) Except: function (second, compareSelector) { compareSelector = Utils.CreateLambda(compareSelector); var source = this; return new Enumerable(function () { var enumerator; var keys; return new IEnumerator( function () { enumerator = source.GetEnumerator(); keys = new Dictionary(compareSelector); Enumerable.From(second).ForEach(function (key) { keys.Add(key); }); }, function () { while (enumerator.MoveNext()) { var current = enumerator.Current(); if (!keys.Contains(current)) { keys.Add(current); return this.Yield(current); } } return false; }, function () { Utils.Dispose(enumerator); }) }); }, // Overload:function(second) // Overload:function(second, compareSelector) Intersect: function (second, compareSelector) { compareSelector = Utils.CreateLambda(compareSelector); var source = this; return new Enumerable(function () { var enumerator; var keys; var outs; return new IEnumerator( function () { enumerator = source.GetEnumerator(); keys = new Dictionary(compareSelector); Enumerable.From(second).ForEach(function (key) { keys.Add(key); }); outs = new Dictionary(compareSelector); }, function () { while (enumerator.MoveNext()) { var current = enumerator.Current(); if (!outs.Contains(current) && keys.Contains(current)) { outs.Add(current); return this.Yield(current); } } return false; }, function () { Utils.Dispose(enumerator); }) }); }, // Overload:function(second) // Overload:function(second, compareSelector) SequenceEqual: function (second, compareSelector) { compareSelector = Utils.CreateLambda(compareSelector); var firstEnumerator = this.GetEnumerator(); try { var secondEnumerator = Enumerable.From(second).GetEnumerator(); try { while (firstEnumerator.MoveNext()) { if (!secondEnumerator.MoveNext() || compareSelector(firstEnumerator.Current()) !== compareSelector(secondEnumerator.Current())) { return false; } } if (secondEnumerator.MoveNext()) return false; return true; } finally { Utils.Dispose(secondEnumerator); } } finally { Utils.Dispose(firstEnumerator); } }, Union: function (second, compareSelector) { compareSelector = Utils.CreateLambda(compareSelector); var source = this; return new Enumerable(function () { var firstEnumerator; var secondEnumerator; var keys; return new IEnumerator( function () { firstEnumerator = source.GetEnumerator(); keys = new Dictionary(compareSelector); }, function () { var current; if (secondEnumerator === undefined) { while (firstEnumerator.MoveNext()) { current = firstEnumerator.Current(); if (!keys.Contains(current)) { keys.Add(current); return this.Yield(current); } } secondEnumerator = Enumerable.From(second).GetEnumerator(); } while (secondEnumerator.MoveNext()) { current = secondEnumerator.Current(); if (!keys.Contains(current)) { keys.Add(current); return this.Yield(current); } } return false; }, function () { try { Utils.Dispose(firstEnumerator); } finally { Utils.Dispose(secondEnumerator); } }) }); }, /* Ordering Methods */ OrderBy: function (keySelector) { return new OrderedEnumerable(this, keySelector, false); }, OrderByDescending: function (keySelector) { return new OrderedEnumerable(this, keySelector, true); }, Reverse: function () { var source = this; return new Enumerable(function () { var buffer; var index; return new IEnumerator( function () { buffer = source.ToArray(); index = buffer.length; }, function () { return (index > 0) ? this.Yield(buffer[--index]) : false; }, Functions.Blank) }); }, Shuffle: function () { var source = this; return new Enumerable(function () { var buffer; return new IEnumerator( function () { buffer = source.ToArray(); }, function () { if (buffer.length > 0) { var i = Math.floor(Math.random() * buffer.length); return this.Yield(buffer.splice(i, 1)[0]); } return false; }, Functions.Blank) }); }, /* Grouping Methods */ // Overload:function(keySelector) // Overload:function(keySelector,elementSelector) // Overload:function(keySelector,elementSelector,resultSelector) // Overload:function(keySelector,elementSelector,resultSelector,compareSelector) GroupBy: function (keySelector, elementSelector, resultSelector, compareSelector) { var source = this; keySelector = Utils.CreateLambda(keySelector); elementSelector = Utils.CreateLambda(elementSelector); if (resultSelector != null) resultSelector = Utils.CreateLambda(resultSelector); compareSelector = Utils.CreateLambda(compareSelector); return new Enumerable(function () { var enumerator; return new IEnumerator( function () { enumerator = source.ToLookup(keySelector, elementSelector, compareSelector) .ToEnumerable() .GetEnumerator(); }, function () { while (enumerator.MoveNext()) { return (resultSelector == null) ? this.Yield(enumerator.Current()) : this.Yield(resultSelector(enumerator.Current().Key(), enumerator.Current())); } return false; }, function () { Utils.Dispose(enumerator); }) }); }, // Overload:function(keySelector) // Overload:function(keySelector,elementSelector) // Overload:function(keySelector,elementSelector,resultSelector) // Overload:function(keySelector,elementSelector,resultSelector,compareSelector) PartitionBy: function (keySelector, elementSelector, resultSelector, compareSelector) { var source = this; keySelector = Utils.CreateLambda(keySelector); elementSelector = Utils.CreateLambda(elementSelector); compareSelector = Utils.CreateLambda(compareSelector); var hasResultSelector; if (resultSelector == null) { hasResultSelector = false; resultSelector = function (key, group) { return new Grouping(key, group) } } else { hasResultSelector = true; resultSelector = Utils.CreateLambda(resultSelector); } return new Enumerable(function () { var enumerator; var key; var compareKey; var group = []; return new IEnumerator( function () { enumerator = source.GetEnumerator(); if (enumerator.MoveNext()) { key = keySelector(enumerator.Current()); compareKey = compareSelector(key); group.push(elementSelector(enumerator.Current())); } }, function () { var hasNext; while ((hasNext = enumerator.MoveNext()) == true) { if (compareKey === compareSelector(keySelector(enumerator.Current()))) { group.push(elementSelector(enumerator.Current())); } else break; } if (group.length > 0) { var result = (hasResultSelector) ? resultSelector(key, Enumerable.From(group)) : resultSelector(key, group); if (hasNext) { key = keySelector(enumerator.Current()); compareKey = compareSelector(key); group = [elementSelector(enumerator.Current())]; } else group = []; return this.Yield(result); } return false; }, function () { Utils.Dispose(enumerator); }) }); }, BufferWithCount: function (count) { var source = this; return new Enumerable(function () { var enumerator; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { var array = []; var index = 0; while (enumerator.MoveNext()) { array.push(enumerator.Current()); if (++index >= count) return this.Yield(array); } if (array.length > 0) return this.Yield(array); return false; }, function () { Utils.Dispose(enumerator); }) }); }, /* Aggregate Methods */ // Overload:function(func) // Overload:function(seed,func) // Overload:function(seed,func,resultSelector) Aggregate: function (seed, func, resultSelector) { return this.Scan(seed, func, resultSelector).Last(); }, // Overload:function() // Overload:function(selector) Average: function (selector) { selector = Utils.CreateLambda(selector); var sum = 0; var count = 0; this.ForEach(function (x) { sum += selector(x); ++count; }); return sum / count; }, // Overload:function() // Overload:function(predicate) Count: function (predicate) { predicate = (predicate == null) ? Functions.True : Utils.CreateLambda(predicate); var count = 0; this.ForEach(function (x, i) { if (predicate(x, i)) ++count; }); return count; }, // Overload:function() // Overload:function(selector) Max: function (selector) { if (selector == null) selector = Functions.Identity; return this.Select(selector).Aggregate(function (a, b) { return (a > b) ? a : b; }); }, // Overload:function() // Overload:function(selector) Min: function (selector) { if (selector == null) selector = Functions.Identity; return this.Select(selector).Aggregate(function (a, b) { return (a < b) ? a : b; }); }, MaxBy: function (keySelector) { keySelector = Utils.CreateLambda(keySelector); return this.Aggregate(function (a, b) { return (keySelector(a) > keySelector(b)) ? a : b }); }, MinBy: function (keySelector) { keySelector = Utils.CreateLambda(keySelector); return this.Aggregate(function (a, b) { return (keySelector(a) < keySelector(b)) ? a : b }); }, // Overload:function() // Overload:function(selector) Sum: function (selector) { if (selector == null) selector = Functions.Identity; return this.Select(selector).Aggregate(0, function (a, b) { return a + b; }); }, /* Paging Methods */ ElementAt: function (index) { var value; var found = false; this.ForEach(function (x, i) { if (i == index) { value = x; found = true; return false; } }); if (!found) throw new Error("index is less than 0 or greater than or equal to the number of elements in source."); return value; }, ElementAtOrDefault: function (index, defaultValue) { var value; var found = false; this.ForEach(function (x, i) { if (i == index) { value = x; found = true; return false; } }); return (!found) ? defaultValue : value; }, // Overload:function() // Overload:function(predicate) First: function (predicate) { if (predicate != null) return this.Where(predicate).First(); var value; var found = false; this.ForEach(function (x) { value = x; found = true; return false; }); if (!found) throw new Error("First:No element satisfies the condition."); return value; }, // Overload:function(defaultValue) // Overload:function(defaultValue,predicate) FirstOrDefault: function (defaultValue, predicate) { if (predicate != null) return this.Where(predicate).FirstOrDefault(defaultValue); var value; var found = false; this.ForEach(function (x) { value = x; found = true; return false; }); return (!found) ? defaultValue : value; }, // Overload:function() // Overload:function(predicate) Last: function (predicate) { if (predicate != null) return this.Where(predicate).Last(); var value; var found = false; this.ForEach(function (x) { found = true; value = x; }); if (!found) throw new Error("Last:No element satisfies the condition."); return value; }, // Overload:function(defaultValue) // Overload:function(defaultValue,predicate) LastOrDefault: function (defaultValue, predicate) { if (predicate != null) return this.Where(predicate).LastOrDefault(defaultValue); var value; var found = false; this.ForEach(function (x) { found = true; value = x; }); return (!found) ? defaultValue : value; }, // Overload:function() // Overload:function(predicate) Single: function (predicate) { if (predicate != null) return this.Where(predicate).Single(); var value; var found = false; this.ForEach(function (x) { if (!found) { found = true; value = x; } else throw new Error("Single:sequence contains more than one element."); }); if (!found) throw new Error("Single:No element satisfies the condition."); return value; }, // Overload:function(defaultValue) // Overload:function(defaultValue,predicate) SingleOrDefault: function (defaultValue, predicate) { if (predicate != null) return this.Where(predicate).SingleOrDefault(defaultValue); var value; var found = false; this.ForEach(function (x) { if (!found) { found = true; value = x; } else throw new Error("Single:sequence contains more than one element."); }); return (!found) ? defaultValue : value; }, Skip: function (count) { var source = this; return new Enumerable(function () { var enumerator; var index = 0; return new IEnumerator( function () { enumerator = source.GetEnumerator(); while (index++ < count && enumerator.MoveNext()) { }; }, function () { return (enumerator.MoveNext()) ? this.Yield(enumerator.Current()) : false; }, function () { Utils.Dispose(enumerator); }) }); }, // Overload:function(predicate) // Overload:function(predicate) SkipWhile: function (predicate) { predicate = Utils.CreateLambda(predicate); var source = this; return new Enumerable(function () { var enumerator; var index = 0; var isSkipEnd = false; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { while (!isSkipEnd) { if (enumerator.MoveNext()) { if (!predicate(enumerator.Current(), index++)) { isSkipEnd = true; return this.Yield(enumerator.Current()); } continue; } else return false; } return (enumerator.MoveNext()) ? this.Yield(enumerator.Current()) : false; }, function () { Utils.Dispose(enumerator); }); }); }, Take: function (count) { var source = this; return new Enumerable(function () { var enumerator; var index = 0; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { return (index++ < count && enumerator.MoveNext()) ? this.Yield(enumerator.Current()) : false; }, function () { Utils.Dispose(enumerator); } ) }); }, // Overload:function(predicate) // Overload:function(predicate) TakeWhile: function (predicate) { predicate = Utils.CreateLambda(predicate); var source = this; return new Enumerable(function () { var enumerator; var index = 0; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { return (enumerator.MoveNext() && predicate(enumerator.Current(), index++)) ? this.Yield(enumerator.Current()) : false; }, function () { Utils.Dispose(enumerator); }); }); }, // Overload:function() // Overload:function(count) TakeExceptLast: function (count) { if (count == null) count = 1; var source = this; return new Enumerable(function () { if (count <= 0) return source.GetEnumerator(); // do nothing var enumerator; var q = []; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { while (enumerator.MoveNext()) { if (q.length == count) { q.push(enumerator.Current()); return this.Yield(q.shift()); } q.push(enumerator.Current()); } return false; }, function () { Utils.Dispose(enumerator); }); }); }, TakeFromLast: function (count) { if (count <= 0 || count == null) return Enumerable.Empty(); var source = this; return new Enumerable(function () { var sourceEnumerator; var enumerator; var q = []; return new IEnumerator( function () { sourceEnumerator = source.GetEnumerator(); }, function () { while (sourceEnumerator.MoveNext()) { if (q.length == count) q.shift() q.push(sourceEnumerator.Current()); } if (enumerator == null) { enumerator = Enumerable.From(q).GetEnumerator(); } return (enumerator.MoveNext()) ? this.Yield(enumerator.Current()) : false; }, function () { Utils.Dispose(enumerator); }); }); }, IndexOf: function (item) { var found = null; this.ForEach(function (x, i) { if (x === item) { found = i; return true; } }); return (found !== null) ? found : -1; }, LastIndexOf: function (item) { var result = -1; this.ForEach(function (x, i) { if (x === item) result = i; }); return result; }, /* Convert Methods */ ToArray: function () { var array = []; this.ForEach(function (x) { array.push(x) }); return array; }, // Overload:function(keySelector) // Overload:function(keySelector, elementSelector) // Overload:function(keySelector, elementSelector, compareSelector) ToLookup: function (keySelector, elementSelector, compareSelector) { keySelector = Utils.CreateLambda(keySelector); elementSelector = Utils.CreateLambda(elementSelector); compareSelector = Utils.CreateLambda(compareSelector); var dict = new Dictionary(compareSelector); this.ForEach(function (x) { var key = keySelector(x); var element = elementSelector(x); var array = dict.Get(key); if (array !== undefined) array.push(element); else dict.Add(key, [element]); }); return new Lookup(dict); }, ToObject: function (keySelector, elementSelector) { keySelector = Utils.CreateLambda(keySelector); elementSelector = Utils.CreateLambda(elementSelector); var obj = {}; this.ForEach(function (x) { obj[keySelector(x)] = elementSelector(x); }); return obj; }, // Overload:function(keySelector, elementSelector) // Overload:function(keySelector, elementSelector, compareSelector) ToDictionary: function (keySelector, elementSelector, compareSelector) { keySelector = Utils.CreateLambda(keySelector); elementSelector = Utils.CreateLambda(elementSelector); compareSelector = Utils.CreateLambda(compareSelector); var dict = new Dictionary(compareSelector); this.ForEach(function (x) { dict.Add(keySelector(x), elementSelector(x)); }); return dict; }, // Overload:function() // Overload:function(replacer) // Overload:function(replacer, space) ToJSON: function (replacer, space) { return JSON.stringify(this.ToArray(), replacer, space); }, // Overload:function() // Overload:function(separator) // Overload:function(separator,selector) ToString: function (separator, selector) { if (separator == null) separator = ""; if (selector == null) selector = Functions.Identity; return this.Select(selector).ToArray().join(separator); }, /* Action Methods */ // Overload:function(action) // Overload:function(action) Do: function (action) { var source = this; action = Utils.CreateLambda(action); return new Enumerable(function () { var enumerator; var index = 0; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { if (enumerator.MoveNext()) { action(enumerator.Current(), index++); return this.Yield(enumerator.Current()); } return false; }, function () { Utils.Dispose(enumerator); }); }); }, // Overload:function(action) // Overload:function(action) // Overload:function(func) // Overload:function(func) ForEach: function (action) { action = Utils.CreateLambda(action); var index = 0; var enumerator = this.GetEnumerator(); try { while (enumerator.MoveNext()) { if (action(enumerator.Current(), index++) === false) break; } } finally { Utils.Dispose(enumerator); } }, // Overload:function() // Overload:function(separator) // Overload:function(separator,selector) Write: function (separator, selector) { if (separator == null) separator = ""; selector = Utils.CreateLambda(selector); var isFirst = true; this.ForEach(function (item) { if (isFirst) isFirst = false; else document.write(separator); document.write(selector(item)); }); }, // Overload:function() // Overload:function(selector) WriteLine: function (selector) { selector = Utils.CreateLambda(selector); this.ForEach(function (item) { document.write(selector(item)); document.write("
    "); }); }, Force: function () { var enumerator = this.GetEnumerator(); try { while (enumerator.MoveNext()) { } } finally { Utils.Dispose(enumerator); } }, /* Functional Methods */ Let: function (func) { func = Utils.CreateLambda(func); var source = this; return new Enumerable(function () { var enumerator; return new IEnumerator( function () { enumerator = Enumerable.From(func(source)).GetEnumerator(); }, function () { return (enumerator.MoveNext()) ? this.Yield(enumerator.Current()) : false; }, function () { Utils.Dispose(enumerator); }) }); }, Share: function () { var source = this; var sharedEnumerator; return new Enumerable(function () { return new IEnumerator( function () { if (sharedEnumerator == null) { sharedEnumerator = source.GetEnumerator(); } }, function () { return (sharedEnumerator.MoveNext()) ? this.Yield(sharedEnumerator.Current()) : false; }, Functions.Blank ) }); }, MemoizeAll: function () { var source = this; var cache; var enumerator; return new Enumerable(function () { var index = -1; return new IEnumerator( function () { if (enumerator == null) { enumerator = source.GetEnumerator(); cache = []; } }, function () { index++; if (cache.length <= index) { return (enumerator.MoveNext()) ? this.Yield(cache[index] = enumerator.Current()) : false; } return this.Yield(cache[index]); }, Functions.Blank ) }); }, /* Error Handling Methods */ Catch: function (handler) { handler = Utils.CreateLambda(handler); var source = this; return new Enumerable(function () { var enumerator; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { try { return (enumerator.MoveNext()) ? this.Yield(enumerator.Current()) : false; } catch (e) { handler(e); return false; } }, function () { Utils.Dispose(enumerator); }); }); }, Finally: function (finallyAction) { finallyAction = Utils.CreateLambda(finallyAction); var source = this; return new Enumerable(function () { var enumerator; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { return (enumerator.MoveNext()) ? this.Yield(enumerator.Current()) : false; }, function () { try { Utils.Dispose(enumerator); } finally { finallyAction(); } }); }); }, /* For Debug Methods */ // Overload:function() // Overload:function(message) // Overload:function(message,selector) Trace: function (message, selector) { if (message == null) message = "Trace"; selector = Utils.CreateLambda(selector); return this.Do(function (item) { console.log(message, ":", selector(item)); }); } } // private // static functions var Functions = { Identity: function (x) { return x; }, True: function () { return true; }, Blank: function () { } } // static const var Types = { Boolean: typeof true, Number: typeof 0, String: typeof "", Object: typeof {}, Undefined: typeof undefined, Function: typeof function () { } } // static utility methods var Utils = { // Create anonymous function from lambda expression string CreateLambda: function (expression) { if (expression == null) return Functions.Identity; if (typeof expression == Types.String) { if (expression == "") { return Functions.Identity; } else if (expression.indexOf("=>") == -1) { return new Function("$,$$,$$$,$$$$", "return " + expression); } else { var expr = expression.match(/^[(\s]*([^()]*?)[)\s]*=>(.*)/); return new Function(expr[1], "return " + expr[2]); } } return expression; }, IsIEnumerable: function (obj) { if (typeof Enumerator != Types.Undefined) { try { new Enumerator(obj); return true; } catch (e) { } } return false; }, Compare: function (a, b) { return (a === b) ? 0 : (a > b) ? 1 : -1; }, Dispose: function (obj) { if (obj != null) obj.Dispose(); } } // IEnumerator State var State = { Before: 0, Running: 1, After: 2 } // name "Enumerator" is conflict JScript's "Enumerator" var IEnumerator = function (initialize, tryGetNext, dispose) { var yielder = new Yielder(); var state = State.Before; this.Current = yielder.Current; this.MoveNext = function () { try { switch (state) { case State.Before: state = State.Running; initialize(); // fall through case State.Running: if (tryGetNext.apply(yielder)) { return true; } else { this.Dispose(); return false; } case State.After: return false; } } catch (e) { this.Dispose(); throw e; } } this.Dispose = function () { if (state != State.Running) return; try { dispose(); } finally { state = State.After; } } } // for tryGetNext var Yielder = function () { var current = null; this.Current = function () { return current; } this.Yield = function (value) { current = value; return true; } } // for OrderBy/ThenBy var OrderedEnumerable = function (source, keySelector, descending, parent) { this.source = source; this.keySelector = Utils.CreateLambda(keySelector); this.descending = descending; this.parent = parent; } OrderedEnumerable.prototype = new Enumerable(); OrderedEnumerable.prototype.CreateOrderedEnumerable = function (keySelector, descending) { return new OrderedEnumerable(this.source, keySelector, descending, this); } OrderedEnumerable.prototype.ThenBy = function (keySelector) { return this.CreateOrderedEnumerable(keySelector, false); } OrderedEnumerable.prototype.ThenByDescending = function (keySelector) { return this.CreateOrderedEnumerable(keySelector, true); } OrderedEnumerable.prototype.GetEnumerator = function () { var self = this; var buffer; var indexes; var index = 0; return new IEnumerator( function () { buffer = []; indexes = []; self.source.ForEach(function (item, index) { buffer.push(item); indexes.push(index); }); var sortContext = SortContext.Create(self, null); sortContext.GenerateKeys(buffer); indexes.sort(function (a, b) { return sortContext.Compare(a, b); }); }, function () { return (index < indexes.length) ? this.Yield(buffer[indexes[index++]]) : false; }, Functions.Blank ) } var SortContext = function (keySelector, descending, child) { this.keySelector = keySelector; this.descending = descending; this.child = child; this.keys = null; } SortContext.Create = function (orderedEnumerable, currentContext) { var context = new SortContext(orderedEnumerable.keySelector, orderedEnumerable.descending, currentContext); if (orderedEnumerable.parent != null) return SortContext.Create(orderedEnumerable.parent, context); return context; } SortContext.prototype.GenerateKeys = function (source) { var len = source.length; var keySelector = this.keySelector; var keys = new Array(len); for (var i = 0; i < len; i++) keys[i] = keySelector(source[i]); this.keys = keys; if (this.child != null) this.child.GenerateKeys(source); } SortContext.prototype.Compare = function (index1, index2) { var comparison = Utils.Compare(this.keys[index1], this.keys[index2]); if (comparison == 0) { if (this.child != null) return this.child.Compare(index1, index2) comparison = Utils.Compare(index1, index2); } return (this.descending) ? -comparison : comparison; } // optimize array or arraylike object var ArrayEnumerable = function (source) { this.source = source; } ArrayEnumerable.prototype = new Enumerable(); ArrayEnumerable.prototype.Any = function (predicate) { return (predicate == null) ? (this.source.length > 0) : Enumerable.prototype.Any.apply(this, arguments); } ArrayEnumerable.prototype.Count = function (predicate) { return (predicate == null) ? this.source.length : Enumerable.prototype.Count.apply(this, arguments); } ArrayEnumerable.prototype.ElementAt = function (index) { return (0 <= index && index < this.source.length) ? this.source[index] : Enumerable.prototype.ElementAt.apply(this, arguments); } ArrayEnumerable.prototype.ElementAtOrDefault = function (index, defaultValue) { return (0 <= index && index < this.source.length) ? this.source[index] : defaultValue; } ArrayEnumerable.prototype.First = function (predicate) { return (predicate == null && this.source.length > 0) ? this.source[0] : Enumerable.prototype.First.apply(this, arguments); } ArrayEnumerable.prototype.FirstOrDefault = function (defaultValue, predicate) { if (predicate != null) { return Enumerable.prototype.FirstOrDefault.apply(this, arguments); } return this.source.length > 0 ? this.source[0] : defaultValue; } ArrayEnumerable.prototype.Last = function (predicate) { return (predicate == null && this.source.length > 0) ? this.source[this.source.length - 1] : Enumerable.prototype.Last.apply(this, arguments); } ArrayEnumerable.prototype.LastOrDefault = function (defaultValue, predicate) { if (predicate != null) { return Enumerable.prototype.LastOrDefault.apply(this, arguments); } return this.source.length > 0 ? this.source[this.source.length - 1] : defaultValue; } ArrayEnumerable.prototype.Skip = function (count) { var source = this.source; return new Enumerable(function () { var index; return new IEnumerator( function () { index = (count < 0) ? 0 : count }, function () { return (index < source.length) ? this.Yield(source[index++]) : false; }, Functions.Blank); }); }; ArrayEnumerable.prototype.TakeExceptLast = function (count) { if (count == null) count = 1; return this.Take(this.source.length - count); } ArrayEnumerable.prototype.TakeFromLast = function (count) { return this.Skip(this.source.length - count); } ArrayEnumerable.prototype.Reverse = function () { var source = this.source; return new Enumerable(function () { var index; return new IEnumerator( function () { index = source.length; }, function () { return (index > 0) ? this.Yield(source[--index]) : false; }, Functions.Blank) }); } ArrayEnumerable.prototype.SequenceEqual = function (second, compareSelector) { if ((second instanceof ArrayEnumerable || second instanceof Array) && compareSelector == null && Enumerable.From(second).Count() != this.Count()) { return false; } return Enumerable.prototype.SequenceEqual.apply(this, arguments); } ArrayEnumerable.prototype.ToString = function (separator, selector) { if (selector != null || !(this.source instanceof Array)) { return Enumerable.prototype.ToString.apply(this, arguments); } if (separator == null) separator = ""; return this.source.join(separator); } ArrayEnumerable.prototype.GetEnumerator = function () { var source = this.source; var index = 0; return new IEnumerator( Functions.Blank, function () { return (index < source.length) ? this.Yield(source[index++]) : false; }, Functions.Blank); } // Collections var Dictionary = (function () { // static utility methods var HasOwnProperty = function (target, key) { return Object.prototype.hasOwnProperty.call(target, key); } var ComputeHashCode = function (obj) { if (obj === null) return "null"; if (obj === undefined) return "undefined"; return (typeof obj.toString === Types.Function) ? obj.toString() : Object.prototype.toString.call(obj); } // LinkedList for Dictionary var HashEntry = function (key, value) { this.Key = key; this.Value = value; this.Prev = null; this.Next = null; } var EntryList = function () { this.First = null; this.Last = null; } EntryList.prototype = { AddLast: function (entry) { if (this.Last != null) { this.Last.Next = entry; entry.Prev = this.Last; this.Last = entry; } else this.First = this.Last = entry; }, Replace: function (entry, newEntry) { if (entry.Prev != null) { entry.Prev.Next = newEntry; newEntry.Prev = entry.Prev; } else this.First = newEntry; if (entry.Next != null) { entry.Next.Prev = newEntry; newEntry.Next = entry.Next; } else this.Last = newEntry; }, Remove: function (entry) { if (entry.Prev != null) entry.Prev.Next = entry.Next; else this.First = entry.Next; if (entry.Next != null) entry.Next.Prev = entry.Prev; else this.Last = entry.Prev; } } // Overload:function() // Overload:function(compareSelector) var Dictionary = function (compareSelector) { this.count = 0; this.entryList = new EntryList(); this.buckets = {}; // as Dictionary> this.compareSelector = (compareSelector == null) ? Functions.Identity : compareSelector; } Dictionary.prototype = { Add: function (key, value) { var compareKey = this.compareSelector(key); var hash = ComputeHashCode(compareKey); var entry = new HashEntry(key, value); if (HasOwnProperty(this.buckets, hash)) { var array = this.buckets[hash]; for (var i = 0; i < array.length; i++) { if (this.compareSelector(array[i].Key) === compareKey) { this.entryList.Replace(array[i], entry); array[i] = entry; return; } } array.push(entry); } else { this.buckets[hash] = [entry]; } this.count++; this.entryList.AddLast(entry); }, Get: function (key) { var compareKey = this.compareSelector(key); var hash = ComputeHashCode(compareKey); if (!HasOwnProperty(this.buckets, hash)) return undefined; var array = this.buckets[hash]; for (var i = 0; i < array.length; i++) { var entry = array[i]; if (this.compareSelector(entry.Key) === compareKey) return entry.Value; } return undefined; }, Set: function (key, value) { var compareKey = this.compareSelector(key); var hash = ComputeHashCode(compareKey); if (HasOwnProperty(this.buckets, hash)) { var array = this.buckets[hash]; for (var i = 0; i < array.length; i++) { if (this.compareSelector(array[i].Key) === compareKey) { var newEntry = new HashEntry(key, value); this.entryList.Replace(array[i], newEntry); array[i] = newEntry; return true; } } } return false; }, Contains: function (key) { var compareKey = this.compareSelector(key); var hash = ComputeHashCode(compareKey); if (!HasOwnProperty(this.buckets, hash)) return false; var array = this.buckets[hash]; for (var i = 0; i < array.length; i++) { if (this.compareSelector(array[i].Key) === compareKey) return true; } return false; }, Clear: function () { this.count = 0; this.buckets = {}; this.entryList = new EntryList(); }, Remove: function (key) { var compareKey = this.compareSelector(key); var hash = ComputeHashCode(compareKey); if (!HasOwnProperty(this.buckets, hash)) return; var array = this.buckets[hash]; for (var i = 0; i < array.length; i++) { if (this.compareSelector(array[i].Key) === compareKey) { this.entryList.Remove(array[i]); array.splice(i, 1); if (array.length == 0) delete this.buckets[hash]; this.count--; return; } } }, Count: function () { return this.count; }, ToEnumerable: function () { var self = this; return new Enumerable(function () { var currentEntry; return new IEnumerator( function () { currentEntry = self.entryList.First }, function () { if (currentEntry != null) { var result = { Key: currentEntry.Key, Value: currentEntry.Value }; currentEntry = currentEntry.Next; return this.Yield(result); } return false; }, Functions.Blank); }); } } return Dictionary; })(); // dictionary = Dictionary var Lookup = function (dictionary) { this.Count = function () { return dictionary.Count(); } this.Get = function (key) { return Enumerable.From(dictionary.Get(key)); } this.Contains = function (key) { return dictionary.Contains(key); } this.ToEnumerable = function () { return dictionary.ToEnumerable().Select(function (kvp) { return new Grouping(kvp.Key, kvp.Value); }); } } var Grouping = function (key, elements) { this.Key = function () { return key; } ArrayEnumerable.call(this, elements); } Grouping.prototype = new ArrayEnumerable(); // out to global return Enumerable; })()