約 5,056,700 件
https://w.atwiki.jp/marketresearch/pages/26.html
Market Scenario The Blockchain Market Size Of USD CAGR Value includes a global opportunity With analysis and industry forecasts for the period 2023–2032. Blockchain report’s segmentation section focuses on each category while also identifying those with the greatest influence on the Blockchain Market. The framework for finding Key companies and assessing their Geographical Research, product portfolios, and ability for Business growth. In order to forecast the extent of competition, the second one step analyzing the core competencies and market shares of leading companies. Get a Sample PDF File@ https //www.quincemarketinsights.com/request-sample-59119?pu Competitive Analysis In terms of comparative analysis, the global market research report contains information related to the leading market players and their roles played across the global market to win the race against the other market leaders . Global Blockchain Market Segmentation Global Blockchain market is segmented on the basis of Technology type application distribution channel and user and vertical industry by offering in-depth information along with geography. By Providers (Application Providers, Middleware Providers, Infrastructure Providers), By Organization Size (Large Enterprises, Small Medium-sized Enterprises), By Application (Payments, Smart Contracts, Documentation, Digital Identity, Supply Chain Management, Governance, Risk, Compliance Management, Others), By End User (BFSI, Government, Healthcare and Life Sciences, Media and Entertainment, Retail and E-Commerce, Travel and Hospitality, Transportation and Logistics, Real Estate, Energy and Utilities, Others) Geographical Analysis Of Global Blockchain Market Regional analysis is also one of the most important features of the research report of the market. The experts have provided in-depth information related to the geography of the global Blockchain market. The research report provides information related to the sales output of the demand for global Blockchain both at international as well as the national levels various region. Apart from this it also provides a comprehensive as well as accurate geography-wise market analysis of the market volume and the historical data. Geographical landscape that are included in the global Blockchain market research report are Europe, Asia Pacific, North America, Africa, South America, and Middle East Make an Enquiry for purchasing this Report @ https //www.quincemarketinsights.com/enquiry-before-buying/enquiry-before-buying-59119?pu Key Outlook This report will help market leaders / new entrants in this market to get information about the most recent results of their revenue figures for the overall Blockchain Market and segments. This report will help operators understand the competitive landscape and get more information to better manage their business and plan an appropriate marketing strategy. The report also helps stakeholders understand the market landscape and provides them with insights into key market challenges and opportunities. BM, AWS, Microsoft, SAP, Intel, Oracle, Bitfury, Cegeka, Earthport, Guardtime, Digital Asset Holdings, Chain, Huawei, BlockCypher, Symbiont, BigchainDB Details Contained In The Global Blockchain Market Report 2021 Market Overview 1.1 Market Introduction 1.2 Market Analysis By Type 1.2.1 Type 1 1.2.2 Type 2 1.3 Market Analysis By Applications 1.3.1 Application 1 1.3.2 Application 2 1.4 Market Analysis by Regions Key Questions Covered In The Market Research Report What will be the growth rate of the Blockchain market? What are the important factors that drive the market share of the global Blockchain market? What are the key factors dividing the market size of the Global Blockchain market? Who are the top manufacturers in the Blockchain market? What are the major market opportunities, challenges, and threats faced by the Blockchain market? Who are the leading distributors, traders, and dealers of the Blockchain market? What are the sales, price, and revenue analyses of the top manufacturers of the Blockchain market? What is the impact of covid-19 on the Global Blockchain market? How the market has been segmented in this market research report? About Us QMI has the most comprehensive collection of market research products and services available on the web. We deliver reports from virtually all major publications and refresh our list regularly to provide you with immediate online access to the world’s most extensive and up-to-date archive of professional insights into global markets, companies, goods, and patterns. Contact us Quince Market Insights Phone +1 208 405 2835 Email sales@quincemarketinsights.com Website https //www.quincemarketinsights.com/
https://w.atwiki.jp/blacraison/
Block 新設クラン!現在クラメン募集中!
https://w.atwiki.jp/mieyanman/pages/14.html
WITH T1 AS ( SELECT FILE_NAME ,FILE_ID ,TABLESPACE_NAME ,BYTES ,BLOCKS ,STATUS ,RELATIVE_FNO ,AUTOEXTENSIBLE ,MAXBYTES ,MAXBLOCKS ,INCREMENT_BY ,USER_BYTES ,USER_BLOCKS ,ONLINE_STATUS FROM DBA_DATA_FILES ) , T2 AS ( SELECT TABLESPACE_NAME ,FILE_ID ,BLOCK_ID ,BYTES ,BLOCKS ,RELATIVE_FNO FROM DBA_FREE_SPACE ) , T3 AS ( SELECT T1.TABLESPACE_NAME AS TABLESPACE_NAME ,ROUND(MIN(T1.BYTES) / (1024 * 1024), 2) AS NOW_SIZE ,ROUND(MIN(T1.BYTES) / (1024 * 1024) - SUM(T2.BYTES) / (1024 * 1024),2) AS USED_SIZE FROM T1 LEFT OUTER JOIN T2 ON T1.FILE_ID = T2.FILE_ID GROUP BY T1.TABLESPACE_NAME ) SELECT T3.TABLESPACE_NAME AS "表領域" ,TO_CHAR(T3.NOW_SIZE, FM9,999,999,990 ) AS "現在のサイズ(MB)" ,TO_CHAR(T3.USED_SIZE, FM9,999,999,990 ) AS "使用量(MB)" ,TO_CHAR(ROUND(T3.USED_SIZE / T3.NOW_SIZE * 100,2), FM9,999,999,990.00 ) AS "使用率(%)" FROM T3
https://w.atwiki.jp/skyrimparma/pages/24.html
Block Safeguard0 守護 1 --- Armor may protect, but a trained warrior doesn t let a blow get that close, deflecting painful blows more effectively.盾の防御力とブロック性能が上昇する Safeguard1 守護 40 ↑ Countless deadly blows have rained upon your shield-arm, yet with each, your technique has improved, your resolve grown, your defense strengthened.盾の防御力とブロック性能が更に上昇する Debilitating Bash 消耗撃 20 Safeguard0 守護 A warrior uses everything at his disposal, even learning to enervate foes with his shield strikes. A well-aimed bash is all that is needed to hamper any foe.通常のバッシュ攻撃が、8 秒間対象の自動回復能力を無効化するようになる。 Deadly Bash デッドリー・バッシュ 50 Debilitating Bash You ve mastered defensive combat techniques, crushing enemies with bashes that rival the fiercest strikes of a guardsman s mace.全てのバッシュのダメージが大幅に上昇する Quick Reflexes クイック・リフレックス 25 Safeguard0 守護 Only in balance can an attack be turned properly. You ve learned the exact moment when to block to disrupt your opponents rhythm.タイムドブロックの効果時間が0.6秒増加する Quick Reflexes クイック・リフレックス 55 ↑ You conduct the tempo of battle, your perfectly timed shield movements serving a crashing drumbeat that leaves foes flatfooted.タイムドブロックの効果時間が0.5秒増加する Replenish0 充填 35 QuickReflexes0 クイック・リフレックス You relish the opportunity to block each attack, knowing that each critical attack you disrupt weakens your foe s momentum and adds to yours.時限防御に成功した時、一秒かけてスタミナが 20 ポイント回復する。 Replenish1 充填 70 ↑ You drink in the frustration of your enemies, as their blocked blows and turned blades are a vital boost to your effective combat stratagem.時限防御に成功した時、二秒かけてスタミナが 40 ポイント回復する。 Dispel ディスペル 50 QuickReflexes0 クイック・リフレックス A risky art for sure, but your nimble shield can deflect missiles of all sorts harmlessly away with a perfect balance of grace and timing.軽装の盾でタイムドブロックに成功すると、矢や破壊魔法のダメージを大幅に減少させる Overwhelm 圧倒 55 Dispel ディスペル A dynamo of battle strikes faster and harder than foes can comprehend. Your dynamic bashes embolden your swordarm, leaving foes in bloody tatters.軽装の盾のパワーバッシュをすると、近接武器のダメージと速度が僅かの間だが上昇する。スタミナがある程度残っている必要がある Guardian s Trick 粉砕 50 QuickReflexes0 クイック・リフレックス You ve mastered the catch-block, using heavy strength and perfect counterforce to lock and twist the incoming weapon, leaving your foe unarmed.重装の盾を装備している時、時限防御に成功すると、わずかな確率で攻撃してきた相手の武器が破壊される。 Shove シャーヴ 55 GuardiansTrick 粉砕 A lesser warrior blows away like a leaf in the wind, as your powerful shield bashes send him flying when you bring your full force to bear.重装の盾のパワーバッシュで対象を吹っ飛ばす。これはスタミナがある程度無いと発生しない。幽霊、マンモス、ドラゴンは不可 Sanctuary 聖域 20 Safeguard0 守護 As the chaos of combat surrounds you, you seek shelter behind your faithful shield, gaining valuable time to gather your strength.防御中、体力とマジカの回復速度が速くなる。魔法を防ぐとその魔法コスト15%分のスタミナが減る Sanctuary 聖域 40 ↑ The din of battle fades as you raise your shield, a bulwark of safety from the danger around you. Pausing, you quickly regain your strength and composure.防御中、体力とマジカの回復速度が20%速くなる。防御中は移動不可となり効果が倍増する。魔法を防ぐとその魔法コスト10%分のスタミナが減る Exhaust0 疲弊 35 Sanctuary0 聖域 The best offense is a good defense. You turn the enemy s force against him, weakening his attacks with every clash of your shield.近接攻撃の防御に成功した後、攻撃してきた相手の攻撃力が 4 秒間、25%減少する。 Exhaust1 疲弊 55 ↑ Even the strongest warrior must carefully consider their attacks against you, as you block and parry in ways that only wither your foe s aggression.近接攻撃の防御に成功した後、攻撃してきた相手の攻撃力が 6 秒間、30%減少する。 Exhaust2 疲弊 75 ↑ Your enemies have heard rumors warriors exhausting themselves beating against your ever-present shield. Let them come try their luck.近接攻撃の防御に成功した後、攻撃してきた相手の攻撃力が 8 秒間、35%減少する。 Riposte リポステ 45 Exhaust0 疲弊 The first time, he thought he made a mistake, but there was no error. Your defense skill with a blade rivals the slashing skill of lesser warriors assaults.斬撃武器でブロックすると、攻撃側の体力を若干減少させる Riposte リポステ 75 ↑ A master of the riposte, only the fiercest, or most foolish, dare attack you with your blade at the ready, for your canny defense slashes past their attack.斬撃武器でブロックすると、攻撃側の体力を低下させる Block Runner ブロックランナー 65 Power Bash haust0 疲弊 Countless battles with your shield have given you a critical edge, moving, dodging and returning to cover behind your shield in a flash.盾を構えたまま速く移動できる Blunt Supremacy ブラントスプレマシー 60 Power Bash A graceful sword is pretty, and a shield is useful, but all a good warrior needs is a simple hammer to expertly bash all who approach.打撃武器でパワーバッシュすると、前方の対象全てにヒットする Mastery Last Stand Mastery ラストスタンド 95 Shield Charge The ultimate combat art of the shielded warrior. You can summon the focus required to perfectly block every blow for a short while, refuting even the worst fate.ラストスタンドのパワーを使えるようになる。あらゆる攻撃をブロックしてダメージを0にする
https://w.atwiki.jp/block/pages/11.html
Block Actionとは-? 自らステージを作成して投稿したり、他の人が作ったステージをPLAYしたり出来ます。
https://w.atwiki.jp/hmiku/pages/31430.html
【登録タグ C VOCALOID ZOLA PROJECT KYO ZOLA PROJECT WIL ZOLA PROJECT YUU 小宮ちゃんP 曲 曲英】 作詞:小宮ちゃんP 作曲:小宮ちゃんP 編曲:小宮ちゃんP 映像:鴫野エイカー 製作協力:まく、黒コート、asakawaさんP、くうわんこちゃん、茶々P 唄:ZOLA PROJECT 曲紹介 ZOLA1周年コンテストの為に作ったEDMです( ^ω^ )!! ZOLAの良さがでるような楽曲にしたいと思って作りました( ^ω^ ) 曲名:『Check! Check! Check!』 歌詞 (PIAPROより転載) back.back.back. she will be back. I can't seem to let you go、 When will she be back? back.back. she will be back.back.back. Forget when she was mine When will she be back? back.back. she will be back.back.back. 僕だけが思い出してるの? ‘Tick‐tock, tick went the clock. 君が思い出になっていく 朝起きると虚しい気持ちが僕を包み込む 意味深なSNSの 言葉を拾って追いかける Check! Check! Check! Your words It's been so lonely without you here Check! Check! Check! Your words Waiting for my phone to blow いつのまにか 流す涙も尽きて Check! Check! Check! Your words 小さな玩具に振り回される 貴方が好きだった曲は もう聞けないや 楽しかった思い出も 今は切ないだけ 後悔が止まない あの時こうしていれば、、、 違う未来が僕らにもあったのかな Check! Check! Check! Your words 断ち切れない思い 死んじゃいそう なんで僕じゃ駄目なんだ 馬鹿なことばかり考えて 貴方のこと 考え夜が明けて ‘Tick‐tock, tick went the clock. 時計がかちかち動いていた 時が過ぎていく コメント 名前 コメント
https://w.atwiki.jp/fiji/pages/106.html
# dump on echo -n 1 /proc/sys/vm/block_dump # dump off echo -n 0 /proc/sys/vm/block_dump block/ll_rw_blk.c if (unlikely(block_dump)) { char b[BDEVNAME_SIZE]; printk(KERN_DEBUG "%s(%d) %s block %Lu on %s\n", current- comm, current- pid, (rw WRITE) ? "WRITE" "READ", (unsigned long long)bio- bi_sector, bdevname(bio- bi_bdev,b)); } fs/fs-writeback.c if (unlikely(block_dump)) { struct dentry *dentry = NULL; const char *name = "?"; if (!list_empty( inode- i_dentry)) { dentry = list_entry(inode- i_dentry.next, struct dentry, d_alias); if (dentry dentry- d_name.name) name = (const char *) dentry- d_name.name; } if (inode- i_ino || strcmp(inode- i_sb- s_id, "bdev")) printk(KERN_DEBUG "%s(%d) dirtied inode %lu (%s) on %s\n", current- comm, current- pid, inode- i_ino, name, inode- i_sb- s_id); }
https://w.atwiki.jp/sampleisbest/pages/287.html
開発環境 Microsoft Visual C# 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Windows フォーム アプリケーション プロジェクト名 HashChecker プロパティ Form1 AcceptButton Check AllowDrop True MaximizeBox False Text Hash Checker Label Text File Path TextBox (Name) FilePath Enabled False Label Text MD5 TextBox (Name) MD5Out Enabled False TextBox (Name) MD5In Label Text SHA-1 TextBox (Name) SHA1Out Enabled False TextBox (Name) SHA1In Label Text File Size TextBox (Name) FileSizeOut Enabled False TextBox (Name) FileSizeIn Button (Name) Check Text Check 参考 ファイルのMD5やSHA1などでハッシュ値を計算する .NET Tips C#, VB.NET Form1.cs using System; using System.IO; using System.Security.Cryptography; using System.Text; using System.Windows.Forms; namespace HashChecker { public partial class Form1 Form { public Form1() { InitializeComponent(); } private void Form1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.Copy; } else { e.Effect = DragDropEffects.None; } } private void Form1_DragDrop(object sender, DragEventArgs e) { string[] filePathArray = (string[])e.Data.GetData(DataFormats.FileDrop, false); string filePath = filePathArray[0]; FilePath.Text = filePath; // File Size FileInfo fi = new FileInfo(filePath); FileSizeOut.Text = fi.Length.ToString(); FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); // MD5 using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider()) { byte[] bs = md5.ComputeHash(fs); StringBuilder result = new StringBuilder(); foreach (byte b in bs) { result.Append(b.ToString("x2")); } MD5Out.Text = result.ToString(); } fs.Seek(0, SeekOrigin.Begin); // SHA-1 using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) { byte[] bs = sha1.ComputeHash(fs); StringBuilder result = new StringBuilder(); foreach (byte b in bs) { result.Append(b.ToString("x2")); } SHA1Out.Text = result.ToString(); } fs.Close(); } private void Check_Click(object sender, EventArgs e) { StringBuilder message = new StringBuilder(); int error = 0; // File Size message.Append("File Size "); string fileSize = FileSizeIn.Text.Replace(",", ""); if (FileSizeOut.Text == fileSize) { message.Append("OK"); } else { message.Append("NG"); error++; } // MD5 message.Append("\nMD5 "); if (String.Compare(MD5Out.Text, MD5In.Text, true) == 0) { message.Append("OK"); } else { message.Append("NG"); error++; } // SHA-1 message.Append("\nSHA-1 "); if (String.Compare(SHA1Out.Text, SHA1In.Text, true) == 0) { message.Append("OK"); } else { message.Append("NG"); error++; } MessageBoxIcon icon; switch (error) { case 0 icon = MessageBoxIcon.Information; break; case 3 icon = MessageBoxIcon.Error; break; default icon = MessageBoxIcon.Warning; break; } MessageBox.Show(message.ToString(), "Hash Checker", MessageBoxButtons.OK, icon); } } }
https://w.atwiki.jp/mrfrtech/pages/46.html
Market Scenario The uplifting concentrations on the decentralization of information and data ledgers have resulted in the escalation of Blockchain technology. This Blockchain Technology Market facilitates the invariableness of the functions of the database by making transparent interactions. The applications produced by Blockchain Technology Industry are gaining speedy mileage and covering a wide range of domains such as retail, healthcare, and BFSI. Also, there’s a huge market opportunity and potential for the Blockchain Technology Market. Therefore, Blockchain is assumed to gain huge popularity in the future years because of its innate nature. According to the expectation of MRFR or Market Research Future, within the review period i.e. from 2018 to 2023, the Blockchain Technology Market will grow at a CAGR of Compound Annual Growth rate of 66.41%. The rising demand for digital identity has resulted in the expansion of Blockchain Technology Market Forecast. The various identity platforms based on blockchain technology have numerous applications in both countries that have weak identification procedures and in unregulated countries. At the national level, the adoption of Blockchain Technology Market Demand-based identification platforms has been performed by various governments to promote transparent and secure transactions across the public and private sectors. Various governments have used blockchain technology at a national level with their e-citizen programs since 2018. Therefore, these countries have been able to develop their identity-related procedures and successfully minimized the bureaucracy. Also, this technology has helped them to digitalize all kinds of public transactions via safe digital identities. Request a Free Sample @ https //www.marketresearchfuture.com/sample_request/1708 Competitive Outlook Eminent players profiled in the global blockchain technology report include Deloitte Touche Tohmatsu Limited, IBM Corporation, Hewlett Packard, Enterprise Company, Accenture PLC, Infosys Limited, Cyber Infrastructure Pvt. Ltd, Solulab Inc., Empirica S.A, Microsoft Corporation, Oracle Corporation, and Amazon Web Services, Inc.Segmentation According to the Blockchain Technology Market Analysis, this market can be classified based on the application, service provider, organization size, end-users, and region. By Application The Blockchain technology market is segmented into the following divisions based on the types of application •Payment and transaction •Digital identity •Exchanges •Smart contract •Documentation •Other By Organization Size Based on organization size, the divisions of the Blockchain technology market are •Small enterprises •Medium enterprises •Large enterprises By Service Provider This segment classifies the usage of different Blockchain technology. The divisions are as follows Middleware provider •Application provider •Infrastructure provider •Solution provider •Protocol provider By End-users The Blockchain technology market is segmented into the following divisions based on the end-users. •BFSI •Life sciences and Health care •Telecommunication and IT •Hospitality and travel •Government •Retail •Construction and real estate •Others By Region The segmentation of the worldwide Blockchain technology market based on the region are North America •Europe •Asia Pacific •Rest of the world Regional Analysis According to the Blockchain Technology Market Opportunitiesand trends, in 2018, the North American region has dominated this market and it was estimated at approximately USD 612.3 million. The reason behind such growth is the speedier adoption of these innovative Blockchain technologies in most of the developed nations such as Canada and the United States. Also, the rising adoption of this technology among various verticals including retail, BFSI, government for detection of digital identity, wallet and payment solutions, smart contracts, etc. are assumed to enhance the Blockchain Technology Market Share. Industry Analysis In 2017, the price of the cryptocurrency has jumped to 2.200% within only 11 months and as a result, the funds raised by the various Blockchain start-ups via IOS had surpassed the VC investment in the Blockchain sector. Browse Full Report Details @ https //www.marketresearchfuture.com/reports/block-chain-technology-market-1708 Table of Contents 1Executive Summary 2Scope of the Report 2.1Market Definition 2.2Scope of the Study 2.2.1Research objectives 2.2.2Assumptions Limitations 2.3Markets Structure Continued…. View Similar Report Internet of things (IoT) Market https //ictmrfr.blogspot.com/2022/04/internet-of-things-market-growth-key.html B2B Telecommunication Market https //www.scutify.com/articles/2022-04-12-b2b-telecommunication-market-analysis--geographic-growth-opportunities-for-it-security-and-data- Cash Management System Market https //market-research-future.tribe.so/post/cash-management-system-market-size-receives-a-rapid-boost-in-economy-due-to--625d5382d24f49591bd3befbLearning Management System Market By Application (Corporate, Academics), by Deployment (Cloud, On-Premise), by Service (Administration, Performance Management, Content Management, Communication Collaboration) About Market Research Future At Market Research Future (MRFR), we enable our customers to unravel the complexity of various industries through our Cooked Research Report (CRR), Half-Cooked Research Reports (HCRR), Raw Research Reports (3R), Continuous-Feed Research (CFR), and Market Research Consulting Services. Contact Market Research Future (Part of Wantstats Research and Media Private Limited) 99 Hudson Street, 5Th Floor New York, NY 10013 United States of America 1 628 258 0071 (US) 44 2035 002 764 (UK) Email sales@marketresearchfuture.com Website https //www.marketresearchfuture.com #market #research #industry #data #report #share #digital #gnews Plugin Error キーワードを入力してください。 #trend #future #analyis #industryreport #industrygrowth #demographic #strategy #manegment
https://w.atwiki.jp/nobunyaganoyabou/pages/13.html
)(); /** * The main Table namespace */ var Table = (function(){ /** * Determine if a reference is defined */ function def(o) {return (typeof o!="undefined");}; /** * Determine if an object or class string contains a given class. */ function hasClass(o,name) { return new RegExp("(^|\\s)"+name+"(\\s|$)").test(o.className); }; /** * Add a class to an object */ function addClass(o,name) { var c = o.className || ""; if (def(c) !hasClass(o,name)) { o.className += (c?" " "") + name; } }; /** * Remove a class from an object */ function removeClass(o,name) { var c = o.className || ""; o.className = c.replace(new RegExp("(^|\\s)"+name+"(\\s|$)"),"$1"); }; /** * For classes that match a given substring, return the rest */ function classValue(o,prefix) { var c = o.className; if (c.match(new RegExp("(^|\\s)"+prefix+"([^ ]+)"))) { return RegExp.$2; } return null; }; /** * Return true if an object is hidden. * This uses the "russian doll" technique to unwrap itself to the most efficient * function after the first pass. This avoids repeated feature detection that * would always fall into the same block of code. */ function isHidden(o) { if (window.getComputedStyle) { var cs = window.getComputedStyle; return (isHidden = function(o) { return none ==cs(o,null).getPropertyValue( display ); })(o); } else if (window.currentStyle) { return(isHidden = function(o) { return none ==o.currentStyle[ display ]; })(o); } return (isHidden = function(o) { return none ==o.style[ display ]; })(o); }; /** * Get a parent element by tag name, or the original element if it is of the tag type */ function getParent(o,a,b) { if (o!=null o.nodeName) { if (o.nodeName==a || (b o.nodeName==b)) { return o; } while (o=o.parentNode) { if (o.nodeName (o.nodeName==a || (b o.nodeName==b))) { return o; } } } return null; }; /** * Utility function to copy properties from one object to another */ function copy(o1,o2) { for (var i=2;i arguments.length; i++) { var a = arguments[i]; if (def(o1[a])) { o2[a] = o1[a]; } } } // The table object itself var table = { //Class names used in the code AutoStripeClassName "table-autostripe", StripeClassNamePrefix "table-stripeclass ", AutoSortClassName "table-autosort", AutoSortColumnPrefix "table-autosort ", AutoSortTitle "Click to sort", SortedAscendingClassName "table-sorted-asc", SortedDescendingClassName "table-sorted-desc", SortableClassName "table-sortable", SortableColumnPrefix "table-sortable ", NoSortClassName "table-nosort", AutoFilterClassName "table-autofilter", FilteredClassName "table-filtered", FilterableClassName "table-filterable", FilteredRowcountPrefix "table-filtered-rowcount ", RowcountPrefix "table-rowcount ", FilterAllLabel "Filter All", AutoPageSizePrefix "table-autopage ", AutoPageJumpPrefix "table-page ", PageNumberPrefix "table-page-number ", PageCountPrefix "table-page-count " }; /** * A place to store misc table information, rather than in the table objects themselves */ table.tabledata = {}; /** * Resolve a table given an element reference, and make sure it has a unique ID */ table.uniqueId=1; table.resolve = function(o,args) { if (o!=null o.nodeName o.nodeName!="TABLE") { o = getParent(o,"TABLE"); } if (o==null) { return null; } if (!o.id) { var id = null; do { var id = "TABLE_"+(table.uniqueId++); } while (document.getElementById(id)!=null); o.id = id; } this.tabledata[o.id] = this.tabledata[o.id] || {}; if (args) { copy(args,this.tabledata[o.id],"stripeclass","ignorehiddenrows","useinnertext","sorttype","col","desc","page","pagesize"); } return o; }; /** * Run a function against each cell in a table header or footer, usually * to add or remove css classes based on sorting, filtering, etc. */ table.processTableCells = function(t, type, func, arg) { t = this.resolve(t); if (t==null) { return; } if (type!="TFOOT") { this.processCells(t.tHead, func, arg); } if (type!="THEAD") { this.processCells(t.tFoot, func, arg); } }; /** * Internal method used to process an arbitrary collection of cells. * Referenced by processTableCells. * It s done this way to avoid getElementsByTagName() which would also return nested table cells. */ table.processCells = function(section,func,arg) { if (section!=null) { if (section.rows section.rows.length section.rows.length 0) { var rows = section.rows; for (var j=0,L2=rows.length; j L2; j++) { var row = rows[j]; if (row.cells row.cells.length row.cells.length 0) { var cells = row.cells; for (var k=0,L3=cells.length; k L3; k++) { var cellsK = cells[k]; func.call(this,cellsK,arg); } } } } } }; /** * Get the cellIndex value for a cell. This is only needed because of a Safari * bug that causes cellIndex to exist but always be 0. * Rather than feature-detecting each time it is called, the function will * re-write itself the first time it is called. */ table.getCellIndex = function(td) { var tr = td.parentNode; var cells = tr.cells; if (cells cells.length) { if (cells.length 1 cells[cells.length-1].cellIndex 0) { // Define the new function, overwrite the one we re running now, and then run the new one (this.getCellIndex = function(td) { return td.cellIndex; })(td); } // Safari will always go through this slower block every time. Oh well. for (var i=0,L=cells.length; i L; i++) { if (tr.cells[i]==td) { return i; } } } return 0; }; /** * A map of node names and how to convert them into their "value" for sorting, filtering, etc. * These are put here so it is extensible. */ table.nodeValue = { INPUT function(node) { if (def(node.value) node.type ((node.type!="checkbox" node.type!="radio") || node.checked)) { return node.value; } return ""; }, SELECT function(node) { if (node.selectedIndex =0 node.options) { // Sort select elements by the visible text return node.options[node.selectedIndex].text; } return ""; }, IMG function(node) { return node.name || ""; } }; /** * Get the text value of a cell. Only use innerText if explicitly told to, because * otherwise we want to be able to handle sorting on inputs and other types */ table.getCellValue = function(td,useInnerText) { if (useInnerText def(td.innerText)) { return td.innerText; } if (!td.childNodes) { return ""; } var childNodes=td.childNodes; var ret = ""; for (var i=0,L=childNodes.length; i L; i++) { var node = childNodes[i]; var type = node.nodeType; // In order to get realistic sort results, we need to treat some elements in a special way. // These behaviors are defined in the nodeValue() object, keyed by node name if (type==1) { var nname = node.nodeName; if (this.nodeValue[nname]) { ret += this.nodeValue[nname](node); } else { ret += this.getCellValue(node); } } else if (type==3) { if (def(node.innerText)) { ret += node.innerText; } else if (def(node.nodeValue)) { ret += node.nodeValue; } } } return ret; }; /** * Consider colspan and rowspan values in table header cells to calculate the actual cellIndex * of a given cell. This is necessary because if the first cell in row 0 has a rowspan of 2, * then the first cell in row 1 will have a cellIndex of 0 rather than 1, even though it really * starts in the second column rather than the first. * See http //www.javascripttoolbox.com/temp/table_cellindex.html */ table.tableHeaderIndexes = {}; table.getActualCellIndex = function(tableCellObj) { if (!def(tableCellObj.cellIndex)) { return null; } var tableObj = getParent(tableCellObj,"TABLE"); var cellCoordinates = tableCellObj.parentNode.rowIndex+"-"+this.getCellIndex(tableCellObj); // If it has already been computed, return the answer from the lookup table if (def(this.tableHeaderIndexes[tableObj.id])) { return this.tableHeaderIndexes[tableObj.id][cellCoordinates]; } var matrix = []; this.tableHeaderIndexes[tableObj.id] = {}; var thead = getParent(tableCellObj,"THEAD"); var trs = thead.getElementsByTagName( TR ); // Loop thru every tr and every cell in the tr, building up a 2-d array "grid" that gets // populated with an "x" for each space that a cell takes up. If the first cell is colspan // 2, it will fill in values [0] and [1] in the first array, so that the second cell will // find the first empty cell in the first row (which will be [2]) and know that this is // where it sits, rather than its internal .cellIndex value of [1]. for (var i=0; i trs.length; i++) { var cells = trs[i].cells; for (var j=0; j cells.length; j++) { var c = cells[j]; var rowIndex = c.parentNode.rowIndex; var cellId = rowIndex+"-"+this.getCellIndex(c); var rowSpan = c.rowSpan || 1; var colSpan = c.colSpan || 1; var firstAvailCol; if(!def(matrix[rowIndex])) { matrix[rowIndex] = []; } var m = matrix[rowIndex]; // Find first available column in the first row for (var k=0; k m.length+1; k++) { if (!def(m[k])) { firstAvailCol = k; break; } } this.tableHeaderIndexes[tableObj.id][cellId] = firstAvailCol; for (var k=rowIndex; k rowIndex+rowSpan; k++) { if(!def(matrix[k])) { matrix[k] = []; } var matrixrow = matrix[k]; for (var l=firstAvailCol; l firstAvailCol+colSpan; l++) { matrixrow[l] = "x"; } } } } // Store the map so future lookups are fast. return this.tableHeaderIndexes[tableObj.id][cellCoordinates]; }; /** * Sort all rows in each TBODY (tbodies are sorted independent of each other) */ table.sort = function(o,args) { var t, tdata, sortconvert=null; // Allow for a simple passing of sort type as second parameter if (typeof(args)=="function") { args={sorttype args}; } args = args || {}; // If no col is specified, deduce it from the object sent in if (!def(args.col)) { args.col = this.getActualCellIndex(o) || 0; } // If no sort type is specified, default to the default sort args.sorttype = args.sorttype || Sort[ default ]; // Resolve the table t = this.resolve(o,args); tdata = this.tabledata[t.id]; // If we are sorting on the same column as last time, flip the sort direction if (def(tdata.lastcol) tdata.lastcol==tdata.col def(tdata.lastdesc)) { tdata.desc = !tdata.lastdesc; } else { tdata.desc = !!args.desc; } // Store the last sorted column so clicking again will reverse the sort order tdata.lastcol=tdata.col; tdata.lastdesc=!!tdata.desc; // If a sort conversion function exists, pre-convert cell values and then use a plain alphanumeric sort var sorttype = tdata.sorttype; if (typeof(sorttype.convert)=="function") { sortconvert=tdata.sorttype.convert; sorttype=Sort.alphanumeric; } // Loop through all THEADs and remove sorted class names, then re-add them for the col // that is being sorted this.processTableCells(t,"THEAD", function(cell) { if (hasClass(cell,this.SortableClassName)) { removeClass(cell,this.SortedAscendingClassName); removeClass(cell,this.SortedDescendingClassName); // If the computed colIndex of the cell equals the sorted colIndex, flag it as sorted if (tdata.col==table.getActualCellIndex(cell) (classValue(cell,table.SortableClassName))) { addClass(cell,tdata.desc?this.SortedAscendingClassName this.SortedDescendingClassName); } } } ); // Sort each tbody independently var bodies = t.tBodies; if (bodies==null || bodies.length==0) { return; } // Define a new sort function to be called to consider descending or not var newSortFunc = (tdata.desc)? function(a,b){return sorttype(b[0],a[0]);} function(a,b){return sorttype(a[0],b[0]);}; var useinnertext=!!tdata.useinnertext; var col = tdata.col; for (var i=0,L=bodies.length; i L; i++) { var tb = bodies[i], tbrows = tb.rows, rows = []; // Allow tbodies to request that they not be sorted if(!hasClass(tb,table.NoSortClassName)) { // Create a separate array which will store the converted values and refs to the // actual rows. This is the array that will be sorted. var cRow, cRowIndex=0; if (cRow=tbrows[cRowIndex]){ // Funky loop style because it s considerably faster in IE do { if (rowCells = cRow.cells) { var cellValue = (col rowCells.length)?this.getCellValue(rowCells[col],useinnertext) null; if (sortconvert) cellValue = sortconvert(cellValue); rows[cRowIndex] = [cellValue,tbrows[cRowIndex]]; } } while (cRow=tbrows[++cRowIndex]) } // Do the actual sorting rows.sort(newSortFunc); // Move the rows to the correctly sorted order. Appending an existing DOM object just moves it! cRowIndex=0; var displayedCount=0; var f=[removeClass,addClass]; if (cRow=rows[cRowIndex]){ do { tb.appendChild(cRow[1]); } while (cRow=rows[++cRowIndex]) } } } // If paging is enabled on the table, then we need to re-page because the order of rows has changed! if (tdata.pagesize) { this.page(t); // This will internally do the striping } else { // Re-stripe if a class name was supplied if (tdata.stripeclass) { this.stripe(t,tdata.stripeclass,!!tdata.ignorehiddenrows); } } }; /** * Apply a filter to rows in a table and hide those that do not match. */ table.filter = function(o,filters,args) { var cell; args = args || {}; var t = this.resolve(o,args); var tdata = this.tabledata[t.id]; // If new filters were passed in, apply them to the table s list of filters if (!filters) { // If a null or blank value was sent in for filters then that means reset the table to no filters tdata.filters = null; } else { // Allow for passing a select list in as the filter, since this is common design if (filters.nodeName=="SELECT" filters.type=="select-one" filters.selectedIndex -1) { filters={ filter filters.options[filters.selectedIndex].value }; } // Also allow for a regular input if (filters.nodeName=="INPUT" filters.type=="text") { filters={ filter "/^"+filters.value+"/" }; } // Force filters to be an array if (typeof(filters)=="object" !filters.length) { filters = [filters]; } // Convert regular expression strings to RegExp objects and function strings to function objects for (var i=0,L=filters.length; i L; i++) { var filter = filters[i]; if (typeof(filter.filter)=="string") { // If a filter string is like "/expr/" then turn it into a Regex if (filter.filter.match(/^\/(.*)\/$/)) { filter.filter = new RegExp(RegExp.$1); filter.filter.regex=true; } // If filter string is like "function (x) { ... }" then turn it into a function else if (filter.filter.match(/^function\s*\(([^\)]*)\)\s*\{(.*)}\s*$/)) { filter.filter = Function(RegExp.$1,RegExp.$2); } } // If some non-table object was passed in rather than a col value, resolve it // and assign it s column index to the filter if it doesn t have one. This way, // passing in a cell reference or a select object etc instead of a table object // will automatically set the correct column to filter. if (filter !def(filter.col) (cell=getParent(o,"TD","TH"))) { filter.col = this.getCellIndex(cell); } // Apply the passed-in filters to the existing list of filters for the table, removing those that have a filter of null or "" if ((!filter || !filter.filter) tdata.filters) { delete tdata.filters[filter.col]; } else { tdata.filters = tdata.filters || {}; tdata.filters[filter.col] = filter.filter; } } // If no more filters are left, then make sure to empty out the filters object for (var j in tdata.filters) { var keep = true; } if (!keep) { tdata.filters = null; } } // Everything s been setup, so now scrape the table rows return table.scrape(o); }; /** * "Page" a table by showing only a subset of the rows */ table.page = function(t,page,args) { args = args || {}; if (def(page)) { args.page = page; } return table.scrape(t,args); }; /** * Jump forward or back any number of pages */ table.pageJump = function(t,count,args) { t = this.resolve(t,args); return this.page(t,(table.tabledata[t.id].page||0)+count,args); }; /** * Go to the next page of a paged table */ table.pageNext = function(t,args) { return this.pageJump(t,1,args); }; /** * Go to the previous page of a paged table */ table.pagePrevious = function(t,args) { return this.pageJump(t,-1,args); }; /** * Scrape a table to either hide or show each row based on filters and paging */ table.scrape = function(o,args) { var col,cell,filterList,filterReset=false,filter; var page,pagesize,pagestart,pageend; var unfilteredrows=[],unfilteredrowcount=0,totalrows=0; var t,tdata,row,hideRow; args = args || {}; // Resolve the table object t = this.resolve(o,args); tdata = this.tabledata[t.id]; // Setup for Paging var page = tdata.page; if (def(page)) { // Don t let the page go before the beginning if (page 0) { tdata.page=page=0; } pagesize = tdata.pagesize || 25; // 25=arbitrary default pagestart = page*pagesize+1; pageend = pagestart + pagesize - 1; } // Scrape each row of each tbody var bodies = t.tBodies; if (bodies==null || bodies.length==0) { return; } for (var i=0,L=bodies.length; i L; i++) { var tb = bodies[i]; for (var j=0,L2=tb.rows.length; j L2; j++) { row = tb.rows[j]; hideRow = false; // Test if filters will hide the row if (tdata.filters row.cells) { var cells = row.cells; var cellsLength = cells.length; // Test each filter for (col in tdata.filters) { if (!hideRow) { filter = tdata.filters[col]; if (filter col cellsLength) { var val = this.getCellValue(cells[col]); if (filter.regex val.search) { hideRow=(val.search(filter) 0); } else if (typeof(filter)=="function") { hideRow=!filter(val,cells[col]); } else { hideRow = (val!=filter); } } } } } // Keep track of the total rows scanned and the total runs _not_ filtered out totalrows++; if (!hideRow) { unfilteredrowcount++; if (def(page)) { // Temporarily keep an array of unfiltered rows in case the page we re on goes past // the last page and we need to back up. Don t want to filter again! unfilteredrows.push(row); if (unfilteredrowcount pagestart || unfilteredrowcount pageend) { hideRow = true; } } } row.style.display = hideRow?"none" ""; } } if (def(page)) { // Check to see if filtering has put us past the requested page index. If it has, // then go back to the last page and show it. if (pagestart =unfilteredrowcount) { pagestart = unfilteredrowcount-(unfilteredrowcount%pagesize); tdata.page = page = pagestart/pagesize; for (var i=pagestart,L=unfilteredrows.length; i L; i++) { unfilteredrows[i].style.display=""; } } } // Loop through all THEADs and add/remove filtered class names this.processTableCells(t,"THEAD", function(c) { ((tdata.filters def(tdata.filters[table.getCellIndex(c)]) hasClass(c,table.FilterableClassName))?addClass removeClass)(c,table.FilteredClassName); } ); // Stripe the table if necessary if (tdata.stripeclass) { this.stripe(t); } // Calculate some values to be returned for info and updating purposes var pagecount = Math.floor(unfilteredrowcount/pagesize)+1; if (def(page)) { // Update the page number/total containers if they exist if (tdata.container_number) { tdata.container_number.innerHTML = page+1; } if (tdata.container_count) { tdata.container_count.innerHTML = pagecount; } } // Update the row count containers if they exist if (tdata.container_filtered_count) { tdata.container_filtered_count.innerHTML = unfilteredrowcount; } if (tdata.container_all_count) { tdata.container_all_count.innerHTML = totalrows; } return { data tdata, unfilteredcount unfilteredrowcount, total totalrows, pagecount pagecount, page page, pagesize pagesize }; }; /** * Shade alternate rows, aka Stripe the table. */ table.stripe = function(t,className,args) { args = args || {}; args.stripeclass = className; t = this.resolve(t,args); var tdata = this.tabledata[t.id]; var bodies = t.tBodies; if (bodies==null || bodies.length==0) { return; } className = tdata.stripeclass; // Cache a shorter, quicker reference to either the remove or add class methods var f=[removeClass,addClass]; for (var i=0,L=bodies.length; i L; i++) { var tb = bodies[i], tbrows = tb.rows, cRowIndex=0, cRow, displayedCount=0; if (cRow=tbrows[cRowIndex]){ // The ignorehiddenrows test is pulled out of the loop for a slight speed increase. // Makes a bigger difference in FF than in IE. // In this case, speed always wins over brevity! if (tdata.ignoreHiddenRows) { do { f[displayedCount++%2](cRow,className); } while (cRow=tbrows[++cRowIndex]) } else { do { if (!isHidden(cRow)) { f[displayedCount++%2](cRow,className); } } while (cRow=tbrows[++cRowIndex]) } } } }; /** * Build up a list of unique values in a table column */ table.getUniqueColValues = function(t,col) { var values={}, bodies = this.resolve(t).tBodies; for (var i=0,L=bodies.length; i L; i++) { var tbody = bodies[i]; for (var r=0,L2=tbody.rows.length; r L2; r++) { values[this.getCellValue(tbody.rows[r].cells[col])] = true; } } var valArray = []; for (var val in values) { valArray.push(val); } return valArray.sort(); }; /** * Scan the document on load and add sorting, filtering, paging etc ability automatically * based on existence of class names on the table and cells. */ table.auto = function(args) { var cells = [], tables = document.getElementsByTagName("TABLE"); var val,tdata; if (tables!=null) { for (var i=0,L=tables.length; i L; i++) { var t = table.resolve(tables[i]); tdata = table.tabledata[t.id]; if (val=classValue(t,table.StripeClassNamePrefix)) { tdata.stripeclass=val; } // Do auto-filter if necessary if (hasClass(t,table.AutoFilterClassName)) { table.autofilter(t); } // Do auto-page if necessary if (val = classValue(t,table.AutoPageSizePrefix)) { table.autopage(t,{ pagesize +val}); } // Do auto-sort if necessary if ((val = classValue(t,table.AutoSortColumnPrefix)) || (hasClass(t,table.AutoSortClassName))) { table.autosort(t,{ col (val==null)?null +val}); } // Do auto-stripe if necessary if (tdata.stripeclass hasClass(t,table.AutoStripeClassName)) { table.stripe(t); } } } }; /** * Add sorting functionality to a table header cell */ table.autosort = function(t,args) { t = this.resolve(t,args); var tdata = this.tabledata[t.id]; this.processTableCells(t, "THEAD", function(c) { var type = classValue(c,table.SortableColumnPrefix); if (type!=null) { type = type || "default"; c.title =c.title || table.AutoSortTitle; addClass(c,table.SortableClassName); c.onclick = Function("","Table.sort(this,{ sorttype Sort[ "+type+" ]})"); // If we are going to auto sort on a column, we need to keep track of what kind of sort it will be if (args.col!=null) { if (args.col==table.getActualCellIndex(c)) { tdata.sorttype=Sort[ "+type+" ]; } } } } ); if (args.col!=null) { table.sort(t,args); } }; /** * Add paging functionality to a table */ table.autopage = function(t,args) { t = this.resolve(t,args); var tdata = this.tabledata[t.id]; if (tdata.pagesize) { this.processTableCells(t, "THEAD,TFOOT", function(c) { var type = classValue(c,table.AutoPageJumpPrefix); if (type=="next") { type = 1; } else if (type=="previous") { type = -1; } if (type!=null) { c.onclick = Function("","Table.pageJump(this,"+type+")"); } } ); if (val = classValue(t,table.PageNumberPrefix)) { tdata.container_number = document.getElementById(val); } if (val = classValue(t,table.PageCountPrefix)) { tdata.container_count = document.getElementById(val); } return table.page(t,0,args); } }; /** * A util function to cancel bubbling of clicks on filter dropdowns */ table.cancelBubble = function(e) { e = e || window.event; if (typeof(e.stopPropagation)=="function") { e.stopPropagation(); } if (def(e.cancelBubble)) { e.cancelBubble = true; } }; /** * Auto-filter a table */ table.autofilter = function(t,args) { args = args || {}; t = this.resolve(t,args); var tdata = this.tabledata[t.id],val; table.processTableCells(t, "THEAD", function(cell) { if (hasClass(cell,table.FilterableClassName)) { var cellIndex = table.getCellIndex(cell); var colValues = table.getUniqueColValues(t,cellIndex); if (colValues.length 0) { if (typeof(args.insert)=="function") { func.insert(cell,colValues); } else { var sel = select onchange="Table.filter(this,this)" onclick="Table.cancelBubble(event)" class=" +table.AutoFilterClassName+ " option value="" +table.FilterAllLabel+ /option ; for (var i=0; i colValues.length; i++) { sel += option value=" +colValues[i]+ " +colValues[i]+ /option ; } sel += /select ; cell.innerHTML += " br "+sel; } } } }); if (val = classValue(t,table.FilteredRowcountPrefix)) { tdata.container_filtered_count = document.getElementById(val); } if (val = classValue(t,table.RowcountPrefix)) { tdata.container_all_count = document.getElementById(val); } }; /** * Attach the auto event so it happens on load. * use jQuery s ready() function if available */ if (typeof(jQuery)!="undefined") { jQuery(table.auto); } else if (window.addEventListener) { window.addEventListener( "load", table.auto, false ); } else if (window.attachEvent) { window.attachEvent( "onload", table.auto ); } return table; })(); }