// jc.jquery.js // written by James D Chalmers // Where possible, Code Copyright & Property of MTCMedia LTD // www.mtcmedia.co.uk // MTCMEDIA: Internet Media Solutions // v1.632 // released 17 Feb 2010 // Added auto window.resize events to centerscreen & screenfill // v1.631 // released 8 Feb 2010 // updated centerscreen // added auto positioning to element // this should be checked across all functions // some rollfade updates got over-written. These have now been fixed. // v1.63 // released 27 Jan 2010 // added jcmarquee // this is an adaptation of brandscroll // these two functions badly need to be deprecated and // rewritten as a single light function // that is highly customisable. // modified brandscroll_settings identifier. // now : var i = 'bs_'+Math.floor(Math.random()*10102030123); // v1.62 // released 19 Jan 2010 // changelog: // fixed rollfade checkclass // adjusted rollfade default (fades in to 1.0 opacity now instead of 0.9) // fixed brandscroll mouse out // cleared timeout properly in brandscroll // adding date to new versions // v1.61 // changelog // added daisychaining to all functions // modified centerscreen // v1.6 // changelog // added brandscroll(); // v1.51 // changelog // added formhint // v1.0 traced back to 8th Dec 2009 /////// NEEDED GLOBAL VARIABLES var brandscroll_settings = new Array; var jcmarquee = new Array; /////// NEEDED FUNCTIONS // #sp // stops event bubbling function sp (event){ event.stopPropagation(); } // #screenfill // leaves no borders // yset $.fn.screenfill = function(options){ var options = $.extend({ animate : 1, onresize : 1, onresizeanimate : 0 }, options); $('html, body').css({overflow : 'hidden'}); var w = $(window).width(); var h = $(window).height(); return this.each(function(){ var el = $(this); var ew = el.outerWidth(); var eh = el.outerHeight(); var ratio = ew / eh; // auto positioning if(el.css('position')!='absolute'){ el.css('position', 'relative'); } var cssoptions = { }; if(w > h){ cssoptions.width = w; cssoptions.height = (w/ratio); } else { cssoptions.height = h; cssoptions.width = (h*ratio); } if(cssoptions.width < w){ cssoptions.height = h; cssoptions.width = (h*ratio); } if(cssoptions.height < h) { cssoptions.height = h; cssoptions.width = (h*ratio); } // center cssoptions.left = ((w-cssoptions.width)/2)+'px'; cssoptions.top = ((h-cssoptions.height)/2)+'px'; cssoptions.height += 'px'; cssoptions.width += 'px'; if(options.animate == true){ el.stop().animate(cssoptions, {queue : false, duration : 500}); } else { el.stop().css(cssoptions); } el.fadeIn(); if(options.onresize){ $(window).bind('resize', function(){ el.screenfill({ animate : options.onresizeanimate, onresize : 0 }); }); } }); }; // #centerscreen // v1.631 update: // supports auto positioning // v1.61 updates: // now supports custom pre-set width / height // and horizontal and vertical adjustments // also supports centering relative to immediate parent $.fn.centerscreen = function(options){ var options = $.extend({ horizontal : true, vertical : true, animate : true, speed : 500, parent : false, vertical_adjustment : 0, horizontal_adjustment : 0, w : 0, h : 0, onresize : 1, onresizeanimate : 0 }, options); return this.each(function(){ var el = $(this); var ew = el.outerWidth(true); var eh = el.outerHeight(true); if(options.parent){ var w = el.parent().outerWidth(); var h = el.parent().outerHeight(); } else { var w = $(window).width(); var h = $(window).height(); } // auto positioning if(el.css('position') != 'absolute'){ el.css('position', 'relative'); } if(options.w >0){ w = options.w-1+1; } if(options.h>0){ h = options.h-1+1; } var w = (options.horizontal_adjustment-1+1)+w; var h = (options.vertical_adjustment-1+1)+h; var cssoptions = ''; var cssoptions = {}; if(ew < w){ if(options.horizontal){ cssoptions.left = (w-ew)/2+'px'; } } else { cssoptions.left = 0; } if(eh < h) { if(options.vertical){ cssoptions.top = (h-eh)/2+'px'; } } else { cssoptions.top = 0; } if(options.animate){ el.stop().animate(cssoptions, {queue : false, duration : options.speed}); } else { el.stop().css(cssoptions); } if(options.onresize){ options.onresize = 0; options.animate = options.onresizeanimate; $(window).bind('resize', function(){ el.centerscreen(options); }); } el.show(); }); }; // #rollover // name images, imagename_0.jpg (or whatever filetype) // imagename_1.jpg (for hover).. $.fn.rollover = function(options){ var options = $.extend({ preloadID : '#rollover_preloader' }, options); return this.each(function(){ var el = $(this); if(typeof(el.attr('src')) == 'undefined'){ // find the image el = el.find('img'); } if(el.length > 0){ // start rollover var thissrc = el.attr('src'); // thissrc is image original src var thishover = thissrc; thishover = thishover.replace(/(.*)_[0-9](\.[a-z]+)$/, "$1_1$2"); el.hover(function(){ el.attr('src', thishover); }, function(){ el.attr('src', thissrc); }); // close hover // PRELOAD if($(options.preloadID).length == 0){ // create it $('body').prepend(''); } $(options.preloadID).append(''); } // close el.length }); // close each }; // #slidepanel $.fn.slidepanel = function(options) { var options = $.extend({ slideID : '.slider', speed_in : 500, speed_out : 500, hideOptions : { top : '100%' } },options); return this.each(function(){ var el = $(this); var slide = $(this).find(options.slideID); // auto positioning if(el.css('position')!='absolute'){ el.css('position', 'relative'); } // store original positions etc var originalcss = { top : slide.css('top'), left : slide.css('left') }; function hide() { slide.stop().animate(options.hideOptions, {queue : false, duration : options.speed_out}); } function show() { slide.stop().animate(originalcss, {queue : false, duration : options.speed_in}); } hide(); el.hover(show, hide); slide.mouseover(sp); slide.children().mouseover(sp); }); }; ////// Alpha PNG Background replacement... ///// note that options.color could supply a background image as well. //// #alphabg $.fn.alphabg = function(options) { var options = $.extend({ opacity : 0.7, zIndex : '-1', color : '#000', fadeDuration : 0 },options); return this.each(function(){ var el = $(this); var grabber = 'grabber_'+Math.floor(Math.random()*10010923); el.attr('grabber', grabber); // auto positioning if(el.css('position')!='absolute'){ el.css('position', 'relative'); } var thisz = el.css('z-index'); if(typeof(thisz) == 'undefined' || (thisz+'x').replace(/[^0-9]/g, '') == ''){ el.css('z-index', '1'); } var w = el.outerWidth()+'px'; var h = el.outerHeight()+'px'; var bghtml = '
'; var g = '[grabber='+grabber+'] '; if($(g+'> .bg').length == 0){ el.append(bghtml); } else { $(g+'> .bg').css({width : w, height : h}); } $(g+'> .bg').fadeTo(options.fadeDuration, options.opacity); }); }; // #rollfade // apply fading effects to rollover // check's custom class $.fn.rollfade = function(options){ var options = $.extend({ checkClass : 'clicked', fadeIn : 1.0, fadeOut : 0.5, // also default fade duration : 300 }, options); options.checkClass = options.checkClass.replace(/\./g, ''); return this.each(function(){ var el = $(this); if(!el.hasClass('.'+options.checkClass)){ el.fadeTo(0, options.fadeOut); } el.hover(function(){ if(el.hasClass('.'+options.checkClass) == false){ el.stop().fadeTo(options.duration, options.fadeIn); } }, function(){ if(el.hasClass(options.checkClass) == false){ el.stop().fadeTo(options.duration, options.fadeOut); } }); }); }; // #formhint // helpful form field hint text // clears on focus $.fn.formhint = function(options){ var options = $.extend({ attr : 'title' }, options); return this.each(function(){ // set value as title var el = $(this); if(el.val() == ''){ el.val(el.attr(options.attr)); el.focus(function(){ if(el.val() == el.attr(options.attr)){ el.val(''); } else { el.select(); } }); // close focus el.blur(function(){ if(el.val() == ''){ el.val(el.attr(options.attr)); } }); // close blur } else { // close if) el.focus(function(){ el.select(); }); } }); // close each }; // #brandscroll // notes: needs continuous mode // needs work on onclick etc - passing $(this) // example usage // $(window).load(function(){ // $('#brandscroll').brandscroll(); // // $('.right').brandscroll_button({ // el : '#brandscroll', // direction : 'right' // }); // // $('.left').brandscroll_button({ // el : '#brandscroll' // }); // }); // html markup //
//
// //
//
// apply styles to #brandscroll and .item, as well as perhaps .left and .right $.fn.brandscroll = function(options){ var options = $.extend({ speed : 1000, stoponhover : true, onclick : '', onmouseover : '', onmouseout : '', autoplay : true, autoplayinterval : 2000, cycle : true, autoheight : true, itemspacing : 5, autocenteritems : true, force : 100, rewindspeed : 1900 },options); return this.each(function(){ if($(this).length>0){ var el = $(this); // assign id and save to moveQueue var i = 'bs_'+Math.floor(Math.random()*10102030123); // this is used to add actions to queue :) el.attr('brandscroll_settings', i); // save settings brandscroll_settings[i] = options; // get items var items = el.children('.item'); // empty el interior el.children(':not(.item)').remove(); // build el.wrapInner('
'); var vp = el.children('.viewport'); vp.wrapInner('
'); var us = vp.children('.universe'); // force apply some el css if(el.css('position')!='absolute'){ el.css('position', 'relative'); } // force apply some vp css vp.css({ 'position' : 'relative', height : '100%', width : '100%', 'z-index' : 1, overflow : 'hidden' }); // insert a clear us.append('
'); // style universe items items = us.children('.item'); items.css({ float : 'left', 'margin-right' : options.itemspacing+'px' }); // calculate universe width var us_width = 0; // also calculate max height var maxheight = 0; items.each(function(){ var e = $(this); us_width += (e.outerWidth(true)); var thisheight = e.outerHeight(true); if(thisheight > maxheight){maxheight=thisheight;} }); // force apply some universe css us.css({ 'position' : 'absolute', top : '0px', left : '0px', height : '100%', 'z-index' : 5, width : us_width+'px' }); if(options.autoheight){ var css = {height : maxheight+'px'}; el.css(css); us.css(css); vp.css(css); } // do autocenter if(options.autocenteritems){ items.each(function(){ var e = $(this); if(e.outerHeight(true) < maxheight){ var thistop = maxheight - e.outerHeight(true); thistop = thistop/2; e.css({ 'position' : 'relative', top : thistop+'px' }); } }); } // do autoplay if(options.autoplay){ brandscroll_settings[i]['interval'] = setInterval(function(){ el.brandscroll_move({ force : options.force, cycle : options.cycle, i : i, speed : options.speed, rewindspeed : options.rewindspeed }); }, options.autoplayinterval); } // do stop on hover if(options.stoponhover){ items.hover(function(){ el.brandscroll_pause({i:i}); }, function(){ el.brandscroll_resume({i:i}); }); } if(options.onclick!=''){ items.click(function(){ return options['onclick'](); }); } if(options.onmouseover!=''){ items.mouseover(function(){ return options['onmouseover'](); }); } if(options.onmouseout!=''){ items.mouseout(function(){ return options['onmouseout'](); }); } } }); }; // brandscroll animation event $.fn.brandscroll_move = function(options){ var options = $.extend({ force : '', cycle : '', i : '', speed : '', direction : 'right', rewindspeed : '', stopqueue : false }, options); return this.each(function(){ // establish elements var el = $(this); var vp = el.children('.viewport'); var us = vp.children('.universe'); var i = options.i; if(i==''){ i = el.attr('brandscroll_settings'); } var s = brandscroll_settings[i]; for (var c in options){ if(options[c]==''){ options[c]=s[c]; } } // get width of universe var uswidth = us.outerWidth(true); // get viewport width var vpwidth = vp.outerWidth(); // get current position var thisleft = us.position().left; // integify options.force = options.force-1+1; thisleft = thisleft-1+1; var speed = options.speed; if(options.direction=='right'){ // get moveleft value var ml = thisleft-options.force; // cycle if(options.cycle){ if(ml == (-(uswidth-vpwidth)-(options.force))) { // reset ml = 0; speed = options.rewindspeed; } } if((ml*-1)>uswidth-vpwidth){ ml = -(uswidth-vpwidth); } } else { // move left // get moveleft value var ml = thisleft+options.force; // cycle if(options.cycle){ if((ml*-1)==(-options.force)){ ml = (uswidth-vpwidth); ml = ml*-1; speed = options.rewindspeed; } } // see if its greater than end. if(ml>0){ ml = 0; } } ml = Math.floor(ml); if(options.stopqueue){ us.stop(true); } us.animate({ left : ml+'px' }, {queue : true, duration : speed}); el.brandscroll_pause(); var waitspeed = speed; if(speed==options.rewindspeed){ waitspeed += (options.rewindspeed/2); } brandscroll_settings[i]['movetimer'] = setTimeout(function(){ el.brandscroll_resume(); }, waitspeed); }); }; $.fn.brandscroll_pause = function(options){ var options = $.extend({ i : '' }, options); return this.each(function(){ var el = $(this); var i = options.i; if(i==''){ i = el.attr('brandscroll_settings'); } var us = el.find('.universe'); // we have enough info to re-start the // interval so we can just clear it here clearInterval(brandscroll_settings[i]['interval']); clearTimeout(brandscroll_settings[i]['movetimer']); }); }; $.fn.brandscroll_resume = function(options){ var options = $.extend({ i : '' }, options); return this.each(function(){ var el = $(this); var i = options.i; if(i==''){ i = el.attr('brandscroll_settings'); } var s = brandscroll_settings[i]; // we will restart the interval from the saved settings if(s.autoplay){ brandscroll_settings[i]['interval'] = setInterval(function(){ el.brandscroll_move({ force : s.force, cycle : s.cycle, i : i, speed : s.speed }); }, s.autoplayinterval); } }); }; $.fn.brandscroll_button = function(options){ var options = $.extend({ direction : 'right', el : '', force : '', stopqueue : true }, options); return this.each(function(){ var el = $(this); if(options.el == ''){ alert('Please provide the el option. This can be a normal jquery css reference to the brandscroll element.'); } var e = $(options.el); var i = e.attr('brandscroll_settings'); var s = brandscroll_settings[i]; for (var c in options){ if(options[c]==''){options[c]==s[c];} } el.click(function(){ e.brandscroll_move(options); return false; }); }); }; // #jcmarquee // similar setup to brandscroll // more refined _action function // need to add mover buttons $.fn.jcmarquee = function(options){ var options = $.extend({ speed : 100, // per 1000 pixels to provide consistency // 100ms/1000px autocenter : true, autowidth : true, loop : true, direction : 'left', pauseonhover : true }, options); return this.each(function(){ var el = $(this); var i = 'jcmarquee_'+Math.floor(Math.random()*1021930); el.attr('jcmarquee', i); jcmarquee[i] = Array; jcmarquee[i].options = options; // positioning if(el.css('position')!='absolute'){ el.css('position', 'relative'); } // create viewport el.wrapInner('
'); var vp = el.find('.viewport:first'); // create universe vp.wrapInner('
'); var us = el.find('.universe:first'); // css viewport vp.css({ 'position' : 'absolute', 'width' : '100%', 'height' : '100%', 'overflow' : 'hidden', 'left' : 0, 'top' : 0 }); // css universe us.css('position' , 'absolute'); if(options.direction == 'right'){ var cssoptions = { 'left' : -vp.outerWidth()+'px' }; } else { var cssoptions = { 'right' : -us.outerWidth()+'px' }; } // autowidth? if(options.autowidth){ cssoptions.width = us.outerWidth()+'px'; } // autocenter? if(options.autocenter){ cssoptions.top = (vp.outerHeight()-us.outerHeight())/2+'px'; } // final css application us.css(cssoptions); // get us width for other calcs var uswidth = us.outerWidth(); // calculate speed var speed = (options.speed/1000); speed = uswidth/speed; speed = Math.floor(speed); // store speed jcmarquee[i]['storespeed'] = speed; // anim function function anim () { el.addClass('refreshthis'+i); el.removeClass('refreshthis'+i); if(options.direction == 'right'){ // stop us.stop(true).css('left', -us.outerWidth()+'px'); // start animation us.animate({ left : vp.outerWidth()+'px' },{ queue : false, duration : speed, easing : 'linear' }); } else { // stop us.stop(true).css('right', -us.outerWidth()+'px'); // start animation us.animate({ right : vp.outerWidth()+'px' },{ queue : false, duration : speed, easing : 'linear' }); } } // start anim(); // loop? if(options.loop){ jcmarquee[i]['loop'] = setInterval(function(){ anim(); }, speed); } // pause on mouseover? if(options.pauseonhover){ vp.hover(function(){ el.jcmarquee_action({ action : 'pause' }); }, function(){ el.jcmarquee_action({ action : 'resume' }); }); } }); }; $.fn.jcmarquee_action = function(options){ var options = $.extend({ action : '' }, options); return this.each(function(){ var el = $(this); // get i var i = el.attr('jcmarquee'); // get opts var opts = jcmarquee[i]['options']; // set vars var us = el.find('.universe:first'); var vp = el.find('.viewport:first'); // pause if(options.action=='pause'){ // stop us us.stop(true); // stop timer clearInterval(jcmarquee[i]['loop']); clearTimeout(jcmarquee[i]['timeout']); } if(options.action=='resume'){ clearInterval(jcmarquee[i]['loop']); clearTimeout(jcmarquee[i]['timeout']); // got to do some beastin calculations us.stop(true); // basically find out how much of us is still to be animated var togo = 0; if(opts.direction == 'left'){ // using css right togo = vp.outerWidth()-us.position().left; togo = us.outerWidth()-togo; } else { togo = us.position().left*-1; togo = togo+vp.outerWidth(); } if(togo<0){togo=togo*-1;} // calculate speed var speed = (opts.speed/1000); speed = togo/speed; speed = Math.floor(speed); el.addClass('refreshthis'+i); el.removeClass('refreshthis'+i); // then fire of an anim if(opts.direction == 'right'){ // start animation us.animate({ left : vp.outerWidth()+'px' }, { queue : false, duration : speed, easing : 'linear' }); } else { // start animation us.animate({ right : vp.outerWidth()+'px' }, { queue : false, duration : speed, easing : 'linear' }); } function anim () { el.addClass('refreshthis'+i); el.removeClass('refreshthis'+i); if(opts.direction == 'right'){ // stop us.stop(true).css('left', -us.outerWidth()+'px'); // start animation us.animate({ left : vp.outerWidth()+'px' },{ queue : false, duration : jcmarquee[i]['storespeed'], easing : 'linear' }); } else { // stop us.stop(true).css('right', -us.outerWidth()+'px'); // start animation us.animate({ right : vp.outerWidth()+'px' },{ queue : false, duration : jcmarquee[i]['storespeed'], easing : 'linear' }); } } // loop? if(opts.loop){ // then fire off a settimeout jcmarquee[i]['timeout'] = setTimeout(function(){ anim(); // then within this set up the new loop jcmarquee[i]['loop'] = setInterval(anim, jcmarquee[i]['storespeed']); }, speed); } } // end resume }); };