function resumeerror() {return true;} //window.onerror=resumeerror; function nopic(){ var img=event.srcelement; img.src="../files/nopic.png"; img.onerror=null; } /*! * glide.js * version: 1.0.65 * simple, lightweight and fast jquery slider * author: @jedrzejchalubek * site: http://jedrzejchalubek.com/ * licensed under the mit license */ ;(function ($, window, document, undefined) { var name = 'glide', defaults = { // {int or bool} false for turning off autoplay autoplay: 4000, // {bool} pause autoplay on mouseover slider hoverpause: true, // {bool} circual play circular: true, // {int} animation time animationduration: 500, // {string} animation easing function animationtimingfunc: 'cubic-bezier(0.165, 0.840, 0.440, 1.000)', /** * {bool or string} show/hide/appendto arrows * true for append arrows to slider wrapper * false for not appending arrows * id or class name (e.g. '.class-name') for appending to specific html markup */ arrows: true, // {string} arrows wrapper class arrowswrapperclass: 'slider__arrows', // {string} main class for both arrows arrowmainclass: 'slider__arrows-item', // {string} right arrow arrowrightclass: 'slider__arrows-item--right', // {string} right arrow text arrowrighttext: 'next', // {string} left arrow arrowleftclass: 'slider__arrows-item--left', // {string} left arrow text arrowlefttext: 'prev', navigationimg: false, /** * {bool or string} show/hide/appendto bullets navigation * true for append arrows to slider wrapper * false for not appending arrows * id or class name (e.g. '.class-name') for appending to specific html markup */ navigation: true, // {bool} center bullet navigation navigationcenter: true, // {string} navigation class navigationclass: 'slider__nav', // {string} navigation item class navigationitemclass: 'slider__nav-item', // {string} current navigation item class navigationcurrentitemclass: 'slider__nav-item--current', // {bool} slide on left/right keyboard arrows press keyboard: true, // {int or bool} touch settings touchdistance: 60, // {function} callback before plugin init beforeinit: function() {}, // {function} callback after plugin init afterinit: function() {}, // {function} callback before slide change beforetransition: function() {}, // {function} callback after slide change aftertransition: function() {} }; /** * slider constructor * @param {object} parent * @param {object} options */ function glide(parent, options) { // cache this var self = this; // extend options this.options = $.extend({}, defaults, options); // current slide id this.currentslide = 0; // if css3 transition isn't supported switch csssupport variable to false and use $.animate() this.csssupport = ( !this.css.issupported("transition") || !this.css.issupported("transform") ) ? false : true; // if circular set offset, two cloned slides this.offset = (this.options.circular) ? 2 : 0; // callbacks before plugin init this.options.beforeinit.call(this); // sidebar this.parent = parent; // initialize this.init(); // start autoplay this.play(); // callback after plugin init this.options.afterinit.call(this); /** * api * returning slider methods */ return { /** * get current slide number * @return {int} */ current: function() { return -(self.currentslide) + 1; }, /** * reinit * rebuild and recalculate dimensions of slider elements */ reinit: function() { self.init(); }, /** * destroy * revert init modifications and freeze slides */ destroy: function(){ self.destroy(); }, /** * start autoplay */ play: function() { self.play(); }, /** * stop autoplay */ pause: function() { self.pause(); }, /** * slide one forward * @param {function} callback */ next: function(callback) { self.slide(1, false, callback); }, /** * slide one backward * @param {function} callback */ prev: function(callback) { self.slide(-1, false, callback); }, /** * jump to specifed slide * @param {int} distance * @param {function} callback */ jump: function(distance, callback) { self.slide(distance-1, true, callback); }, /** * append navigation to specifet target * @param {mixed} target */ nav: function(target) { /** * if navigation wrapper already exist * remove it, protection before doubled navigation */ if (self.navigation.wrapper) self.navigation.wrapper.remove(); // while target isn't specifed, use slider wrapper self.options.navigation = (target) ? target : self.options.navigation; // build self.navigation(); }, /** * append arrows to specifet target * @param {mixed} target */ arrows: function(target) { /** * if arrows wrapper already exist * remove it, protection before doubled arrows */ if (self.arrows.wrapper) self.arrows.wrapper.remove(); // while target isn't specifed, use slider wrapper self.options.arrows = (target) ? target : self.options.arrows; // build self.arrows(); } }; } /** * building slider */ glide.prototype.build = function() { /** * attatch bindings */ this.bindings(); /** * there is more than one slide */ if (this.slides.length > 1) { /** * circular * if circular option is true * append left and right arrow */ if (this.options.circular) this.circular(); /** * arrows * if arrows option is true * append left and right arrow */ if (this.options.arrows) this.arrows(); /** * navigation * if navigation option is true * append navigation item for each slide */ if (this.options.navigation) this.navigation(); } /** * attatch events */ this.events(); }; /** * build circular dom elements * clone first and last slide * set wrapper width with addional slides * move slider wrapper to first slide */ glide.prototype.circular = function() { /** * clone first and last slide * and set width for each */ this.firstclone = this.slides.filter(':first-child').clone().width(this.slides.spread); this.lastclone = this.slides.filter(':last-child').clone().width(this.slides.spread); //��¡��ͼƭҫȥ����ʵ��class $(this.firstclone).removeclass("real"); $(this.lastclone).removeclass("real"); /** * append clodes slides to slider wrapper at the beginning and end * increase wrapper with with values of addional slides * clear translate and skip cloned last slide at the beginning */ this.wrapper.append(this.firstclone).prepend(this.lastclone).width( this.parent.width() * (this.slides.length+2) ) .trigger('cleartransition') .trigger('settranslate', [-this.slides.spread]); }; /** * building navigation dom */ glide.prototype.navigation = function() { this.navigation.items = {}; // navigation wrapper this.navigation.wrapper = $('
', { 'class': this.options.navigationclass }).appendto( /** * setting append target * if option is true set default target, that is slider wrapper * else get target set in options * @type {bool or string} */ (this.options.navigation === true) ? this.parent : this.options.navigation ); for (var i = 0; i < this.slides.length; i++) { if(this.options.navigationimg) { var src = $(this.slides[i]).children("a").children("img").attr('src'); this.navigation.items[i] = $('', { 'src': src, 'class': this.options.navigationitemclass, 'data-distance': i }).appendto(this.navigation.wrapper); }else{ this.navigation.items[i] = $('', { 'href': '#', 'class': this.options.navigationitemclass, // direction and distance -> item index forward 'data-distance': i }).appendto(this.navigation.wrapper); } } // add navcurrentitemclass to the first navigation item this.navigation.items[0].addclass(this.options.navigationcurrentitemclass); // if centered option is true if (this.options.navigationcenter && !this.options.navigationimg) { // center bullet navigation this.navigation.wrapper.css({ 'left': '50%', 'width': this.navigation.wrapper.children().outerwidth(true) * this.navigation.wrapper.children().length, 'margin-left': -(this.navigation.wrapper.outerwidth(true)/2) }); } }; /** * building arrows dom */ glide.prototype.arrows = function() { /** * arrows wrapper * @type {obejct} */ this.arrows.wrapper = $('
', { 'class': this.options.arrowswrapperclass }).appendto( /** * setting append target * if option is true set default target, that is slider wrapper * else get target set in options * @type {bool or string} */ (this.options.arrows === true) ? this.parent : this.options.arrows ); /** * right arrow * @type {obejct} */ this.arrows.right = $('', { 'href': '#', 'class': this.options.arrowmainclass + ' ' + this.options.arrowrightclass, // direction and distance -> one forward 'data-distance': '1', 'html': this.options.arrowrighttext }).appendto(this.arrows.wrapper); /** * left arrow * @type {object} */ this.arrows.left = $('', { 'href': '#', 'class': this.options.arrowmainclass + ' ' + this.options.arrowleftclass, // direction and distance -> one backward 'data-distance': '-1', 'html': this.options.arrowlefttext }).appendto(this.arrows.wrapper); }; /** * function bindings */ glide.prototype.bindings = function() { var self = this, o = this.options, prefix = this.css.getprefix(); /** * setup slider wrapper bindings * for translate and transition control */ this.wrapper.bind({ /** * set transition */ 'settransition': function() { $(this).css( prefix + 'transition', prefix + 'transform ' + o.animationduration + 'ms ' + o.animationtimingfunc); }, /** * clear transition * for immediate jump effect */ 'cleartransition': function() { $(this).css( prefix + 'transition', 'none'); }, /** * set translate value * @param {object} event * @param {ind} translate */ 'settranslate': function(event, translate) { // if css3 suported set translate3d if (self.csssupport) $(this).css( prefix + 'transform', 'translate3d(' + translate + 'px, 0px, 0px)'); // if not set left margin else $(this).css('margin-left', translate); } }); }; /** * events controllers */ glide.prototype.events = function() { /** * swipe * if swipe option is true * attach touch events */ if (this.options.touchdistance) { this.parent.on({ 'touchstart mspointerdown': $.proxy(this.events.touchstart, this), 'touchmove mspointermove': $.proxy(this.events.touchmove, this), 'touchend mspointerup': $.proxy(this.events.touchend, this) }); } /** * arrows * if arrows exists * attach click event */ if (this.arrows.wrapper) { $(this.arrows.wrapper).children().on('click touchstart', $.proxy(this.events.arrows, this) ); } /** * navigation * if navigation exists * attach click event */ if (this.navigation.wrapper) { $(this.navigation.wrapper).children().on('click touchstart', $.proxy(this.events.navigation, this) ); } /** * keyboard * if keyboard option is true * attach press event */ if (this.options.keyboard) { $(document).on('keyup.glidekeyup', $.proxy(this.events.keyboard, this) ); } /** * slider hover * if hover option is true * attach hover event */ if (this.options.hoverpause) { this.parent.on('mouseover mouseout', $.proxy(this.events.hover, this) ); } /** * slider resize * on window resize * attach resize event */ $(window).on('resize', $.proxy(this.events.resize, this) ); }; /** * navigation event controller * on click in navigation item get distance * then slide specified distance with jump */ glide.prototype.events.navigation = function(event) { if ( !this.wrapper.attr('disabled') ) { // prevent default behaviour event.preventdefault(); // slide distance specified in data attribute this.slide( $(event.currenttarget).data('distance'), true ); } }; /** * arrows event controller * on click in arrows get direction and distance * then slide specified distance without jump * @param {obejct} event */ glide.prototype.events.arrows = function(event) { if ( !this.wrapper.attr('disabled') ) { // prevent default behaviour event.preventdefault(); // slide distance specified in data attribute this.slide( $(event.currenttarget).data('distance'), false ); } }; /** * keyboard arrows event controller * keyboard left and right arrow keys press */ glide.prototype.events.keyboard = function(event) { if ( !this.wrapper.attr('disabled') ) { // next if (event.keycode === 39 && this.slides.length > 1) this.slide(1); // prev if (event.keycode === 37 && this.slides.length > 1) this.slide(-1); } }; /** * when mouse is over slider, pause autoplay * on out, start autoplay again */ glide.prototype.events.hover = function(event) { // pasue autoplay this.pause(); // when mouse left slider or touch end, start autoplay anew if (event.type === 'mouseout') this.play(); }; /** * when resize browser window * reinit plugin for new slider dimensions * correct crop to current slide */ glide.prototype.events.resize = function(event) { // reinit plugin (set new slider dimensions) this.dimensions(); // crop to current slide if(this.slides.length > 1) this.slide(0); }; /** * disable events thats controls slide changes */ glide.prototype.disableevents = function() { this.wrapper.attr( "disabled", true ); }; /** * enable events thats controls slide changes */ glide.prototype.enableevents = function() { this.wrapper.attr( "disabled", false ); }; /** * touch start * @param {object} e event */ glide.prototype.events.touchstart = function(event) { if(ispc()) { return; } if ( !this.wrapper.attr('disabled') ) { // cache event var touch = event.originalevent.touches[0] || event.originalevent.changedtouches[0]; // get touch start points this.events.touchstartx = touch.pagex; this.events.touchstarty = touch.pagey; this.events.touchsin = null; } }; /** * touch move * from swipe length segments calculate swipe angle * @param {obejct} e event */ glide.prototype.events.touchmove = function(event) { if (this.slides.length == 1) { return; } if(ispc()) { return; } if ( !this.wrapper.attr('disabled') ) { // cache event var touch = event.originalevent.touches[0] || event.originalevent.changedtouches[0]; // calculate start, end points var subexsx = touch.pagex - this.events.touchstartx; var subeysy = touch.pagey - this.events.touchstarty; // bitwise subexsx pow var powex = math.abs( subexsx << 2 ); // bitwise subeysy pow var powey = math.abs( subeysy << 2 ); // calculate the length of the hypotenuse segment var touchhypotenuse = math.sqrt( powex + powey ); // calculate the length of the cathetus segment var touchcathetus = math.sqrt( powey ); // calculate the sine of the angle this.events.touchsin = math.asin( touchcathetus/touchhypotenuse ); if ( (this.events.touchsin * (180 / math.pi)) < 45 ) event.preventdefault(); } }; /** * touch end * @param {object} e event */ glide.prototype.events.touchend = function(event) { if (this.slides.length == 1) { return; } if(ispc()) { return; } if ( !this.wrapper.attr('disabled') ) { // cache event var touch = event.originalevent.touches[0] || event.originalevent.changedtouches[0]; // calculate touch distance var touchdistance = touch.pagex - this.events.touchstartx; // while touch is positive and greater than distance set in options if ( (touchdistance > this.options.touchdistance) && ( (this.events.touchsin * (180 / math.pi)) < 45) ) { // slide one backward this.slide(-1); // while touch is negative and lower than negative distance set in options } else if ( (touchdistance < -this.options.touchdistance) && ( (this.events.touchsin * (180 / math.pi)) < 45) ) { // slide one forward this.slide(1); } } }; /** * slides change & animate logic * @param {int} distance * @param {bool} jump * @param {function} callback */ glide.prototype.slide = function(distance, jump, callback) { /** * stop autoplay * clearing timer */ this.pause(); // callbacks before slide change this.options.beforetransition.call(this); // setup variables var self = this, currentslide = (jump) ? 0 : this.currentslide, slideslength = -(this.slides.length-1), fromfirst = false, fromlast = false; /** * check if current slide is first and direction is previous, then go to last slide * or current slide is last and direction is next, then go to the first slide * else change current slide normally */ if ( currentslide === 0 && distance === -1 ) { fromfirst = true; currentslide = slideslength; } else if ( currentslide === slideslength && distance === 1 ) { fromlast = true; currentslide = 0; } else { currentslide = currentslide + (-distance); } /** * crop to current slide. * mul slide width by current slide number. */ var offset = this.slides.spread * currentslide; /** * while circular decrease offset with the width of single slide * when fromfirst and fromlast flags are set, unbind events thats controls changing * when fromlast flags is set, set offset to slide width mulled by slides count without cloned slides * when fromfirst flags is set, set offset to zero */ if (this.options.circular) { offset = offset - this.slides.spread; if (fromlast || fromfirst) this.disableevents(); if (fromlast) offset = this.slides.spread * (slideslength - 2); if (fromfirst) offset = 0; } /** * slide change animation * while css3 is supported use offset * if not, use $.animate(); */ if (this.csssupport) this.wrapper.trigger('settransition').trigger('settranslate', [offset]); else this.wrapper.stop().animate({ 'margin-left': offset }, this.options.animationduration); /** * while circular */ if (this.options.circular) { /** * when fromfirst and fromlast flags are set * after animation clear transition and bind events that control slides changing */ if (fromfirst || fromlast) { this.afteranimation(function(){ self.wrapper.trigger('cleartransition'); self.enableevents(); }); } /** * when fromlast flag is set * after animation make immediate jump from cloned slide to proper one */ if (fromlast) { this.afteranimation(function(){ fromlast = false; self.wrapper.trigger('settranslate', [-self.slides.spread]); }); } /** * when fromfirst flag is set * after animation make immediate jump from cloned slide to proper one */ if (fromfirst) { this.afteranimation(function(){ fromfirst = false; self.wrapper.trigger('settranslate', [self.slides.spread * (slideslength-1)]); }); } } // set to navigation item current class if (this.options.navigation && this.navigation.wrapper) { $('.' + this.options.navigationclass, (this.options.navigation === true) ? this.parent : this.options.navigation).children() .eq(-currentslide) .addclass(this.options.navigationcurrentitemclass) .siblings() .removeclass(this.options.navigationcurrentitemclass); } // update current slide globaly this.currentslide = currentslide; // callbacks after slide change this.afteranimation(function(){ self.options.aftertransition.call(self); if ( (callback !== 'undefined') && (typeof callback === 'function') ) callback(); }); /** * start autoplay * setting up timer */ this.play(); //���ͼƭ�ĸ߶ȸ���slider�ĸ߶� mycurrentslide = -this.currentslide + 1; fixslidermaxheight(); }; /** * autoplay logic * setup counting */ glide.prototype.play = function() { // cache this var self = this; /** * if autoplay turn on * slide one forward after a set time */ if (this.options.autoplay) { this.auto = setinterval(function() { //alert(self.slides.length); if(self.slides.length > 1) self.slide(1, false); }, this.options.autoplay); } }; /** * autoplay pause * clear counting */ glide.prototype.pause = function() { /** * if autoplay turn on * clear interial */ if (this.options.autoplay) this.auto = clearinterval(this.auto); }; /** * call callback after animation duration * added 10 ms to duration to be sure is fired after animation * @param {function} callback */ glide.prototype.afteranimation = function(callback) { settimeout(function(){ callback(); }, this.options.animationduration + 10); }; /** * dimensions * get & set dimensions of slider elements */ glide.prototype.dimensions = function() { // get slide width this.slides.spread = this.parent.width(); // set wrapper width this.wrapper.width(this.slides.spread * (this.slides.length + this.offset)); // set slide width this.slides.add(this.firstclone).add(this.lastclone).width(this.slides.spread); }; /** * destroy * revert init modifications and freeze slides */ glide.prototype.destroy = function() { this.parent.unbind(); this.wrapper.unbind(); this.wrapper.removeattr("style"); $(this.navigation.wrapper).children().unbind(); $(this.arrows.wrapper).children().unbind(); this.slide(0, true); this.pause(); if(this.options.circular) { this.firstclone.remove(); this.lastclone.remove(); } }; /** * initialize * set wrapper * set slides * set animation type */ glide.prototype.init = function() { // set slides wrapper this.wrapper = this.parent.children(); // set slides this.slides = this.wrapper.children(); // set slider dimentions //this.dimensions(); // build dom this.build(); // reinit plugin (set new slider dimensions) $(document).trigger("resize"); }; /** * methods for css3 management */ glide.prototype.css = { /** * check css3 support * @param {string} declaration name to check * @return {boolean} */ issupported: function(declaration) { var issupported = false, prefixes = 'khtml ms o moz webkit'.split(' '), clone = document.createelement('div'), declarationcapital = null; declaration = declaration.tolowercase(); if (clone.style[declaration] !== undefined) issupported = true; if (issupported === false) { declarationcapital = declaration.charat(0).touppercase() + declaration.substr(1); for( var i = 0; i < prefixes.length; i++ ) { if( clone.style[prefixes[i] + declarationcapital ] !== undefined ) { issupported = true; break; } } } if (window.opera) { if (window.opera.version() < 13) issupported = false; } if (issupported === 'undefined' || issupported === undefined) issupported = false; return issupported; }, /** * get browser css prefix * @return {string} returns prefix in "-{prefix}-" format */ getprefix: function () { if (!window.getcomputedstyle) return ''; var styles = window.getcomputedstyle(document.documentelement, ''); return '-' + (array.prototype.slice .call(styles) .join('') .match(/-(moz|webkit|ms)-/) || (styles.olink === '' && ['', 'o']) )[1] + '-'; } }; $.fn[name] = function(options) { return this.each(function () { if ( !$.data(this, 'api_' + name) ) { $.data(this, 'api_' + name, new glide($(this), options) ); } }); }; })(jquery, window, document); var mycurrentslide = 1; function fixslidermaxheight() { //���ͼƭ�ĸ߶ȸ���slider�ĸ߶� var newheight = $(".detailglide .slider li:eq(" + mycurrentslide + ")").height(); $(".detailglide .slider").css({"max-height":newheight + "px"}); //alert(newheight); } $(window).load(function(){fixslidermaxheight();})