QFLogFormatting.js 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385
  1. /****************************************************************************************************************************
  2. Licensed Materials - Property of IBM
  3. BI and PM: QFW
  4. © Copyright IBM Corp. 2005, 2010
  5. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  6. *****************************************************************************************************************************/
  7. var fso = null;
  8. function getFileSystemObject()
  9. {
  10. try
  11. {
  12. if( fso == null )
  13. fso = new ActiveXObject("Scripting.FileSystemObject");
  14. return fso;
  15. } catch (e) {
  16. return null;
  17. }
  18. }
  19. function executeXML( text, binFolder, fileName )
  20. {
  21. text = text.replace( /<[^> \/]+:/g, "<" );
  22. text = text.replace( /<\/[^> ]+:/g, "</" );
  23. text = text.replace( /(\<\/?)(validate)/g, "$1execute" );
  24. text = text.replace( /<queryFeedback[\S\s]*<\/queryFeedback>/g, "" );
  25. var fso = new ActiveXObject("Scripting.FileSystemObject");
  26. var s = fso.CreateTextFile( fileName + ".xml", true);
  27. s.WriteLine(text);
  28. s.Close();
  29. var myshell = new ActiveXObject( "WScript.shell" );
  30. myshell.CurrentDirectory = binFolder;
  31. myshell.run( "\"" + binFolder + "\\QFWTest.exe\" -rsxsl 2 -pagesize -1 -d \"" + binFolder + "\\..\\logs\\qfw\" \"" + fileName + ".xml\"" , 1, true );
  32. if( fso.FileExists(fileName + ".out") )
  33. {
  34. textFile = fso.OpenTextFile(fileName + ".out",1);
  35. var fileContents = textFile.ReadAll();
  36. textFile.Close();
  37. return fileContents;
  38. }
  39. }
  40. var xslObject = null;
  41. function getOutputFormattingXsl()
  42. {
  43. if( xslObject != null )
  44. return xslObject;
  45. var fileSystem = getFileSystemObject();
  46. xslFile = fileSystem.OpenTextFile( binFolder.innerText + "\\..\\templates\\qfw\\QFResultSetFormatting.xsl" ,1 );
  47. var xslFileContents = xslFile.ReadAll();
  48. xslFile.Close();
  49. xslObject = new ActiveXObject("Microsoft.XMLDOM");
  50. xslObject.async = false;
  51. xslObject.loadXML( xslFileContents );
  52. return xslObject;
  53. }
  54. function executeOnClick()
  55. {
  56. var fullXML = event.srcElement.parentElement;
  57. var xmlroot = null;
  58. var resultroot = null;
  59. var child = fullXML.firstChild;
  60. for( ; child != null; child = child.nextSibling )
  61. if( child.tagName == "DIV" )
  62. {
  63. if( xmlroot == null && child.className == 'e')
  64. xmlroot = child;
  65. if( child.className == "result" )
  66. resultroot = child;
  67. else
  68. child.style.display = "none";
  69. }
  70. if( resultroot != null )
  71. {
  72. resultroot.style.display = "block";
  73. return;
  74. }
  75. if( xmlroot == null )
  76. return;
  77. if( document.body.client != "CRN" )
  78. executeWithQFWTest( xmlroot, fullXML );
  79. else
  80. executeWithCRN( xmlroot, fullXML );
  81. }
  82. var v_sFrameId_Counter = 1;
  83. function executeWithCRN( xmlroot, fullXML )
  84. {
  85. var v_oFrame;
  86. var v_sFrameId;
  87. for( var i = 0; i < fullXML.childNodes.length; ++i )
  88. if( fullXML.childNodes[i].tagName == "IFRAME" )
  89. v_oFrame = fullXML.childNodes[i];
  90. if( !v_oFrame )
  91. {
  92. var v_sFrameId = "idResultView" + (v_sFrameId_Counter++);
  93. v_oFrame = document.createElement( "IFRAME" );
  94. fullXML.appendChild( v_oFrame );
  95. v_oFrame.outerHTML =
  96. '<IFRAME src="' + window.parent.G_HAL.F_GetFileURL('../hal/blank.htm') +
  97. '" name="' + v_sFrameId + '" id="' + v_sFrameId + '" frameBorder="no" style="border:none; display:block; width: 80%;"></IFRAME>';
  98. var v_sQueryText = extractV5CommandText( xmlroot, fullXML );
  99. var v_sReportSpec = window.parent.G_QanReportGenerator.F_convertQueryToReportSpec( v_sQueryText );
  100. window.parent.G_QanQueryExecution.F_submitReportViewRequest( v_sFrameId, document, v_sReportSpec );
  101. }
  102. else
  103. {
  104. v_oFrame.style.display = "block";
  105. }
  106. }
  107. window.adjustResultViewer = function(viewerWindow)
  108. {
  109. // alert( 'h='+ viewerWindow.document.getElementById( 'CVReportRS' ).offsetHeight + ';w=' + viewerWindow.document.body.scrollWidth );
  110. //debugger;
  111. var v_nViewerIframe = document.getElementById(viewerWindow.name);
  112. var v_nViewerElement = viewerWindow.document.getElementById( 'CVReportRS' );
  113. var v_viewerHeight = v_nViewerElement.offsetHeight;
  114. var v_nViewerToolbarElement = viewerWindow.document.getElementById( 'CVToolbarRS' );
  115. if( v_nViewerToolbarElement )
  116. v_viewerHeight += v_nViewerToolbarElement.offsetHeight;
  117. var v_nViewerNavElement = viewerWindow.document.getElementById( 'CVNavLinksRS' );
  118. if( v_nViewerNavElement )
  119. v_viewerHeight += v_nViewerNavElement.offsetHeight;
  120. v_nViewerIframe.style.height = v_viewerHeight + 5 + 'px';
  121. v_nViewerIframe.style.width = viewerWindow.document.body.scrollWidth + 5 + 'px';
  122. }
  123. function extractV5CommandText( xmlroot, fullXML )
  124. {
  125. var queryText = "";
  126. var rootElemName = xmlNodeName( xmlroot );
  127. if( rootElemName == 'command' || rootElemName == 'qs:command' )
  128. queryText = xmlroot.innerText;
  129. else
  130. {
  131. var connectElem;
  132. var queryElem = document.getElementById( fullXML.parentNode.objId );
  133. if( queryElem )
  134. connectElem = document.getElementById( queryElem.connectId + "_connect" );
  135. if( connectElem && connectElem.children.length >= 2 )
  136. {
  137. var connectionSpecElem = connectElem.firstChild;
  138. for( ; connectionSpecElem && connectionSpecElem.className != "e";
  139. connectionSpecElem = connectionSpecElem.nextSibling );
  140. if( !connectionSpecElem )
  141. formatXMLFromString( connectElem );
  142. for( connectionSpecElem = connectElem.firstChild;
  143. connectionSpecElem && connectionSpecElem.className != "e";
  144. connectionSpecElem = connectionSpecElem.nextSibling );
  145. queryText = "<command>" + ((connectionSpecElem)?connectionSpecElem.innerText:"") +
  146. xmlroot.innerText + "</command>";
  147. }
  148. else
  149. queryText = "<command>" + xmlroot.innerText + "</command>";
  150. }
  151. queryText = queryText.replace( /\<[^\> ]*:?parameters.*\>/, "<parameters xmlns:bus=\"http://developer.cognos.com/schemas/bibus/3/\" SOAP-ENC:arrayType=\"bus:parameterValue[2]\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"SOAP-ENC:Array\">" );
  152. queryText = queryText.replace( /\<\/[^\> ]*:?parameters/, "</parameters" );
  153. queryText = queryText.replace( /\<qs:command/, "<command" );
  154. queryText = queryText.replace( /\<\/qs:command/, "</command" );
  155. queryText = queryText.replace( /rID="[^"]*"/g, "" );
  156. return queryText;
  157. }
  158. function executeWithQFWTest( xmlroot, fullXML )
  159. {
  160. var resultroot = document.createElement( "div" );
  161. fullXML.appendChild( resultroot );
  162. resultroot.innerText = " Procesing ... ";
  163. resultroot.className = "result";
  164. var thisdate = new Date();
  165. var fileName = binFolder.innerText + "\\..\\logs\\qfw\\qfwlog_temp_" + thisdate.getTime();
  166. var queryText = extractV5CommandText( xmlroot, fullXML );
  167. var resultContent =
  168. executeXML( queryText, binFolder.innerText, fileName );
  169. var xml = new ActiveXObject("Microsoft.XMLDOM")
  170. xml.async = false;
  171. if( xml.loadXML(resultContent) )
  172. {
  173. var htmlText = xml.transformNode( getOutputFormattingXsl() );
  174. resultroot.innerHTML = htmlText;
  175. }
  176. else
  177. {
  178. resultroot.innerHTML = "<pre></pre>";
  179. resultroot.firstChild.innerText = resultContent;
  180. }
  181. event.cancelBubble = true;
  182. }
  183. function executeSetProperties()
  184. {
  185. var propsElem = event.srcElement;
  186. var dsPwd = document.createElement( "span" );
  187. propsElem.appendChild( dsPwd );
  188. dsPwd.innerText = "Password";
  189. var dsPwd = document.createElement( "textArea" );
  190. propsElem.appendChild( dsPwd );
  191. dsPwd.rows = 1;
  192. dsPwd.cols = 20;
  193. }
  194. function mainMethodOnClick()
  195. {
  196. var methodElem = event.srcElement;
  197. for( ; methodElem != null && methodElem.className != "method";
  198. methodElem = methodElem.parentElement );
  199. if( methodElem == null )
  200. return;
  201. var children = methodElem.childNodes;
  202. for( i = 0; i < children.length; ++i )
  203. {
  204. if( children[i].className == "nesting" )
  205. {
  206. if( event.srcElement.innerText == '(-)' )
  207. {
  208. event.srcElement.innerText = '(+)';
  209. children[i].style.display ='none';
  210. }
  211. else
  212. {
  213. event.srcElement.innerText = '(-)';
  214. children[i].style.display ='block';
  215. }
  216. }
  217. }
  218. }
  219. var treeID = 1;
  220. function xmlFirstChild( xmlNode, nodeName )
  221. {
  222. var i = 0;
  223. for( ; i < xmlNode.childNodes.length; ++i )
  224. {
  225. if( xmlNode.childNodes[i].tagName == "DIV" && xmlNode.childNodes[i].className == "" )
  226. {
  227. xmlNode = xmlNode.childNodes[i];
  228. i = -1;
  229. continue;
  230. }
  231. if( xmlNode.childNodes[i].className == "e" &&
  232. ( nodeName == null || nodeName == xmlNodeName( xmlNode.childNodes[i] ) ) )
  233. return xmlNode.childNodes[i];
  234. }
  235. return null;
  236. }
  237. function xmlGetText( xmlNode )
  238. {
  239. var i = 0;
  240. for( ; i < xmlNode.childNodes.length; ++i )
  241. {
  242. if( xmlNode.childNodes[i].tagName == "DIV" && xmlNode.childNodes[i].className == "" )
  243. {
  244. xmlNode = xmlNode.childNodes[i];
  245. i = -1;
  246. continue;
  247. }
  248. if( xmlNode.childNodes[i].tagName == "B" && xmlNode.childNodes[i].className == "t" )
  249. {
  250. return xmlNode.childNodes[i].innerText;
  251. }
  252. }
  253. return "";
  254. }
  255. function xmlNextSibling( xmlNode, nodeName )
  256. {
  257. var xmlNode = xmlNode.nextSibling;
  258. for( ; xmlNode != null; xmlNode = xmlNode.nextSibling )
  259. {
  260. if( xmlNode.className == "e" &&
  261. ( nodeName == null || nodeName == xmlNodeName( xmlNode ) ) )
  262. {
  263. return xmlNode;
  264. }
  265. }
  266. return null;
  267. }
  268. function xmlParent( xmlNode )
  269. {
  270. for( ; xmlNode != null; xmlNode = xmlNode.parentElement )
  271. {
  272. if( xmlNode.className == "e" )
  273. return xmlNode;
  274. }
  275. return null;
  276. }
  277. function xmlNodeName( xmlNode )
  278. {
  279. var i = 0;
  280. for( ; i < xmlNode.childNodes.length; ++i )
  281. {
  282. if( xmlNode.childNodes[i].className == "c" )
  283. {
  284. xmlNode = xmlNode.childNodes[i];
  285. break;
  286. }
  287. }
  288. var elemContent = xmlNode.innerText;
  289. return elemContent.replace(/</,'').match(/[^\ >\/]*/)[0];
  290. }
  291. function xmlNodeAttribute( xmlNode, attributeName )
  292. {
  293. var i = 0;
  294. for( ; i < xmlNode.childNodes.length; ++i )
  295. {
  296. if( xmlNode.childNodes[i].className == "c" )
  297. {
  298. xmlNode = xmlNode.childNodes[i];
  299. break;
  300. }
  301. }
  302. elemContent = xmlNode.innerText;
  303. var v_reAttrExpr = new RegExp( ' ' + attributeName + '\=\"([^\"]*)\"' );
  304. var v_aAttrExprRes = elemContent.match( v_reAttrExpr );
  305. if( !v_aAttrExprRes )
  306. return "";
  307. return (v_aAttrExprRes[1])? v_aAttrExprRes[1]: "";
  308. }
  309. function isQSAPICommandType( elemName )
  310. {
  311. return ( elemName == "execute" ||
  312. elemName == "getParameters" ||
  313. elemName == "validate" ) ;
  314. }
  315. function getV5QuerySet( xmlNode )
  316. {
  317. var elemName = xmlNodeName( xmlNode );
  318. if( elemName == "querySet" )
  319. return xmlNode;
  320. if( isQSAPICommandType( elemName ) ||
  321. elemName == "source" ||
  322. elemName == "response" )
  323. {
  324. return xmlFirstChild( xmlNode, "querySet" );
  325. }
  326. if( elemName == "command" || elemName == "qs:command" )
  327. {
  328. var childNode = xmlFirstChild( xmlNode );
  329. for( ; childNode != null; childNode = xmlNextSibling( childNode ) )
  330. {
  331. elemName = xmlNodeName( childNode );
  332. if( isQSAPICommandType( elemName ) )
  333. {
  334. return xmlFirstChild( childNode, "querySet" );
  335. }
  336. }
  337. }
  338. }
  339. function unwindQuerySet( xmlNode, tree, parentIndex )
  340. {
  341. var xmlQuerySet = getV5QuerySet( xmlNode );
  342. if( xmlQuerySet == null )
  343. return false;
  344. var queryArray = new Array();
  345. var xmlQueries = xmlFirstChild( xmlQuerySet, "queries" );
  346. if( xmlQueries != null )
  347. {
  348. var xmlQuery = xmlFirstChild( xmlQueries, "query" );
  349. for( ; xmlQuery != null; xmlQuery = xmlNextSibling( xmlQuery, "query" ) )
  350. {
  351. queryArray[ xmlNodeAttribute( xmlQuery, "name" ) ] = xmlQuery;
  352. }
  353. xmlQuery = xmlFirstChild( xmlQueries, "providerQuery" );
  354. for( ; xmlQuery != null; xmlQuery = xmlNextSibling( xmlQuery, "providerQuery" ) )
  355. {
  356. unwindProviderQuery( xmlQuery, tree, parentIndex, queryArray );
  357. }
  358. }
  359. var xmlQRDs = xmlFirstChild( xmlQuerySet, "queryResultDefinitions" );
  360. if( xmlQRDs != null )
  361. {
  362. var xmlQRD = xmlFirstChild( xmlQRDs, "queryResultDefinition" );
  363. for( ; xmlQRD != null; xmlQRD = xmlNextSibling( xmlQRD, "queryResultDefinition" ) )
  364. {
  365. unwindQRD( xmlQRD, tree, parentIndex, queryArray );
  366. }
  367. }
  368. return true;
  369. }
  370. var treeLeafIdGen = 0;
  371. function unwindQRD( xmlQRD, tree, parentIndex, queryArray )
  372. {
  373. thisLeafId = treeLeafIdGen++;
  374. tree.add( thisLeafId, parentIndex,
  375. xmlNodeAttribute( xmlQRD, "name" ),
  376. null, null, "#FCFFD3", "QRD" );
  377. preserveId2XMLNodeMapping( thisLeafId, xmlQRD );
  378. unwindQueryRef( xmlQRD, tree, thisLeafId, queryArray );
  379. }
  380. function unwindQueryRef( xmlRef, tree, parentIndex, queryArray )
  381. {
  382. queryName = xmlNodeAttribute( xmlRef, "refQuery" );
  383. xmlQuery = queryArray[queryName];
  384. if( xmlQuery == null )
  385. return;
  386. unwindQuery( xmlQuery, tree, parentIndex, queryArray );
  387. }
  388. function unwindQuery( xmlQuery, tree, parentIndex, queryArray )
  389. {
  390. thisLeafId = treeLeafIdGen++;
  391. tree.add( thisLeafId, parentIndex,
  392. xmlNodeAttribute( xmlQuery, "name" ),
  393. null, null, "#E3E3D3", "Query" );
  394. xmlSource = xmlFirstChild( xmlQuery, "source" );
  395. if( xmlSource == null )
  396. return;
  397. preserveId2XMLNodeMapping( thisLeafId, xmlQuery );
  398. unwindSource( xmlSource, tree, thisLeafId, queryArray );
  399. }
  400. function unwindSource( xmlSource, tree, parentIndex, queryArray )
  401. {
  402. if( unwindQuerySet( xmlSource, tree, parentIndex ) )
  403. return;
  404. var childNode = xmlFirstChild( xmlSource );
  405. for( ; childNode != null; childNode = xmlNextSibling( childNode ) )
  406. {
  407. if( xmlNodeName( childNode ) == "queryRef" )
  408. unwindQueryRef( childNode, tree, parentIndex, queryArray );
  409. else if( xmlNodeName( childNode ) == "providerQuery" )
  410. unwindProviderQuery( childNode, tree, parentIndex, queryArray );
  411. else if( xmlNodeName( childNode ) == "queryOperation" ||
  412. xmlNodeName( childNode ) == "joinOperation" )
  413. unwindOperation( childNode, tree, parentIndex, queryArray );
  414. else if( xmlNodeName( childNode ) == "sqlQuery" ||
  415. xmlNodeName( childNode ) == "mdxQuery" )
  416. unwindNativeQuery( childNode, tree, parentIndex, queryArray );
  417. }
  418. }
  419. function providerQuery_GetPlanDetails( xmlPQuery )
  420. {
  421. var xmlPlans = xmlFirstChild( xmlPQuery, "plans" );
  422. if( !xmlPlans)
  423. return;
  424. var xmlPlan = xmlFirstChild( xmlPlans, "plan" );
  425. if( !xmlPlan )
  426. return;
  427. return xmlFirstChild( xmlPlan, "planDetails" );
  428. }
  429. function preserveId2XMLNodeMapping( thisLeafId, xmlPQuery )
  430. {
  431. if( !document.nodeId2XMLNode )
  432. document.nodeId2XMLNode = [];
  433. document.nodeId2XMLNode[ thisLeafId ] = xmlPQuery;
  434. }
  435. function createQueryPlanNode( xmlPQuery, tree, parentIndex )
  436. {
  437. var providerStr = xmlNodeAttribute( xmlPQuery, "provider" );
  438. var nodeText;
  439. if( providerStr == "CubeBuildProvider" )
  440. nodeText = "CUBE";
  441. else if( providerStr == "OlapQueryProvider" )
  442. nodeText = "MDX";
  443. else if( providerStr == "RelationalQueryProvider" )
  444. nodeText = "SQL";
  445. else
  446. {
  447. var xmlPlanDetails = providerQuery_GetPlanDetails( xmlPQuery );
  448. if( !xmlPlanDetails )
  449. return parentIndex;
  450. if( xmlFirstChild( xmlPlanDetails, "wrappedQuery" ) )
  451. nodeText = "MDX";
  452. else
  453. return parentIndex;
  454. }
  455. var thisLeafId = treeLeafIdGen++;
  456. tree.add( thisLeafId, parentIndex,
  457. xmlNodeAttribute( xmlPQuery, "name" ),
  458. null, null, "#A3E3E3", nodeText );
  459. preserveId2XMLNodeMapping( thisLeafId, xmlPQuery );
  460. return thisLeafId;
  461. }
  462. function unwindProviderQuery( xmlPQuery, tree, parentIndex, queryArray )
  463. {
  464. var thisLeafId;
  465. if( !tree.m_bQueryPlan )
  466. {
  467. thisLeafId = treeLeafIdGen++;
  468. tree.add( thisLeafId, parentIndex,
  469. xmlNodeAttribute( xmlPQuery, "name" ),
  470. null, null, "#A3E3E3", "providerQuery <div>[" + xmlNodeAttribute( xmlPQuery, "provider" ) + "]</div>" );
  471. }
  472. else
  473. {
  474. thisLeafId = createQueryPlanNode( xmlPQuery, tree, parentIndex );
  475. }
  476. preserveId2XMLNodeMapping( thisLeafId, xmlPQuery );
  477. xmlSource = xmlFirstChild( xmlPQuery, "source" );
  478. if( xmlSource == null )
  479. return;
  480. unwindSource( xmlSource, tree, thisLeafId, queryArray );
  481. }
  482. function unwindOperation( xmlOperation, tree, parentIndex, queryArray )
  483. {
  484. thisLeafId = treeLeafIdGen++;
  485. tree.add( thisLeafId, parentIndex, xmlNodeAttribute(xmlOperation, 'setOperation'),
  486. null, null, null, xmlNodeName(xmlOperation) );
  487. preserveId2XMLNodeMapping( thisLeafId, xmlOperation );
  488. xmlQueryRefs = xmlFirstChild( xmlOperation, "queryRefs" );
  489. if( xmlQueryRefs == null )
  490. return;
  491. unwindSource( xmlQueryRefs, tree, thisLeafId, queryArray );
  492. }
  493. function unwindJoin( xmlJoin, tree, parentIndex, queryArray )
  494. {
  495. thisLeafId = treeLeafIdGen++;
  496. tree.add( thisLeafId, parentIndex, xmlNodeName(xmlOperation) );
  497. xmlJoinOperands = xmlFirstChild( xmlJoin, "joinOperands" );
  498. if( xmlJoinOperands == null )
  499. return;
  500. preserveId2XMLNodeMapping( thisLeafId, xmlJoin );
  501. var xmlJoinOperand = xmlFirstChild( xmlJoinOperands );
  502. for( ; xmlJoinOperand != null; xmlJoinOperand = xmlNextSibling( xmlJoinOperand ) )
  503. unwindSource( xmlJoin, tree, thisLeafId, queryArray );
  504. }
  505. function unwindNativeQuery( xmlNativeQuery, tree, parentIndex, queryArray )
  506. {
  507. thisLeafId = treeLeafIdGen++;
  508. tree.add( thisLeafId, parentIndex, xmlNodeName(xmlNativeQuery) );
  509. preserveId2XMLNodeMapping( thisLeafId, xmlNativeQuery );
  510. }
  511. function buildQueryTree( fullXML, nodeInitializationFunc )
  512. {
  513. var treeNode = document.createElement( "div" );
  514. fullXML.insertBefore( treeNode, (fullXML.lastChild.className == "nodeDetails")? fullXML.lastChild: null );
  515. treeNode.className = "tree";
  516. treeNode.id = "tree_" + treeID;
  517. treeID++;
  518. var t = new LogTree( treeNode.id +'.t',treeNode);
  519. treeNode.t = t;
  520. t.config.nodeWidth = 60;
  521. t.config.nodeHeight = 40;
  522. t.config.levelMargin = 20;
  523. t.config.siblingMargin = 10;
  524. t.config.tempTreeContainer = tempTreeContainer;
  525. tempTreeContainer.parentElement.className = "tree";
  526. xmlRoot = xmlFirstChild( fullXML );
  527. nodeInitializationFunc( xmlRoot, t, -1 );
  528. t.container.onclick = queryPlan_onClick;
  529. t.container.onblur = queryPlan_onBlur;
  530. t.UpdateTree();
  531. var rootGroup = treeNode.childNodes[0];
  532. treeNode.style.height = rootGroup.style.posHeight + 3;
  533. treeNode.style.width = "100%";
  534. }
  535. var G_QueryPlan_activeNode;
  536. function queryPlan_getNodeContainer( planNode )
  537. {
  538. for( ; planNode && planNode.tagName != "roundrect"; planNode = planNode.parentElement );
  539. return planNode;
  540. }
  541. function queryPlan_treeContainer( planNode )
  542. {
  543. for( ; planNode && planNode.className != "fullXML"; planNode = planNode.parentElement );
  544. return planNode;
  545. }
  546. function queryPlan_getNodeDetailsArea( fullXML )
  547. {
  548. if( !fullXML.nodeDetailsArea )
  549. {
  550. var nodeDetailsArea = document.createElement( "DIV" );
  551. nodeDetailsArea.className = "nodeDetails";
  552. fullXML.appendChild( nodeDetailsArea );
  553. fullXML.nodeDetailsArea = nodeDetailsArea;
  554. }
  555. return fullXML.nodeDetailsArea;
  556. }
  557. function queryPlan_populateNodeDetailsTitle( nodeDetailsArea, planNode )
  558. {
  559. if( !nodeDetailsArea.titleDiv )
  560. {
  561. nodeDetailsArea.titleDiv = document.createElement( "DIV" );
  562. nodeDetailsArea.appendChild( nodeDetailsArea.titleDiv );
  563. nodeDetailsArea.titleDiv.className = "detailsTitle";
  564. }
  565. nodeDetailsArea.titleDiv.innerHTML = "";
  566. nodeDetailsArea.nodeNameB = document.createElement( "B" );
  567. nodeDetailsArea.titleDiv.appendChild( nodeDetailsArea.nodeNameB );
  568. nodeDetailsArea.nodeNameB.className = "detailsName";
  569. nodeDetailsArea.nodeNameB.innerText = planNode.firstChild.childNodes[0].innerText;
  570. }
  571. function queryPlan_getDetailsContentDiv( nodeDetailsArea )
  572. {
  573. if( !nodeDetailsArea.detailContextDiv )
  574. {
  575. nodeDetailsArea.detailContextDiv = document.createElement( "DIV" );
  576. nodeDetailsArea.appendChild( nodeDetailsArea.detailContextDiv );
  577. }
  578. return nodeDetailsArea.detailContextDiv;
  579. }
  580. function queryPlan_propertyOnClick()
  581. {
  582. var propertyNameU = event.srcElement;
  583. var nodeDetailsArea = propertyNameU.parentElement.parentElement;
  584. var contentDiv = queryPlan_getDetailsContentDiv( nodeDetailsArea );
  585. var propertyName = propertyNameU.innerText;
  586. for( var i = 0; i < contentDiv.childNodes.length; ++i )
  587. contentDiv.childNodes[i].style.display = "none";
  588. contentDiv.property2RenderedValue[propertyName].style.display = "block";
  589. }
  590. function queryPlan_populateNodeDetails_title( nodeDetailsArea, contentDiv, propertyName, renderedProperty )
  591. {
  592. renderedProperty.style.display = "none";
  593. contentDiv.appendChild( renderedProperty );
  594. if( !contentDiv.property2RenderedValue )
  595. contentDiv.property2RenderedValue = [];
  596. contentDiv.property2RenderedValue[propertyName] = renderedProperty;
  597. var propertyNameU = document.createElement( "U" );
  598. nodeDetailsArea.titleDiv.appendChild( propertyNameU );
  599. propertyNameU.innerText = propertyName;
  600. propertyNameU.onclick = queryPlan_propertyOnClick;
  601. }
  602. function queryPlan_populateNodeDetails_fromInfo( nodeDetailsArea, planNode, xmlPlanNode )
  603. {
  604. var initPropertyContent;
  605. var contentDiv = queryPlan_getDetailsContentDiv( nodeDetailsArea );
  606. var xmlInfoNode = xmlFirstChild( xmlPlanNode, "info" );
  607. if( xmlInfoNode )
  608. {
  609. var xmlInfoItemNode = xmlFirstChild( xmlInfoNode, "property" );
  610. for( ; xmlInfoItemNode != null; xmlInfoItemNode = xmlNextSibling( xmlInfoItemNode, "property" ) )
  611. {
  612. var propertyText = xmlGetText( xmlInfoItemNode );
  613. var propertyName = xmlNodeAttribute( xmlInfoItemNode, "name" );
  614. var renderedProperty = document.createElement( "DIV" );
  615. renderedProperty.innerText = propertyText;
  616. queryPlan_populateNodeDetails_title( nodeDetailsArea, contentDiv, propertyName, renderedProperty );
  617. if( !initPropertyContent )
  618. initPropertyContent = renderedProperty;
  619. }
  620. }
  621. return initPropertyContent;
  622. }
  623. function queryPlan_populateNodeDetails_xmlQuery( nodeDetailsArea, planNode, xmlQuery )
  624. {
  625. var nodeDiv = document.createElement( "DIV" );
  626. parentPlanDiv.appendChild( nodeDiv );
  627. nodeDiv.className = "items";
  628. nodeDiv.innerText = nodeName + ' "' + xmlNodeAttribute( xmlPlanNode, "Name" ) + '"';
  629. parentPlanDiv = nodeDiv;
  630. }
  631. function queryPlan_populateNodeDetails_fromXmlQueryNode( nodeDetailsArea, xmlQueryNode, parentQueryDiv )
  632. {
  633. var nodeName = xmlNodeName( xmlQueryNode );
  634. if( nodeName == "expression" ||
  635. nodeName == "filterExpression" )
  636. {
  637. var nodeDiv = document.createElement( "DIV" );
  638. parentQueryDiv.appendChild( nodeDiv );
  639. nodeDiv.className = "queryExpr";
  640. nodeDiv.innerText = xmlGetText( xmlQueryNode );
  641. return;
  642. }
  643. if( nodeName == "edge" ||
  644. nodeName == "valueSet" ||
  645. nodeName == "groupHeader" ||
  646. nodeName == "groupFooter" ||
  647. nodeName == "groupDetails" ||
  648. nodeName == "dataItemRef" ||
  649. nodeName == "dataItem" ||
  650. nodeName == "detailFilter" ||
  651. nodeName == "slicer" ||
  652. nodeName == "summaryFilter" )
  653. {
  654. var nodeDiv = document.createElement( "DIV" );
  655. parentQueryDiv.appendChild( nodeDiv );
  656. nodeDiv.className = "queryItem";
  657. nodeDiv.innerText = nodeName;
  658. var nameAttrValue;
  659. if( nodeName == "valueSet" || nodeName == "dataItemRef" )
  660. nameAttrValue = xmlNodeAttribute( xmlQueryNode, "refDataItem" ) ;
  661. else
  662. nameAttrValue = xmlNodeAttribute( xmlQueryNode, "name" ) ;
  663. if( nameAttrValue )
  664. nodeDiv.innerText += ' "' + nameAttrValue + '"';
  665. parentQueryDiv = nodeDiv;
  666. }
  667. if( nodeName == "source" )
  668. {
  669. return;
  670. }
  671. var xmlChild = xmlFirstChild( xmlQueryNode );
  672. for( ; xmlChild; xmlChild = xmlNextSibling( xmlChild ) )
  673. {
  674. queryPlan_populateNodeDetails_fromXmlQueryNode( nodeDetailsArea, xmlChild, parentQueryDiv );
  675. }
  676. }
  677. function queryPlan_populateNodeDetails_fromOriginal( nodeDetailsArea, planNode, xmlPlanNode )
  678. {
  679. var xmlOriginal = xmlFirstChild( xmlPlanNode, "original" );
  680. if( !xmlOriginal )
  681. {
  682. var xmlPlanDetails = providerQuery_GetPlanDetails( xmlPlanNode );
  683. xmlOriginal = xmlFirstChild( xmlPlanDetails, "wrappedQuery" );
  684. if( !xmlOriginal )
  685. return null;
  686. }
  687. var contentDiv = queryPlan_getDetailsContentDiv( nodeDetailsArea );
  688. var queryDetailsDiv = document.createElement( "DIV" );
  689. contentDiv.appendChild( queryDetailsDiv );
  690. queryPlan_populateNodeDetails_fromXmlQueryNode( nodeDetailsArea, xmlOriginal, queryDetailsDiv );
  691. queryPlan_populateNodeDetails_title( nodeDetailsArea, contentDiv, "query", queryDetailsDiv );
  692. return queryDetailsDiv;
  693. }
  694. function queryPlan_populateNodeDetails_fromCubeNode( nodeDetailsArea, xmlPlanNode, parentPlanDiv )
  695. {
  696. var nodeName = xmlNodeName( xmlPlanNode );
  697. if( nodeName == "Dimension" ||
  698. nodeName == "Hierarchy" ||
  699. nodeName == "LevelRef" ||
  700. nodeName == "Level" ||
  701. nodeName == "Measure" )
  702. {
  703. var nodeDiv = document.createElement( "DIV" );
  704. parentPlanDiv.appendChild( nodeDiv );
  705. nodeDiv.className = "cube";
  706. nodeDiv.innerText = nodeName + ' "' + xmlNodeAttribute( xmlPlanNode, "Name" ) + '"';
  707. parentPlanDiv = nodeDiv;
  708. }
  709. if( nodeName != "planDetails" &&
  710. nodeName != "Model" &&
  711. nodeName != "DimensionCollection" &&
  712. nodeName != "Dimension" &&
  713. nodeName != "HierarchyCollection" &&
  714. nodeName != "Hierarchy" &&
  715. nodeName != "HierarchyLevels" &&
  716. nodeName != "LevelCollection" &&
  717. nodeName != "MeasureCollection" )
  718. {
  719. return;
  720. }
  721. var xmlChild = xmlFirstChild( xmlPlanNode );
  722. for( ; xmlChild; xmlChild = xmlNextSibling( xmlChild ) )
  723. {
  724. queryPlan_populateNodeDetails_fromCubeNode( nodeDetailsArea, xmlChild, parentPlanDiv );
  725. }
  726. }
  727. function queryPlan_populateNodeDetails_fromCube( nodeDetailsArea, planNode, xmlPlanNode )
  728. {
  729. var xmlPlanDetails = providerQuery_GetPlanDetails( xmlPlanNode );
  730. var contentDiv = queryPlan_getDetailsContentDiv( nodeDetailsArea );
  731. var cubePlanDetailsDiv = document.createElement( "DIV" );
  732. contentDiv.appendChild( cubePlanDetailsDiv );
  733. queryPlan_populateNodeDetails_fromCubeNode( nodeDetailsArea, xmlPlanDetails, cubePlanDetailsDiv );
  734. return cubePlanDetailsDiv;
  735. }
  736. function queryPlan_populateNodeDetails( nodeDetailsArea, planNode )
  737. {
  738. queryPlan_populateNodeDetailsTitle( nodeDetailsArea, planNode );
  739. var contentDiv = queryPlan_getDetailsContentDiv( nodeDetailsArea );
  740. contentDiv.innerHTML = "";
  741. if( !document.nodeId2XMLNode )
  742. return;
  743. var xmlPlanNode = document.nodeId2XMLNode[ planNode.id ];
  744. if( !xmlPlanNode )
  745. return;
  746. var nodeName = xmlNodeName( xmlPlanNode );
  747. if( nodeName == "query" || nodeName == "queryResultDefinition" || nodeName == "queryOperation" )
  748. queryPlan_populateNodeDetails_v5Blocks( nodeDetailsArea, planNode, xmlPlanNode, nodeName );
  749. else
  750. queryPlan_populateNodeDetails_providerQueryBlocks( nodeDetailsArea, planNode, xmlPlanNode );
  751. }
  752. function queryPlan_populateNodeDetails_v5Blocks( nodeDetailsArea, planNode, xmlPlanNode, nodeName )
  753. {
  754. var contentDiv = queryPlan_getDetailsContentDiv( nodeDetailsArea );
  755. var queryDetailsDiv = document.createElement( "DIV" );
  756. contentDiv.appendChild( queryDetailsDiv );
  757. queryPlan_populateNodeDetails_fromXmlQueryNode( nodeDetailsArea, xmlPlanNode, queryDetailsDiv, nodeName );
  758. queryPlan_populateNodeDetails_title( nodeDetailsArea, contentDiv, nodeName, queryDetailsDiv );
  759. queryDetailsDiv.style.display = "block";
  760. return queryDetailsDiv;
  761. }
  762. function queryPlan_populateNodeDetails_providerQueryBlocks( nodeDetailsArea, planNode, xmlPlanNode )
  763. {
  764. var initPropertyContent = queryPlan_populateNodeDetails_fromInfo( nodeDetailsArea, planNode, xmlPlanNode );
  765. if( xmlNodeAttribute( xmlPlanNode, "provider" ) == "CubeBuildProvider" )
  766. initPropertyContent = queryPlan_populateNodeDetails_fromCube( nodeDetailsArea, planNode, xmlPlanNode );
  767. else
  768. {
  769. var propertyContent = queryPlan_populateNodeDetails_fromOriginal( nodeDetailsArea, planNode, xmlPlanNode );
  770. if( !initPropertyContent )
  771. initPropertyContent = propertyContent;
  772. }
  773. if( initPropertyContent )
  774. initPropertyContent.style.display = "block";
  775. }
  776. function queryPlan_onClick()
  777. {
  778. var planNode = queryPlan_getNodeContainer( event.srcElement );
  779. var fullXML = queryPlan_treeContainer( planNode );
  780. if( !fullXML )
  781. return;
  782. planNode.prevFillColorValue = planNode.fillColor.value;
  783. planNode.fillColor = "white";
  784. var nodeDetailsArea = queryPlan_getNodeDetailsArea( fullXML );
  785. queryPlan_populateNodeDetails( nodeDetailsArea, planNode );
  786. nodeDetailsArea.style.display = "block";
  787. if( G_QueryPlan_activeNode )
  788. queryPlan_onBlur();
  789. G_QueryPlan_activeNode = planNode;
  790. }
  791. function queryPlan_onBlur()
  792. {
  793. var planNode = G_QueryPlan_activeNode;
  794. planNode.fillColor = planNode.prevFillColorValue;
  795. }
  796. function unwindPlanQuerySet( xmlNode, tree, parentIndex )
  797. {
  798. tree.container.parentElement.className = "plan";
  799. tree.m_bQueryPlan = true;
  800. unwindQuerySet( xmlNode, tree, parentIndex );
  801. }
  802. function shortParameterOnClick()
  803. {
  804. }
  805. function adjustParameterHeaderState( fullXML, open )
  806. {
  807. //determine which parameter type it is
  808. var paramElem = fullXML.firstChild;
  809. for( ; paramElem != null; paramElem = paremElem.nextSibling )
  810. if( paramElem.className == "paramType" )
  811. break;
  812. if( paramElem == null )
  813. return;
  814. var paramType = paramElem.innerText.replace(/:\s*/, "" );
  815. //finds the methodHeader
  816. var headerElem = fullXML.parentElement.firstChild;
  817. for( ; headerElem != null; headerElem = headerElem .nextSibling )
  818. if( headerElem.className == "methodHeader" )
  819. break;
  820. if( headerElem == null )
  821. return;
  822. //finds the parameter in the methodHeader
  823. var paramToggleElem = headerElem.firstChild;
  824. for( ; paramToggleElem != null; paramToggleElem = paramToggleElem.nextSibling )
  825. if( paramToggleElem.tagName == "U" && paramToggleElem.innerText.indexOf( paramType ) == 0 )
  826. break;
  827. if( paramToggleElem == null )
  828. return;
  829. //changes the +/-
  830. paramToggleElem.previousSibling.innerText = (open)? "-": "+";
  831. }
  832. function adjustErrorHeaderState( fullXML, open )
  833. {
  834. var paramElem = fullXML.firstChild;
  835. for( ; paramElem != null; paramElem = paremElem.nextSibling )
  836. if( paramElem.className == "err")
  837. break;
  838. if( paramElem == null )
  839. return;
  840. var headerElem = fullXML.parentElement.firstChild;
  841. for( ; headerElem != null; headerElem = headerElem .nextSibling )
  842. if( headerElem.className == "methodHeader" )
  843. break;
  844. if( headerElem == null )
  845. return;
  846. var paramToggleElem = headerElem.firstChild;
  847. for( ; paramToggleElem != null; paramToggleElem = paramToggleElem.nextSibling )
  848. { if( paramToggleElem.tagName == "U" && paramToggleElem.innerText.indexOf( "error" ) == 0 )
  849. break;
  850. }
  851. if( paramToggleElem == null )
  852. return;
  853. paramToggleElem.previousSibling.innerText = (open)? "-": "+";
  854. }
  855. function openExecutionPlan( parent )
  856. {
  857. if( parent.tagName == "DIV" && parent.className == "fullXML" )
  858. {
  859. if( parent.childNodes.length >= 4 && parent.childNodes[3].tagName == "U" )
  860. {
  861. var fullXML = parent;
  862. fullXML.style.display = 'block';
  863. setParameterPresentation( "Plan", fullXML );
  864. }
  865. return;
  866. }
  867. var childNode = parent.firstChild;
  868. for( ; childNode != null; childNode = childNode.nextSibling )
  869. {
  870. openExecutionPlan( childNode, open );
  871. }
  872. }
  873. function allParametersFoldingCall(parent)
  874. {
  875. if( event.srcElement.innerText.indexOf( "Hide" ) == 0)
  876. {
  877. allParametersFolding( parent, false )
  878. event.srcElement.innerText = "Show query trees";
  879. }
  880. else
  881. {
  882. allParametersFolding( parent, true )
  883. event.srcElement.innerText = "Hide query trees";
  884. }
  885. }
  886. function showExecutionTree( parent )
  887. {
  888. window.parent.G_QanApp.F_CreateExecutionTrees();
  889. window.parent.G_QanApp.F_ShowExecutionTrees();
  890. }
  891. function allParametersFolding( parent, open )
  892. {
  893. if( parent.tagName == "DIV" && parent.className == "fullXML" )
  894. {
  895. if( parent.childNodes.length >= 3 && parent.childNodes[2].tagName == "U" )
  896. {
  897. if( open )
  898. {
  899. parent.style.display = 'block';
  900. setParameterPresentation( "Tree", parent );
  901. }
  902. else
  903. {
  904. parent.style.display = 'none';
  905. }
  906. adjustParameterHeaderState( parent, open );
  907. updateMethodInfoClass( parent.parentElement );
  908. }
  909. return;
  910. }
  911. var childNode = parent.firstChild;
  912. for( ; childNode != null; childNode = childNode.nextSibling )
  913. {
  914. allParametersFolding( childNode, open );
  915. if(childNode.nextSibling == null) break;
  916. }
  917. }
  918. function allErrorsFoldingCall(parent)
  919. {
  920. var numError = 0;
  921. if( event.srcElement.innerText.indexOf( "Hide" ) == 0)
  922. {
  923. numError = allErrorsFolding( parent, false, numError )
  924. event.srcElement.innerText = "Show all errors";
  925. }
  926. else
  927. {
  928. numError = allErrorsFolding( parent, true, numError )
  929. if(!numError)
  930. {
  931. alert("There are no errors to show in this log");
  932. event.srcElement.onclick = ""
  933. event.srcElement.style.color = "gray";
  934. return;
  935. }
  936. event.srcElement.innerText = "Hide all errors";
  937. }
  938. }
  939. function allErrorsFolding( parent, open, numError )
  940. {
  941. if( parent.tagName == "DIV" && parent.className == "fullXML" && parent.innerText.indexOf( "error" ) == 0)
  942. {
  943. if( parent.childNodes.length == 2 && parent.childNodes[1].tagName == "DIV" )
  944. {
  945. var fullXML = parent;
  946. if( open )
  947. {
  948. fullXML.style.display = 'block';
  949. setParameterPresentation( "XML", fullXML );
  950. }
  951. else
  952. fullXML.style.display = 'none';
  953. adjustErrorHeaderState( fullXML, open );
  954. updateMethodInfoClass( fullXML.parentElement );
  955. }
  956. numError++;
  957. return numError;
  958. }
  959. var childNode = parent.firstChild;
  960. for( ; childNode != null; childNode = childNode.nextSibling )
  961. {
  962. numError = allErrorsFolding( childNode, open, numError );
  963. }
  964. return numError;
  965. }
  966. function globalEventHandler()
  967. {
  968. if( event.srcElement == null )
  969. return;
  970. var parentElement = event.srcElement.parentElement;
  971. if( event.srcElement.tagName == "U" && parentElement != null )
  972. {
  973. if( parentElement.className == "fullXML" )
  974. {
  975. return changeParameterPresentation();
  976. }
  977. else if( parentElement.className == "logItemMenu" )
  978. {
  979. return changeLogItemPresentation();
  980. }
  981. }
  982. if( event.srcElement.tagName == "B" && event.srcElement.className == "paramType" &&
  983. parentElement != null && parentElement.className == "fullXML" )
  984. {
  985. return setSelectionOnXML( parentElement );
  986. }
  987. if( event.srcElement.className == "logItemHeader" ||
  988. parentElement != null && parentElement.className == "logItemHeader" )
  989. {
  990. return foldingLogItem();
  991. }
  992. }
  993. function foldingLogItem()
  994. {
  995. var v_spanLogItem = event.srcElement;
  996. if( v_spanLogItem.className != "logItemHeader" )
  997. v_spanLogItem = v_spanLogItem.parentElement;
  998. if( !v_spanLogItem )
  999. return;
  1000. var v_divLogContainer = v_spanLogItem.parentElement;
  1001. if( !v_divLogContainer )
  1002. return;
  1003. var v_img = v_spanLogItem.firstChild;
  1004. if( !v_img )
  1005. return;
  1006. var v_bIsOpened = ( v_img.src.search(/show_area.gif$/) >= 0 );
  1007. if( v_bIsOpened )
  1008. v_img.src = v_img.src.replace( /show_area.gif$/, "hide_area.gif" );
  1009. else
  1010. v_img.src = v_img.src.replace( /hide_area.gif$/, "show_area.gif" );
  1011. var v_divSibling = v_spanLogItem.nextSibling;
  1012. for( ; v_divSibling; v_divSibling = v_divSibling.nextSibling )
  1013. {
  1014. v_divSibling.style.display = ( v_bIsOpened )? 'none': "block";
  1015. }
  1016. if( !v_bIsOpened )
  1017. setLogItemPresentation( v_divLogContainer.presentation, v_divLogContainer );
  1018. }
  1019. function changeLogItemPresentation()
  1020. {
  1021. if( event.srcElement != null && event.srcElement.tagName != "U" )
  1022. return;
  1023. var v_sPresentationType = event.srcElement.innerText;
  1024. var v_divLogItemMenu = event.srcElement.parentElement;
  1025. var v_divLogItemContainer = v_divLogItemMenu.parentElement;
  1026. setLogItemPresentation( v_sPresentationType, v_divLogItemContainer );
  1027. }
  1028. function setLogItemPresentation( v_sPresentationType, v_divLogItemContainer )
  1029. {
  1030. v_divLogItemContainer.presentation = v_sPresentationType;
  1031. var v_bFoundPresentation = false;
  1032. var v_divLogItemPresentation = v_divLogItemContainer.firstChild;
  1033. for( ; v_divLogItemPresentation;
  1034. v_divLogItemPresentation = v_divLogItemPresentation.nextSibling )
  1035. {
  1036. if( !v_divLogItemPresentation.presentation )
  1037. continue;
  1038. var v_bMatches = (v_divLogItemPresentation.presentation.indexOf(v_sPresentationType) >= 0 );
  1039. v_divLogItemPresentation.style.display = ( v_bMatches )? "block": "none";
  1040. v_bFoundPresentation |= ( v_divLogItemPresentation.presentation == v_sPresentationType );
  1041. }
  1042. if( !v_bFoundPresentation )
  1043. window.parent.G_QanApp.F_ShowPresentation( v_sPresentationType, v_divLogItemContainer );
  1044. }
  1045. function changeParameterPresentation()
  1046. {
  1047. if( event.srcElement != null && event.srcElement.tagName != "U" )
  1048. return;
  1049. var presentationType = event.srcElement.innerText;
  1050. var parent = event.srcElement.parentElement.parentElement;
  1051. var fullXML = event.srcElement.parentElement;
  1052. setParameterPresentation( presentationType, fullXML );
  1053. }
  1054. function setParameterPresentation( presentationType, fullXML )
  1055. {
  1056. var treeNode, xmlNode, planNode, resultNode;
  1057. var parent = fullXML.parentElement;
  1058. for( var i = 0; i < fullXML.childNodes.length; ++i )
  1059. if( fullXML.childNodes[i].className == "e" )
  1060. xmlNode = fullXML.childNodes[i];
  1061. else
  1062. if( fullXML.childNodes[i].className == "tree" )
  1063. treeNode = fullXML.childNodes[i];
  1064. else if( fullXML.childNodes[i].className == "plan" )
  1065. planNode = fullXML.childNodes[i];
  1066. else
  1067. if( fullXML.childNodes[i].tagName == "DIV" ||
  1068. fullXML.childNodes[i].tagName == "IFRAME" )
  1069. {
  1070. fullXML.childNodes[i].style.display = "none";
  1071. }
  1072. if( xmlNode == null )
  1073. {
  1074. formatXMLFromString( fullXML );
  1075. for( var i = 0; i < fullXML.childNodes.length; ++i )
  1076. if( fullXML.childNodes[i].className == "e" )
  1077. xmlNode = fullXML.childNodes[i];
  1078. }
  1079. if( presentationType == "Tree" )
  1080. {
  1081. fullXML.presentation = "queryTree";
  1082. if( treeNode )
  1083. treeNode.style.display = "block";
  1084. else
  1085. buildQueryTree( fullXML, unwindQuerySet );
  1086. if( xmlNode )
  1087. xmlNode.style.display = "none";
  1088. if( planNode )
  1089. planNode.style.display = "none";
  1090. if( resultNode )
  1091. resultNode.style.display = "none";
  1092. }
  1093. else if( presentationType == "Plan" )
  1094. {
  1095. fullXML.presentation = "queryPlan";
  1096. if( planNode )
  1097. planNode.style.display = "block";
  1098. else
  1099. buildQueryTree( fullXML, unwindPlanQuerySet );
  1100. if( xmlNode )
  1101. xmlNode.style.display = "none";
  1102. if( treeNode )
  1103. treeNode.style.display = "none";
  1104. }
  1105. else
  1106. {
  1107. fullXML.presentation = "XML";
  1108. if( treeNode )
  1109. treeNode.style.display = "none";
  1110. if( planNode )
  1111. planNode.style.display = "none";
  1112. if( xmlNode )
  1113. {
  1114. xmlNode.style.display = "block";
  1115. }
  1116. }
  1117. }
  1118. function longParameterFolding()
  1119. {
  1120. var paramType = event.srcElement.parentElement.innerText.split(" ")[0];
  1121. var parent = event.srcElement.parentElement.parentElement.parentElement;
  1122. var children = parent.childNodes;
  1123. }
  1124. function updateMethodInfoClass( methodInfo )
  1125. {
  1126. var open = false;
  1127. var children = methodInfo.childNodes;
  1128. for( i = 0; i < children.length; ++i )
  1129. {
  1130. if( children[i].className != "fullXML" )
  1131. continue;
  1132. if( children[i].style.display == "block" )
  1133. {
  1134. open = true;
  1135. break;
  1136. }
  1137. }
  1138. if( open && methodInfo.className == "methodInfo" )
  1139. methodInfo.className = "methodInfoOpen";
  1140. if( !open && methodInfo.className == "methodInfoOpen" )
  1141. methodInfo.className = "methodInfo";
  1142. }
  1143. function parameterFolding()
  1144. {
  1145. var paramType = event.srcElement.innerText.split(" ")[0];
  1146. var parent = event.srcElement.parentElement.parentElement;
  1147. var plus = event.srcElement.previousSibling;
  1148. var children = parent.childNodes;
  1149. for( i = 0; i < children.length; ++i )
  1150. {
  1151. if( children[i].className != "fullXML" )
  1152. continue;
  1153. var fullXML = children[i];
  1154. var firstTimeOpened = (children[i].style.display == '');
  1155. var switchedToTreeView = false;
  1156. if( fullXML.innerText.indexOf( paramType ) == 0)
  1157. {
  1158. if( fullXML.style.display == '' || fullXML.style.display == 'none' )
  1159. {
  1160. fullXML.style.display = 'block';
  1161. plus.innerHTML = '-';
  1162. if( firstTimeOpened )
  1163. {
  1164. var childNode = fullXML.firstChild;
  1165. for( ; childNode != null; childNode = childNode.nextSibling )
  1166. if( childNode.tagName == "U" )
  1167. break;
  1168. setParameterPresentation( (childNode)? "Tree": "XML", fullXML);
  1169. switchedToTreeView = true;
  1170. }
  1171. }
  1172. else
  1173. {
  1174. children[i].style.display = 'none';
  1175. plus.innerHTML = '+';
  1176. break;
  1177. }
  1178. break;
  1179. }
  1180. }
  1181. updateMethodInfoClass( parent );
  1182. event.cancelBubble = true;
  1183. }
  1184. function setSelectionOnXML( fullXML )
  1185. {
  1186. var range = document.selection.createRange();
  1187. var xmlChildren = fullXML.children;
  1188. for( j = 0; j < xmlChildren.length; ++j )
  1189. {
  1190. if( xmlChildren[j].tagName != 'DIV' )
  1191. continue;
  1192. range.moveToElementText( xmlChildren[j] );
  1193. try{
  1194. range.select();
  1195. } catch (error) {};
  1196. }
  1197. }
  1198. function toggleXmlContent()
  1199. {
  1200. var xmlLineTag;
  1201. var xmlElemTag = event.srcElement;
  1202. for( ; xmlElemTag; xmlElemTag = xmlElemTag.parentElement )
  1203. {
  1204. if( xmlElemTag.tagName == 'DIV' && xmlElemTag.className == 'c' )
  1205. xmlLineTag = xmlElemTag;
  1206. if( xmlElemTag.tagName == 'DIV' && xmlElemTag.className == 'e' )
  1207. break;
  1208. }
  1209. if( !xmlElemTag )
  1210. return;
  1211. var xmlElemToHide;
  1212. if( xmlLineTag )
  1213. {
  1214. var children = xmlElemTag.childNodes;
  1215. for( i = 0; i < children.length; ++i )
  1216. {
  1217. if( children[i].tagName != 'DIV' || children[i].className != '' )
  1218. continue;
  1219. xmlElemToHide = children[i];
  1220. if( xmlElemToHide.style.display == 'none' )
  1221. {
  1222. xmlElemToHide.style.display = 'block';
  1223. xmlLineTag.innerHTML = xmlLineTag.innerHTML.replace( /<SPAN class=collapsed><\/SPAN>/, "" );
  1224. }
  1225. else
  1226. {
  1227. xmlElemToHide.style.display = 'none';
  1228. xmlLineTag.innerHTML += '<SPAN class=collapsed></SPAN>';
  1229. }
  1230. break;
  1231. }
  1232. }
  1233. else
  1234. {
  1235. xmlLineTag = xmlElemTag.children[0];
  1236. if( !xmlLineTag || xmlLineTag.tagName != 'DIV' || xmlLineTag.children.length == 0 )
  1237. return;
  1238. xmlElemToHide = xmlLineTag.children[xmlLineTag.children.length - 1];
  1239. if( !xmlElemToHide || xmlElemToHide.tagName != 'B' )
  1240. return;
  1241. if( xmlElemToHide.style.display == 'none' )
  1242. {
  1243. xmlElemToHide.style.display = 'inline';
  1244. xmlLineTag.innerHTML = xmlLineTag.innerHTML.replace( /<SPAN class=collapsed><\/SPAN>/, "" );
  1245. }
  1246. else
  1247. {
  1248. xmlElemToHide.style.display = 'none';
  1249. xmlLineTag.innerHTML = xmlLineTag.innerHTML.replace( /\&gt;/, "&gt;<SPAN class=collapsed></SPAN>" );
  1250. }
  1251. }
  1252. event.cancelBubble = true;
  1253. return true;
  1254. }
  1255. function openPreferencesDialog()
  1256. {
  1257. window.parent.D_QanPreferencies.F_Show();
  1258. }
  1259. function allPreferencesFoldingCall( doc )
  1260. {
  1261. var rule;
  1262. if (doc.styleSheets[0].rules)
  1263. {
  1264. rule = doc.styleSheets[0].rules;
  1265. }
  1266. else
  1267. {
  1268. alert("Stylesheet rules are unreadable. Preferences not available");
  1269. event.srcElement.onclick = "";
  1270. event.srcElement.style.color = "gray";
  1271. return;
  1272. }
  1273. if( event.srcElement.innerText.indexOf( "Show" ) == 0)
  1274. {
  1275. setSelections(doc);
  1276. allPreferencesFolding( rule, true )
  1277. event.srcElement.innerText = "Hide preferences";
  1278. }
  1279. else
  1280. {
  1281. allPreferencesFolding( rule, false )
  1282. if( event.srcElement.innerText.indexOf( "Hide" ) == 0)
  1283. {
  1284. event.srcElement.innerText = "Show preferences";
  1285. }
  1286. else
  1287. {
  1288. //find "Hide preferences" and rename with "Show preferences"
  1289. var preferences = doc.body;
  1290. for(var t=0; t < preferences.childNodes.length; t++)
  1291. {
  1292. if (preferences.childNodes[t].className == "menu")
  1293. {
  1294. preferences = preferences.childNodes[t];
  1295. break;
  1296. }
  1297. }
  1298. //HTML->Body->menu->preferences->[preferencesList]
  1299. for(var t=0; t < preferences.childNodes.length; t++)
  1300. {
  1301. if (preferences.childNodes[t].className == "menuitem")
  1302. {
  1303. if( preferences.childNodes[t].innerText.indexOf( "Hide preferences" ) == 0)
  1304. {
  1305. preferences.childNodes[t].innerText = "Show preferences";
  1306. return;
  1307. }
  1308. }
  1309. }
  1310. }
  1311. }
  1312. }
  1313. function allPreferencesFolding( rule, open )
  1314. {
  1315. for (var i = 0; i < rule.length; i++)
  1316. {
  1317. if (rule[i].selectorText == ".preferences" )
  1318. {
  1319. if(open)
  1320. rule[i].style.display="block";
  1321. else
  1322. rule[i].style.display="none";
  1323. return;
  1324. }
  1325. }
  1326. }
  1327. function saveANDapplyPreferences( doc )
  1328. {
  1329. inputPreferences(doc);
  1330. savePreferences(doc);
  1331. applyPreferences(doc);
  1332. }
  1333. function loadANDapplyPreferences( doc )
  1334. {
  1335. loadPreferences(doc);
  1336. applyPreferences(doc);
  1337. }
  1338. function applyPreferences( doc )
  1339. {
  1340. var rule;
  1341. if (doc.styleSheets[0].rules)
  1342. {
  1343. rule = doc.styleSheets[0].rules;
  1344. }
  1345. else
  1346. {
  1347. alert("Stylesheet rules are unreadable. Preferences not available");
  1348. event.srcElement.onclick = "";
  1349. event.srcElement.style.color = "gray";
  1350. return;
  1351. }
  1352. var fullXMLhit = false;
  1353. var providersListTemp = [];
  1354. providersListTemp = providersListTemp.concat(providersList);
  1355. var highlightListTemp = [];
  1356. highlightListTemp = highlightListTemp.concat(highlightList);
  1357. for (var i = 0; i < rule.length; i++)
  1358. { //changes the <style> to apply color scheme throughout log
  1359. var selectorText = rule[i].selectorText;
  1360. if(!selectorText) continue;
  1361. switch (selectorText)
  1362. {
  1363. case ".nHL":
  1364. rule[i].style.display = nHLdisplay;
  1365. break;
  1366. case ".nHLtimeStamp":
  1367. rule[i].style.display = nHLtimeStamp;
  1368. rule[i].style.color = dark;
  1369. break;
  1370. case ".timeStamp":
  1371. rule[i].style.display = timeStamp;
  1372. rule[i].style.color = dark;
  1373. break;
  1374. case ".methodHeader EM":
  1375. case ".methodHeader SMALL":
  1376. case ".preference":
  1377. case ".tree":
  1378. case ".action":
  1379. rule[i].style.background = light;
  1380. break;
  1381. case ".methodInfoOpen":
  1382. rule[i].style.background = medL;
  1383. break;
  1384. case ".providerName":
  1385. rule[i].style.color = dark;
  1386. break;
  1387. case ".nodeDetails":
  1388. rule[i].style.background = medL;
  1389. break;
  1390. case ".queryItem":
  1391. case ".queryExpr":
  1392. rule[i].style.background = light;
  1393. break;
  1394. case ".preferences":
  1395. rule[i].style.color = dark;
  1396. rule[i].style.background = medL;
  1397. break;
  1398. case ".fullXML":
  1399. if (!fullXMLhit)
  1400. {
  1401. rule[i].style.background = light;
  1402. fullXMLhit = true;
  1403. }
  1404. break;
  1405. default:
  1406. for (var j = 0; j < providersListTemp.length; j++)
  1407. {
  1408. if (selectorText == providersListTemp[j])
  1409. {
  1410. switch (highlightListTemp[0])
  1411. {
  1412. case undefined:
  1413. break;
  1414. case "none":
  1415. rule[i].style.display = "";
  1416. rule[i].style.background = "";
  1417. break;
  1418. case "hide":
  1419. rule[i].style.display = "none";
  1420. rule[i].style.background = "";
  1421. break;
  1422. default:
  1423. rule[i].style.display = "";
  1424. rule[i].style.background = colorLookup(highlightListTemp[0]);
  1425. }
  1426. providersListTemp.shift();
  1427. highlightListTemp.shift();highlightListTemp
  1428. }
  1429. }
  1430. }
  1431. }
  1432. }
  1433. var usingCookie = false;
  1434. var filename = "\\..\\templates\\qfw\\QF_Logging_preferences.css" //reset in load
  1435. var timeStamp;
  1436. var nHLtimeStamp;
  1437. var nHLdisplay;
  1438. var highlightList;
  1439. var highlightColor;
  1440. var providersList = [".QFS",
  1441. ".CoordinationPlanner",
  1442. ".RefinerProvider",
  1443. ".ZeroSuppressProvider",
  1444. ".MDOperationProvider",
  1445. ".CubeBuildProvider",
  1446. ".NoDataModeProvider",
  1447. ".ReporterModeProvider",
  1448. ".TabularFuncProvider",
  1449. ".TabularOperationProvider",
  1450. ".RelationalQueryProvider",
  1451. ".OlapQueryProvider",
  1452. ".PowerCubeODP",
  1453. ".SAPBWODP",
  1454. ".SAPBWODP2",
  1455. ".MSAnalysisODP",
  1456. ".MasterDetailProvider"]
  1457. var light;
  1458. var medL;
  1459. var medD;
  1460. var dark;
  1461. function loadPreferences( doc )
  1462. {
  1463. if( doc.body.client == "CRN" )
  1464. {
  1465. usingCookie = true;
  1466. }
  1467. if(usingCookie)
  1468. {
  1469. timeStamp = manipulateCookie( doc, "timeStamp", "?" ) || manipulateCookie( doc, "timeStamp", "none" );
  1470. nHLtimeStamp = manipulateCookie( doc, "nHLtimeStamp", "?" ) || manipulateCookie( doc, "nHLtimeStamp", "none" );
  1471. nHLdisplay = manipulateCookie( doc, "minors", "?" ) || manipulateCookie( doc, "minors", "none" );
  1472. highlightList = manipulateCookie( doc, "providers", "?" ) || ["none","none","none","none","none","none","none","none","none","none","none","none","none","none","none","none","none"];
  1473. highlightColor = manipulateCookie( doc, "color", "?" ) || manipulateCookie( doc, "color", "blue" );
  1474. colorScheme( highlightColor );
  1475. }
  1476. else
  1477. {
  1478. filename = doc.body.childNodes[0].innerText + filename; //gets binFolder and makes path for prefs file
  1479. readPrefsCss();
  1480. }
  1481. }
  1482. function inputPreferences( doc )
  1483. {
  1484. var nodeList = [];
  1485. var parentEvent = event.srcElement.parentElement.childNodes; //HTML->Body->preferences->[preferenceList]
  1486. for (var i = 0; i < parentEvent.length; i++)
  1487. {
  1488. if (parentEvent[i].id)
  1489. {
  1490. switch (parentEvent[i].id) //HTML->Body->preferences->preference
  1491. {
  1492. case "timestamp":
  1493. if(usingCookie) manipulateCookie( doc, "timeStamp", "kill" );
  1494. if(usingCookie) manipulateCookie( doc, "nHLtimeStamp", "kill" );
  1495. //HTML->Body->menu->preferences->timeStamp->select->option->preferenceOption
  1496. var preferences = parentEvent[i];
  1497. for(var t=0; t < preferences.childNodes.length; t++)
  1498. {
  1499. if ( preferences.childNodes[t].innerText )
  1500. {
  1501. preferences = preferences.childNodes[t];
  1502. break;
  1503. }
  1504. }
  1505. for(var t=0; t < preferences.length; t++)
  1506. {
  1507. if( preferences[t].selected )
  1508. {
  1509. var temp = preferences[t].value.split(", ");
  1510. timeStamp = temp[0];
  1511. nHLtimeStamp = temp[1];
  1512. break;
  1513. }
  1514. }
  1515. break;
  1516. case "minors":
  1517. if(usingCookie) manipulateCookie( doc, "minors", "kill" );
  1518. //HTML->Body->menu->preferences->minors->select->option->preferenceOption
  1519. var preferences = parentEvent[i];
  1520. for(var t=0; t < preferences.childNodes.length; t++)
  1521. {
  1522. if ( preferences.childNodes[t].innerText )
  1523. {
  1524. preferences = preferences.childNodes[t];
  1525. break;
  1526. }
  1527. }
  1528. for(var t=0; t < preferences.length; t++)
  1529. {
  1530. if( preferences[t].selected )
  1531. {
  1532. nHLdisplay = preferences[t].value
  1533. break;
  1534. }
  1535. }
  1536. break;
  1537. case "providers":
  1538. highlightList = []; //resets highlightList
  1539. if(usingCookie) manipulateCookie( doc, "providers", "kill" );
  1540. //HTML->Body->menu->preferences->providers->preferenceOption->select->option
  1541. var preferences = parentEvent[i];
  1542. for(var t=0; t < preferences.childNodes.length; t++)
  1543. {
  1544. if ( preferences.childNodes[t].innerText )
  1545. {
  1546. for(var s=0; s < preferences.childNodes[t].childNodes.length; s++)
  1547. {
  1548. if ( preferences.childNodes[t].childNodes[s].innerText )
  1549. {
  1550. for(var r=0; r < preferences.childNodes[t].childNodes[s].childNodes.length; r++)
  1551. {
  1552. if ( preferences.childNodes[t].childNodes[s].childNodes[r].innerText )
  1553. {
  1554. if( preferences.childNodes[t].childNodes[s].childNodes[r].selected )
  1555. {
  1556. highlightList.push( preferences.childNodes[t].childNodes[s].childNodes[r].value );
  1557. break;
  1558. }
  1559. }
  1560. }
  1561. }
  1562. }
  1563. }
  1564. }
  1565. break;
  1566. case "color":
  1567. if(usingCookie) manipulateCookie( doc, "color", "kill" );
  1568. //HTML->Body->menu->preferences->minors->select->option->preferenceOption
  1569. var preferences = parentEvent[i];
  1570. for(var t=0; t < preferences.childNodes.length; t++)
  1571. {
  1572. if ( preferences.childNodes[t].innerText )
  1573. {
  1574. preferences = preferences.childNodes[t];
  1575. break;
  1576. }
  1577. }
  1578. for(var t=0; t < preferences.length; t++)
  1579. {
  1580. if( preferences[t].selected )
  1581. {
  1582. highlightColor = preferences[t].value
  1583. break;
  1584. }
  1585. }
  1586. colorScheme( highlightColor );
  1587. break;
  1588. }
  1589. }
  1590. }
  1591. }
  1592. function savePreferences( doc )
  1593. {
  1594. if (usingCookie)
  1595. {
  1596. manipulateCookie( doc, "timeStamp", timeStamp);
  1597. manipulateCookie( doc, "nHLtimeStamp", nHLtimeStamp );
  1598. manipulateCookie( doc, "minors", nHLdisplay );
  1599. manipulateCookie( doc, "providers", highlightList );
  1600. manipulateCookie( doc, "color", highlightColor);
  1601. }
  1602. else
  1603. {
  1604. fso = getFileSystemObject();
  1605. if( fso == null )
  1606. {
  1607. usingCookie = true;
  1608. savePreferences( doc );
  1609. return;
  1610. }
  1611. writePrefsCss();
  1612. }
  1613. }
  1614. function manipulateCookie( doc, name, value )
  1615. {
  1616. if (value == "?")
  1617. {//load
  1618. if(name == "providers")
  1619. {
  1620. var cookieJar = doc.cookie.split(";");
  1621. for (var i=0; i < cookieJar.length; i++)
  1622. {
  1623. if(cookieJar[i].indexOf(name) != -1)
  1624. {
  1625. var providers = cookieJar[i].substr( cookieJar[i].indexOf("=")+1, cookieJar[i].length ).split(",");
  1626. return providers;
  1627. }
  1628. }
  1629. return null;
  1630. }
  1631. var cookieJar = doc.cookie.split(";");
  1632. for (var i=0; i < cookieJar.length; i++)
  1633. {
  1634. if(cookieJar[i].indexOf(name) != -1) return cookieJar[i].substr( cookieJar[i].indexOf("=")+1, cookieJar[i].length );
  1635. }
  1636. return null;
  1637. }
  1638. else if( value == "kill" )
  1639. {//erase
  1640. expiD = new Date();
  1641. expiD.setTime( expiD.getTime() - 1 ); //makes expiry in the past, thus erasing the cookie
  1642. doc.cookie = name + "=" + value + ";expires=" + expiD.toUTCString();
  1643. return;
  1644. }
  1645. else
  1646. {//save
  1647. expiD = new Date();
  1648. expiD.setTime( expiD.getTime() + 600000000 ); //adds one week to date
  1649. doc.cookie = (name + "=" + value + ";expires=" + expiD.toUTCString() + ";path=/");
  1650. return value;
  1651. }
  1652. }
  1653. function writePrefsCss()
  1654. {
  1655. fso = getFileSystemObject();
  1656. // modifies .css file
  1657. var pref;
  1658. pref = fso.CreateTextFile( filename , true);
  1659. pref.WriteLine( value2Rule( 1, timeStamp ) );
  1660. pref.WriteLine( value2Rule( 2, nHLtimeStamp ) );
  1661. pref.WriteLine( value2Rule( 3, nHLdisplay ) );
  1662. pref.WriteLine( value2Rule( 4, highlightList ) );
  1663. pref.WriteLine( value2Rule( 5, highlightColor ) );
  1664. pref.Close();
  1665. }
  1666. function value2Rule( ruleNum, text )
  1667. {
  1668. return ".rule" + ruleNum + " { background-image: url(" + text + ") }" ;
  1669. }
  1670. function readPrefsCss()
  1671. {
  1672. if( document.styleSheets.length < 4 || document.styleSheets[3].rules.length < 5)
  1673. {
  1674. //alert( "No preferences file found. Setting defaults" );
  1675. setDefaults();
  1676. return;
  1677. }
  1678. var v_cssPrefs = document.styleSheets[3];
  1679. timeStamp = rule2Value( v_cssPrefs.rules[0] );
  1680. nHLtimeStamp = rule2Value( v_cssPrefs.rules[1] );
  1681. nHLdisplay = rule2Value( v_cssPrefs.rules[2] );
  1682. highlightList = rule2Value( v_cssPrefs.rules[3] ).split(",");
  1683. highlightColor = rule2Value( v_cssPrefs.rules[4] );
  1684. colorScheme( highlightColor );
  1685. }
  1686. function rule2Value( cssRule )
  1687. {
  1688. return cssRule.style.backgroundImage.replace( /url\(/, "" ).replace( /\)/, "" );
  1689. }
  1690. function verifyPrefs(doc)
  1691. {
  1692. if(usingCookie)
  1693. {
  1694. alert( "Cookie:\n" + doc.cookie );
  1695. return;
  1696. }
  1697. readPrefsCss();
  1698. alert( filename + ":\n\n"
  1699. + "timeStamp: " + timeStamp
  1700. + "\nnHLtimeStamp: " + nHLtimeStamp
  1701. + "\nnHLdisplay: " + nHLdisplay
  1702. + "\nhighlightList: " + highlightList
  1703. + "\nhighlightColor: " + highlightColor )
  1704. }
  1705. function setDefaults(doc)
  1706. {
  1707. if(usingCookie)
  1708. {
  1709. timeStamp = manipulateCookie( doc, "timeStamp", "none" );
  1710. nHLtimeStamp = manipulateCookie( doc, "nHLtimeStamp", "none" );
  1711. nHLdisplay = manipulateCookie( doc, "minors", "none" );
  1712. highlightList = ["none","none","none","none","none","none","none","none","none","none","none","none","none","none","none","none","none"];
  1713. highlightColor = manipulateCookie( doc, "color", "blue" );
  1714. colorScheme( highlightColor );
  1715. return;
  1716. }
  1717. timeStamp = "none";
  1718. nHLtimeStamp = "none";
  1719. nHLdisplay = "none";
  1720. highlightList = ["none","none","none","none","none","none","none","none","none","none","none","none","none","none","none","none","none"];
  1721. highlightColor = "blue";
  1722. colorScheme( highlightColor );
  1723. }
  1724. function setSelections(doc)
  1725. {
  1726. //select proper options in preferences drop-down
  1727. //HTML->Body->menu
  1728. var preferences = doc.body;
  1729. for(var t=0; t < preferences.childNodes.length; t++)
  1730. {
  1731. if (preferences.childNodes[t].className == "menu")
  1732. {
  1733. preferences = preferences.childNodes[t];
  1734. break;
  1735. }
  1736. }
  1737. //HTML->Body->menu->preferences->[preference]
  1738. for(var t=0; t < preferences.childNodes.length; t++)
  1739. {
  1740. if (preferences.childNodes[t].className == "preferences")
  1741. {
  1742. preferences = preferences.childNodes[t].childNodes;
  1743. break;
  1744. }
  1745. }
  1746. var preference;
  1747. for (var i=0; i < preferences.length; i++)
  1748. {
  1749. preference = preferences[i];
  1750. if(preference.id)
  1751. {
  1752. var optionList = preference.childNodes;
  1753. switch (preference.id)
  1754. {
  1755. case "timestamp":
  1756. selectionSet( optionList, ("" + timeStamp + ", " + nHLtimeStamp) );
  1757. break;
  1758. case "minors":
  1759. selectionSet( optionList, nHLdisplay );
  1760. break;
  1761. case "providers":
  1762. var highlightIndex = 0;
  1763. //HTML->Body->menu->preferences->preference->providers->preferenceOptionList
  1764. for(var t1=0; t1 < optionList.length; t1++)
  1765. {
  1766. if (optionList[t1].providerClass)
  1767. {
  1768. selectionSet( optionList[t1].childNodes, highlightList[highlightIndex] )
  1769. highlightIndex++;
  1770. }
  1771. }
  1772. break;
  1773. default: //case "color":
  1774. selectionSet( optionList, highlightColor );
  1775. // end of switch
  1776. }
  1777. }
  1778. }
  1779. }
  1780. function selectionSet( optionList, expectedValue )
  1781. {
  1782. //HTML->Body->menu->preferences->preference->(id)->select->[options]
  1783. for(var t1=0; t1 < optionList.length; t1++)
  1784. {
  1785. if (optionList[t1].innerText)
  1786. {
  1787. //HTML->Body->menu->preferences->preference->(id)->select->option
  1788. for(var t2=0; t2 < optionList[t1].childNodes.length; t2++)
  1789. {
  1790. if ( optionList[t1].childNodes[t2].value == expectedValue)
  1791. {
  1792. optionList[t1].childNodes[t2].selected = "selected";
  1793. break;
  1794. }
  1795. }
  1796. }
  1797. }
  1798. }
  1799. function colorScheme( color )
  1800. {
  1801. switch (color)
  1802. {
  1803. case "red":
  1804. light = "#ffcccc"
  1805. medL = "#ff9999"
  1806. medD = "#ff0000"
  1807. dark = "#cc0000"
  1808. break;
  1809. case "orange":
  1810. light = "#ffcccc"
  1811. medL = "#ffcc99"
  1812. medD = "#ff6600"
  1813. dark = "#cc3300"
  1814. break;
  1815. case "yellow":
  1816. light = "#ffffcc"
  1817. medL = "#ffff99"
  1818. medD = "#ffcc00"
  1819. dark = "#cc9900"
  1820. break;
  1821. case "green":
  1822. light = "#ccffcc"
  1823. medL = "#99ff99"
  1824. medD = "#00cc00"
  1825. dark = "#009900"
  1826. break;
  1827. case "cyan":
  1828. light = "#ccffff"
  1829. medL = "#99ffff"
  1830. medD = "#009999"
  1831. dark = "#006666"
  1832. break;
  1833. case "purple":
  1834. light = "#ffccff"
  1835. medL = "#cc99ff"
  1836. medD = "#660099"
  1837. dark = "#330066"
  1838. break;
  1839. case "pink":
  1840. light = "#ffccff"
  1841. medL = "#ff99cc"
  1842. medD = "#cc0099"
  1843. dark = "#990066"
  1844. break;
  1845. case "grey":
  1846. light = "#cccccc"
  1847. medL = "#999999"
  1848. medD = "#666666"
  1849. dark = "#333333"
  1850. break;
  1851. default: //case "blue":
  1852. light = "#f0f0ff"
  1853. medL = "#9999ff"
  1854. medD = "#0033cc"
  1855. dark = "#003399"
  1856. }
  1857. }
  1858. function colorLookup( color )
  1859. {
  1860. switch (color)
  1861. {
  1862. case "red":
  1863. return "#ffdddd";
  1864. case "orange":
  1865. return "#ffddcc";
  1866. case "yellow":
  1867. return "#ffffcc";
  1868. case "green":
  1869. return "#ddffdd";
  1870. case "cyan":
  1871. return "#ddffff";
  1872. case "purple":
  1873. return "#cc99ff";
  1874. case "pink":
  1875. return "#ffccdd";
  1876. case "grey":
  1877. return "#dddddd";
  1878. default: //case "blue":
  1879. return "#ddddff";
  1880. }
  1881. }
  1882. function formatXMLFromString( fullXML )
  1883. {
  1884. var v_elChild = fullXML.firstChild;
  1885. for( ; v_elChild; v_elChild = v_elChild.nextSibling )
  1886. if( v_elChild.className == "xmltext" )
  1887. {
  1888. var v_xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  1889. v_xmlDoc.async = false;
  1890. var v_sXML = v_elChild.innerHTML.replace( /\<\?xml\:namespace[^\>]*\/\>/g, "" );
  1891. // v_sXML = v_sXML.replace( /\<qs\:command /, '<qs:command xmlns:qs="qs" xmlns:SOAP="soap" xmlns:md="md" xmlns:x="x" ' );
  1892. v_sXML = '<x xmlns:qs="qs" xmlns:SOAP="soap" xmlns:md="md" xmlns:x="x">' + v_sXML + '</x>';
  1893. v_xmlDoc.loadXML( v_sXML );
  1894. if( !v_xmlDoc.documentElement || !v_xmlDoc.documentElement.childNodes[0] )
  1895. return;
  1896. var v_aFormattedXML = [];
  1897. formatXMLNode( v_xmlDoc.documentElement.childNodes[0], v_aFormattedXML );
  1898. fullXML.innerHTML += v_aFormattedXML.join('');
  1899. }
  1900. }
  1901. function formatXMLName( elName )
  1902. {
  1903. if( elName.nodeName == "x:el" )
  1904. return elName.getAttribute( "en" );
  1905. return elName.nodeName;
  1906. }
  1907. function formatXMLNode( elNode, aFormattedHTML )
  1908. {
  1909. if( elNode.selectNodes("x:at").length == elNode.childNodes.length )
  1910. {
  1911. aFormattedHTML.push( '<DIV class="e">&lt;' + formatXMLName(elNode) );
  1912. formatXMLNodeAttrs( elNode, aFormattedHTML )
  1913. aFormattedHTML.push( '/&gt;</DIV>' );
  1914. return;
  1915. }
  1916. if( elNode.selectNodes( '.[text() and not (comment())]' ).length )
  1917. {
  1918. aFormattedHTML.push( '<DIV class="e" ondblclick="toggleXmlContent();"><DIV>&lt;' + formatXMLName(elNode) );
  1919. formatXMLNodeAttrs( elNode, aFormattedHTML )
  1920. aFormattedHTML.push( '&gt;' );
  1921. formatXMLNodeChildren( elNode, aFormattedHTML );
  1922. aFormattedHTML.push( '&lt;/' + formatXMLName(elNode) + '&gt;' );
  1923. aFormattedHTML.push( '</DIV></DIV>' );
  1924. }
  1925. else
  1926. {
  1927. aFormattedHTML.push( '<DIV class="e"><DIV class="c" ondblclick="toggleXmlContent();">&lt;' + formatXMLName(elNode) );
  1928. formatXMLNodeAttrs( elNode, aFormattedHTML );
  1929. aFormattedHTML.push( '&gt;</DIV><DIV>' );
  1930. formatXMLNodeChildren( elNode, aFormattedHTML );
  1931. aFormattedHTML.push( '<DIV>&lt;/' + formatXMLName(elNode) + '&gt;</DIV></DIV></DIV>' );
  1932. }
  1933. }
  1934. function formatXMLText( nText, aFormattedHTML )
  1935. {
  1936. aFormattedHTML.push( '<B class="t">' + nText.text.F_XMLEEncode() + '</B>' );
  1937. }
  1938. function formatXMLComment( nComment, aFormattedHTML )
  1939. {
  1940. aFormattedHTML.push( '<DIV class="k"><PRE>&lt;!--' + nComment.text.F_XMLEEncode() + '--&gt;</PRE></DIV>' );
  1941. }
  1942. function formatXMLNodeAttrs( elNode, aFormattedHTML )
  1943. {
  1944. for( var i = 0; i < elNode.childNodes.length; ++i )
  1945. {
  1946. if( elNode.childNodes[i].nodeName != 'x:at' )
  1947. continue;
  1948. aFormattedHTML.push( ' ' + elNode.childNodes[i].getAttribute("n") + '="<B>' +
  1949. elNode.childNodes[i].text.F_XMLEEncode() + '"</B>' );
  1950. }
  1951. }
  1952. function formatXMLNodeChildren( elNode, aFormattedHTML )
  1953. {
  1954. var v_nChild = elNode.firstChild;
  1955. for( ; v_nChild; v_nChild = v_nChild.nextSibling )
  1956. {
  1957. if( v_nChild.nodeName == "x:at" )
  1958. continue;
  1959. if( v_nChild.nodeType == 1 )
  1960. formatXMLNode( v_nChild, aFormattedHTML );
  1961. else if( v_nChild.nodeType == 3 )
  1962. formatXMLText( v_nChild, aFormattedHTML );
  1963. else if( v_nChild.nodeType == 8 )
  1964. formatXMLComment( v_nChild, aFormattedHTML );
  1965. }
  1966. }
  1967. String.prototype.F_XMLEEncode = function()
  1968. {
  1969. return this.replace( /&/g, "&amp;amp;" ).replace( /</g, "&amp;lt;" ).replace( />/g, "&amp;gt;" ).replace( /'/g, "&amp;apos;" ).replace( /"/g, "&amp;quot;" );
  1970. };