﻿AG.Data.Stock = {
    _objStockData: '',
    GetListSymbol: function () {
        if (agLanguageName == "vi-VN")
            AG.Data.Stock._objStockData = AG.ClientAPI.createData(CompanyInfomation, 'StockListed', [{ Type: AG.Config.CompanyType.Listed }, { Type: AG.Config.CompanyType.Fund }, { Type: AG.Config.CompanyType.UPCOM}], { static: ['Id','Code', 'VietnameseName'] }, [{ Field: 'Code', Direction: 'ASC'}]);
        else
            AG.Data.Stock._objStockData = AG.ClientAPI.createData(CompanyInfomation, 'StockListed', [{ Type: AG.Config.CompanyType.Listed }, { Type: AG.Config.CompanyType.Fund }, { Type: AG.Config.CompanyType.UPCOM}], { static: ['Id', 'Code','InternationalName'] }, [{ Field: 'Code', Direction: 'ASC'}]);
        return AG.Data.Stock._objStockData;
    },
    GetName: function (stockCode) {
        var obj = AG.ClientAPI;
        var objCompany = obj.createData(CompanyInfomation, 'StockName', [{ Code: stockCode}], { static: ['Id', 'Code', 'Name', 'Industry', 'StockExchange', 'Modified'] });
        if (typeof (objCompany[0].Industry) != 'undefined')
            var objField = obj.createData(CompanyCategory, 'Industry', [{ Id: objCompany[0].Industry}], { static: ['Id', 'Code', 'Name'] });
        if (typeof (objCompany[0].RootIndustry) != 'undefined')
            var objRootField = obj.createData(CompanyCategory, 'RootIndustry', [{ Id: objCompany[0].RootIndustry}], { static: ['Id', 'Code', 'Name'] });
        if (typeof (objCompany[0].StockExchange) != 'undefined')
            var objStockExchange = obj.createData(StockExchange, 'StockExchange', [{ Id: objCompany[0].StockExchange}], { static: ['Id', 'Name', 'Code'] });
        var result = { Id: objCompany[0].Id, Code: objCompany[0].Code, Name: objCompany[0].Name, Industry: objCompany[0].Industry, StockExchange: objCompany[0].StockExchange, ReportGroup: objCompany[0].ReportGroup, RootIndustry: objCompany[0].RootIndustry, IndustryName: typeof (objField) != 'undefined' ? objField[0].Name : '', RootIndustryName: typeof (objRootField) != 'undefined' ? objRootField[0].Name : '', StockExchangeName: typeof (objStockExchange) != 'undefined' ? objStockExchange[0].Name : '', StockExchangeCode: typeof (objStockExchange) != 'undefined' ? objStockExchange[0].Code : '', Modified: objCompany[0].Modified };
        return result;
    },
    GetMarketEvent: function (stockCode, type, startDate, endDate, startIndex, endIndex) {
        if (typeof (stockCode) == 'undefined')
            stockCode = '';
        if (typeof (type) == 'undefined')
            type = '';
        if (typeof (startDate) == 'undefined')
            startDate = '';
        if (typeof (endDate) == 'undefined')
            endDate = '';
        if (typeof (startIndex) == 'undefined')
            startIndex = '';
        if (typeof (endIndex) == 'undefined')
            endIndex = '';
        var url = '/Handler/WS.StockData/SearchMarketEvent.ashx?' + '&typeEvent=' + type + '&company=' + stockCode + '&startDate=' + startDate + '&endDate=' + endDate + '&startIndex=' + startIndex + '&endIndex=' + endIndex + '&language=' + agLanguageName;
        var objData = AG.ClientAPI.getDirectData(url, false, null);
        if (typeof (objData.StockDataDS.News) == 'undefined') {
            objData.StockDataDS.News = {}
        }
        if (typeof (objData.StockDataDS.News.length) == 'undefined' && typeof (objData.StockDataDS.News) != 'undefined') {
            objData.StockDataDS.News = [objData.StockDataDS.News];
        }
        return objData.StockDataDS.News;
    },
    CountMarketEvent: function (stockCode, type, startDate, endDate) {
        var url = '/Handler/WS.StockData/CountMarketEvent.ashx?' + 'typeEvent=' + type + '&company=' + stockCode + '&startDate=' + startDate + '&endDate=' + endDate + '&language=' + agLanguageName;
        return AG.ClientAPI.getDirectData(url, false, null);
    },
    GetTypeFinancialReport: function (reportGroup) {
        if (typeof (reportGroup) == 'undefined' || reportGroup == AG.Config.Empty)
            reportGroup = AG.Config.Empty;
        var obj = AG.ClientAPI;
        return obj.createData(FieldCategory, reportGroup, [{ ParentId: reportGroup, Type: AG.Config.DataType.ReportGroup}], { static: ['Id', 'Code', 'Name', 'Level', 'Type', 'PathById'] });
    },
    GetFinancialInfomation: function (func, companyId, timeLevel, typeFinancialReport, typeCompany, startIndex, endIndex) {

        var order = [{ Field: 'EndDate', Direction: 'DESC'}];
        var requestNameFT = 'FinancialTime' + '_' + timeLevel + '_' + startIndex + '_' + endIndex;
        var objTime = AG.ClientAPI.createData(FinancialTime, requestNameFT, [{ Level: timeLevel }, { StartIndex: startIndex }, { EndIndex: endIndex}], { static: ['Id', 'Name'] }, order);
        var data = [{ Company: companyId }, { ParentId: typeCompany}];
        for (var i = 0; i < objTime.length; i++) {
            data.push({ FinancialTime: objTime[i].Id });
        }
        var requestNameFR = 'FinancialReport' + companyId + '_' + timeLevel + '_' + typeCompany + '_' + startIndex + '_' + endIndex;
        for (var i = 0; i < typeFinancialReport.length; i++) {
            data.push({ Type: typeFinancialReport[i] });
            requestNameFR += '_' + typeFinancialReport;
        }
        var objFinancialReport = AG.ClientAPI.createData(FinancialReport, requestNameFR, data);
        AG.ClientAPI.add(func, function () { return FinancialReport.pkConditions[requestNameFR].isRun && FinancialTime.pkConditions[requestNameFT].isRun; }, function () { return { Time: AG.ClientAPI.getData(FinancialTime, requestNameFT), financialReport: AG.ClientAPI.getData(FinancialReport, requestNameFR) }; });
        obj = null, order = null; objTime = null, data = null, objFinancialReport = null;
    },
    GetHeadQuater: function (stockCodeId) {
        var obj = AG.ClientAPI;
        return obj.createData(CompanyInfomation, 'Headquarter', [{ Id: stockCodeId}], { static: ['Id', 'Code', 'Headquarter', 'Website', 'Phone'] });
    },
    GetLeadership: function (stockCodeId) {
        var obj = AG.ClientAPI;
        var order = [{ Field: 'Index', Direction: 'ASC'}];
        return obj.createData(Leadership, 'Leadership', [{ Company: stockCodeId}], { static: ['Id', 'Code', 'Name', 'CurrentPosition'] }, order);
    },
    GetOverview: function (stockCodeId) {
        var obj = AG.ClientAPI;
        var result = obj.createData(CompanyInfomation, 'Overview', [{ Id: stockCodeId}], { static: ['Id', 'Code', 'Overview'] });
        return result.length > 0 ? result[0].Overview : '';
    },
    GetSummaryInfo: function (stockCode) {
        var obj = AG.ClientAPI;
        var requestName = 'OutstandingShare' + '_' + 'MarketCapitalization' + '_' + 'DividendYield';
        var objRealtime = obj.createData(CompanyRealtime, requestName, [{ Code: stockCode}], { static: ['Id', 'Code', 'OutstandingShare', 'MarketCapitalization', 'DividendYield'] });
        requestName = 'CharteredCapital' + '_' + 'FirstTradingDate';
        var objCompany = obj.createData(CompanyInfomation, requestName, [{ Code: stockCode}], { static: ['Id', 'Code', 'CharteredCapital'], dynamic: ['FirstTradingDate'] });
        return [{ OutstandingShare: objRealtime[0].OutstandingShare, MarketCapitalization: objRealtime[0].MarketCapitalization, DividendYield: objRealtime[0].DividendYield, CharteredCapital: objCompany[0].CharteredCapital, FirstTradingDate: objCompany[0].FirstTradingDate}];
    },
    GetShareholder: function (stockCodeId) {
        var obj = AG.ClientAPI;
        return obj.createData(Shareholder, 'Shareholder', [{ Company: stockCodeId }, { Type: AG.Config.ShareholderType.Shareholder}], { static: ['Id', 'Code', 'Name', 'HoldingQuantity', 'HoldingPercent'] });
    },
    GetPrice: function (stockCode) {
        var obj = AG.ClientAPI;
        return obj.createData(CompanyRealtime, 'Price', [{ Code: stockCode}], { static: ['Id', 'Code', 'ClosePrice', 'Diff', 'DiffPercent', 'DiffPercent', 'Highest52Weeks', 'Lowest52Weeks', 'TotalShare', 'MarketCapitalization'] });
    },
    GetSBSInfomation: function () {
        var obj = AG.ClientAPI;
        var stockCode = 'SBS';
        var order = [{ Field: 'SessionDate', Direction: 'DESC'}];
        var objCurTrade = obj.createData(CompanyRealtime, stockCode, [{ Code: stockCode}], { static: ['Id', 'Name', 'Code', 'Modified', 'OpenPrice', 'ClosePrice', 'Diff', 'DiffPercent', 'HighestPrice', 'LowestPrice', 'TotalShare', 'MarketCapitalization', 'Highest52Weeks', 'Lowest52Weeks', 'DividendYield', 'PELTM', 'BookValueShareTotalEquityLFI', 'Beta', 'OutstandingShare'], dynamic: ['SessionDate', 'ForeignOwnedRatio'] });
        var sessionDate = AGFS.DateUtils.convertDateToString(objCurTrade[0].Modified, 'yyyy-MM-dd') + ' 00:00:00';
        var objPreTrade = obj.createData(CompanyDaily, stockCode, [{ Code: stockCode }, { StartIndex: 1 }, { EndIndex: 1}], { static: ['Id', 'Code', 'SessionDate', 'OpenPrice', 'ClosePrice', 'TotalShare'], dynamic: ['HighestPrice', 'LowestPrice'] }, order, [{ Field: 'SessionDate', Type: 'Static', Operator: '<', Value: sessionDate}]);
        var result = { PreTrade: objPreTrade[0], CurTrade: objCurTrade[0] };
        return result;
    },
    GetCompetitor: function (rootIndustryId, startIndex, endIndex, orderBy, orderType) {
        var obj = AG.ClientAPI;
        var order = [];
        if (typeof (orderBy) != "undefined")
            order = [{ Field: orderBy, Direction: 'ASC'}];
        else
            order = [{ Field: 'ID', Direction: 'ASC'}];
        if (typeof (orderType) != "undefined")
            order[0].Direction = orderType;
        if (orderBy != 'Code')
            order.push({ Field: 'Code', Direction: 'ASC' });
        var requestName = 'GetCompetitor' + '_' + rootIndustryId + '_' + startIndex + '_' + endIndex + '_' + orderBy + '_' + orderType;
        return obj.createData(CompanyInfomation, requestName, [{ RootIndustry: rootIndustryId }, { Type: AG.Config.CompanyType.Listed }, { Type: AG.Config.CompanyType.Fund }, { StartIndex: startIndex }, { EndIndex: endIndex}], { static: ['Id', 'Code', 'CharteredCapital'] }, order, undefined, [{ Name: 'AG_Stock_Report_CompanyRealtime', Alias: 'CPR', Join: 'Left Join', JoinColumn: 'Code', MainColumn: 'Code', data: [], fields: { static: ['Id', 'ClosePrice', 'DiffPercent', 'OutstandingShare', 'MarketCapitalization', 'PELTM', 'Beta']}}]);
    },
    GetCountCompetitor: function (rootIndustryId) {
        var obj = CompanyInfomation;
        return obj.getCount([{ RootIndustry: rootIndustryId }, { Type: AG.Config.CompanyType.Listed }, { Type: AG.Config.CompanyType.Fund}]);
    },
    GetSBSPriceQuery: function (startDate, endDate, startIndex, endIndex, orderBy, orderType) {
        var obj = AG.ClientAPI;
        var order = [];
        if (typeof (orderBy) != "undefined")
            order = [{ Field: orderBy, Direction: 'ASC'}];
        else
            order = [{ Field: 'ID', Direction: 'ASC'}];
        if (typeof (orderType) != "undefined")
            order[0].Direction = orderType;
        var requestName = 'GetPriceQuery' + '_' + 'SBS' + '_' + startDate + '_' + endDate + '_' + startIndex + '_' + endIndex + '_' + orderBy + '_' + orderType;
        return obj.createData(CompanyDaily, requestName, [{ Code: 'SBS' }, { StartDate: startDate }, { EndDate: endDate }, { StartIndex: startIndex }, { EndIndex: endIndex}], { static: ['Id', 'Code', 'SessionDate', 'ClosePrice', 'Diff', 'DiffPercent', 'OpenPrice'], dynamic: [, 'MatchTotalShare', 'MatchTotalValue', 'PutThroughTotalShare', 'PutThroughTotalValue', 'HighestPrice', 'LowestPrice', 'CourseVolume1', 'CourseVolume2', 'CourseVolume3'] }, order);
    },

    GetPriceQuery: function (stockCode, startIndex, endIndex) {
        var obj = AG.ClientAPI;
        var order = [];
        order.push({ Field: 'SessionDate', Direction: 'DESC' });
        var requestName = 'GetPriceQuery' + '_' + stockCode + '_' + startIndex + '_' + endIndex;
        return obj.createData(CompanyDaily, requestName, [{ Code: stockCode}], { static: ['Id', 'Code', 'SessionDate', 'ClosePrice', 'Diff', 'DiffPercent', 'TotalShare', 'TotalValue'] }, order);
    },
    GetCountPriceQuery: function (stockCode, startDate, endDate) {
        var obj = CompanyDaily;
        var data = [{ Code: stockCode}];
        if (startDate != undefined)
            data.push({ StartDate: startDate });
        if (endDate != undefined)
            data.push({ EndDate: endDate });
        return obj.getCount(data);
    },
    GetForeignTrade: function (stockCode, startIndex, endIndex) {
        var obj = AG.ClientAPI;
        var order = [];
        order.push({ Field: 'SessionDate', Direction: 'DESC' });
        var requestName = 'GetForeignTrade' + '_' + stockCode + '_' + startIndex + '_' + endIndex;
        return obj.createData(CompanyDaily, requestName, [{ Code: stockCode}], { static: ['Id', 'Code', 'SessionDate', 'ForeignCurrentRoom', 'ForeignBuyVolume', 'ForeignSellVolume', 'ForeignSellValue', 'ForeignBuyValue'] }, order);
    },
    GetCountForeignTrade: function (stockCode) {
        var obj = CompanyDaily;
        return obj.getCount([{ Code: stockCode}]);
    },
    GetOrder: function (stockCode, startIndex, endIndex) {
        var obj = AG.ClientAPI;
        var order = [];
        order.push({ Field: 'SessionDate', Direction: 'DESC' });
        var requestName = 'GetOrder' + '_' + stockCode + '_' + startIndex + '_' + endIndex;
        return obj.createData(CompanyDaily, requestName, [{ Code: stockCode}], { static: ['Id', 'Code', 'SessionDate', 'BidCountOrder', 'OfferCountOrder', 'BidVolumeOrder'], dynamic: ['OfferVolumeOrder'] }, order);
    },
    GetCountOrder: function (stockCode) {
        var obj = CompanyDaily;
        return obj.getCount([{ Code: stockCode}]);
    },
    GetSBSStatistic: function () {
        var obj = AG.ClientAPI;
        var order = [];
        //order.push({ Field: 'SessionDate', Direction: 'DESC' });
        var requestName = 'GetSBSStatistic';
        return obj.createData(CompanyRealtime, requestName, [{ Code: 'SBS'}], { static: ['Id', 'Code', 'Lowest52Weeks', 'Highest52Weeks', 'MarketCapitalization', 'OutstandingShare', 'EPSLTM', 'ROALTM', 'ROELTM', 'PE', 'Beta', 'AverageVolume10Days', 'DiffPercentPrice5Days', 'DiffPercentPrice1Month'], Dynamic: ['TotalAssetTotalEquityLFY'] }, order);
    },
    GetEquivalent: function (stockCode, field, rate, startIndex, endIndex, orderBy, orderType) {
        var obj = AG.ClientAPI;
        var requestName = stockCode + '_' + field;
        var objStockCode = obj.createData(CompanyRealtime, requestName, [{ Code: stockCode}], { static: ['Id', 'Code', field] });
        var maxRate = 0, minRate = 0;
        if (objStockCode.length > 0) {
            maxRate = rate + parseFloat(objStockCode[0][field]);
            minRate = rate - parseFloat(objStockCode[0][field]);
        }
        var order = [];
        if (typeof (orderBy) != "undefined")
            order = [{ Field: orderBy, Direction: 'ASC'}];
        else
            order = [{ Field: 'ID', Direction: 'ASC'}];
        if (typeof (orderType) != "undefined")
            order[0].Direction = orderType;
        if (orderBy != 'Code')
            order.push({ Field: 'Code', Direction: 'ASC' });
        var filters = [];
        filters.push({ Field: field, Type: 'Static', Index: 0, Operator: '>=', Value: minRate });
        filters.push({ Field: field, Type: 'Static', Index: 1, Operator: '<=', Value: maxRate });
        requestName = 'GetEquivalent' + '_' + stockCode + '_' + field + '_' + rate + '_' + startIndex + '_' + endIndex + '_' + orderBy + '_' + orderType;
        return obj.createData(CompanyRealtime, requestName, [{ Code: 'SBS'}], { static: ['Id', 'Code', 'EPSLTM', 'ClosePrice', 'MarketCapitalization', 'PE'] }, order, filters);
    },
    GetCountEquivalent: function (stockCode, field, rate) {
        var obj = AG.ClientAPI;
        var requestName = stockCode + '_' + field;
        var objStockCode = obj.createData(CompanyRealtime, requestName, [{ Code: stockCode}], { static: ['Id', 'Code', field] });
        var maxRate = 0, minRate = 0;
        if (objStockCode.length > 0) {
            maxRate = rate + parseFloat(objStockCode[0][field]);
            minRate = rate - parseFloat(objStockCode[0][field]);
        }
        var filters = [];
        filters.push({ Field: field, Type: 'Static', Index: 0, Operator: '>=', Value: minRate });
        filters.push({ Field: field, Type: 'Static', Index: 1, Operator: '<=', Value: maxRate });
        return CompanyRealtime.getCount([{ Code: 'SBS'}], filters);
    },
    GetFinancialStrength: function (stockCode) {
        var obj = AG.ClientAPI;
        var requestName = 'GetFinancialStrength' + '_' + stockCode;
        return obj.createData(CompanyRealtime, requestName, [{ Code: stockCode}], { static: ['Id', 'Code', 'TotalRevenueLFI', 'GrossProfitMarginLFI', 'IncomeBeforeTaxLFI', 'IncomeAfterTaxLFI', 'ROELTM', 'ROALTM'], dynamic: ['TotalAssetLFI', 'LongtermAssetsLFI', 'OwnerEquityLFI'] });
    },
    GetValuationRatio: function (stockCode) {
        var obj = AG.ClientAPI;
        var requestName = 'GetValuationRatio' + '_' + stockCode;
        return obj.createData(CompanyRealtime, requestName, [{ Code: stockCode}], { static: ['Id', 'Code', 'EPSLTM', 'BookValueShareTotalEquityLFI', 'RevenueOutstandingShareLTM', 'PELTM', 'PB', 'PS', 'PriceCashFlowShareLTM'], dynamic: ['EVEBITLTM'] });
    },
    GetTradingInfo: function (stockCode) {
        var obj = AG.ClientAPI;
        var requestName = 'GetValuationRatio' + '_' + stockCode;
        return obj.createData(CompanyRealtime, requestName, [{ Code: stockCode}], { static: ['Id', 'Code', 'OpenPrice', 'ClosePrice', 'LowestPrice', 'HighestPrice', 'TotalShare', 'TotalValue', 'Beta', 'PELTM', 'PB', 'PS', 'OutstandingShare', 'MarketCapitalization'], dynamic: ['AverageValue1Week', 'AverageVolume1Week', 'ForeignOwnedRatio'] });
    },
    GetNextPlan: function (stockCode) {
        var obj = AG.ClientAPI;
        return obj.createData(YearPlanning, 'StockNextPlanning', [{ Code: stockCode}], { static: ['Id', 'Code', 'Year', 'EBT', 'NBAT', 'DivInShares', 'DivInCash', 'Sales'] });
    },
    GetRevenue5Years: function (func, companyId, reportGroup) {
        var timeLevel = 1, startIndex = 1, endIndex = 5;
        var requestNameFRBFC = 'GetRevenue5Years' + '_' + companyId + '_' + '_' + reportGroup + '_' + timeLevel + '_' + startIndex + '_' + endIndex;
        var code = [{ Code: 'GNISN10' }, { Code: 'BKISN430' }, { Code: 'SCISN12' }, { Code: 'ISISN70'}];
        code.push({ ParentId: reportGroup });
        var objField = Field.searchField(requestNameFRBFC, code);
        code = null;
        var order = [{ Field: 'EndDate', Direction: 'DESC'}];
        var objTime = AG.ClientAPI.createData(FinancialTime, requestNameFRBFC, [{ Level: timelevel }, { StartIndex: startIndex }, { EndIndex: endIndex}], { static: ['Id', 'Name'] }, order);
        var data = [{ ParentId: reportGroup}];
        for (var i = 0; i < objTime.length; i++) {
            data.push({ FinancialTime: objTime[i].Id });
        }
        data.push({ Company: stockCodeId });
        var fields = { static: ['Id', 'FinancialTime'], field: [] };
        for (var i = 0; i < objField.length; i++) {
            fields.field.push({ Id: objField[i].Id });
        }
        FinancialReport.getFinancialInfoById(requestNameFRBFC, data, fields);
        AG.ClientAPI.add(func, function () { return FinancialReport.pkConditions[requestNameFRBFC].isRun && FinancialTime.pkConditions[requestNameFRBFC].isRun; }, function () { return { Time: AG.ClientAPI.getData(FinancialTime, requestNameFRBFC), financialReport: AG.ClientAPI.getData(FinancialReport, requestNameFRBFC) }; });
        objField = null, order = null; objTime = null, objFinancialReport = null, data = null, fields = null;
    },
    GetEmployment5Year: function (companyId) {
        return { Time: ['2006', '2007', '2008', '2009', '2010'], Data: [26121, 17632, 15162, 17711, 21616] };
    },
    GetSBSCategoryStockScreener: function () {
        return [{ Code: 'GeneralInfo', Name: 'Popular Criteria' }, { Code: 'CompanyDescriptors', Name: 'Company Descriptors' }, { Code: 'SizeShareVolume', Name: 'Size & Share Volume' }, { Code: 'PricePriceChanges', Name: 'Price & Price Changes' }, { Code: 'Valuations', Name: 'Valuations' }, { Code: 'Profitability', Name: 'Profitability' }, { Code: 'Growth', Name: 'Growth' }, { Code: 'ManagementRatio', Name: 'Management ratio' }, { Code: 'LiquidityCoverage', Name: 'Liquidity & Coverage'}];
    },
    GetFieldByCategory: function (categoryCode) {
        switch (categoryCode) {
            case 'GeneralInfo':
                return [{ Code: 'StockExchange', Name: 'StockExchange' }, { Code: 'RootIndustry', Name: 'Industry' }, { Code: 'Industry', Name: 'Sub sector' }, { Code: 'CharteredCapital', Name: 'Chartered Capital' }, { Code: 'MarketCapitalization', Name: 'Market Capitalization' }, { Code: 'Beta', Name: 'Beta' }, { Code: 'OutstandingShare', Name: 'Outstanding Share' }, { Code: 'PercentOwnedInstitutions', Name: 'Institutional percent held' }, { Code: 'ForeignOwnedRatio', Name: 'Foreign own (%)'}];
                break;
            case 'CompanyDescriptors':
                return [{ Code: 'StockExchange', Name: 'StockExchange' }, { Code: 'RootIndustry', Name: 'Industry' }, { Code: 'Industry', Name: 'Sub sector'}];
                break;
            case 'SizeShareVolume':
                return [{ Code: 'OutstandingShare', Name: 'Outstanding Share' }, { Code: 'MarketCapitalization', Name: 'Market Cap' }, { Code: 'Volume30Days', Name: 'Average trading volume (20days)'}];
                break;
            case 'PricePriceChanges':
                return [{ Code: 'ClosePrice', Name: 'Current Price' }, { Code: 'Highest52Weeks', Name: '52 Week High' }, { Code: 'Lowest52Weeks', Name: '52 Week Low' }, { Code: 'Beta', Name: 'Beta' }, { Code: 'DiffPercentPrice5Days', Name: '% Price Change (1 Week) ' }, { Code: 'DiffPercentPrice1Month', Name: '% Price Change (4 Week) ' }, { Code: 'DiffPercentPrice3Months', Name: '% Price Change (12 Week) ' }, { Code: 'DiffPercentPriceThisYear', Name: '% Price Change (YTD)'}];
                break;
            case 'Valuations':
                return [{ Code: 'PE', Name: 'P/E' }, { Code: 'PB', Name: 'P/B' }, { Code: 'PS', Name: 'P/S' }, { Code: 'BookValueShareTotalEquityLFI', Name: 'Book Value' }, { Code: 'SalesLFI', Name: 'Enterprise Value'}];
                break;
            case 'Profitability':
                return [{ Code: 'ROELTM', Name: 'ROE' }, { Code: 'ROALTM', Name: 'ROA' }, { Code: 'GrossProfitMarginLFI', Name: 'Gross Margin' }, { Code: 'IncomeAfterTaxMarginLFI', Name: 'Net Margin'}];
                break;
            case 'Growth':
                return [{ Code: 'SalesGrowthRateLFI', Name: 'Sales growth rate' }, { Code: 'RevenueGrowthRateLFI', Name: 'Gross profit growth rate' }, { Code: 'IncomeAfterTaxGrowthRateLFI', Name: 'Net profit growth rate' }, { Code: 'TotalAssetGrowthRateLFI', Name: 'Total asset growth rate' }, { Code: 'OwnersEquitiesGrowthRateLFI', Name: "Owners' equities growth rate" }, { Code: 'EPSGrowthRateLFI', Name: 'EPS growth rate'}];
                break;
            case 'ManagementRatio':
                return [{ Code: 'ReceivableTurnoverLFY', Name: "Receivable turnover " }, { Code: 'InventoryTurnoverLFY', Name: 'Inventory turnover' }, { Code: 'PayableTurnoverLFY', Name: 'Payable turnover ' }, { Code: 'CashPeriodLFY', Name: 'Cash period' }, { Code: 'AssetTurnoverLFY', Name: 'Asset turnover' }, { Code: 'LongtermAssetTurnoverLFY', Name: 'Long-term asset turnover' }, { Code: 'FixAssetTurnoverLFY', Name: 'Fix asset turnover'}];
                break;
            case 'LiquidityCoverage':
                return [{ Code: 'TotalDebtTotalAssetLFI', Name: 'Debt / Total Asset' }, { Code: 'TotalDebtTotalEquityLFI', Name: "Debt /Owners' equities" }, { Code: 'CurrentRatioLFI', Name: 'Current ratio' }, { Code: 'QuickRatioLFI', Name: 'Quick ratio' }, { Code: 'CashRatioLFI', Name: "Cash ratio"}];
                break;
        }
    },
    GetCountCompanyByField: function (field, operator, value) {
        return CompanyRealtime.getCount([{}], [{ Field: field, Index: 0, Type: 'Static', Operator: operator, Value: value}]);
    },
    GetCompanyFilter: function (strFilter, startIndex, endIndex, orderBy, orderType) {
        var obj = AG.ClientAPI;
        var arrListParam = strFilter.split(';');
        var order = [];
        if (typeof (orderBy) != "undefined")
            order = [{ Field: orderBy, Direction: 'ASC'}];
        else
            order = [{ Field: 'ID', Direction: 'ASC'}];
        if (typeof (orderType) != "undefined")
            order[0].Direction = orderType;
        if (orderBy != 'Code')
            order.push({ Field: 'Code', Direction: 'ASC' });
        var fields = { static: ['Id', 'Code', 'Name'], dynamic: [] };
        var filter = [];
        var type = 'Static';
        for (var i = 0; i < arrListParam.length; i++) {
            var arrParam = arrListParam[i].split(',');
            switch (arrParam[0]) {
                case 'PELFI':
                    type = 'Dynamic';
                    break;
                default:
                    type = 'Static';
                    break;
            }
            filter.push({ Field: arrParam[0], Type: type, Index: i, Operator: arrParam[1], Value: arrParam[2] });
            if (type == 'Dynamic')
                fields.dynamic.push(arrParam[0]);
            else
                fields.static.push(arrParam[0]);
        }
        var requestName = 'GetCompanyFilter' + '_' + strFilter + '_' + startIndex + '_' + endIndex + '_' + orderBy + '_' + orderType;
        return obj.createData(CompanyRealtime, requestName, [{ StartIndex: startIndex }, { EndIndex: endIndex}], fields, order, filter);
    },
    GetCountCompanyFilter: function (strFilter) {
        var obj = CompanyRealtime;
        var requestName = 'GetCountCompanyFilter' + strFilter;
        var arrListParam = strFilter.split(';');
        var filter = [];
        var fields = { static: ['Id', ] };
        for (var i = 0; i < arrListParam.length; i++) {
            var arrParam = arrListParam[i].split(',');
            switch (arrParam[0]) {
                case 'PELFI':
                    type = 'Dynamic';
                    break;
                default:
                    type = 'Static';
                    break;
            }
            filter.push({ Field: arrParam[0], Type: type, Index: i, Operator: arrParam[1], Value: arrParam[2] });
        }
        return obj.getCount([{}], filter);
    },
    GetSBSOutstandingShare: function () {
        return AG.ClientAPI.createData(CompanyRealtime, 'GetSBSOutstandingShare', [{ Code: 'SBS'}], { static: ['OutstandingShare'], dynamic: ['SessionDate'] })[0];
    },
    GetEvent: function (func, stockCodeId, type, startDate, endDate, startIndex, endIndex) {
        if (typeof (stockCodeId) == 'undefined')
            stockCodeId = '';
        if (typeof (type) == 'undefined')
            type = '';
        if (typeof (startDate) == 'undefined')
            startDate = '';
        if (typeof (endDate) == 'undefined')
            endDate = '';
        if (typeof (startIndex) == 'undefined')
            startIndex = '';
        if (typeof (endIndex) == 'undefined')
            endIndex = '';
        var url = '/Handler/WS.StockData/SearchMarketEvent.ashx?' + '&typeEvent=' + type + '&company=' + stockCodeId + '&startDate=' + startDate + '&endDate=' + endDate + '&startIndex=' + startIndex + '&endIndex=' + endIndex + '&language=' + agLanguageName;
        AG.ClientAPI.getDataAsync(url, true, func);

    },
    GetCountEvent: function (stockCode, type, startDate, endDate) {
        var dataEvent = [];
        if (typeof (startDate) != 'undefined' && startDate != '')
            dataEvent.push({ StartDate: startDate });
        if (typeof (endDate) != 'undefined' && endDate != '')
            dataEvent.push({ EndDate: endDate });
        if (typeof (stockCode) != 'undefined' && stockCode != '')
            dataEvent.push({ Company: stockCode });
        if (type != AG.Config.Empty && typeof (type) != 'undefined' && type != '')
            dataEvent.push({ Type: type });
        return Event.getCount(dataEvent);
        dataEvent = null;
    },
    GetEventDateInMonth: function (startDate, endDate) {
        var data = [{ StartDate: startDate }, { EndDate: endDate}];
        var field = { static: ['Id', 'ExRightDate'] };
        var requestName = startDate + '_' + endDate;
        return AG.ClientAPI.createData(Event, requestName, data, field);
    },
    GetTypeEvent: function () {
        var order = [];
        order.push({ Field: 'Code', Direction: 'ASC' });
        var data = ['EVO06', 'EVO07', 'EVO08', 'EVC03', 'EVC04', 'EVC01', 'EVC08', 'EVD01', 'EVI04', 'EVI03', 'EVO01', 'EVC05', 'EVO02', 'EVO05', 'EVO11', 'EVO15', 'EVO12', 'EVO07', 'EVO13', 'EVD01'];

        for (var i = 0; i < data.length; i++) {
            data[i] = { Code: data[i] };
        }
        var requestName = "GetTypeEvent";
        if (agLanguageName == "en-US")
            requestName += "_Language";
        return AG.ClientAPI.createData(Config, requestName, data, { static: ['Id', 'Name'] }, order);
    },

    GetEventDetail: function (eventId) {
        var requestName = 'GetEventDetail' + eventId;
        var objEvent = AG.ClientAPI.createData(Event, requestName, [{ Id: eventId}], { static: ['Id'], dynamic: ['Title', 'Content', 'Summary'] });
        var objAttachment = AG.ClientAPI.createData(Attachment, requestName, [{ Parent: eventId}], { static: ['Id', 'Name'] });
        var result = { Title: null, Content: null, Attachment: null };
        if (objEvent.length > 0) {
            result.Title = objEvent[0].Title;
            result.Content = objEvent[0].Content;
            result.PublishDate = objEvent[0].PublishDate;
            result.Attachment = objAttachment;
        }
        return result;
    },
    GetAttachmentById: function (attachmentId) {
        location.href = '/Handler/WS.Data/GetAttachment.ashx?Id=' + attachmentId + '&Language=' + agLanguageName;

    },
    GetDividend: function (company, startDate, endDate, startIndex, endIndex) {
        var requestName = 'GetDividend' + company + startDate + endDate + startIndex + endIndex;
        return AG.ClientAPI.createData(Event, requestName, [{ Company: company }, { StartDate: startDate }, { EndDate: endDate}], { static: ['Id', 'ExRightDate', 'EndRegisterDate', 'ExerciseDate', 'Type', 'Name'], dynamic: ['Title', 'DividendYear', 'DividendTerm', 'Value', 'Currency'] }, [{ Field: 'ExRightDate', Direction: 'DESC'}]);
    },
    GetSBSDividend: function () {
        var objSBS = AG.ClientAPI.createData(CompanyInfomation, 'SBS', [{ Code: 'SBS'}], { static: ['Id'] });
        return AG.ClientAPI.createData(Event, 'GetSBSDividend', [{ Company: objSBS[0].Id}], { static: ['Id', 'ExRightDate', 'EndRegisterDate', 'ExerciseDate', 'Type', 'Name'], dynamic: ['Title', 'Value'] }, [{ Field: 'ExRightDate', Direction: 'DESC'}], [{ Field: 'EventTypeCode', Type: 'Dynamic', Index: 0, Operator: '=', Value: "EVD01"}]);
    },
    GetStockExchangeAndClosePrice: function (aStockCode) {
        var data = [];
        var requestName = '';
        for (var i = 0; i < aStockCode.length; i++) {
            data.push({ Code: aStockCode[i] });
            requestName += aStockCode[i];
        }
        return AG.ClientAPI.createData(CompanyRealtime, requestName, data, { static: ['Id', 'ClosePrice'] }, undefined, undefined, [{ Name: 'AG_Stock_StockExchange', Alias: 'E', Join: 'Inner Join', JoinColumn: 'StockExchange', MainColumn: 'Id', data: [], fields: { static: ['Name']}}]);
    },
    CountEventNews: function (stockCode, eventype, startDate, endDate) {
        //        var url = '/Handler/WS.StockData/CountNews.ashx?' + '&typeEvent=' + type + '&company=' + stockCodeId + '&startDate=' + startDate + '&endDate=' + endDate + '&startIndex=' + startIndex + '&endIndex=' + endIndex;
        AG.ClientAPI.getDirectData(url, true, dataEvent);
    }
}
