PageRenderTime 354ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

/js/yuga.js

https://github.com/dounokouno/yuga.js-TT-Custom
JavaScript | 317 lines | 261 code | 5 blank | 51 comment | 22 complexity | 10bca07349485afba7fcc3c140339623 MD5 | raw file
  1. /*
  2. * yuga.js 0.7.2 - 優雅なWeb制作のためのJS
  3. *
  4. * Copyright (c) 2009 Kyosuke Nakamura (kyosuke.jp)
  5. * Licensed under the MIT License:
  6. * http://www.opensource.org/licenses/mit-license.php
  7. *
  8. * Since: 2006-10-30
  9. * Modified: 2012-02-04
  10. */
  11. /*
  12. * yuga.js TT Custom
  13. *
  14. * Copyright (c) 2011 TAGAWA takao (dounokouno@gmail.com)
  15. * Licensed under the MIT License:
  16. * http://www.opensource.org/licenses/mit-license.php
  17. *
  18. * Since: 2011-09-18
  19. * Modified: 2012-10-11
  20. */
  21. (function($) {
  22. //---------------------------------------------------------------------
  23. $.yuga = {
  24. // URIを解析したオブジェクトを返すfunction
  25. Uri: function(path){
  26. var self = this;
  27. this.originalPath = path;
  28. //絶対パスを取得
  29. this.absolutePath = (function(){
  30. var e = document.createElement('a');
  31. e.href = path;
  32. return e.href;
  33. })();
  34. //絶対パスを分解
  35. var fields = {'schema' : 2, 'username' : 5, 'password' : 6, 'host' : 7, 'path' : 9, 'query' : 10, 'fragment' : 11};
  36. var r = /^((\w+):)?(\/\/)?((\w+):?(\w+)?@)?([^\/\?:]+):?(\d+)?(\/?[^\?#]+)?\??([^#]+)?#?(\w*)/.exec(this.absolutePath);
  37. for (var field in fields) {
  38. this[field] = r[fields[field]];
  39. }
  40. this.querys = {};
  41. if(this.query){
  42. $.each(self.query.split('&'), function(){
  43. var a = this.split('=');
  44. if (a.length == 2) self.querys[a[0]] = a[1];
  45. });
  46. }
  47. },
  48. //ユニークな配列を取得
  49. uniqueArray: function(array) {
  50. var storage = new Object;
  51. var uniqueArray = new Array();
  52. var i, value;
  53. for (var i=0;i<array.length;i++) {
  54. value = array[i];
  55. if (!(value in storage)) {
  56. storage[value] = true;
  57. uniqueArray.push(value);
  58. }
  59. }
  60. return uniqueArray;
  61. },
  62. //ロールオーバー
  63. rollover: function(options) {
  64. var c = $.extend({
  65. hoverSelector: '.btn, .allbtn img',
  66. groupSelector: '.btngroup',
  67. postfix: '-over'
  68. }, options);
  69. //ロールオーバーするノードの初期化
  70. var rolloverImgs = $(c.hoverSelector).filter(isNotCurrent);
  71. rolloverImgs.each(function(){
  72. this.originalSrc = $(this).attr('src');
  73. this.rolloverSrc = this.originalSrc.replace(new RegExp('('+c.postfix+')?(\.gif|\.jpg|\.png)$'), c.postfix+"$2");
  74. this.rolloverImg = new Image;
  75. this.rolloverImg.src = this.rolloverSrc;
  76. });
  77. //グループ内のimg要素を指定するセレクタ生成
  78. var groupingImgs = $(c.groupSelector).find('img').filter(isRolloverImg);
  79. //通常ロールオーバー
  80. rolloverImgs.not(groupingImgs).hover(function(){
  81. $(this).attr('src',this.rolloverSrc);
  82. },function(){
  83. $(this).attr('src',this.originalSrc);
  84. });
  85. //グループ化されたロールオーバー
  86. $(c.groupSelector).hover(function(){
  87. $(this).find('img').filter(isRolloverImg).each(function(){
  88. $(this).attr('src',this.rolloverSrc);
  89. });
  90. },function(){
  91. $(this).find('img').filter(isRolloverImg).each(function(){
  92. $(this).attr('src',this.originalSrc);
  93. });
  94. });
  95. //フィルタ用function
  96. function isNotCurrent(i){
  97. return Boolean(!this.currentSrc);
  98. }
  99. function isRolloverImg(i){
  100. return Boolean(this.rolloverSrc);
  101. }
  102. },
  103. //カテゴリー内表示
  104. category: function(options) {
  105. var c = $.extend({
  106. buttonSelector: '.btn',
  107. currentImagePostfix: '-over'
  108. }, options);
  109. var bodyClasses = new Array();
  110. if ($('body').attr('class')) {
  111. bodyClasses = $('body').attr('class').split(' ');
  112. }
  113. for (var i=0;i<bodyClasses.length;i++) {
  114. $(c.buttonSelector).each(function(){
  115. if ($(this).hasClass(bodyClasses[i])) {
  116. var originalSrc = $(this).attr('src');
  117. var rolloverSrc = originalSrc.replace(new RegExp('('+c.currentImagePostfix+')?(\.gif|\.jpg|\.png)$'), c.currentImagePostfix+"$2");
  118. //初期表示
  119. $(this).attr('src', rolloverSrc);
  120. //hoverイベントを上書き
  121. $(this).hover(function(){
  122. $(this).attr('src', rolloverSrc);
  123. }, function(){
  124. $(this).attr('src', rolloverSrc);
  125. });
  126. }
  127. });
  128. }
  129. },
  130. //外部リンクは別ウインドウを設定
  131. externalLink: function(options) {
  132. var c = $.extend({
  133. windowOpen: true
  134. }, options);
  135. var uri = new $.yuga.Uri(location.href);
  136. var e = $('a[href^="http://"],a[href^="https://"]').not('a[href^="' + uri.schema + '://' + uri.host + '/' + '"]');
  137. if (c.windowOpen) {
  138. e.click(function() {
  139. window.open(this.href, '_blank');
  140. return false;
  141. });
  142. }
  143. e.addClass(c.externalClass);
  144. },
  145. //ページ内リンクはするするスクロール
  146. scroll: function(options) {
  147. var c = $.extend({
  148. duration: 500
  149. }, options);
  150. $('a[href^="#"], area[href^="#"]').not('a[href="#"], area[href="#"]').click(function(event){
  151. var hrefdata = new $.yuga.Uri(this.getAttribute('href'));
  152. var position = $('#'+hrefdata.fragment).offset().top;
  153. $(navigator.userAgent.match(/safari/i) ? 'body' : 'html').animate({scrollTop: position}, {
  154. duration: c.duration,
  155. complete: function(){
  156. location.href = hrefdata.absolutePath;
  157. }
  158. });
  159. event.preventDefault();
  160. return false;
  161. });
  162. },
  163. //タブ機能
  164. tab: function(options) {
  165. var c = $.extend({
  166. tabNavSelector: '.tabnav',
  167. activeTabClass: 'active'
  168. }, options);
  169. $(c.tabNavSelector).each(function(){
  170. var tabNavList = $(this).find('a[href^=#], area[href^=#]');
  171. var tabBodyList;
  172. tabNavList.each(function(){
  173. this.hrefdata = new $.yuga.Uri(this.getAttribute('href'));
  174. var selecter = '#'+this.hrefdata.fragment;
  175. if (tabBodyList) {
  176. tabBodyList = tabBodyList.add(selecter);
  177. } else {
  178. tabBodyList = $(selecter);
  179. }
  180. $(this).unbind('click');
  181. $(this).click(function(){
  182. tabNavList.removeClass(c.activeTabClass);
  183. $(this).addClass(c.activeTabClass);
  184. tabBodyList.hide();
  185. $(selecter).show();
  186. return false;
  187. });
  188. });
  189. tabBodyList.hide()
  190. tabNavList.filter(':first').trigger('click');
  191. });
  192. },
  193. //odd、even、first-cchild、last-child、nth-childクラスを追加
  194. child: function(options) {
  195. var c = $.extend({
  196. selector: '.child',
  197. oddClass: 'odd',
  198. evenClass: 'even',
  199. firstChidlClass: 'first-child',
  200. lastChidlClass: 'last-child'
  201. }, options);
  202. $(c.selector).each(function(){
  203. //JSでは0から数えるのでevenとaddを逆に指定
  204. $(this).children(':odd').addClass(c.evenClass);
  205. $(this).children(':even').addClass(c.oddClass);
  206. //:first-child, :last-childをクラスとして追加
  207. $(this).children(':first-child').addClass(c.firstChidlClass);
  208. $(this).children(':last-child').addClass(c.lastChidlClass);
  209. //:nth-childをクラスとして追加
  210. var n=0;
  211. $(this).children().each(function(){
  212. n++;
  213. $(this).addClass('nth-child-'+n);
  214. for (var i=2;i<=n;i++) {
  215. if ((n%i) == 0) {
  216. $(this).addClass('nth-child-'+i+'n');
  217. }
  218. }
  219. });
  220. });
  221. },
  222. //href属性の内容に合わせてアイコン用クラスを追加
  223. icon: function(options) {
  224. var c = $.extend({
  225. ignoreClass: '.nonicon'
  226. }, options);
  227. // 別ウィンドウクラス
  228. var uri = new $.yuga.Uri(location.href);
  229. var e = $('a[href^="http://"],a[href^="https://"]').not('a[href^="' + uri.schema + '://' + uri.host + '/' + '"]').not(c.ignoreClass);
  230. e.addClass('external');
  231. // その他クラス
  232. $('a[href^="mailto"]').not(c.ignoreClass).addClass('mailto');
  233. $('a[href$=".pdf"]').not(c.ignoreClass).addClass('pdf');
  234. $('a[href$=".doc"], a[href$=".docx"]').not(c.ignoreClass).addClass('doc');
  235. $('a[href$=".xls"], a[href$=".xlsx"]').not(c.ignoreClass).addClass('xls');
  236. $('a[href$=".ppt"], a[href$=".pptx"]').not(c.ignoreClass).addClass('ppt');
  237. $('a[href$=".zip"]').not(c.ignoreClass).addClass('zip');
  238. },
  239. //ボックスの高さを揃える
  240. heightLine: function(options) {
  241. var c = $.extend({
  242. parentSelector: '.heightline-parent',
  243. groupClassPrefix: 'heightline-'
  244. }, options);
  245. //heightline-parent
  246. $(c.parentSelector).each(function(){
  247. var height = 0;
  248. $(this).children().each(function(){
  249. if (height < parseInt($(this).height())) {
  250. height = parseInt($(this).height());
  251. }
  252. });
  253. $(this).children().height(height);
  254. });
  255. //heightline-group
  256. var classes = new Array();
  257. $('body *').not(c.parentSelector+',script,style,br').each(function(){
  258. if ($(this).attr('class') && $(this).attr('class').match(new RegExp(c.groupClassPrefix))) {
  259. var ary = $(this).attr('class').split(' ');
  260. for (var i=0;i<ary.length;i++) {
  261. if (ary[i].match(new RegExp(c.groupClassPrefix))) {
  262. classes.push(ary[i]);
  263. }
  264. }
  265. }
  266. });
  267. classes = $.yuga.uniqueArray(classes);
  268. for (var i=0;i<classes.length;i++) {
  269. height = 0;
  270. $('.'+classes[i]).each(function(){
  271. if (height < parseInt($(this).height())) {
  272. height = parseInt($(this).height());
  273. }
  274. });
  275. $('.'+classes[i]).height(height);
  276. }
  277. },
  278. //トグル表示
  279. toggleBox: function(options) {
  280. var c = $.extend({
  281. selector: '.toggle',
  282. speed: 'normal'
  283. }, options);
  284. //要素を非表示
  285. $(c.selector).each(function(){
  286. $(this).parent().next().hide();
  287. });
  288. //クリックイベント
  289. $(c.selector).click(function(){
  290. $(this).parent().next().slideToggle(c.speed);
  291. });
  292. },
  293. //ポップアップウィンドウ
  294. popup: function(options) {
  295. var c = $.extend({
  296. name: '',
  297. width: 600,
  298. height: 400,
  299. status: 'yes',
  300. scrollbars: 'yes',
  301. directories: 'yes',
  302. menubar: 'yes',
  303. resizable: 'yes',
  304. toolbar: 'yes'
  305. }, options);
  306. $('a.popup').click(function(){
  307. window.open(this.href, c.name, 'width='+c.width+',height='+c.height+',status='+c.status+',scrollbars='+c.scrollbars+',directories='+c.directories+',menubar='+c.menubar+',resizable='+c.resizable+',toolbar='+c.toolbar);
  308. return false;
  309. });
  310. }
  311. };
  312. })(jQuery);