1
0

demos.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. Request.implement({
  2. processScripts: function(text){
  3. if (this.options.evalResponse && (/(ecma|java)script/).test(this.getHeader('Content-type'))) return $exec(text);
  4. return text.stripScripts(this.options.evalScripts);
  5. }
  6. });
  7. var Demos = {
  8. start: function() {
  9. if (location.protocol == 'file:') Demos.local();
  10. Demos.getList();
  11. var hash=document.location.hash;
  12. if(hash){
  13. var demo=hash.replace('#','');
  14. this.demo=demo;
  15. Demos.load(demo)
  16. }
  17. },
  18. categories: function(json) {
  19. var menu = $('menu-wrapper'), list = new Hash(json);
  20. list.getKeys().each(function(group) {
  21. var demos = new Hash(list[group]);
  22. var category = new Element('h2', {'text': group}).inject(menu);
  23. var ul = new Element('ul', {'class': 'folder'}).inject(category, 'after');
  24. demos.each(function(value, key) {
  25. new Element('li').adopt(new Element('h3').adopt(new Element('a', {
  26. 'href': '#',
  27. 'text': value.title,
  28. 'events': {
  29. 'click': function(e) {
  30. e.preventDefault();
  31. document.location.hash=key;
  32. Demos.load(key);
  33. }
  34. }
  35. }))).inject(ul);
  36. });
  37. });
  38. },
  39. load: function(folder) {
  40. window.demo_path = folder + '/';
  41. var wrapper = $('demos-wrapper');
  42. var demo = new Request.HTML({
  43. url: folder + '/index.html',
  44. onSuccess: function(tree) {
  45. wrapper.empty().adopt(Demos.parse(tree, folder));
  46. var assets = $(document.head).getElements('#demo-css, #demo-js');
  47. if (assets) assets.dispose();
  48. new Element('link', {'id': 'demo-css', 'type': 'text/css', 'rel': 'stylesheet', 'href': folder + '/demo.css'}).inject(document.head);
  49. new Element('script', {'id': 'demo-js', 'type': 'text/javascript', 'src': folder + '/demo.js'}).inject(document.head);
  50. Demos.setInformer(folder);
  51. }
  52. }).GET();
  53. },
  54. parse: function(tree, folder) {
  55. var temp = new Element('div').adopt(tree), dir = folder;
  56. var fixes = temp.getElements('a[href!="#"], img');
  57. fixes.each(function(fix) {
  58. var type = (fix.get('src')) ? 'src' : 'href';
  59. if (Browser.Engine.trident && type == 'src') {
  60. var split = window.location.pathname.split('/').slice(0, -1).join('/') + '/';
  61. dir = fix.get(type).replace(split, split + folder + '/');
  62. fix.set(type, dir);
  63. }
  64. else fix.set(type, dir + '/' + fix.get(type));
  65. });
  66. return temp;
  67. },
  68. getList: function() {
  69. var request = new Request.JSON({url: 'demos.json', onComplete: Demos.categories}).GET();
  70. },
  71. local: function() {
  72. Browser.Request = function(){
  73. return $try(function(){
  74. return new ActiveXObject('MSXML2.XMLHTTP');
  75. }, function(){
  76. return new XMLHttpRequest();
  77. });
  78. };
  79. Request.implement({
  80. isSuccess: function() {
  81. return (!this.status || (this.status >= 200) && (this.status < 300));
  82. }
  83. });
  84. },
  85. setInformer: function(folder){
  86. var info=new Element('div', {'class': 'info'}).injectTop($('demos-wrapper'));
  87. var informer={};
  88. ['html', 'js', 'css'].each( function(type){
  89. informer[type]=new Element('pre', {'class': 'informer '+type,styles:{display:'none'}}).injectAfter(info);
  90. });
  91. new Request({
  92. url: folder+'/index.html',
  93. onComplete: function(text){
  94. var body='';
  95. text.replace(/<body[^>]*>([\s\S]*?)<\/body>/gi, function(){
  96. body += arguments[1] + '\n';
  97. return '';
  98. });
  99. informer.html.innerHTML=body.replace(/</g,'&lt;').replace(/>/g,'&gt;');
  100. }
  101. }).get();
  102. new Request({
  103. url: folder+'/demo.css',
  104. onComplete: function(text){
  105. informer.css.innerHTML=text;
  106. }
  107. }).get();
  108. new Request({
  109. url: folder+'/demo.js',
  110. onComplete: function(text){
  111. informer.js.innerHTML=text.replace(/</g,'&lt;').replace(/>/g,'&gt;');
  112. }
  113. }).get();
  114. ['html', 'js', 'css'].each( function(type){
  115. new Element('a', {href: '#'+type, text: type}).addEvent('click', function(event){
  116. event.preventDefault();
  117. for(var item in informer){
  118. if(item!=type){
  119. informer[item].style.display='none';
  120. }else{
  121. if(informer[type].style.display=='none'){
  122. informer[type].style.display='block';
  123. }else{
  124. informer[type].style.display='none';
  125. }
  126. }
  127. };
  128. }).injectInside(info);
  129. });
  130. }
  131. };
  132. window.addEvent('load', Demos.start);