1/* 2 * jQuery plugins 3 * v0.1 140901 4 * Adam Policky 5 */ 6 7/* 8 * RB_BREADCRUMBS 9 */ 10(function ($) { 11 $.fn.rb_breadcrumbs = function (options) { 12 var crumb_holder = $('.positioncrmb').empty(); 13 if (!crumb_holder.length) { 14 crumb_holder = $('<p class="positioncrmb">'); 15 $('.page-title').after(crumb_holder); 16 } 17 18 var bcI = 0; 19 20 this.each(function () { 21 var jqElem = $(this); 22 23 var label = jqElem.text(); 24 var target = jqElem.next(); 25 var hash = 'bc' + (++bcI); 26 27 target.prepend($('<a id="' + hash + '"></a>')); 28 29 var crumbUL = crumb_holder.children('ul.crumbholder').first(); 30 if (!crumbUL.length) { 31 crumbUL = $('<ul class="crumbholder" />'); 32 crumb_holder.prepend(crumbUL); 33 } 34 35 crumbUL.append($('<li><a href="#' + hash + '" onclick="return rb.gotoHash(this)">' + label + '</a></li>')); 36 }); 37 38 if (bcI > 0) 39 crumb_holder.addClass('inited'); 40 41 return this; 42 }; 43 44 /* end RB_BREADCRUMBS */ 45}(jQuery)); 46 47 48 49/* RB_PINASPECT 50 * 51 * maintain a given aspect ratio on any block element 52 * resets element height when width changes 53 * settings 54 * aspect: the ratio w/h 55 * use data-aspect to define on element 56 * eventDelay: time to delay before firing resize events (200) 57 * prevents event overload 58 */ 59(function ($) { 60 $.fn.rb_pinAspect = function (options) { 61 this.settings = $.extend({ 62 // These are the defaults. 63 aspect: 1, //default aspect if none given = square 64 eventDelay: 200 //delay firing of resize event for set time 65 }, options); 66 67 var _self = this; 68 69 var a = this.attr('pinAspect'); 70 this.settings.aspect = a || this.settings.aspect; 71 72 73 return this.each(function () { 74 //console.log('$aspect: ' + this); 75 var elem = $(this); 76 77 var aspectArr = getDataBkptArray(elem, 'pinAspect'); 78 elem.data('aspect', aspectArr); 79 80 set(elem, _self.settings); 81 82 elem.addClass('resize-listener').on('rb-resize', function () { 83 //console.log('resize aspect'); 84 set(elem, _self.settings); 85 }); 86 elem.addClass('bkpt-listener').on('breakpoint', function () { 87 //console.log('aspect breakpoint: ' + rb.s.getBreakpointName()); 88 //console.log('bkpt aspect'); 89 set(elem, _self.settings); 90 }); 91 92 93 }); 94 95 }; 96 97 function set(elem, settings) { 98 if (elem.hasClass('tall')) setWidth(elem, settings); 99 else setHeight(elem, settings); 100 } 101 102 function setHeight(elem, settings) { 103 var aspect = elem.data('aspect'); 104 if (!aspect) aspect = settings.aspect; 105 if ($.isArray(aspect)) { 106 aspect = aspect[rb.s.bkpt]; 107 } 108 109 if (aspect == 'f') { 110 var wH = window.innerHeight; 111 var header = document.querySelector('header'); 112 var rect = header.getBoundingClientRect(); 113 elem.height(wH - rect.bottom); 114 } else if (aspect == 0) { 115 elem.height(0); 116 } else if (aspect) { 117 var w = elem.width(); 118 elem.height(w / aspect); 119 } else { 120 elem.height('auto'); 121 } 122 } 123 124 function setWidth(elem, settings) { 125 var aspect = elem.data('aspect'); 126 if (!aspect) aspect = settings.aspect; 127 if ($.isArray(aspect)) { 128 aspect = aspect[rb.s.bkpt]; 129 } 130 //console.log(aspect); 131 if (aspect) { 132 var h = elem.height(); 133 elem.width(h * aspect); 134 } else { 135 elem.width('auto'); 136 } 137 } 138 139 /* end RB_PINASPECT */ 140}(jQuery)); 141 142 143 144/* RB_FAQS 145 * 146 */ 147(function ($) { 148 $.fn.rb_faqs = function (options) { 149 var settings = $.extend({ 150 // These are the defaults. 151 noop: 1 152 }, options); 153 154 return this.each(function () { 155 var elem = $(this); 156
157 var div = $('<div class="faq">'); 158 159 var child = this.nextElementSibling; 160 161 var loop = true; 162 var numChildren = 0; 163 while (loop) { 164 if (child && child.localName == 'p' && child.classList.contains('faq')) { 165 var nextChild = child.nextElementSibling; 166 167 div.append(child); 168 $(child).addClass('temp'); 169 numChildren++; 170 child = nextChild; 171 } else { 172 loop = false; 173 174 if (numChildren) { 175 div.insertAfter(elem); 176 elem.data('div', div); 177 //add event listeners 178 179 elem.click(function () { 180 var elem = $(this); 181 elem.data('on', !elem.data('on')); 182 183 var div = elem.data('div'); 184 if (elem.data('on')) { 185 elem.addClass('on'); 186 div.addClass('on'); 187 } else { 188 elem.removeClass('on'); 189 div.removeClass('on'); 190 } 191 }); 192 } 193 } 194 } 195 }); 196 }; 197 198 /* end RB_PINHEIGHT */ 199}(jQuery)); 200 201/* RB_BTNS 202 * 203 */ 204(function ($) { 205 $.fn.rb_btns = function (options) { 206 return this.each(function () { 207 var _p = this.parentElement; 208 var _before = _p.previousElementSibling; 209 var _parent = _p.parentElement; 210 211 var div = $('<div class="btns p">'); 212 213 var loop = true; 214 var numElems = 0; 215 while (loop) { 216 var isValidP = _p && _p.localName == 'p'; 217 if (isValidP) { 218 var firstChild = _p.firstElementChild; 219 isValidP = (firstChild.localName == 'a' && firstChild.classList.contains('btn')); 220 } 221 222 if (isValidP) { 223 var nextP = _p.nextElementSibling; 224 225 div.append(firstChild); 226 _parent.removeChild(_p); 227 numElems++; 228 _p = nextP; 229 } else { 230 loop = false; 231 232 if (numElems) { 233 if (_before) 234 div.insertAfter($(_before)); 235 } 236 } 237 } 238 }); 239 }; 240 241 /* end RB_PINHEIGHT */ 242}(jQuery)); 243 244 245/* 246 * ON_VIEW 247 */ 248(function ($) { 249 $.fn.onView = function (options) { 250 this.settings = $.extend({ 251 // These are the defaults. 252 near_bottom: 100, 253 near_top: 100, 254 view: null, //callback when item is in view 255 near: null //callback when item within near range 256 }, options); 257 258 var _self = this; 259 260 $(window).scroll(function () { 261 _self.checkNow(); 262 }); 263 264 this.checkNow = function () { 265 var wTop = $(window).scrollTop(); 266 var wBottom = wTop + $(window).height(); 267 268 var nearTop = wTop - _self.settings.near_top; 269 var nearBottom = wBottom + _self.settings.near_bottom; 270 271 _self.each(function () { 272 var elem = $(this); 273 var pos = elem.offset(); 274 var elemTop = pos.top; 275 var elemBottom = elemTop + elem.height(); 276 277 var tIn, bIn; 278 279 //check close 280 tIn = ((elemTop < nearBottom) && (elemTop > nearTop)); 281 bIn = ((elemBottom < nearBottom) && (elemBottom > nearTop)); 282 if (tIn || bIn) { 283 if (!elem.data('nearInited')) { 284 if (_self.settings.near) _self.settings.near(elem); 285 elem.data('nearInited', true); 286 } 287 } 288 289 //check window 290 tIn = ((elemTop < wBottom) && (elemTop > wTop)); 291 bIn = ((elemBottom < wBottom) && (elemBottom > wTop)); 292 if (tIn || bIn) { 293 if (!elem.data('wInited')) { 294 if (_self.settings.view) _self.settings.view(elem); 295 elem.data('wInited', true); 296 } 297 } 298 299 }); 300 }; 301 302 this.checkNow(); 303 304 return this; 305 }; 306 /* end ON_VIEW */ 307}(jQuery)); 308 309 310/* 311 * jQuery plugin to serialize form data to JSON 312 */ 313jQuery.fn.serializeJSON = function () { 314 var json = {}; 315 jQuery.map(jQuery(this).serializeArray(), function (n, i) { 316 var _ = n.name.indexOf('['); 317 if (_ > -1) { 318 var o = json; 319 var _name = n.name.replace(/\]/gi, '').split('['); 320 for (var i = 0, len = _name.length; i < len; i++) { 321 if (i == len - 1) { 322 if (o[_name[i]]) { 323 if (typeof o[_name[i]] == 'string') { 324 o[_name[i]] = [o[_name[i]]]; 325 } 326 o[_name[i]].push(n.value); 327 } else o[_name[i]] = n.value || ''; 328 } else o = o[_name[i]] = o[_name[i]] || {}; 329 } 330 } else { 331 if (json[n.name] !== undefined) { 332 if (!json[n.name].push) { 333 json[n.name] = [json[n.name]]; 334 } 335 json[n.name].push(n.value || ''); 336 } else json[n.name] = n.value || ''; 337 } 338 }); 339 return json; 340}; 341 342 343/* 344 * util function creates an array of data values corresponding to screen width breakpoints 345 */ 346function getDataBkptArray(elem, dataAttr) { 347 var tempData; 348 var i; 349 350 dataArr = elem.attr(dataAttr).split(','); 351 for (i = 0; i <= rb.bkpt_names.length; i++) { 352 if (!dataArr[i]) 353 dataArr[i] = tempData; 354 else 355 tempData = dataArr[i]; 356 } 357 358 return dataArr; 359}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.