jquery.carouFredSel-6.2.1.js 89 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255
  1. /*
  2. * jQuery carouFredSel 6.2.1
  3. * Demo's and documentation:
  4. * caroufredsel.dev7studios.com
  5. *
  6. * Copyright (c) 2013 Fred Heusschen
  7. * www.frebsite.nl
  8. *
  9. * Dual licensed under the MIT and GPL licenses.
  10. * http://en.wikipedia.org/wiki/MIT_License
  11. * http://en.wikipedia.org/wiki/GNU_General_Public_License
  12. */
  13. (function($) {
  14. // LOCAL
  15. if ( $.fn.carouFredSel )
  16. {
  17. return;
  18. }
  19. $.fn.caroufredsel = $.fn.carouFredSel = function(options, configs)
  20. {
  21. // no element
  22. if (this.length == 0)
  23. {
  24. debug( true, 'No element found for "' + this.selector + '".' );
  25. return this;
  26. }
  27. // multiple elements
  28. if (this.length > 1)
  29. {
  30. return this.each(function() {
  31. $(this).carouFredSel(options, configs);
  32. });
  33. }
  34. var $cfs = this,
  35. $tt0 = this[0],
  36. starting_position = false;
  37. if ($cfs.data('_cfs_isCarousel'))
  38. {
  39. starting_position = $cfs.triggerHandler('_cfs_triggerEvent', 'currentPosition');
  40. $cfs.trigger('_cfs_triggerEvent', ['destroy', true]);
  41. }
  42. var FN = {};
  43. FN._init = function(o, setOrig, start)
  44. {
  45. o = go_getObject($tt0, o);
  46. o.items = go_getItemsObject($tt0, o.items);
  47. o.scroll = go_getScrollObject($tt0, o.scroll);
  48. o.auto = go_getAutoObject($tt0, o.auto);
  49. o.prev = go_getPrevNextObject($tt0, o.prev);
  50. o.next = go_getPrevNextObject($tt0, o.next);
  51. o.pagination = go_getPaginationObject($tt0, o.pagination);
  52. o.swipe = go_getSwipeObject($tt0, o.swipe);
  53. o.mousewheel = go_getMousewheelObject($tt0, o.mousewheel);
  54. if (setOrig)
  55. {
  56. opts_orig = $.extend(true, {}, $.fn.carouFredSel.defaults, o);
  57. }
  58. opts = $.extend(true, {}, $.fn.carouFredSel.defaults, o);
  59. opts.d = cf_getDimensions(opts);
  60. crsl.direction = (opts.direction == 'up' || opts.direction == 'left') ? 'next' : 'prev';
  61. var a_itm = $cfs.children(),
  62. avail_primary = ms_getParentSize($wrp, opts, 'width');
  63. if (is_true(opts.cookie))
  64. {
  65. opts.cookie = 'caroufredsel_cookie_' + conf.serialNumber;
  66. }
  67. opts.maxDimension = ms_getMaxDimension(opts, avail_primary);
  68. // complement items and sizes
  69. opts.items = in_complementItems(opts.items, opts, a_itm, start);
  70. opts[opts.d['width']] = in_complementPrimarySize(opts[opts.d['width']], opts, a_itm);
  71. opts[opts.d['height']] = in_complementSecondarySize(opts[opts.d['height']], opts, a_itm);
  72. // primary size not set for a responsive carousel
  73. if (opts.responsive)
  74. {
  75. if (!is_percentage(opts[opts.d['width']]))
  76. {
  77. opts[opts.d['width']] = '100%';
  78. }
  79. }
  80. // primary size is percentage
  81. if (is_percentage(opts[opts.d['width']]))
  82. {
  83. crsl.upDateOnWindowResize = true;
  84. crsl.primarySizePercentage = opts[opts.d['width']];
  85. opts[opts.d['width']] = ms_getPercentage(avail_primary, crsl.primarySizePercentage);
  86. if (!opts.items.visible)
  87. {
  88. opts.items.visibleConf.variable = true;
  89. }
  90. }
  91. if (opts.responsive)
  92. {
  93. opts.usePadding = false;
  94. opts.padding = [0, 0, 0, 0];
  95. opts.align = false;
  96. opts.items.visibleConf.variable = false;
  97. }
  98. else
  99. {
  100. // visible-items not set
  101. if (!opts.items.visible)
  102. {
  103. opts = in_complementVisibleItems(opts, avail_primary);
  104. }
  105. // primary size not set -> calculate it or set to "variable"
  106. if (!opts[opts.d['width']])
  107. {
  108. if (!opts.items.visibleConf.variable && is_number(opts.items[opts.d['width']]) && opts.items.filter == '*')
  109. {
  110. opts[opts.d['width']] = opts.items.visible * opts.items[opts.d['width']];
  111. opts.align = false;
  112. }
  113. else
  114. {
  115. opts[opts.d['width']] = 'variable';
  116. }
  117. }
  118. // align not set -> set to center if primary size is number
  119. if (is_undefined(opts.align))
  120. {
  121. opts.align = (is_number(opts[opts.d['width']]))
  122. ? 'center'
  123. : false;
  124. }
  125. // set variabe visible-items
  126. if (opts.items.visibleConf.variable)
  127. {
  128. opts.items.visible = gn_getVisibleItemsNext(a_itm, opts, 0);
  129. }
  130. }
  131. // set visible items by filter
  132. if (opts.items.filter != '*' && !opts.items.visibleConf.variable)
  133. {
  134. opts.items.visibleConf.org = opts.items.visible;
  135. opts.items.visible = gn_getVisibleItemsNextFilter(a_itm, opts, 0);
  136. }
  137. opts.items.visible = cf_getItemsAdjust(opts.items.visible, opts, opts.items.visibleConf.adjust, $tt0);
  138. opts.items.visibleConf.old = opts.items.visible;
  139. if (opts.responsive)
  140. {
  141. if (!opts.items.visibleConf.min)
  142. {
  143. opts.items.visibleConf.min = opts.items.visible;
  144. }
  145. if (!opts.items.visibleConf.max)
  146. {
  147. opts.items.visibleConf.max = opts.items.visible;
  148. }
  149. opts = in_getResponsiveValues(opts, a_itm, avail_primary);
  150. }
  151. else
  152. {
  153. opts.padding = cf_getPadding(opts.padding);
  154. if (opts.align == 'top')
  155. {
  156. opts.align = 'left';
  157. }
  158. else if (opts.align == 'bottom')
  159. {
  160. opts.align = 'right';
  161. }
  162. switch (opts.align)
  163. {
  164. // align: center, left or right
  165. case 'center':
  166. case 'left':
  167. case 'right':
  168. if (opts[opts.d['width']] != 'variable')
  169. {
  170. opts = in_getAlignPadding(opts, a_itm);
  171. opts.usePadding = true;
  172. }
  173. break;
  174. // padding
  175. default:
  176. opts.align = false;
  177. opts.usePadding = (
  178. opts.padding[0] == 0 &&
  179. opts.padding[1] == 0 &&
  180. opts.padding[2] == 0 &&
  181. opts.padding[3] == 0
  182. ) ? false : true;
  183. break;
  184. }
  185. }
  186. if (!is_number(opts.scroll.duration))
  187. {
  188. opts.scroll.duration = 500;
  189. }
  190. if (is_undefined(opts.scroll.items))
  191. {
  192. opts.scroll.items = (opts.responsive || opts.items.visibleConf.variable || opts.items.filter != '*')
  193. ? 'visible'
  194. : opts.items.visible;
  195. }
  196. opts.auto = $.extend(true, {}, opts.scroll, opts.auto);
  197. opts.prev = $.extend(true, {}, opts.scroll, opts.prev);
  198. opts.next = $.extend(true, {}, opts.scroll, opts.next);
  199. opts.pagination = $.extend(true, {}, opts.scroll, opts.pagination);
  200. // swipe and mousewheel extend later on, per direction
  201. opts.auto = go_complementAutoObject($tt0, opts.auto);
  202. opts.prev = go_complementPrevNextObject($tt0, opts.prev);
  203. opts.next = go_complementPrevNextObject($tt0, opts.next);
  204. opts.pagination = go_complementPaginationObject($tt0, opts.pagination);
  205. opts.swipe = go_complementSwipeObject($tt0, opts.swipe);
  206. opts.mousewheel = go_complementMousewheelObject($tt0, opts.mousewheel);
  207. if (opts.synchronise)
  208. {
  209. opts.synchronise = cf_getSynchArr(opts.synchronise);
  210. }
  211. // DEPRECATED
  212. if (opts.auto.onPauseStart)
  213. {
  214. opts.auto.onTimeoutStart = opts.auto.onPauseStart;
  215. deprecated('auto.onPauseStart', 'auto.onTimeoutStart');
  216. }
  217. if (opts.auto.onPausePause)
  218. {
  219. opts.auto.onTimeoutPause = opts.auto.onPausePause;
  220. deprecated('auto.onPausePause', 'auto.onTimeoutPause');
  221. }
  222. if (opts.auto.onPauseEnd)
  223. {
  224. opts.auto.onTimeoutEnd = opts.auto.onPauseEnd;
  225. deprecated('auto.onPauseEnd', 'auto.onTimeoutEnd');
  226. }
  227. if (opts.auto.pauseDuration)
  228. {
  229. opts.auto.timeoutDuration = opts.auto.pauseDuration;
  230. deprecated('auto.pauseDuration', 'auto.timeoutDuration');
  231. }
  232. // /DEPRECATED
  233. }; // /init
  234. FN._build = function() {
  235. $cfs.data('_cfs_isCarousel', true);
  236. var a_itm = $cfs.children(),
  237. orgCSS = in_mapCss($cfs, ['textAlign', 'float', 'position', 'top', 'right', 'bottom', 'left', 'zIndex', 'width', 'height', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft']),
  238. newPosition = 'relative';
  239. switch (orgCSS.position)
  240. {
  241. case 'absolute':
  242. case 'fixed':
  243. newPosition = orgCSS.position;
  244. break;
  245. }
  246. if (conf.wrapper == 'parent')
  247. {
  248. sz_storeOrigCss($wrp);
  249. }
  250. else
  251. {
  252. $wrp.css(orgCSS);
  253. }
  254. $wrp.css({
  255. 'overflow' : 'hidden',
  256. 'position' : newPosition
  257. });
  258. sz_storeOrigCss($cfs);
  259. $cfs.data('_cfs_origCssZindex', orgCSS.zIndex);
  260. $cfs.css({
  261. 'textAlign' : 'left',
  262. 'float' : 'none',
  263. 'position' : 'absolute',
  264. 'top' : 0,
  265. 'right' : 'auto',
  266. 'bottom' : 'auto',
  267. 'left' : 0,
  268. 'marginTop' : 0,
  269. 'marginRight' : 0,
  270. 'marginBottom' : 0,
  271. 'marginLeft' : 0
  272. });
  273. sz_storeMargin(a_itm, opts);
  274. sz_storeOrigCss(a_itm);
  275. if (opts.responsive)
  276. {
  277. sz_setResponsiveSizes(opts, a_itm);
  278. }
  279. }; // /build
  280. FN._bind_events = function() {
  281. FN._unbind_events();
  282. // stop event
  283. $cfs.bind(cf_e('stop', conf), function(e, imm) {
  284. e.stopPropagation();
  285. // button
  286. if (!crsl.isStopped)
  287. {
  288. if (opts.auto.button)
  289. {
  290. opts.auto.button.addClass(cf_c('stopped', conf));
  291. }
  292. }
  293. // set stopped
  294. crsl.isStopped = true;
  295. if (opts.auto.play)
  296. {
  297. opts.auto.play = false;
  298. $cfs.trigger(cf_e('pause', conf), imm);
  299. }
  300. return true;
  301. });
  302. // finish event
  303. $cfs.bind(cf_e('finish', conf), function(e) {
  304. e.stopPropagation();
  305. if (crsl.isScrolling)
  306. {
  307. sc_stopScroll(scrl);
  308. }
  309. return true;
  310. });
  311. // pause event
  312. $cfs.bind(cf_e('pause', conf), function(e, imm, res) {
  313. e.stopPropagation();
  314. tmrs = sc_clearTimers(tmrs);
  315. // immediately pause
  316. if (imm && crsl.isScrolling)
  317. {
  318. scrl.isStopped = true;
  319. var nst = getTime() - scrl.startTime;
  320. scrl.duration -= nst;
  321. if (scrl.pre)
  322. {
  323. scrl.pre.duration -= nst;
  324. }
  325. if (scrl.post)
  326. {
  327. scrl.post.duration -= nst;
  328. }
  329. sc_stopScroll(scrl, false);
  330. }
  331. // update remaining pause-time
  332. if (!crsl.isPaused && !crsl.isScrolling)
  333. {
  334. if (res)
  335. {
  336. tmrs.timePassed += getTime() - tmrs.startTime;
  337. }
  338. }
  339. // button
  340. if (!crsl.isPaused)
  341. {
  342. if (opts.auto.button)
  343. {
  344. opts.auto.button.addClass(cf_c('paused', conf));
  345. }
  346. }
  347. // set paused
  348. crsl.isPaused = true;
  349. // pause pause callback
  350. if (opts.auto.onTimeoutPause)
  351. {
  352. var dur1 = opts.auto.timeoutDuration - tmrs.timePassed,
  353. perc = 100 - Math.ceil( dur1 * 100 / opts.auto.timeoutDuration );
  354. opts.auto.onTimeoutPause.call($tt0, perc, dur1);
  355. }
  356. return true;
  357. });
  358. // play event
  359. $cfs.bind(cf_e('play', conf), function(e, dir, del, res) {
  360. e.stopPropagation();
  361. tmrs = sc_clearTimers(tmrs);
  362. // sort params
  363. var v = [dir, del, res],
  364. t = ['string', 'number', 'boolean'],
  365. a = cf_sortParams(v, t);
  366. dir = a[0];
  367. del = a[1];
  368. res = a[2];
  369. if (dir != 'prev' && dir != 'next')
  370. {
  371. dir = crsl.direction;
  372. }
  373. if (!is_number(del))
  374. {
  375. del = 0;
  376. }
  377. if (!is_boolean(res))
  378. {
  379. res = false;
  380. }
  381. // stopped?
  382. if (res)
  383. {
  384. crsl.isStopped = false;
  385. opts.auto.play = true;
  386. }
  387. if (!opts.auto.play)
  388. {
  389. e.stopImmediatePropagation();
  390. return debug(conf, 'Carousel stopped: Not scrolling.');
  391. }
  392. // button
  393. if (crsl.isPaused)
  394. {
  395. if (opts.auto.button)
  396. {
  397. opts.auto.button.removeClass(cf_c('stopped', conf));
  398. opts.auto.button.removeClass(cf_c('paused', conf));
  399. }
  400. }
  401. // set playing
  402. crsl.isPaused = false;
  403. tmrs.startTime = getTime();
  404. // timeout the scrolling
  405. var dur1 = opts.auto.timeoutDuration + del;
  406. dur2 = dur1 - tmrs.timePassed;
  407. perc = 100 - Math.ceil(dur2 * 100 / dur1);
  408. if (opts.auto.progress)
  409. {
  410. tmrs.progress = setInterval(function() {
  411. var pasd = getTime() - tmrs.startTime + tmrs.timePassed,
  412. perc = Math.ceil(pasd * 100 / dur1);
  413. opts.auto.progress.updater.call(opts.auto.progress.bar[0], perc);
  414. }, opts.auto.progress.interval);
  415. }
  416. tmrs.auto = setTimeout(function() {
  417. if (opts.auto.progress)
  418. {
  419. opts.auto.progress.updater.call(opts.auto.progress.bar[0], 100);
  420. }
  421. if (opts.auto.onTimeoutEnd)
  422. {
  423. opts.auto.onTimeoutEnd.call($tt0, perc, dur2);
  424. }
  425. if (crsl.isScrolling)
  426. {
  427. $cfs.trigger(cf_e('play', conf), dir);
  428. }
  429. else
  430. {
  431. $cfs.trigger(cf_e(dir, conf), opts.auto);
  432. }
  433. }, dur2);
  434. // pause start callback
  435. if (opts.auto.onTimeoutStart)
  436. {
  437. opts.auto.onTimeoutStart.call($tt0, perc, dur2);
  438. }
  439. return true;
  440. });
  441. // resume event
  442. $cfs.bind(cf_e('resume', conf), function(e) {
  443. e.stopPropagation();
  444. if (scrl.isStopped)
  445. {
  446. scrl.isStopped = false;
  447. crsl.isPaused = false;
  448. crsl.isScrolling = true;
  449. scrl.startTime = getTime();
  450. sc_startScroll(scrl, conf);
  451. }
  452. else
  453. {
  454. $cfs.trigger(cf_e('play', conf));
  455. }
  456. return true;
  457. });
  458. // prev + next events
  459. $cfs.bind(cf_e('prev', conf)+' '+cf_e('next', conf), function(e, obj, num, clb, que) {
  460. e.stopPropagation();
  461. // stopped or hidden carousel, don't scroll, don't queue
  462. if (crsl.isStopped || $cfs.is(':hidden'))
  463. {
  464. e.stopImmediatePropagation();
  465. return debug(conf, 'Carousel stopped or hidden: Not scrolling.');
  466. }
  467. // not enough items
  468. var minimum = (is_number(opts.items.minimum)) ? opts.items.minimum : opts.items.visible + 1;
  469. if (minimum > itms.total)
  470. {
  471. e.stopImmediatePropagation();
  472. return debug(conf, 'Not enough items ('+itms.total+' total, '+minimum+' needed): Not scrolling.');
  473. }
  474. // get config
  475. var v = [obj, num, clb, que],
  476. t = ['object', 'number/string', 'function', 'boolean'],
  477. a = cf_sortParams(v, t);
  478. obj = a[0];
  479. num = a[1];
  480. clb = a[2];
  481. que = a[3];
  482. var eType = e.type.slice(conf.events.prefix.length);
  483. if (!is_object(obj))
  484. {
  485. obj = {};
  486. }
  487. if (is_function(clb))
  488. {
  489. obj.onAfter = clb;
  490. }
  491. if (is_boolean(que))
  492. {
  493. obj.queue = que;
  494. }
  495. obj = $.extend(true, {}, opts[eType], obj);
  496. // test conditions callback
  497. if (obj.conditions && !obj.conditions.call($tt0, eType))
  498. {
  499. e.stopImmediatePropagation();
  500. return debug(conf, 'Callback "conditions" returned false.');
  501. }
  502. if (!is_number(num))
  503. {
  504. if (opts.items.filter != '*')
  505. {
  506. num = 'visible';
  507. }
  508. else
  509. {
  510. var arr = [num, obj.items, opts[eType].items];
  511. for (var a = 0, l = arr.length; a < l; a++)
  512. {
  513. if (is_number(arr[a]) || arr[a] == 'page' || arr[a] == 'visible') {
  514. num = arr[a];
  515. break;
  516. }
  517. }
  518. }
  519. switch(num) {
  520. case 'page':
  521. e.stopImmediatePropagation();
  522. return $cfs.triggerHandler(cf_e(eType+'Page', conf), [obj, clb]);
  523. break;
  524. case 'visible':
  525. if (!opts.items.visibleConf.variable && opts.items.filter == '*')
  526. {
  527. num = opts.items.visible;
  528. }
  529. break;
  530. }
  531. }
  532. // resume animation, add current to queue
  533. if (scrl.isStopped)
  534. {
  535. $cfs.trigger(cf_e('resume', conf));
  536. $cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]);
  537. e.stopImmediatePropagation();
  538. return debug(conf, 'Carousel resumed scrolling.');
  539. }
  540. // queue if scrolling
  541. if (obj.duration > 0)
  542. {
  543. if (crsl.isScrolling)
  544. {
  545. if (obj.queue)
  546. {
  547. if (obj.queue == 'last')
  548. {
  549. queu = [];
  550. }
  551. if (obj.queue != 'first' || queu.length == 0)
  552. {
  553. $cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]);
  554. }
  555. }
  556. e.stopImmediatePropagation();
  557. return debug(conf, 'Carousel currently scrolling.');
  558. }
  559. }
  560. tmrs.timePassed = 0;
  561. $cfs.trigger(cf_e('slide_'+eType, conf), [obj, num]);
  562. // synchronise
  563. if (opts.synchronise)
  564. {
  565. var s = opts.synchronise,
  566. c = [obj, num];
  567. for (var j = 0, l = s.length; j < l; j++) {
  568. var d = eType;
  569. if (!s[j][2])
  570. {
  571. d = (d == 'prev') ? 'next' : 'prev';
  572. }
  573. if (!s[j][1])
  574. {
  575. c[0] = s[j][0].triggerHandler('_cfs_triggerEvent', ['configuration', d]);
  576. }
  577. c[1] = num + s[j][3];
  578. s[j][0].trigger('_cfs_triggerEvent', ['slide_'+d, c]);
  579. }
  580. }
  581. return true;
  582. });
  583. // prev event
  584. $cfs.bind(cf_e('slide_prev', conf), function(e, sO, nI) {
  585. e.stopPropagation();
  586. var a_itm = $cfs.children();
  587. // non-circular at start, scroll to end
  588. if (!opts.circular)
  589. {
  590. if (itms.first == 0)
  591. {
  592. if (opts.infinite)
  593. {
  594. $cfs.trigger(cf_e('next', conf), itms.total-1);
  595. }
  596. return e.stopImmediatePropagation();
  597. }
  598. }
  599. sz_resetMargin(a_itm, opts);
  600. // find number of items to scroll
  601. if (!is_number(nI))
  602. {
  603. if (opts.items.visibleConf.variable)
  604. {
  605. nI = gn_getVisibleItemsPrev(a_itm, opts, itms.total-1);
  606. }
  607. else if (opts.items.filter != '*')
  608. {
  609. var xI = (is_number(sO.items)) ? sO.items : gn_getVisibleOrg($cfs, opts);
  610. nI = gn_getScrollItemsPrevFilter(a_itm, opts, itms.total-1, xI);
  611. }
  612. else
  613. {
  614. nI = opts.items.visible;
  615. }
  616. nI = cf_getAdjust(nI, opts, sO.items, $tt0);
  617. }
  618. // prevent non-circular from scrolling to far
  619. if (!opts.circular)
  620. {
  621. if (itms.total - nI < itms.first)
  622. {
  623. nI = itms.total - itms.first;
  624. }
  625. }
  626. // set new number of visible items
  627. opts.items.visibleConf.old = opts.items.visible;
  628. if (opts.items.visibleConf.variable)
  629. {
  630. var vI = cf_getItemsAdjust(gn_getVisibleItemsNext(a_itm, opts, itms.total-nI), opts, opts.items.visibleConf.adjust, $tt0);
  631. if (opts.items.visible+nI <= vI && nI < itms.total)
  632. {
  633. nI++;
  634. vI = cf_getItemsAdjust(gn_getVisibleItemsNext(a_itm, opts, itms.total-nI), opts, opts.items.visibleConf.adjust, $tt0);
  635. }
  636. opts.items.visible = vI;
  637. }
  638. else if (opts.items.filter != '*')
  639. {
  640. var vI = gn_getVisibleItemsNextFilter(a_itm, opts, itms.total-nI);
  641. opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
  642. }
  643. sz_resetMargin(a_itm, opts, true);
  644. // scroll 0, don't scroll
  645. if (nI == 0)
  646. {
  647. e.stopImmediatePropagation();
  648. return debug(conf, '0 items to scroll: Not scrolling.');
  649. }
  650. debug(conf, 'Scrolling '+nI+' items backward.');
  651. // save new config
  652. itms.first += nI;
  653. while (itms.first >= itms.total)
  654. {
  655. itms.first -= itms.total;
  656. }
  657. // non-circular callback
  658. if (!opts.circular)
  659. {
  660. if (itms.first == 0 && sO.onEnd)
  661. {
  662. sO.onEnd.call($tt0, 'prev');
  663. }
  664. if (!opts.infinite)
  665. {
  666. nv_enableNavi(opts, itms.first, conf);
  667. }
  668. }
  669. // rearrange items
  670. $cfs.children().slice(itms.total-nI, itms.total).prependTo($cfs);
  671. if (itms.total < opts.items.visible + nI)
  672. {
  673. $cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs);
  674. }
  675. // the needed items
  676. var a_itm = $cfs.children(),
  677. i_old = gi_getOldItemsPrev(a_itm, opts, nI),
  678. i_new = gi_getNewItemsPrev(a_itm, opts),
  679. i_cur_l = a_itm.eq(nI-1),
  680. i_old_l = i_old.last(),
  681. i_new_l = i_new.last();
  682. sz_resetMargin(a_itm, opts);
  683. var pL = 0,
  684. pR = 0;
  685. if (opts.align)
  686. {
  687. var p = cf_getAlignPadding(i_new, opts);
  688. pL = p[0];
  689. pR = p[1];
  690. }
  691. var oL = (pL < 0) ? opts.padding[opts.d[3]] : 0;
  692. // hide items for fx directscroll
  693. var hiddenitems = false,
  694. i_skp = $();
  695. if (opts.items.visible < nI)
  696. {
  697. i_skp = a_itm.slice(opts.items.visibleConf.old, nI);
  698. if (sO.fx == 'directscroll')
  699. {
  700. var orgW = opts.items[opts.d['width']];
  701. hiddenitems = i_skp;
  702. i_cur_l = i_new_l;
  703. sc_hideHiddenItems(hiddenitems);
  704. opts.items[opts.d['width']] = 'variable';
  705. }
  706. }
  707. // save new sizes
  708. var $cf2 = false,
  709. i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'),
  710. w_siz = cf_mapWrapperSizes(ms_getSizes(i_new, opts, true), opts, !opts.usePadding),
  711. i_siz_vis = 0,
  712. a_cfs = {},
  713. a_wsz = {},
  714. a_cur = {},
  715. a_old = {},
  716. a_new = {},
  717. a_lef = {},
  718. a_lef_vis = {},
  719. a_dur = sc_getDuration(sO, opts, nI, i_siz);
  720. switch(sO.fx)
  721. {
  722. case 'cover':
  723. case 'cover-fade':
  724. i_siz_vis = ms_getTotalSize(a_itm.slice(0, opts.items.visible), opts, 'width');
  725. break;
  726. }
  727. if (hiddenitems)
  728. {
  729. opts.items[opts.d['width']] = orgW;
  730. }
  731. sz_resetMargin(a_itm, opts, true);
  732. if (pR >= 0)
  733. {
  734. sz_resetMargin(i_old_l, opts, opts.padding[opts.d[1]]);
  735. }
  736. if (pL >= 0)
  737. {
  738. sz_resetMargin(i_cur_l, opts, opts.padding[opts.d[3]]);
  739. }
  740. if (opts.align)
  741. {
  742. opts.padding[opts.d[1]] = pR;
  743. opts.padding[opts.d[3]] = pL;
  744. }
  745. a_lef[opts.d['left']] = -(i_siz - oL);
  746. a_lef_vis[opts.d['left']] = -(i_siz_vis - oL);
  747. a_wsz[opts.d['left']] = w_siz[opts.d['width']];
  748. // scrolling functions
  749. var _s_wrapper = function() {},
  750. _a_wrapper = function() {},
  751. _s_paddingold = function() {},
  752. _a_paddingold = function() {},
  753. _s_paddingnew = function() {},
  754. _a_paddingnew = function() {},
  755. _s_paddingcur = function() {},
  756. _a_paddingcur = function() {},
  757. _onafter = function() {},
  758. _moveitems = function() {},
  759. _position = function() {};
  760. // clone carousel
  761. switch(sO.fx)
  762. {
  763. case 'crossfade':
  764. case 'cover':
  765. case 'cover-fade':
  766. case 'uncover':
  767. case 'uncover-fade':
  768. $cf2 = $cfs.clone(true).appendTo($wrp);
  769. break;
  770. }
  771. switch(sO.fx)
  772. {
  773. case 'crossfade':
  774. case 'uncover':
  775. case 'uncover-fade':
  776. $cf2.children().slice(0, nI).remove();
  777. $cf2.children().slice(opts.items.visibleConf.old).remove();
  778. break;
  779. case 'cover':
  780. case 'cover-fade':
  781. $cf2.children().slice(opts.items.visible).remove();
  782. $cf2.css(a_lef_vis);
  783. break;
  784. }
  785. $cfs.css(a_lef);
  786. // reset all scrolls
  787. scrl = sc_setScroll(a_dur, sO.easing, conf);
  788. // animate / set carousel
  789. a_cfs[opts.d['left']] = (opts.usePadding) ? opts.padding[opts.d[3]] : 0;
  790. // animate / set wrapper
  791. if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable')
  792. {
  793. _s_wrapper = function() {
  794. $wrp.css(w_siz);
  795. };
  796. _a_wrapper = function() {
  797. scrl.anims.push([$wrp, w_siz]);
  798. };
  799. }
  800. // animate / set items
  801. if (opts.usePadding)
  802. {
  803. if (i_new_l.not(i_cur_l).length)
  804. {
  805. a_cur[opts.d['marginRight']] = i_cur_l.data('_cfs_origCssMargin');
  806. if (pL < 0)
  807. {
  808. i_cur_l.css(a_cur);
  809. }
  810. else
  811. {
  812. _s_paddingcur = function() {
  813. i_cur_l.css(a_cur);
  814. };
  815. _a_paddingcur = function() {
  816. scrl.anims.push([i_cur_l, a_cur]);
  817. };
  818. }
  819. }
  820. switch(sO.fx)
  821. {
  822. case 'cover':
  823. case 'cover-fade':
  824. $cf2.children().eq(nI-1).css(a_cur);
  825. break;
  826. }
  827. if (i_new_l.not(i_old_l).length)
  828. {
  829. a_old[opts.d['marginRight']] = i_old_l.data('_cfs_origCssMargin');
  830. _s_paddingold = function() {
  831. i_old_l.css(a_old);
  832. };
  833. _a_paddingold = function() {
  834. scrl.anims.push([i_old_l, a_old]);
  835. };
  836. }
  837. if (pR >= 0)
  838. {
  839. a_new[opts.d['marginRight']] = i_new_l.data('_cfs_origCssMargin') + opts.padding[opts.d[1]];
  840. _s_paddingnew = function() {
  841. i_new_l.css(a_new);
  842. };
  843. _a_paddingnew = function() {
  844. scrl.anims.push([i_new_l, a_new]);
  845. };
  846. }
  847. }
  848. // set position
  849. _position = function() {
  850. $cfs.css(a_cfs);
  851. };
  852. var overFill = opts.items.visible+nI-itms.total;
  853. // rearrange items
  854. _moveitems = function() {
  855. if (overFill > 0)
  856. {
  857. $cfs.children().slice(itms.total).remove();
  858. i_old = $( $cfs.children().slice(itms.total-(opts.items.visible-overFill)).get().concat( $cfs.children().slice(0, overFill).get() ) );
  859. }
  860. sc_showHiddenItems(hiddenitems);
  861. if (opts.usePadding)
  862. {
  863. var l_itm = $cfs.children().eq(opts.items.visible+nI-1);
  864. l_itm.css(opts.d['marginRight'], l_itm.data('_cfs_origCssMargin'));
  865. }
  866. };
  867. var cb_arguments = sc_mapCallbackArguments(i_old, i_skp, i_new, nI, 'prev', a_dur, w_siz);
  868. // fire onAfter callbacks
  869. _onafter = function() {
  870. sc_afterScroll($cfs, $cf2, sO);
  871. crsl.isScrolling = false;
  872. clbk.onAfter = sc_fireCallbacks($tt0, sO, 'onAfter', cb_arguments, clbk);
  873. queu = sc_fireQueue($cfs, queu, conf);
  874. if (!crsl.isPaused)
  875. {
  876. $cfs.trigger(cf_e('play', conf));
  877. }
  878. };
  879. // fire onBefore callback
  880. crsl.isScrolling = true;
  881. tmrs = sc_clearTimers(tmrs);
  882. clbk.onBefore = sc_fireCallbacks($tt0, sO, 'onBefore', cb_arguments, clbk);
  883. switch(sO.fx)
  884. {
  885. case 'none':
  886. $cfs.css(a_cfs);
  887. _s_wrapper();
  888. _s_paddingold();
  889. _s_paddingnew();
  890. _s_paddingcur();
  891. _position();
  892. _moveitems();
  893. _onafter();
  894. break;
  895. case 'fade':
  896. scrl.anims.push([$cfs, { 'opacity': 0 }, function() {
  897. _s_wrapper();
  898. _s_paddingold();
  899. _s_paddingnew();
  900. _s_paddingcur();
  901. _position();
  902. _moveitems();
  903. scrl = sc_setScroll(a_dur, sO.easing, conf);
  904. scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
  905. sc_startScroll(scrl, conf);
  906. }]);
  907. break;
  908. case 'crossfade':
  909. $cfs.css({ 'opacity': 0 });
  910. scrl.anims.push([$cf2, { 'opacity': 0 }]);
  911. scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
  912. _a_wrapper();
  913. _s_paddingold();
  914. _s_paddingnew();
  915. _s_paddingcur();
  916. _position();
  917. _moveitems();
  918. break;
  919. case 'cover':
  920. scrl.anims.push([$cf2, a_cfs, function() {
  921. _s_paddingold();
  922. _s_paddingnew();
  923. _s_paddingcur();
  924. _position();
  925. _moveitems();
  926. _onafter();
  927. }]);
  928. _a_wrapper();
  929. break;
  930. case 'cover-fade':
  931. scrl.anims.push([$cfs, { 'opacity': 0 }]);
  932. scrl.anims.push([$cf2, a_cfs, function() {
  933. _s_paddingold();
  934. _s_paddingnew();
  935. _s_paddingcur();
  936. _position();
  937. _moveitems();
  938. _onafter();
  939. }]);
  940. _a_wrapper();
  941. break;
  942. case 'uncover':
  943. scrl.anims.push([$cf2, a_wsz, _onafter]);
  944. _a_wrapper();
  945. _s_paddingold();
  946. _s_paddingnew();
  947. _s_paddingcur();
  948. _position();
  949. _moveitems();
  950. break;
  951. case 'uncover-fade':
  952. $cfs.css({ 'opacity': 0 });
  953. scrl.anims.push([$cfs, { 'opacity': 1 }]);
  954. scrl.anims.push([$cf2, a_wsz, _onafter]);
  955. _a_wrapper();
  956. _s_paddingold();
  957. _s_paddingnew();
  958. _s_paddingcur();
  959. _position();
  960. _moveitems();
  961. break;
  962. default:
  963. scrl.anims.push([$cfs, a_cfs, function() {
  964. _moveitems();
  965. _onafter();
  966. }]);
  967. _a_wrapper();
  968. _a_paddingold();
  969. _a_paddingnew();
  970. _a_paddingcur();
  971. break;
  972. }
  973. sc_startScroll(scrl, conf);
  974. cf_setCookie(opts.cookie, $cfs, conf);
  975. $cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]);
  976. return true;
  977. });
  978. // next event
  979. $cfs.bind(cf_e('slide_next', conf), function(e, sO, nI) {
  980. e.stopPropagation();
  981. var a_itm = $cfs.children();
  982. // non-circular at end, scroll to start
  983. if (!opts.circular)
  984. {
  985. if (itms.first == opts.items.visible)
  986. {
  987. if (opts.infinite)
  988. {
  989. $cfs.trigger(cf_e('prev', conf), itms.total-1);
  990. }
  991. return e.stopImmediatePropagation();
  992. }
  993. }
  994. sz_resetMargin(a_itm, opts);
  995. // find number of items to scroll
  996. if (!is_number(nI))
  997. {
  998. if (opts.items.filter != '*')
  999. {
  1000. var xI = (is_number(sO.items)) ? sO.items : gn_getVisibleOrg($cfs, opts);
  1001. nI = gn_getScrollItemsNextFilter(a_itm, opts, 0, xI);
  1002. }
  1003. else
  1004. {
  1005. nI = opts.items.visible;
  1006. }
  1007. nI = cf_getAdjust(nI, opts, sO.items, $tt0);
  1008. }
  1009. var lastItemNr = (itms.first == 0) ? itms.total : itms.first;
  1010. // prevent non-circular from scrolling to far
  1011. if (!opts.circular)
  1012. {
  1013. if (opts.items.visibleConf.variable)
  1014. {
  1015. var vI = gn_getVisibleItemsNext(a_itm, opts, nI),
  1016. xI = gn_getVisibleItemsPrev(a_itm, opts, lastItemNr-1);
  1017. }
  1018. else
  1019. {
  1020. var vI = opts.items.visible,
  1021. xI = opts.items.visible;
  1022. }
  1023. if (nI + vI > lastItemNr)
  1024. {
  1025. nI = lastItemNr - xI;
  1026. }
  1027. }
  1028. // set new number of visible items
  1029. opts.items.visibleConf.old = opts.items.visible;
  1030. if (opts.items.visibleConf.variable)
  1031. {
  1032. var vI = cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr), opts, opts.items.visibleConf.adjust, $tt0);
  1033. while (opts.items.visible-nI >= vI && nI < itms.total)
  1034. {
  1035. nI++;
  1036. vI = cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr), opts, opts.items.visibleConf.adjust, $tt0);
  1037. }
  1038. opts.items.visible = vI;
  1039. }
  1040. else if (opts.items.filter != '*')
  1041. {
  1042. var vI = gn_getVisibleItemsNextFilter(a_itm, opts, nI);
  1043. opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
  1044. }
  1045. sz_resetMargin(a_itm, opts, true);
  1046. // scroll 0, don't scroll
  1047. if (nI == 0)
  1048. {
  1049. e.stopImmediatePropagation();
  1050. return debug(conf, '0 items to scroll: Not scrolling.');
  1051. }
  1052. debug(conf, 'Scrolling '+nI+' items forward.');
  1053. // save new config
  1054. itms.first -= nI;
  1055. while (itms.first < 0)
  1056. {
  1057. itms.first += itms.total;
  1058. }
  1059. // non-circular callback
  1060. if (!opts.circular)
  1061. {
  1062. if (itms.first == opts.items.visible && sO.onEnd)
  1063. {
  1064. sO.onEnd.call($tt0, 'next');
  1065. }
  1066. if (!opts.infinite)
  1067. {
  1068. nv_enableNavi(opts, itms.first, conf);
  1069. }
  1070. }
  1071. // rearrange items
  1072. if (itms.total < opts.items.visible+nI)
  1073. {
  1074. $cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs);
  1075. }
  1076. // the needed items
  1077. var a_itm = $cfs.children(),
  1078. i_old = gi_getOldItemsNext(a_itm, opts),
  1079. i_new = gi_getNewItemsNext(a_itm, opts, nI),
  1080. i_cur_l = a_itm.eq(nI-1),
  1081. i_old_l = i_old.last(),
  1082. i_new_l = i_new.last();
  1083. sz_resetMargin(a_itm, opts);
  1084. var pL = 0,
  1085. pR = 0;
  1086. if (opts.align)
  1087. {
  1088. var p = cf_getAlignPadding(i_new, opts);
  1089. pL = p[0];
  1090. pR = p[1];
  1091. }
  1092. // hide items for fx directscroll
  1093. var hiddenitems = false,
  1094. i_skp = $();
  1095. if (opts.items.visibleConf.old < nI)
  1096. {
  1097. i_skp = a_itm.slice(opts.items.visibleConf.old, nI);
  1098. if (sO.fx == 'directscroll')
  1099. {
  1100. var orgW = opts.items[opts.d['width']];
  1101. hiddenitems = i_skp;
  1102. i_cur_l = i_old_l;
  1103. sc_hideHiddenItems(hiddenitems);
  1104. opts.items[opts.d['width']] = 'variable';
  1105. }
  1106. }
  1107. // save new sizes
  1108. var $cf2 = false,
  1109. i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'),
  1110. w_siz = cf_mapWrapperSizes(ms_getSizes(i_new, opts, true), opts, !opts.usePadding),
  1111. i_siz_vis = 0,
  1112. a_cfs = {},
  1113. a_cfs_vis = {},
  1114. a_cur = {},
  1115. a_old = {},
  1116. a_lef = {},
  1117. a_dur = sc_getDuration(sO, opts, nI, i_siz);
  1118. switch(sO.fx)
  1119. {
  1120. case 'uncover':
  1121. case 'uncover-fade':
  1122. i_siz_vis = ms_getTotalSize(a_itm.slice(0, opts.items.visibleConf.old), opts, 'width');
  1123. break;
  1124. }
  1125. if (hiddenitems)
  1126. {
  1127. opts.items[opts.d['width']] = orgW;
  1128. }
  1129. if (opts.align)
  1130. {
  1131. if (opts.padding[opts.d[1]] < 0)
  1132. {
  1133. opts.padding[opts.d[1]] = 0;
  1134. }
  1135. }
  1136. sz_resetMargin(a_itm, opts, true);
  1137. sz_resetMargin(i_old_l, opts, opts.padding[opts.d[1]]);
  1138. if (opts.align)
  1139. {
  1140. opts.padding[opts.d[1]] = pR;
  1141. opts.padding[opts.d[3]] = pL;
  1142. }
  1143. a_lef[opts.d['left']] = (opts.usePadding) ? opts.padding[opts.d[3]] : 0;
  1144. // scrolling functions
  1145. var _s_wrapper = function() {},
  1146. _a_wrapper = function() {},
  1147. _s_paddingold = function() {},
  1148. _a_paddingold = function() {},
  1149. _s_paddingcur = function() {},
  1150. _a_paddingcur = function() {},
  1151. _onafter = function() {},
  1152. _moveitems = function() {},
  1153. _position = function() {};
  1154. // clone carousel
  1155. switch(sO.fx)
  1156. {
  1157. case 'crossfade':
  1158. case 'cover':
  1159. case 'cover-fade':
  1160. case 'uncover':
  1161. case 'uncover-fade':
  1162. $cf2 = $cfs.clone(true).appendTo($wrp);
  1163. $cf2.children().slice(opts.items.visibleConf.old).remove();
  1164. break;
  1165. }
  1166. switch(sO.fx)
  1167. {
  1168. case 'crossfade':
  1169. case 'cover':
  1170. case 'cover-fade':
  1171. $cfs.css('zIndex', 1);
  1172. $cf2.css('zIndex', 0);
  1173. break;
  1174. }
  1175. // reset all scrolls
  1176. scrl = sc_setScroll(a_dur, sO.easing, conf);
  1177. // animate / set carousel
  1178. a_cfs[opts.d['left']] = -i_siz;
  1179. a_cfs_vis[opts.d['left']] = -i_siz_vis;
  1180. if (pL < 0)
  1181. {
  1182. a_cfs[opts.d['left']] += pL;
  1183. }
  1184. // animate / set wrapper
  1185. if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable')
  1186. {
  1187. _s_wrapper = function() {
  1188. $wrp.css(w_siz);
  1189. };
  1190. _a_wrapper = function() {
  1191. scrl.anims.push([$wrp, w_siz]);
  1192. };
  1193. }
  1194. // animate / set items
  1195. if (opts.usePadding)
  1196. {
  1197. var i_new_l_m = i_new_l.data('_cfs_origCssMargin');
  1198. if (pR >= 0)
  1199. {
  1200. i_new_l_m += opts.padding[opts.d[1]];
  1201. }
  1202. i_new_l.css(opts.d['marginRight'], i_new_l_m);
  1203. if (i_cur_l.not(i_old_l).length)
  1204. {
  1205. a_old[opts.d['marginRight']] = i_old_l.data('_cfs_origCssMargin');
  1206. }
  1207. _s_paddingold = function() {
  1208. i_old_l.css(a_old);
  1209. };
  1210. _a_paddingold = function() {
  1211. scrl.anims.push([i_old_l, a_old]);
  1212. };
  1213. var i_cur_l_m = i_cur_l.data('_cfs_origCssMargin');
  1214. if (pL > 0)
  1215. {
  1216. i_cur_l_m += opts.padding[opts.d[3]];
  1217. }
  1218. a_cur[opts.d['marginRight']] = i_cur_l_m;
  1219. _s_paddingcur = function() {
  1220. i_cur_l.css(a_cur);
  1221. };
  1222. _a_paddingcur = function() {
  1223. scrl.anims.push([i_cur_l, a_cur]);
  1224. };
  1225. }
  1226. // set position
  1227. _position = function() {
  1228. $cfs.css(a_lef);
  1229. };
  1230. var overFill = opts.items.visible+nI-itms.total;
  1231. // rearrange items
  1232. _moveitems = function() {
  1233. if (overFill > 0)
  1234. {
  1235. $cfs.children().slice(itms.total).remove();
  1236. }
  1237. var l_itm = $cfs.children().slice(0, nI).appendTo($cfs).last();
  1238. if (overFill > 0)
  1239. {
  1240. i_new = gi_getCurrentItems(a_itm, opts);
  1241. }
  1242. sc_showHiddenItems(hiddenitems);
  1243. if (opts.usePadding)
  1244. {
  1245. if (itms.total < opts.items.visible+nI) {
  1246. var i_cur_l = $cfs.children().eq(opts.items.visible-1);
  1247. i_cur_l.css(opts.d['marginRight'], i_cur_l.data('_cfs_origCssMargin') + opts.padding[opts.d[1]]);
  1248. }
  1249. l_itm.css(opts.d['marginRight'], l_itm.data('_cfs_origCssMargin'));
  1250. }
  1251. };
  1252. var cb_arguments = sc_mapCallbackArguments(i_old, i_skp, i_new, nI, 'next', a_dur, w_siz);
  1253. // fire onAfter callbacks
  1254. _onafter = function() {
  1255. $cfs.css('zIndex', $cfs.data('_cfs_origCssZindex'));
  1256. sc_afterScroll($cfs, $cf2, sO);
  1257. crsl.isScrolling = false;
  1258. clbk.onAfter = sc_fireCallbacks($tt0, sO, 'onAfter', cb_arguments, clbk);
  1259. queu = sc_fireQueue($cfs, queu, conf);
  1260. if (!crsl.isPaused)
  1261. {
  1262. $cfs.trigger(cf_e('play', conf));
  1263. }
  1264. };
  1265. // fire onBefore callbacks
  1266. crsl.isScrolling = true;
  1267. tmrs = sc_clearTimers(tmrs);
  1268. clbk.onBefore = sc_fireCallbacks($tt0, sO, 'onBefore', cb_arguments, clbk);
  1269. switch(sO.fx)
  1270. {
  1271. case 'none':
  1272. $cfs.css(a_cfs);
  1273. _s_wrapper();
  1274. _s_paddingold();
  1275. _s_paddingcur();
  1276. _position();
  1277. _moveitems();
  1278. _onafter();
  1279. break;
  1280. case 'fade':
  1281. scrl.anims.push([$cfs, { 'opacity': 0 }, function() {
  1282. _s_wrapper();
  1283. _s_paddingold();
  1284. _s_paddingcur();
  1285. _position();
  1286. _moveitems();
  1287. scrl = sc_setScroll(a_dur, sO.easing, conf);
  1288. scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
  1289. sc_startScroll(scrl, conf);
  1290. }]);
  1291. break;
  1292. case 'crossfade':
  1293. $cfs.css({ 'opacity': 0 });
  1294. scrl.anims.push([$cf2, { 'opacity': 0 }]);
  1295. scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
  1296. _a_wrapper();
  1297. _s_paddingold();
  1298. _s_paddingcur();
  1299. _position();
  1300. _moveitems();
  1301. break;
  1302. case 'cover':
  1303. $cfs.css(opts.d['left'], $wrp[opts.d['width']]());
  1304. scrl.anims.push([$cfs, a_lef, _onafter]);
  1305. _a_wrapper();
  1306. _s_paddingold();
  1307. _s_paddingcur();
  1308. _moveitems();
  1309. break;
  1310. case 'cover-fade':
  1311. $cfs.css(opts.d['left'], $wrp[opts.d['width']]());
  1312. scrl.anims.push([$cf2, { 'opacity': 0 }]);
  1313. scrl.anims.push([$cfs, a_lef, _onafter]);
  1314. _a_wrapper();
  1315. _s_paddingold();
  1316. _s_paddingcur();
  1317. _moveitems();
  1318. break;
  1319. case 'uncover':
  1320. scrl.anims.push([$cf2, a_cfs_vis, _onafter]);
  1321. _a_wrapper();
  1322. _s_paddingold();
  1323. _s_paddingcur();
  1324. _position();
  1325. _moveitems();
  1326. break;
  1327. case 'uncover-fade':
  1328. $cfs.css({ 'opacity': 0 });
  1329. scrl.anims.push([$cfs, { 'opacity': 1 }]);
  1330. scrl.anims.push([$cf2, a_cfs_vis, _onafter]);
  1331. _a_wrapper();
  1332. _s_paddingold();
  1333. _s_paddingcur();
  1334. _position();
  1335. _moveitems();
  1336. break;
  1337. default:
  1338. scrl.anims.push([$cfs, a_cfs, function() {
  1339. _position();
  1340. _moveitems();
  1341. _onafter();
  1342. }]);
  1343. _a_wrapper();
  1344. _a_paddingold();
  1345. _a_paddingcur();
  1346. break;
  1347. }
  1348. sc_startScroll(scrl, conf);
  1349. cf_setCookie(opts.cookie, $cfs, conf);
  1350. $cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]);
  1351. return true;
  1352. });
  1353. // slideTo event
  1354. $cfs.bind(cf_e('slideTo', conf), function(e, num, dev, org, obj, dir, clb) {
  1355. e.stopPropagation();
  1356. var v = [num, dev, org, obj, dir, clb],
  1357. t = ['string/number/object', 'number', 'boolean', 'object', 'string', 'function'],
  1358. a = cf_sortParams(v, t);
  1359. obj = a[3];
  1360. dir = a[4];
  1361. clb = a[5];
  1362. num = gn_getItemIndex(a[0], a[1], a[2], itms, $cfs);
  1363. if (num == 0)
  1364. {
  1365. return false;
  1366. }
  1367. if (!is_object(obj))
  1368. {
  1369. obj = false;
  1370. }
  1371. if (dir != 'prev' && dir != 'next')
  1372. {
  1373. if (opts.circular)
  1374. {
  1375. dir = (num <= itms.total / 2) ? 'next' : 'prev';
  1376. }
  1377. else
  1378. {
  1379. dir = (itms.first == 0 || itms.first > num) ? 'next' : 'prev';
  1380. }
  1381. }
  1382. if (dir == 'prev')
  1383. {
  1384. num = itms.total-num;
  1385. }
  1386. $cfs.trigger(cf_e(dir, conf), [obj, num, clb]);
  1387. return true;
  1388. });
  1389. // prevPage event
  1390. $cfs.bind(cf_e('prevPage', conf), function(e, obj, clb) {
  1391. e.stopPropagation();
  1392. var cur = $cfs.triggerHandler(cf_e('currentPage', conf));
  1393. return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur-1, obj, 'prev', clb]);
  1394. });
  1395. // nextPage event
  1396. $cfs.bind(cf_e('nextPage', conf), function(e, obj, clb) {
  1397. e.stopPropagation();
  1398. var cur = $cfs.triggerHandler(cf_e('currentPage', conf));
  1399. return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur+1, obj, 'next', clb]);
  1400. });
  1401. // slideToPage event
  1402. $cfs.bind(cf_e('slideToPage', conf), function(e, pag, obj, dir, clb) {
  1403. e.stopPropagation();
  1404. if (!is_number(pag))
  1405. {
  1406. pag = $cfs.triggerHandler(cf_e('currentPage', conf));
  1407. }
  1408. var ipp = opts.pagination.items || opts.items.visible,
  1409. max = Math.ceil(itms.total / ipp)-1;
  1410. if (pag < 0)
  1411. {
  1412. pag = max;
  1413. }
  1414. if (pag > max)
  1415. {
  1416. pag = 0;
  1417. }
  1418. return $cfs.triggerHandler(cf_e('slideTo', conf), [pag*ipp, 0, true, obj, dir, clb]);
  1419. });
  1420. // jumpToStart event
  1421. $cfs.bind(cf_e('jumpToStart', conf), function(e, s) {
  1422. e.stopPropagation();
  1423. if (s)
  1424. {
  1425. s = gn_getItemIndex(s, 0, true, itms, $cfs);
  1426. }
  1427. else
  1428. {
  1429. s = 0;
  1430. }
  1431. s += itms.first;
  1432. if (s != 0)
  1433. {
  1434. if (itms.total > 0)
  1435. {
  1436. while (s > itms.total)
  1437. {
  1438. s -= itms.total;
  1439. }
  1440. }
  1441. $cfs.prepend($cfs.children().slice(s, itms.total));
  1442. }
  1443. return true;
  1444. });
  1445. // synchronise event
  1446. $cfs.bind(cf_e('synchronise', conf), function(e, s) {
  1447. e.stopPropagation();
  1448. if (s)
  1449. {
  1450. s = cf_getSynchArr(s);
  1451. }
  1452. else if (opts.synchronise)
  1453. {
  1454. s = opts.synchronise;
  1455. }
  1456. else
  1457. {
  1458. return debug(conf, 'No carousel to synchronise.');
  1459. }
  1460. var n = $cfs.triggerHandler(cf_e('currentPosition', conf)),
  1461. x = true;
  1462. for (var j = 0, l = s.length; j < l; j++)
  1463. {
  1464. if (!s[j][0].triggerHandler(cf_e('slideTo', conf), [n, s[j][3], true]))
  1465. {
  1466. x = false;
  1467. }
  1468. }
  1469. return x;
  1470. });
  1471. // queue event
  1472. $cfs.bind(cf_e('queue', conf), function(e, dir, opt) {
  1473. e.stopPropagation();
  1474. if (is_function(dir))
  1475. {
  1476. dir.call($tt0, queu);
  1477. }
  1478. else if (is_array(dir))
  1479. {
  1480. queu = dir;
  1481. }
  1482. else if (!is_undefined(dir))
  1483. {
  1484. queu.push([dir, opt]);
  1485. }
  1486. return queu;
  1487. });
  1488. // insertItem event
  1489. $cfs.bind(cf_e('insertItem', conf), function(e, itm, num, org, dev) {
  1490. e.stopPropagation();
  1491. var v = [itm, num, org, dev],
  1492. t = ['string/object', 'string/number/object', 'boolean', 'number'],
  1493. a = cf_sortParams(v, t);
  1494. itm = a[0];
  1495. num = a[1];
  1496. org = a[2];
  1497. dev = a[3];
  1498. if (is_object(itm) && !is_jquery(itm))
  1499. {
  1500. itm = $(itm);
  1501. }
  1502. else if (is_string(itm))
  1503. {
  1504. itm = $(itm);
  1505. }
  1506. if (!is_jquery(itm) || itm.length == 0)
  1507. {
  1508. return debug(conf, 'Not a valid object.');
  1509. }
  1510. if (is_undefined(num))
  1511. {
  1512. num = 'end';
  1513. }
  1514. sz_storeMargin(itm, opts);
  1515. sz_storeOrigCss(itm);
  1516. var orgNum = num,
  1517. before = 'before';
  1518. if (num == 'end')
  1519. {
  1520. if (org)
  1521. {
  1522. if (itms.first == 0)
  1523. {
  1524. num = itms.total-1;
  1525. before = 'after';
  1526. }
  1527. else
  1528. {
  1529. num = itms.first;
  1530. itms.first += itm.length;
  1531. }
  1532. if (num < 0)
  1533. {
  1534. num = 0;
  1535. }
  1536. }
  1537. else
  1538. {
  1539. num = itms.total-1;
  1540. before = 'after';
  1541. }
  1542. }
  1543. else
  1544. {
  1545. num = gn_getItemIndex(num, dev, org, itms, $cfs);
  1546. }
  1547. var $cit = $cfs.children().eq(num);
  1548. if ($cit.length)
  1549. {
  1550. $cit[before](itm);
  1551. }
  1552. else
  1553. {
  1554. debug(conf, 'Correct insert-position not found! Appending item to the end.');
  1555. $cfs.append(itm);
  1556. }
  1557. if (orgNum != 'end' && !org)
  1558. {
  1559. if (num < itms.first)
  1560. {
  1561. itms.first += itm.length;
  1562. }
  1563. }
  1564. itms.total = $cfs.children().length;
  1565. if (itms.first >= itms.total)
  1566. {
  1567. itms.first -= itms.total;
  1568. }
  1569. $cfs.trigger(cf_e('updateSizes', conf));
  1570. $cfs.trigger(cf_e('linkAnchors', conf));
  1571. return true;
  1572. });
  1573. // removeItem event
  1574. $cfs.bind(cf_e('removeItem', conf), function(e, num, org, dev) {
  1575. e.stopPropagation();
  1576. var v = [num, org, dev],
  1577. t = ['string/number/object', 'boolean', 'number'],
  1578. a = cf_sortParams(v, t);
  1579. num = a[0];
  1580. org = a[1];
  1581. dev = a[2];
  1582. var removed = false;
  1583. if (num instanceof $ && num.length > 1)
  1584. {
  1585. $removed = $();
  1586. num.each(function(i, el) {
  1587. var $rem = $cfs.trigger(cf_e('removeItem', conf), [$(this), org, dev]);
  1588. if ( $rem )
  1589. {
  1590. $removed = $removed.add($rem);
  1591. }
  1592. });
  1593. return $removed;
  1594. }
  1595. if (is_undefined(num) || num == 'end')
  1596. {
  1597. $removed = $cfs.children().last();
  1598. }
  1599. else
  1600. {
  1601. num = gn_getItemIndex(num, dev, org, itms, $cfs);
  1602. var $removed = $cfs.children().eq(num);
  1603. if ( $removed.length )
  1604. {
  1605. if (num < itms.first)
  1606. {
  1607. itms.first -= $removed.length;
  1608. }
  1609. }
  1610. }
  1611. if ( $removed && $removed.length )
  1612. {
  1613. $removed.detach();
  1614. itms.total = $cfs.children().length;
  1615. $cfs.trigger(cf_e('updateSizes', conf));
  1616. }
  1617. return $removed;
  1618. });
  1619. // onBefore and onAfter event
  1620. $cfs.bind(cf_e('onBefore', conf)+' '+cf_e('onAfter', conf), function(e, fn) {
  1621. e.stopPropagation();
  1622. var eType = e.type.slice(conf.events.prefix.length);
  1623. if (is_array(fn))
  1624. {
  1625. clbk[eType] = fn;
  1626. }
  1627. if (is_function(fn))
  1628. {
  1629. clbk[eType].push(fn);
  1630. }
  1631. return clbk[eType];
  1632. });
  1633. // currentPosition event
  1634. $cfs.bind(cf_e('currentPosition', conf), function(e, fn) {
  1635. e.stopPropagation();
  1636. if (itms.first == 0)
  1637. {
  1638. var val = 0;
  1639. }
  1640. else
  1641. {
  1642. var val = itms.total - itms.first;
  1643. }
  1644. if (is_function(fn))
  1645. {
  1646. fn.call($tt0, val);
  1647. }
  1648. return val;
  1649. });
  1650. // currentPage event
  1651. $cfs.bind(cf_e('currentPage', conf), function(e, fn) {
  1652. e.stopPropagation();
  1653. var ipp = opts.pagination.items || opts.items.visible,
  1654. max = Math.ceil(itms.total/ipp-1),
  1655. nr;
  1656. if (itms.first == 0)
  1657. {
  1658. nr = 0;
  1659. }
  1660. else if (itms.first < itms.total % ipp)
  1661. {
  1662. nr = 0;
  1663. }
  1664. else if (itms.first == ipp && !opts.circular)
  1665. {
  1666. nr = max;
  1667. }
  1668. else
  1669. {
  1670. nr = Math.round((itms.total-itms.first)/ipp);
  1671. }
  1672. if (nr < 0)
  1673. {
  1674. nr = 0;
  1675. }
  1676. if (nr > max)
  1677. {
  1678. nr = max;
  1679. }
  1680. if (is_function(fn))
  1681. {
  1682. fn.call($tt0, nr);
  1683. }
  1684. return nr;
  1685. });
  1686. // currentVisible event
  1687. $cfs.bind(cf_e('currentVisible', conf), function(e, fn) {
  1688. e.stopPropagation();
  1689. var $i = gi_getCurrentItems($cfs.children(), opts);
  1690. if (is_function(fn))
  1691. {
  1692. fn.call($tt0, $i);
  1693. }
  1694. return $i;
  1695. });
  1696. // slice event
  1697. $cfs.bind(cf_e('slice', conf), function(e, f, l, fn) {
  1698. e.stopPropagation();
  1699. if (itms.total == 0)
  1700. {
  1701. return false;
  1702. }
  1703. var v = [f, l, fn],
  1704. t = ['number', 'number', 'function'],
  1705. a = cf_sortParams(v, t);
  1706. f = (is_number(a[0])) ? a[0] : 0;
  1707. l = (is_number(a[1])) ? a[1] : itms.total;
  1708. fn = a[2];
  1709. f += itms.first;
  1710. l += itms.first;
  1711. if (items.total > 0)
  1712. {
  1713. while (f > itms.total)
  1714. {
  1715. f -= itms.total;
  1716. }
  1717. while (l > itms.total)
  1718. {
  1719. l -= itms.total;
  1720. }
  1721. while (f < 0)
  1722. {
  1723. f += itms.total;
  1724. }
  1725. while (l < 0)
  1726. {
  1727. l += itms.total;
  1728. }
  1729. }
  1730. var $iA = $cfs.children(),
  1731. $i;
  1732. if (l > f)
  1733. {
  1734. $i = $iA.slice(f, l);
  1735. }
  1736. else
  1737. {
  1738. $i = $( $iA.slice(f, itms.total).get().concat( $iA.slice(0, l).get() ) );
  1739. }
  1740. if (is_function(fn))
  1741. {
  1742. fn.call($tt0, $i);
  1743. }
  1744. return $i;
  1745. });
  1746. // isPaused, isStopped and isScrolling events
  1747. $cfs.bind(cf_e('isPaused', conf)+' '+cf_e('isStopped', conf)+' '+cf_e('isScrolling', conf), function(e, fn) {
  1748. e.stopPropagation();
  1749. var eType = e.type.slice(conf.events.prefix.length),
  1750. value = crsl[eType];
  1751. if (is_function(fn))
  1752. {
  1753. fn.call($tt0, value);
  1754. }
  1755. return value;
  1756. });
  1757. // configuration event
  1758. $cfs.bind(cf_e('configuration', conf), function(e, a, b, c) {
  1759. e.stopPropagation();
  1760. var reInit = false;
  1761. // return entire configuration-object
  1762. if (is_function(a))
  1763. {
  1764. a.call($tt0, opts);
  1765. }
  1766. // set multiple options via object
  1767. else if (is_object(a))
  1768. {
  1769. opts_orig = $.extend(true, {}, opts_orig, a);
  1770. if (b !== false) reInit = true;
  1771. else opts = $.extend(true, {}, opts, a);
  1772. }
  1773. else if (!is_undefined(a))
  1774. {
  1775. // callback function for specific option
  1776. if (is_function(b))
  1777. {
  1778. var val = eval('opts.'+a);
  1779. if (is_undefined(val))
  1780. {
  1781. val = '';
  1782. }
  1783. b.call($tt0, val);
  1784. }
  1785. // set individual option
  1786. else if (!is_undefined(b))
  1787. {
  1788. if (typeof c !== 'boolean') c = true;
  1789. eval('opts_orig.'+a+' = b');
  1790. if (c !== false) reInit = true;
  1791. else eval('opts.'+a+' = b');
  1792. }
  1793. // return value for specific option
  1794. else
  1795. {
  1796. return eval('opts.'+a);
  1797. }
  1798. }
  1799. if (reInit)
  1800. {
  1801. sz_resetMargin($cfs.children(), opts);
  1802. FN._init(opts_orig);
  1803. FN._bind_buttons();
  1804. var sz = sz_setSizes($cfs, opts);
  1805. $cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]);
  1806. }
  1807. return opts;
  1808. });
  1809. // linkAnchors event
  1810. $cfs.bind(cf_e('linkAnchors', conf), function(e, $con, sel) {
  1811. e.stopPropagation();
  1812. if (is_undefined($con))
  1813. {
  1814. $con = $('body');
  1815. }
  1816. else if (is_string($con))
  1817. {
  1818. $con = $($con);
  1819. }
  1820. if (!is_jquery($con) || $con.length == 0)
  1821. {
  1822. return debug(conf, 'Not a valid object.');
  1823. }
  1824. if (!is_string(sel))
  1825. {
  1826. sel = 'a.caroufredsel';
  1827. }
  1828. $con.find(sel).each(function() {
  1829. var h = this.hash || '';
  1830. if (h.length > 0 && $cfs.children().index($(h)) != -1)
  1831. {
  1832. $(this).unbind('click').click(function(e) {
  1833. e.preventDefault();
  1834. $cfs.trigger(cf_e('slideTo', conf), h);
  1835. });
  1836. }
  1837. });
  1838. return true;
  1839. });
  1840. // updatePageStatus event
  1841. $cfs.bind(cf_e('updatePageStatus', conf), function(e, build, sizes) {
  1842. e.stopPropagation();
  1843. if (!opts.pagination.container)
  1844. {
  1845. return;
  1846. }
  1847. var ipp = opts.pagination.items || opts.items.visible,
  1848. pgs = Math.ceil(itms.total/ipp);
  1849. if (build)
  1850. {
  1851. if (opts.pagination.anchorBuilder)
  1852. {
  1853. opts.pagination.container.children().remove();
  1854. opts.pagination.container.each(function() {
  1855. for (var a = 0; a < pgs; a++)
  1856. {
  1857. var i = $cfs.children().eq( gn_getItemIndex(a*ipp, 0, true, itms, $cfs) );
  1858. $(this).append(opts.pagination.anchorBuilder.call(i[0], a+1));
  1859. }
  1860. });
  1861. }
  1862. opts.pagination.container.each(function() {
  1863. $(this).children().unbind(opts.pagination.event).each(function(a) {
  1864. $(this).bind(opts.pagination.event, function(e) {
  1865. e.preventDefault();
  1866. $cfs.trigger(cf_e('slideTo', conf), [a*ipp, -opts.pagination.deviation, true, opts.pagination]);
  1867. });
  1868. });
  1869. });
  1870. }
  1871. var selected = $cfs.triggerHandler(cf_e('currentPage', conf)) + opts.pagination.deviation;
  1872. if (selected >= pgs)
  1873. {
  1874. selected = 0;
  1875. }
  1876. if (selected < 0)
  1877. {
  1878. selected = pgs-1;
  1879. }
  1880. opts.pagination.container.each(function() {
  1881. $(this).children().removeClass(cf_c('selected', conf)).eq(selected).addClass(cf_c('selected', conf));
  1882. });
  1883. return true;
  1884. });
  1885. // updateSizes event
  1886. $cfs.bind(cf_e('updateSizes', conf), function(e) {
  1887. var vI = opts.items.visible,
  1888. a_itm = $cfs.children(),
  1889. avail_primary = ms_getParentSize($wrp, opts, 'width');
  1890. itms.total = a_itm.length;
  1891. if (crsl.primarySizePercentage)
  1892. {
  1893. opts.maxDimension = avail_primary;
  1894. opts[opts.d['width']] = ms_getPercentage(avail_primary, crsl.primarySizePercentage);
  1895. }
  1896. else
  1897. {
  1898. opts.maxDimension = ms_getMaxDimension(opts, avail_primary);
  1899. }
  1900. if (opts.responsive)
  1901. {
  1902. opts.items.width = opts.items.sizesConf.width;
  1903. opts.items.height = opts.items.sizesConf.height;
  1904. opts = in_getResponsiveValues(opts, a_itm, avail_primary);
  1905. vI = opts.items.visible;
  1906. sz_setResponsiveSizes(opts, a_itm);
  1907. }
  1908. else if (opts.items.visibleConf.variable)
  1909. {
  1910. vI = gn_getVisibleItemsNext(a_itm, opts, 0);
  1911. }
  1912. else if (opts.items.filter != '*')
  1913. {
  1914. vI = gn_getVisibleItemsNextFilter(a_itm, opts, 0);
  1915. }
  1916. if (!opts.circular && itms.first != 0 && vI > itms.first) {
  1917. if (opts.items.visibleConf.variable)
  1918. {
  1919. var nI = gn_getVisibleItemsPrev(a_itm, opts, itms.first) - itms.first;
  1920. }
  1921. else if (opts.items.filter != '*')
  1922. {
  1923. var nI = gn_getVisibleItemsPrevFilter(a_itm, opts, itms.first) - itms.first;
  1924. }
  1925. else
  1926. {
  1927. var nI = opts.items.visible - itms.first;
  1928. }
  1929. debug(conf, 'Preventing non-circular: sliding '+nI+' items backward.');
  1930. $cfs.trigger(cf_e('prev', conf), nI);
  1931. }
  1932. opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
  1933. opts.items.visibleConf.old = opts.items.visible;
  1934. opts = in_getAlignPadding(opts, a_itm);
  1935. var sz = sz_setSizes($cfs, opts);
  1936. $cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]);
  1937. nv_showNavi(opts, itms.total, conf);
  1938. nv_enableNavi(opts, itms.first, conf);
  1939. return sz;
  1940. });
  1941. // destroy event
  1942. $cfs.bind(cf_e('destroy', conf), function(e, orgOrder) {
  1943. e.stopPropagation();
  1944. tmrs = sc_clearTimers(tmrs);
  1945. $cfs.data('_cfs_isCarousel', false);
  1946. $cfs.trigger(cf_e('finish', conf));
  1947. if (orgOrder)
  1948. {
  1949. $cfs.trigger(cf_e('jumpToStart', conf));
  1950. }
  1951. sz_restoreOrigCss($cfs.children());
  1952. sz_restoreOrigCss($cfs);
  1953. FN._unbind_events();
  1954. FN._unbind_buttons();
  1955. if (conf.wrapper == 'parent')
  1956. {
  1957. sz_restoreOrigCss($wrp);
  1958. }
  1959. else
  1960. {
  1961. $wrp.replaceWith($cfs);
  1962. }
  1963. return true;
  1964. });
  1965. // debug event
  1966. $cfs.bind(cf_e('debug', conf), function(e) {
  1967. debug(conf, 'Carousel width: ' + opts.width);
  1968. debug(conf, 'Carousel height: ' + opts.height);
  1969. debug(conf, 'Item widths: ' + opts.items.width);
  1970. debug(conf, 'Item heights: ' + opts.items.height);
  1971. debug(conf, 'Number of items visible: ' + opts.items.visible);
  1972. if (opts.auto.play)
  1973. {
  1974. debug(conf, 'Number of items scrolled automatically: ' + opts.auto.items);
  1975. }
  1976. if (opts.prev.button)
  1977. {
  1978. debug(conf, 'Number of items scrolled backward: ' + opts.prev.items);
  1979. }
  1980. if (opts.next.button)
  1981. {
  1982. debug(conf, 'Number of items scrolled forward: ' + opts.next.items);
  1983. }
  1984. return conf.debug;
  1985. });
  1986. // triggerEvent, making prefixed and namespaced events accessible from outside
  1987. $cfs.bind('_cfs_triggerEvent', function(e, n, o) {
  1988. e.stopPropagation();
  1989. return $cfs.triggerHandler(cf_e(n, conf), o);
  1990. });
  1991. }; // /bind_events
  1992. FN._unbind_events = function() {
  1993. $cfs.unbind(cf_e('', conf));
  1994. $cfs.unbind(cf_e('', conf, false));
  1995. $cfs.unbind('_cfs_triggerEvent');
  1996. }; // /unbind_events
  1997. FN._bind_buttons = function() {
  1998. FN._unbind_buttons();
  1999. nv_showNavi(opts, itms.total, conf);
  2000. nv_enableNavi(opts, itms.first, conf);
  2001. if (opts.auto.pauseOnHover)
  2002. {
  2003. var pC = bt_pauseOnHoverConfig(opts.auto.pauseOnHover);
  2004. $wrp.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
  2005. .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
  2006. }
  2007. // play button
  2008. if (opts.auto.button)
  2009. {
  2010. opts.auto.button.bind(cf_e(opts.auto.event, conf, false), function(e) {
  2011. e.preventDefault();
  2012. var ev = false,
  2013. pC = null;
  2014. if (crsl.isPaused)
  2015. {
  2016. ev = 'play';
  2017. }
  2018. else if (opts.auto.pauseOnEvent)
  2019. {
  2020. ev = 'pause';
  2021. pC = bt_pauseOnHoverConfig(opts.auto.pauseOnEvent);
  2022. }
  2023. if (ev)
  2024. {
  2025. $cfs.trigger(cf_e(ev, conf), pC);
  2026. }
  2027. });
  2028. }
  2029. // prev button
  2030. if (opts.prev.button)
  2031. {
  2032. opts.prev.button.bind(cf_e(opts.prev.event, conf, false), function(e) {
  2033. e.preventDefault();
  2034. $cfs.trigger(cf_e('prev', conf));
  2035. });
  2036. if (opts.prev.pauseOnHover)
  2037. {
  2038. var pC = bt_pauseOnHoverConfig(opts.prev.pauseOnHover);
  2039. opts.prev.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
  2040. .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
  2041. }
  2042. }
  2043. // next butotn
  2044. if (opts.next.button)
  2045. {
  2046. opts.next.button.bind(cf_e(opts.next.event, conf, false), function(e) {
  2047. e.preventDefault();
  2048. $cfs.trigger(cf_e('next', conf));
  2049. });
  2050. if (opts.next.pauseOnHover)
  2051. {
  2052. var pC = bt_pauseOnHoverConfig(opts.next.pauseOnHover);
  2053. opts.next.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
  2054. .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
  2055. }
  2056. }
  2057. // pagination
  2058. if (opts.pagination.container)
  2059. {
  2060. if (opts.pagination.pauseOnHover)
  2061. {
  2062. var pC = bt_pauseOnHoverConfig(opts.pagination.pauseOnHover);
  2063. opts.pagination.container.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
  2064. .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
  2065. }
  2066. }
  2067. // prev/next keys
  2068. if (opts.prev.key || opts.next.key)
  2069. {
  2070. $(document).bind(cf_e('keyup', conf, false, true, true), function(e) {
  2071. var k = e.keyCode;
  2072. if (k == opts.next.key)
  2073. {
  2074. e.preventDefault();
  2075. $cfs.trigger(cf_e('next', conf));
  2076. }
  2077. if (k == opts.prev.key)
  2078. {
  2079. e.preventDefault();
  2080. $cfs.trigger(cf_e('prev', conf));
  2081. }
  2082. });
  2083. }
  2084. // pagination keys
  2085. if (opts.pagination.keys)
  2086. {
  2087. $(document).bind(cf_e('keyup', conf, false, true, true), function(e) {
  2088. var k = e.keyCode;
  2089. if (k >= 49 && k < 58)
  2090. {
  2091. k = (k-49) * opts.items.visible;
  2092. if (k <= itms.total)
  2093. {
  2094. e.preventDefault();
  2095. $cfs.trigger(cf_e('slideTo', conf), [k, 0, true, opts.pagination]);
  2096. }
  2097. }
  2098. });
  2099. }
  2100. // swipe
  2101. if ($.fn.swipe)
  2102. {
  2103. var isTouch = 'ontouchstart' in window;
  2104. if ((isTouch && opts.swipe.onTouch) || (!isTouch && opts.swipe.onMouse))
  2105. {
  2106. var scP = $.extend(true, {}, opts.prev, opts.swipe),
  2107. scN = $.extend(true, {}, opts.next, opts.swipe),
  2108. swP = function() { $cfs.trigger(cf_e('prev', conf), [scP]) },
  2109. swN = function() { $cfs.trigger(cf_e('next', conf), [scN]) };
  2110. switch (opts.direction)
  2111. {
  2112. case 'up':
  2113. case 'down':
  2114. opts.swipe.options.swipeUp = swN;
  2115. opts.swipe.options.swipeDown = swP;
  2116. break;
  2117. default:
  2118. opts.swipe.options.swipeLeft = swN;
  2119. opts.swipe.options.swipeRight = swP;
  2120. }
  2121. if (crsl.swipe)
  2122. {
  2123. $cfs.swipe('destroy');
  2124. }
  2125. $wrp.swipe(opts.swipe.options);
  2126. $wrp.css('cursor', 'move');
  2127. crsl.swipe = true;
  2128. }
  2129. }
  2130. // mousewheel
  2131. if ($.fn.mousewheel)
  2132. {
  2133. if (opts.mousewheel)
  2134. {
  2135. var mcP = $.extend(true, {}, opts.prev, opts.mousewheel),
  2136. mcN = $.extend(true, {}, opts.next, opts.mousewheel);
  2137. if (crsl.mousewheel)
  2138. {
  2139. $wrp.unbind(cf_e('mousewheel', conf, false));
  2140. }
  2141. $wrp.bind(cf_e('mousewheel', conf, false), function(e, delta) {
  2142. e.preventDefault();
  2143. if (delta > 0)
  2144. {
  2145. $cfs.trigger(cf_e('prev', conf), [mcP]);
  2146. }
  2147. else
  2148. {
  2149. $cfs.trigger(cf_e('next', conf), [mcN]);
  2150. }
  2151. });
  2152. crsl.mousewheel = true;
  2153. }
  2154. }
  2155. if (opts.auto.play)
  2156. {
  2157. $cfs.trigger(cf_e('play', conf), opts.auto.delay);
  2158. }
  2159. if (crsl.upDateOnWindowResize)
  2160. {
  2161. var resizeFn = function(e) {
  2162. $cfs.trigger(cf_e('finish', conf));
  2163. if (opts.auto.pauseOnResize && !crsl.isPaused)
  2164. {
  2165. $cfs.trigger(cf_e('play', conf));
  2166. }
  2167. sz_resetMargin($cfs.children(), opts);
  2168. $cfs.trigger(cf_e('updateSizes', conf));
  2169. };
  2170. var $w = $(window),
  2171. onResize = null;
  2172. if ($.debounce && conf.onWindowResize == 'debounce')
  2173. {
  2174. onResize = $.debounce(200, resizeFn);
  2175. }
  2176. else if ($.throttle && conf.onWindowResize == 'throttle')
  2177. {
  2178. onResize = $.throttle(300, resizeFn);
  2179. }
  2180. else
  2181. {
  2182. var _windowWidth = 0,
  2183. _windowHeight = 0;
  2184. onResize = function() {
  2185. var nw = $w.width(),
  2186. nh = $w.height();
  2187. if (nw != _windowWidth || nh != _windowHeight)
  2188. {
  2189. resizeFn();
  2190. _windowWidth = nw;
  2191. _windowHeight = nh;
  2192. }
  2193. };
  2194. }
  2195. $w.bind(cf_e('resize', conf, false, true, true), onResize);
  2196. }
  2197. }; // /bind_buttons
  2198. FN._unbind_buttons = function() {
  2199. var ns1 = cf_e('', conf),
  2200. ns2 = cf_e('', conf, false);
  2201. ns3 = cf_e('', conf, false, true, true);
  2202. $(document).unbind(ns3);
  2203. $(window).unbind(ns3);
  2204. $wrp.unbind(ns2);
  2205. if (opts.auto.button)
  2206. {
  2207. opts.auto.button.unbind(ns2);
  2208. }
  2209. if (opts.prev.button)
  2210. {
  2211. opts.prev.button.unbind(ns2);
  2212. }
  2213. if (opts.next.button)
  2214. {
  2215. opts.next.button.unbind(ns2);
  2216. }
  2217. if (opts.pagination.container)
  2218. {
  2219. opts.pagination.container.unbind(ns2);
  2220. if (opts.pagination.anchorBuilder)
  2221. {
  2222. opts.pagination.container.children().remove();
  2223. }
  2224. }
  2225. if (crsl.swipe)
  2226. {
  2227. $cfs.swipe('destroy');
  2228. $wrp.css('cursor', 'default');
  2229. crsl.swipe = false;
  2230. }
  2231. if (crsl.mousewheel)
  2232. {
  2233. crsl.mousewheel = false;
  2234. }
  2235. nv_showNavi(opts, 'hide', conf);
  2236. nv_enableNavi(opts, 'removeClass', conf);
  2237. }; // /unbind_buttons
  2238. // START
  2239. if (is_boolean(configs))
  2240. {
  2241. configs = {
  2242. 'debug': configs
  2243. };
  2244. }
  2245. // set vars
  2246. var crsl = {
  2247. 'direction' : 'next',
  2248. 'isPaused' : true,
  2249. 'isScrolling' : false,
  2250. 'isStopped' : false,
  2251. 'mousewheel' : false,
  2252. 'swipe' : false
  2253. },
  2254. itms = {
  2255. 'total' : $cfs.children().length,
  2256. 'first' : 0
  2257. },
  2258. tmrs = {
  2259. 'auto' : null,
  2260. 'progress' : null,
  2261. 'startTime' : getTime(),
  2262. 'timePassed' : 0
  2263. },
  2264. scrl = {
  2265. 'isStopped' : false,
  2266. 'duration' : 0,
  2267. 'startTime' : 0,
  2268. 'easing' : '',
  2269. 'anims' : []
  2270. },
  2271. clbk = {
  2272. 'onBefore' : [],
  2273. 'onAfter' : []
  2274. },
  2275. queu = [],
  2276. conf = $.extend(true, {}, $.fn.carouFredSel.configs, configs),
  2277. opts = {},
  2278. opts_orig = $.extend(true, {}, options),
  2279. $wrp = (conf.wrapper == 'parent')
  2280. ? $cfs.parent()
  2281. : $cfs.wrap('<'+conf.wrapper.element+' class="'+conf.wrapper.classname+'" />').parent();
  2282. conf.selector = $cfs.selector;
  2283. conf.serialNumber = $.fn.carouFredSel.serialNumber++;
  2284. conf.transition = (conf.transition && $.fn.transition) ? 'transition' : 'animate';
  2285. // create carousel
  2286. FN._init(opts_orig, true, starting_position);
  2287. FN._build();
  2288. FN._bind_events();
  2289. FN._bind_buttons();
  2290. // find item to start
  2291. if (is_array(opts.items.start))
  2292. {
  2293. var start_arr = opts.items.start;
  2294. }
  2295. else
  2296. {
  2297. var start_arr = [];
  2298. if (opts.items.start != 0)
  2299. {
  2300. start_arr.push(opts.items.start);
  2301. }
  2302. }
  2303. if (opts.cookie)
  2304. {
  2305. start_arr.unshift(parseInt(cf_getCookie(opts.cookie), 10));
  2306. }
  2307. if (start_arr.length > 0)
  2308. {
  2309. for (var a = 0, l = start_arr.length; a < l; a++)
  2310. {
  2311. var s = start_arr[a];
  2312. if (s == 0)
  2313. {
  2314. continue;
  2315. }
  2316. if (s === true)
  2317. {
  2318. s = window.location.hash;
  2319. if (s.length < 1)
  2320. {
  2321. continue;
  2322. }
  2323. }
  2324. else if (s === 'random')
  2325. {
  2326. s = Math.floor(Math.random()*itms.total);
  2327. }
  2328. if ($cfs.triggerHandler(cf_e('slideTo', conf), [s, 0, true, { fx: 'none' }]))
  2329. {
  2330. break;
  2331. }
  2332. }
  2333. }
  2334. var siz = sz_setSizes($cfs, opts),
  2335. itm = gi_getCurrentItems($cfs.children(), opts);
  2336. if (opts.onCreate)
  2337. {
  2338. opts.onCreate.call($tt0, {
  2339. 'width': siz.width,
  2340. 'height': siz.height,
  2341. 'items': itm
  2342. });
  2343. }
  2344. $cfs.trigger(cf_e('updatePageStatus', conf), [true, siz]);
  2345. $cfs.trigger(cf_e('linkAnchors', conf));
  2346. if (conf.debug)
  2347. {
  2348. $cfs.trigger(cf_e('debug', conf));
  2349. }
  2350. return $cfs;
  2351. };
  2352. // GLOBAL PUBLIC
  2353. $.fn.carouFredSel.serialNumber = 1;
  2354. $.fn.carouFredSel.defaults = {
  2355. 'synchronise' : false,
  2356. 'infinite' : true,
  2357. 'circular' : true,
  2358. 'responsive' : false,
  2359. 'direction' : 'left',
  2360. 'items' : {
  2361. 'start' : 0
  2362. },
  2363. 'scroll' : {
  2364. 'easing' : 'swing',
  2365. 'duration' : 500,
  2366. 'pauseOnHover' : false,
  2367. 'event' : 'click',
  2368. 'queue' : false
  2369. }
  2370. };
  2371. $.fn.carouFredSel.configs = {
  2372. 'debug' : false,
  2373. 'transition' : false,
  2374. 'onWindowResize': 'throttle',
  2375. 'events' : {
  2376. 'prefix' : '',
  2377. 'namespace' : 'cfs'
  2378. },
  2379. 'wrapper' : {
  2380. 'element' : 'div',
  2381. 'classname' : 'caroufredsel_wrapper'
  2382. },
  2383. 'classnames' : {}
  2384. };
  2385. $.fn.carouFredSel.pageAnchorBuilder = function(nr) {
  2386. return '<a href="#"><span>'+nr+'</span></a>';
  2387. };
  2388. $.fn.carouFredSel.progressbarUpdater = function(perc) {
  2389. $(this).css('width', perc+'%');
  2390. };
  2391. $.fn.carouFredSel.cookie = {
  2392. get: function(n) {
  2393. n += '=';
  2394. var ca = document.cookie.split(';');
  2395. for (var a = 0, l = ca.length; a < l; a++)
  2396. {
  2397. var c = ca[a];
  2398. while (c.charAt(0) == ' ')
  2399. {
  2400. c = c.slice(1);
  2401. }
  2402. if (c.indexOf(n) == 0)
  2403. {
  2404. return c.slice(n.length);
  2405. }
  2406. }
  2407. return 0;
  2408. },
  2409. set: function(n, v, d) {
  2410. var e = "";
  2411. if (d)
  2412. {
  2413. var date = new Date();
  2414. date.setTime(date.getTime() + (d * 24 * 60 * 60 * 1000));
  2415. e = "; expires=" + date.toGMTString();
  2416. }
  2417. document.cookie = n + '=' + v + e + '; path=/';
  2418. },
  2419. remove: function(n) {
  2420. $.fn.carouFredSel.cookie.set(n, "", -1);
  2421. }
  2422. };
  2423. // GLOBAL PRIVATE
  2424. // scrolling functions
  2425. function sc_setScroll(d, e, c) {
  2426. if (c.transition == 'transition')
  2427. {
  2428. if (e == 'swing')
  2429. {
  2430. e = 'ease';
  2431. }
  2432. }
  2433. return {
  2434. anims: [],
  2435. duration: d,
  2436. orgDuration: d,
  2437. easing: e,
  2438. startTime: getTime()
  2439. };
  2440. }
  2441. function sc_startScroll(s, c) {
  2442. for (var a = 0, l = s.anims.length; a < l; a++)
  2443. {
  2444. var b = s.anims[a];
  2445. if (!b)
  2446. {
  2447. continue;
  2448. }
  2449. b[0][c.transition](b[1], s.duration, s.easing, b[2]);
  2450. }
  2451. }
  2452. function sc_stopScroll(s, finish) {
  2453. if (!is_boolean(finish))
  2454. {
  2455. finish = true;
  2456. }
  2457. if (is_object(s.pre))
  2458. {
  2459. sc_stopScroll(s.pre, finish);
  2460. }
  2461. for (var a = 0, l = s.anims.length; a < l; a++)
  2462. {
  2463. var b = s.anims[a];
  2464. b[0].stop(true);
  2465. if (finish)
  2466. {
  2467. b[0].css(b[1]);
  2468. if (is_function(b[2]))
  2469. {
  2470. b[2]();
  2471. }
  2472. }
  2473. }
  2474. if (is_object(s.post))
  2475. {
  2476. sc_stopScroll(s.post, finish);
  2477. }
  2478. }
  2479. function sc_afterScroll( $c, $c2, o ) {
  2480. if ($c2)
  2481. {
  2482. $c2.remove();
  2483. }
  2484. switch(o.fx) {
  2485. case 'fade':
  2486. case 'crossfade':
  2487. case 'cover-fade':
  2488. case 'uncover-fade':
  2489. $c.css('opacity', 1);
  2490. $c.css('filter', '');
  2491. break;
  2492. }
  2493. }
  2494. function sc_fireCallbacks($t, o, b, a, c) {
  2495. if (o[b])
  2496. {
  2497. o[b].call($t, a);
  2498. }
  2499. if (c[b].length)
  2500. {
  2501. for (var i = 0, l = c[b].length; i < l; i++)
  2502. {
  2503. c[b][i].call($t, a);
  2504. }
  2505. }
  2506. return [];
  2507. }
  2508. function sc_fireQueue($c, q, c) {
  2509. if (q.length)
  2510. {
  2511. $c.trigger(cf_e(q[0][0], c), q[0][1]);
  2512. q.shift();
  2513. }
  2514. return q;
  2515. }
  2516. function sc_hideHiddenItems(hiddenitems) {
  2517. hiddenitems.each(function() {
  2518. var hi = $(this);
  2519. hi.data('_cfs_isHidden', hi.is(':hidden')).hide();
  2520. });
  2521. }
  2522. function sc_showHiddenItems(hiddenitems) {
  2523. if (hiddenitems)
  2524. {
  2525. hiddenitems.each(function() {
  2526. var hi = $(this);
  2527. if (!hi.data('_cfs_isHidden'))
  2528. {
  2529. hi.show();
  2530. }
  2531. });
  2532. }
  2533. }
  2534. function sc_clearTimers(t) {
  2535. if (t.auto)
  2536. {
  2537. clearTimeout(t.auto);
  2538. }
  2539. if (t.progress)
  2540. {
  2541. clearInterval(t.progress);
  2542. }
  2543. return t;
  2544. }
  2545. function sc_mapCallbackArguments(i_old, i_skp, i_new, s_itm, s_dir, s_dur, w_siz) {
  2546. return {
  2547. 'width': w_siz.width,
  2548. 'height': w_siz.height,
  2549. 'items': {
  2550. 'old': i_old,
  2551. 'skipped': i_skp,
  2552. 'visible': i_new
  2553. },
  2554. 'scroll': {
  2555. 'items': s_itm,
  2556. 'direction': s_dir,
  2557. 'duration': s_dur
  2558. }
  2559. };
  2560. }
  2561. function sc_getDuration( sO, o, nI, siz ) {
  2562. var dur = sO.duration;
  2563. if (sO.fx == 'none')
  2564. {
  2565. return 0;
  2566. }
  2567. if (dur == 'auto')
  2568. {
  2569. dur = o.scroll.duration / o.scroll.items * nI;
  2570. }
  2571. else if (dur < 10)
  2572. {
  2573. dur = siz / dur;
  2574. }
  2575. if (dur < 1)
  2576. {
  2577. return 0;
  2578. }
  2579. if (sO.fx == 'fade')
  2580. {
  2581. dur = dur / 2;
  2582. }
  2583. return Math.round(dur);
  2584. }
  2585. // navigation functions
  2586. function nv_showNavi(o, t, c) {
  2587. var minimum = (is_number(o.items.minimum)) ? o.items.minimum : o.items.visible + 1;
  2588. if (t == 'show' || t == 'hide')
  2589. {
  2590. var f = t;
  2591. }
  2592. else if (minimum > t)
  2593. {
  2594. debug(c, 'Not enough items ('+t+' total, '+minimum+' needed): Hiding navigation.');
  2595. var f = 'hide';
  2596. }
  2597. else
  2598. {
  2599. var f = 'show';
  2600. }
  2601. var s = (f == 'show') ? 'removeClass' : 'addClass',
  2602. h = cf_c('hidden', c);
  2603. if (o.auto.button)
  2604. {
  2605. o.auto.button[f]()[s](h);
  2606. }
  2607. if (o.prev.button)
  2608. {
  2609. o.prev.button[f]()[s](h);
  2610. }
  2611. if (o.next.button)
  2612. {
  2613. o.next.button[f]()[s](h);
  2614. }
  2615. if (o.pagination.container)
  2616. {
  2617. o.pagination.container[f]()[s](h);
  2618. }
  2619. }
  2620. function nv_enableNavi(o, f, c) {
  2621. if (o.circular || o.infinite) return;
  2622. var fx = (f == 'removeClass' || f == 'addClass') ? f : false,
  2623. di = cf_c('disabled', c);
  2624. if (o.auto.button && fx)
  2625. {
  2626. o.auto.button[fx](di);
  2627. }
  2628. if (o.prev.button)
  2629. {
  2630. var fn = fx || (f == 0) ? 'addClass' : 'removeClass';
  2631. o.prev.button[fn](di);
  2632. }
  2633. if (o.next.button)
  2634. {
  2635. var fn = fx || (f == o.items.visible) ? 'addClass' : 'removeClass';
  2636. o.next.button[fn](di);
  2637. }
  2638. }
  2639. // get object functions
  2640. function go_getObject($tt, obj) {
  2641. if (is_function(obj))
  2642. {
  2643. obj = obj.call($tt);
  2644. }
  2645. else if (is_undefined(obj))
  2646. {
  2647. obj = {};
  2648. }
  2649. return obj;
  2650. }
  2651. function go_getItemsObject($tt, obj) {
  2652. obj = go_getObject($tt, obj);
  2653. if (is_number(obj))
  2654. {
  2655. obj = {
  2656. 'visible': obj
  2657. };
  2658. }
  2659. else if (obj == 'variable')
  2660. {
  2661. obj = {
  2662. 'visible': obj,
  2663. 'width': obj,
  2664. 'height': obj
  2665. };
  2666. }
  2667. else if (!is_object(obj))
  2668. {
  2669. obj = {};
  2670. }
  2671. return obj;
  2672. }
  2673. function go_getScrollObject($tt, obj) {
  2674. obj = go_getObject($tt, obj);
  2675. if (is_number(obj))
  2676. {
  2677. if (obj <= 50)
  2678. {
  2679. obj = {
  2680. 'items': obj
  2681. };
  2682. }
  2683. else
  2684. {
  2685. obj = {
  2686. 'duration': obj
  2687. };
  2688. }
  2689. }
  2690. else if (is_string(obj))
  2691. {
  2692. obj = {
  2693. 'easing': obj
  2694. };
  2695. }
  2696. else if (!is_object(obj))
  2697. {
  2698. obj = {};
  2699. }
  2700. return obj;
  2701. }
  2702. function go_getNaviObject($tt, obj) {
  2703. obj = go_getObject($tt, obj);
  2704. if (is_string(obj))
  2705. {
  2706. var temp = cf_getKeyCode(obj);
  2707. if (temp == -1)
  2708. {
  2709. obj = $(obj);
  2710. }
  2711. else
  2712. {
  2713. obj = temp;
  2714. }
  2715. }
  2716. return obj;
  2717. }
  2718. function go_getAutoObject($tt, obj) {
  2719. obj = go_getNaviObject($tt, obj);
  2720. if (is_jquery(obj))
  2721. {
  2722. obj = {
  2723. 'button': obj
  2724. };
  2725. }
  2726. else if (is_boolean(obj))
  2727. {
  2728. obj = {
  2729. 'play': obj
  2730. };
  2731. }
  2732. else if (is_number(obj))
  2733. {
  2734. obj = {
  2735. 'timeoutDuration': obj
  2736. };
  2737. }
  2738. if (obj.progress)
  2739. {
  2740. if (is_string(obj.progress) || is_jquery(obj.progress))
  2741. {
  2742. obj.progress = {
  2743. 'bar': obj.progress
  2744. };
  2745. }
  2746. }
  2747. return obj;
  2748. }
  2749. function go_complementAutoObject($tt, obj) {
  2750. if (is_function(obj.button))
  2751. {
  2752. obj.button = obj.button.call($tt);
  2753. }
  2754. if (is_string(obj.button))
  2755. {
  2756. obj.button = $(obj.button);
  2757. }
  2758. if (!is_boolean(obj.play))
  2759. {
  2760. obj.play = true;
  2761. }
  2762. if (!is_number(obj.delay))
  2763. {
  2764. obj.delay = 0;
  2765. }
  2766. if (is_undefined(obj.pauseOnEvent))
  2767. {
  2768. obj.pauseOnEvent = true;
  2769. }
  2770. if (!is_boolean(obj.pauseOnResize))
  2771. {
  2772. obj.pauseOnResize = true;
  2773. }
  2774. if (!is_number(obj.timeoutDuration))
  2775. {
  2776. obj.timeoutDuration = (obj.duration < 10)
  2777. ? 2500
  2778. : obj.duration * 5;
  2779. }
  2780. if (obj.progress)
  2781. {
  2782. if (is_function(obj.progress.bar))
  2783. {
  2784. obj.progress.bar = obj.progress.bar.call($tt);
  2785. }
  2786. if (is_string(obj.progress.bar))
  2787. {
  2788. obj.progress.bar = $(obj.progress.bar);
  2789. }
  2790. if (obj.progress.bar)
  2791. {
  2792. if (!is_function(obj.progress.updater))
  2793. {
  2794. obj.progress.updater = $.fn.carouFredSel.progressbarUpdater;
  2795. }
  2796. if (!is_number(obj.progress.interval))
  2797. {
  2798. obj.progress.interval = 50;
  2799. }
  2800. }
  2801. else
  2802. {
  2803. obj.progress = false;
  2804. }
  2805. }
  2806. return obj;
  2807. }
  2808. function go_getPrevNextObject($tt, obj) {
  2809. obj = go_getNaviObject($tt, obj);
  2810. if (is_jquery(obj))
  2811. {
  2812. obj = {
  2813. 'button': obj
  2814. };
  2815. }
  2816. else if (is_number(obj))
  2817. {
  2818. obj = {
  2819. 'key': obj
  2820. };
  2821. }
  2822. return obj;
  2823. }
  2824. function go_complementPrevNextObject($tt, obj) {
  2825. if (is_function(obj.button))
  2826. {
  2827. obj.button = obj.button.call($tt);
  2828. }
  2829. if (is_string(obj.button))
  2830. {
  2831. obj.button = $(obj.button);
  2832. }
  2833. if (is_string(obj.key))
  2834. {
  2835. obj.key = cf_getKeyCode(obj.key);
  2836. }
  2837. return obj;
  2838. }
  2839. function go_getPaginationObject($tt, obj) {
  2840. obj = go_getNaviObject($tt, obj);
  2841. if (is_jquery(obj))
  2842. {
  2843. obj = {
  2844. 'container': obj
  2845. };
  2846. }
  2847. else if (is_boolean(obj))
  2848. {
  2849. obj = {
  2850. 'keys': obj
  2851. };
  2852. }
  2853. return obj;
  2854. }
  2855. function go_complementPaginationObject($tt, obj) {
  2856. if (is_function(obj.container))
  2857. {
  2858. obj.container = obj.container.call($tt);
  2859. }
  2860. if (is_string(obj.container))
  2861. {
  2862. obj.container = $(obj.container);
  2863. }
  2864. if (!is_number(obj.items))
  2865. {
  2866. obj.items = false;
  2867. }
  2868. if (!is_boolean(obj.keys))
  2869. {
  2870. obj.keys = false;
  2871. }
  2872. if (!is_function(obj.anchorBuilder) && !is_false(obj.anchorBuilder))
  2873. {
  2874. obj.anchorBuilder = $.fn.carouFredSel.pageAnchorBuilder;
  2875. }
  2876. if (!is_number(obj.deviation))
  2877. {
  2878. obj.deviation = 0;
  2879. }
  2880. return obj;
  2881. }
  2882. function go_getSwipeObject($tt, obj) {
  2883. if (is_function(obj))
  2884. {
  2885. obj = obj.call($tt);
  2886. }
  2887. if (is_undefined(obj))
  2888. {
  2889. obj = {
  2890. 'onTouch': false
  2891. };
  2892. }
  2893. if (is_true(obj))
  2894. {
  2895. obj = {
  2896. 'onTouch': obj
  2897. };
  2898. }
  2899. else if (is_number(obj))
  2900. {
  2901. obj = {
  2902. 'items': obj
  2903. };
  2904. }
  2905. return obj;
  2906. }
  2907. function go_complementSwipeObject($tt, obj) {
  2908. if (!is_boolean(obj.onTouch))
  2909. {
  2910. obj.onTouch = true;
  2911. }
  2912. if (!is_boolean(obj.onMouse))
  2913. {
  2914. obj.onMouse = false;
  2915. }
  2916. if (!is_object(obj.options))
  2917. {
  2918. obj.options = {};
  2919. }
  2920. if (!is_boolean(obj.options.triggerOnTouchEnd))
  2921. {
  2922. obj.options.triggerOnTouchEnd = false;
  2923. }
  2924. return obj;
  2925. }
  2926. function go_getMousewheelObject($tt, obj) {
  2927. if (is_function(obj))
  2928. {
  2929. obj = obj.call($tt);
  2930. }
  2931. if (is_true(obj))
  2932. {
  2933. obj = {};
  2934. }
  2935. else if (is_number(obj))
  2936. {
  2937. obj = {
  2938. 'items': obj
  2939. };
  2940. }
  2941. else if (is_undefined(obj))
  2942. {
  2943. obj = false;
  2944. }
  2945. return obj;
  2946. }
  2947. function go_complementMousewheelObject($tt, obj) {
  2948. return obj;
  2949. }
  2950. // get number functions
  2951. function gn_getItemIndex(num, dev, org, items, $cfs) {
  2952. if (is_string(num))
  2953. {
  2954. num = $(num, $cfs);
  2955. }
  2956. if (is_object(num))
  2957. {
  2958. num = $(num, $cfs);
  2959. }
  2960. if (is_jquery(num))
  2961. {
  2962. num = $cfs.children().index(num);
  2963. if (!is_boolean(org))
  2964. {
  2965. org = false;
  2966. }
  2967. }
  2968. else
  2969. {
  2970. if (!is_boolean(org))
  2971. {
  2972. org = true;
  2973. }
  2974. }
  2975. if (!is_number(num))
  2976. {
  2977. num = 0;
  2978. }
  2979. if (!is_number(dev))
  2980. {
  2981. dev = 0;
  2982. }
  2983. if (org)
  2984. {
  2985. num += items.first;
  2986. }
  2987. num += dev;
  2988. if (items.total > 0)
  2989. {
  2990. while (num >= items.total)
  2991. {
  2992. num -= items.total;
  2993. }
  2994. while (num < 0)
  2995. {
  2996. num += items.total;
  2997. }
  2998. }
  2999. return num;
  3000. }
  3001. // items prev
  3002. function gn_getVisibleItemsPrev(i, o, s) {
  3003. var t = 0,
  3004. x = 0;
  3005. for (var a = s; a >= 0; a--)
  3006. {
  3007. var j = i.eq(a);
  3008. t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0;
  3009. if (t > o.maxDimension)
  3010. {
  3011. return x;
  3012. }
  3013. if (a == 0)
  3014. {
  3015. a = i.length;
  3016. }
  3017. x++;
  3018. }
  3019. }
  3020. function gn_getVisibleItemsPrevFilter(i, o, s) {
  3021. return gn_getItemsPrevFilter(i, o.items.filter, o.items.visibleConf.org, s);
  3022. }
  3023. function gn_getScrollItemsPrevFilter(i, o, s, m) {
  3024. return gn_getItemsPrevFilter(i, o.items.filter, m, s);
  3025. }
  3026. function gn_getItemsPrevFilter(i, f, m, s) {
  3027. var t = 0,
  3028. x = 0;
  3029. for (var a = s, l = i.length; a >= 0; a--)
  3030. {
  3031. x++;
  3032. if (x == l)
  3033. {
  3034. return x;
  3035. }
  3036. var j = i.eq(a);
  3037. if (j.is(f))
  3038. {
  3039. t++;
  3040. if (t == m)
  3041. {
  3042. return x;
  3043. }
  3044. }
  3045. if (a == 0)
  3046. {
  3047. a = l;
  3048. }
  3049. }
  3050. }
  3051. function gn_getVisibleOrg($c, o) {
  3052. return o.items.visibleConf.org || $c.children().slice(0, o.items.visible).filter(o.items.filter).length;
  3053. }
  3054. // items next
  3055. function gn_getVisibleItemsNext(i, o, s) {
  3056. var t = 0,
  3057. x = 0;
  3058. for (var a = s, l = i.length-1; a <= l; a++)
  3059. {
  3060. var j = i.eq(a);
  3061. t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0;
  3062. if (t > o.maxDimension)
  3063. {
  3064. return x;
  3065. }
  3066. x++;
  3067. if (x == l+1)
  3068. {
  3069. return x;
  3070. }
  3071. if (a == l)
  3072. {
  3073. a = -1;
  3074. }
  3075. }
  3076. }
  3077. function gn_getVisibleItemsNextTestCircular(i, o, s, l) {
  3078. var v = gn_getVisibleItemsNext(i, o, s);
  3079. if (!o.circular)
  3080. {
  3081. if (s + v > l)
  3082. {
  3083. v = l - s;
  3084. }
  3085. }
  3086. return v;
  3087. }
  3088. function gn_getVisibleItemsNextFilter(i, o, s) {
  3089. return gn_getItemsNextFilter(i, o.items.filter, o.items.visibleConf.org, s, o.circular);
  3090. }
  3091. function gn_getScrollItemsNextFilter(i, o, s, m) {
  3092. return gn_getItemsNextFilter(i, o.items.filter, m+1, s, o.circular) - 1;
  3093. }
  3094. function gn_getItemsNextFilter(i, f, m, s, c) {
  3095. var t = 0,
  3096. x = 0;
  3097. for (var a = s, l = i.length-1; a <= l; a++)
  3098. {
  3099. x++;
  3100. if (x >= l)
  3101. {
  3102. return x;
  3103. }
  3104. var j = i.eq(a);
  3105. if (j.is(f))
  3106. {
  3107. t++;
  3108. if (t == m)
  3109. {
  3110. return x;
  3111. }
  3112. }
  3113. if (a == l)
  3114. {
  3115. a = -1;
  3116. }
  3117. }
  3118. }
  3119. // get items functions
  3120. function gi_getCurrentItems(i, o) {
  3121. return i.slice(0, o.items.visible);
  3122. }
  3123. function gi_getOldItemsPrev(i, o, n) {
  3124. return i.slice(n, o.items.visibleConf.old+n);
  3125. }
  3126. function gi_getNewItemsPrev(i, o) {
  3127. return i.slice(0, o.items.visible);
  3128. }
  3129. function gi_getOldItemsNext(i, o) {
  3130. return i.slice(0, o.items.visibleConf.old);
  3131. }
  3132. function gi_getNewItemsNext(i, o, n) {
  3133. return i.slice(n, o.items.visible+n);
  3134. }
  3135. // sizes functions
  3136. function sz_storeMargin(i, o, d) {
  3137. if (o.usePadding)
  3138. {
  3139. if (!is_string(d))
  3140. {
  3141. d = '_cfs_origCssMargin';
  3142. }
  3143. i.each(function() {
  3144. var j = $(this),
  3145. m = parseInt(j.css(o.d['marginRight']), 10);
  3146. if (!is_number(m))
  3147. {
  3148. m = 0;
  3149. }
  3150. j.data(d, m);
  3151. });
  3152. }
  3153. }
  3154. function sz_resetMargin(i, o, m) {
  3155. if (o.usePadding)
  3156. {
  3157. var x = (is_boolean(m)) ? m : false;
  3158. if (!is_number(m))
  3159. {
  3160. m = 0;
  3161. }
  3162. sz_storeMargin(i, o, '_cfs_tempCssMargin');
  3163. i.each(function() {
  3164. var j = $(this);
  3165. j.css(o.d['marginRight'], ((x) ? j.data('_cfs_tempCssMargin') : m + j.data('_cfs_origCssMargin')));
  3166. });
  3167. }
  3168. }
  3169. function sz_storeOrigCss(i) {
  3170. i.each(function() {
  3171. var j = $(this);
  3172. j.data('_cfs_origCss', j.attr('style') || '');
  3173. });
  3174. }
  3175. function sz_restoreOrigCss(i) {
  3176. i.each(function() {
  3177. var j = $(this);
  3178. j.attr('style', j.data('_cfs_origCss') || '');
  3179. });
  3180. }
  3181. function sz_setResponsiveSizes(o, all) {
  3182. var visb = o.items.visible,
  3183. newS = o.items[o.d['width']],
  3184. seco = o[o.d['height']],
  3185. secp = is_percentage(seco);
  3186. all.each(function() {
  3187. var $t = $(this),
  3188. nw = newS - ms_getPaddingBorderMargin($t, o, 'Width');
  3189. $t[o.d['width']](nw);
  3190. if (secp)
  3191. {
  3192. $t[o.d['height']](ms_getPercentage(nw, seco));
  3193. }
  3194. });
  3195. }
  3196. function sz_setSizes($c, o) {
  3197. var $w = $c.parent(),
  3198. $i = $c.children(),
  3199. $v = gi_getCurrentItems($i, o),
  3200. sz = cf_mapWrapperSizes(ms_getSizes($v, o, true), o, false);
  3201. $w.css(sz);
  3202. if (o.usePadding)
  3203. {
  3204. var p = o.padding,
  3205. r = p[o.d[1]];
  3206. if (o.align && r < 0)
  3207. {
  3208. r = 0;
  3209. }
  3210. var $l = $v.last();
  3211. $l.css(o.d['marginRight'], $l.data('_cfs_origCssMargin') + r);
  3212. $c.css(o.d['top'], p[o.d[0]]);
  3213. $c.css(o.d['left'], p[o.d[3]]);
  3214. }
  3215. $c.css(o.d['width'], sz[o.d['width']]+(ms_getTotalSize($i, o, 'width')*2));
  3216. $c.css(o.d['height'], ms_getLargestSize($i, o, 'height'));
  3217. return sz;
  3218. }
  3219. // measuring functions
  3220. function ms_getSizes(i, o, wrapper) {
  3221. return [ms_getTotalSize(i, o, 'width', wrapper), ms_getLargestSize(i, o, 'height', wrapper)];
  3222. }
  3223. function ms_getLargestSize(i, o, dim, wrapper) {
  3224. if (!is_boolean(wrapper))
  3225. {
  3226. wrapper = false;
  3227. }
  3228. if (is_number(o[o.d[dim]]) && wrapper)
  3229. {
  3230. return o[o.d[dim]];
  3231. }
  3232. if (is_number(o.items[o.d[dim]]))
  3233. {
  3234. return o.items[o.d[dim]];
  3235. }
  3236. dim = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight';
  3237. return ms_getTrueLargestSize(i, o, dim);
  3238. }
  3239. function ms_getTrueLargestSize(i, o, dim) {
  3240. var s = 0;
  3241. for (var a = 0, l = i.length; a < l; a++)
  3242. {
  3243. var j = i.eq(a);
  3244. var m = (j.is(':visible')) ? j[o.d[dim]](true) : 0;
  3245. if (s < m)
  3246. {
  3247. s = m;
  3248. }
  3249. }
  3250. return s;
  3251. }
  3252. function ms_getTotalSize(i, o, dim, wrapper) {
  3253. if (!is_boolean(wrapper))
  3254. {
  3255. wrapper = false;
  3256. }
  3257. if (is_number(o[o.d[dim]]) && wrapper)
  3258. {
  3259. return o[o.d[dim]];
  3260. }
  3261. if (is_number(o.items[o.d[dim]]))
  3262. {
  3263. return o.items[o.d[dim]] * i.length;
  3264. }
  3265. var d = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight',
  3266. s = 0;
  3267. for (var a = 0, l = i.length; a < l; a++)
  3268. {
  3269. var j = i.eq(a);
  3270. s += (j.is(':visible')) ? j[o.d[d]](true) : 0;
  3271. }
  3272. return s;
  3273. }
  3274. function ms_getParentSize($w, o, d) {
  3275. var isVisible = $w.is(':visible');
  3276. if (isVisible)
  3277. {
  3278. $w.hide();
  3279. }
  3280. var s = $w.parent()[o.d[d]]();
  3281. if (isVisible)
  3282. {
  3283. $w.show();
  3284. }
  3285. return s;
  3286. }
  3287. function ms_getMaxDimension(o, a) {
  3288. return (is_number(o[o.d['width']])) ? o[o.d['width']] : a;
  3289. }
  3290. function ms_hasVariableSizes(i, o, dim) {
  3291. var s = false,
  3292. v = false;
  3293. for (var a = 0, l = i.length; a < l; a++)
  3294. {
  3295. var j = i.eq(a);
  3296. var c = (j.is(':visible')) ? j[o.d[dim]](true) : 0;
  3297. if (s === false)
  3298. {
  3299. s = c;
  3300. }
  3301. else if (s != c)
  3302. {
  3303. v = true;
  3304. }
  3305. if (s == 0)
  3306. {
  3307. v = true;
  3308. }
  3309. }
  3310. return v;
  3311. }
  3312. function ms_getPaddingBorderMargin(i, o, d) {
  3313. return i[o.d['outer'+d]](true) - i[o.d[d.toLowerCase()]]();
  3314. }
  3315. function ms_getPercentage(s, o) {
  3316. if (is_percentage(o))
  3317. {
  3318. o = parseInt( o.slice(0, -1), 10 );
  3319. if (!is_number(o))
  3320. {
  3321. return s;
  3322. }
  3323. s *= o/100;
  3324. }
  3325. return s;
  3326. }
  3327. // config functions
  3328. function cf_e(n, c, pf, ns, rd) {
  3329. if (!is_boolean(pf))
  3330. {
  3331. pf = true;
  3332. }
  3333. if (!is_boolean(ns))
  3334. {
  3335. ns = true;
  3336. }
  3337. if (!is_boolean(rd))
  3338. {
  3339. rd = false;
  3340. }
  3341. if (pf)
  3342. {
  3343. n = c.events.prefix + n;
  3344. }
  3345. if (ns)
  3346. {
  3347. n = n +'.'+ c.events.namespace;
  3348. }
  3349. if (ns && rd)
  3350. {
  3351. n += c.serialNumber;
  3352. }
  3353. return n;
  3354. }
  3355. function cf_c(n, c) {
  3356. return (is_string(c.classnames[n])) ? c.classnames[n] : n;
  3357. }
  3358. function cf_mapWrapperSizes(ws, o, p) {
  3359. if (!is_boolean(p))
  3360. {
  3361. p = true;
  3362. }
  3363. var pad = (o.usePadding && p) ? o.padding : [0, 0, 0, 0];
  3364. var wra = {};
  3365. wra[o.d['width']] = ws[0] + pad[1] + pad[3];
  3366. wra[o.d['height']] = ws[1] + pad[0] + pad[2];
  3367. return wra;
  3368. }
  3369. function cf_sortParams(vals, typs) {
  3370. var arr = [];
  3371. for (var a = 0, l1 = vals.length; a < l1; a++)
  3372. {
  3373. for (var b = 0, l2 = typs.length; b < l2; b++)
  3374. {
  3375. if (typs[b].indexOf(typeof vals[a]) > -1 && is_undefined(arr[b]))
  3376. {
  3377. arr[b] = vals[a];
  3378. break;
  3379. }
  3380. }
  3381. }
  3382. return arr;
  3383. }
  3384. function cf_getPadding(p) {
  3385. if (is_undefined(p))
  3386. {
  3387. return [0, 0, 0, 0];
  3388. }
  3389. if (is_number(p))
  3390. {
  3391. return [p, p, p, p];
  3392. }
  3393. if (is_string(p))
  3394. {
  3395. p = p.split('px').join('').split('em').join('').split(' ');
  3396. }
  3397. if (!is_array(p))
  3398. {
  3399. return [0, 0, 0, 0];
  3400. }
  3401. for (var i = 0; i < 4; i++)
  3402. {
  3403. p[i] = parseInt(p[i], 10);
  3404. }
  3405. switch (p.length)
  3406. {
  3407. case 0:
  3408. return [0, 0, 0, 0];
  3409. case 1:
  3410. return [p[0], p[0], p[0], p[0]];
  3411. case 2:
  3412. return [p[0], p[1], p[0], p[1]];
  3413. case 3:
  3414. return [p[0], p[1], p[2], p[1]];
  3415. default:
  3416. return [p[0], p[1], p[2], p[3]];
  3417. }
  3418. }
  3419. function cf_getAlignPadding(itm, o) {
  3420. var x = (is_number(o[o.d['width']])) ? Math.ceil(o[o.d['width']] - ms_getTotalSize(itm, o, 'width')) : 0;
  3421. switch (o.align)
  3422. {
  3423. case 'left':
  3424. return [0, x];
  3425. case 'right':
  3426. return [x, 0];
  3427. case 'center':
  3428. default:
  3429. return [Math.ceil(x/2), Math.floor(x/2)];
  3430. }
  3431. }
  3432. function cf_getDimensions(o) {
  3433. var dm = [
  3434. ['width' , 'innerWidth' , 'outerWidth' , 'height' , 'innerHeight' , 'outerHeight' , 'left', 'top' , 'marginRight' , 0, 1, 2, 3],
  3435. ['height' , 'innerHeight' , 'outerHeight' , 'width' , 'innerWidth' , 'outerWidth' , 'top' , 'left', 'marginBottom', 3, 2, 1, 0]
  3436. ];
  3437. var dl = dm[0].length,
  3438. dx = (o.direction == 'right' || o.direction == 'left') ? 0 : 1;
  3439. var dimensions = {};
  3440. for (var d = 0; d < dl; d++)
  3441. {
  3442. dimensions[dm[0][d]] = dm[dx][d];
  3443. }
  3444. return dimensions;
  3445. }
  3446. function cf_getAdjust(x, o, a, $t) {
  3447. var v = x;
  3448. if (is_function(a))
  3449. {
  3450. v = a.call($t, v);
  3451. }
  3452. else if (is_string(a))
  3453. {
  3454. var p = a.split('+'),
  3455. m = a.split('-');
  3456. if (m.length > p.length)
  3457. {
  3458. var neg = true,
  3459. sta = m[0],
  3460. adj = m[1];
  3461. }
  3462. else
  3463. {
  3464. var neg = false,
  3465. sta = p[0],
  3466. adj = p[1];
  3467. }
  3468. switch(sta)
  3469. {
  3470. case 'even':
  3471. v = (x % 2 == 1) ? x-1 : x;
  3472. break;
  3473. case 'odd':
  3474. v = (x % 2 == 0) ? x-1 : x;
  3475. break;
  3476. default:
  3477. v = x;
  3478. break;
  3479. }
  3480. adj = parseInt(adj, 10);
  3481. if (is_number(adj))
  3482. {
  3483. if (neg)
  3484. {
  3485. adj = -adj;
  3486. }
  3487. v += adj;
  3488. }
  3489. }
  3490. if (!is_number(v) || v < 1)
  3491. {
  3492. v = 1;
  3493. }
  3494. return v;
  3495. }
  3496. function cf_getItemsAdjust(x, o, a, $t) {
  3497. return cf_getItemAdjustMinMax(cf_getAdjust(x, o, a, $t), o.items.visibleConf);
  3498. }
  3499. function cf_getItemAdjustMinMax(v, i) {
  3500. if (is_number(i.min) && v < i.min)
  3501. {
  3502. v = i.min;
  3503. }
  3504. if (is_number(i.max) && v > i.max)
  3505. {
  3506. v = i.max;
  3507. }
  3508. if (v < 1)
  3509. {
  3510. v = 1;
  3511. }
  3512. return v;
  3513. }
  3514. function cf_getSynchArr(s) {
  3515. if (!is_array(s))
  3516. {
  3517. s = [[s]];
  3518. }
  3519. if (!is_array(s[0]))
  3520. {
  3521. s = [s];
  3522. }
  3523. for (var j = 0, l = s.length; j < l; j++)
  3524. {
  3525. if (is_string(s[j][0]))
  3526. {
  3527. s[j][0] = $(s[j][0]);
  3528. }
  3529. if (!is_boolean(s[j][1]))
  3530. {
  3531. s[j][1] = true;
  3532. }
  3533. if (!is_boolean(s[j][2]))
  3534. {
  3535. s[j][2] = true;
  3536. }
  3537. if (!is_number(s[j][3]))
  3538. {
  3539. s[j][3] = 0;
  3540. }
  3541. }
  3542. return s;
  3543. }
  3544. function cf_getKeyCode(k) {
  3545. if (k == 'right')
  3546. {
  3547. return 39;
  3548. }
  3549. if (k == 'left')
  3550. {
  3551. return 37;
  3552. }
  3553. if (k == 'up')
  3554. {
  3555. return 38;
  3556. }
  3557. if (k == 'down')
  3558. {
  3559. return 40;
  3560. }
  3561. return -1;
  3562. }
  3563. function cf_setCookie(n, $c, c) {
  3564. if (n)
  3565. {
  3566. var v = $c.triggerHandler(cf_e('currentPosition', c));
  3567. $.fn.carouFredSel.cookie.set(n, v);
  3568. }
  3569. }
  3570. function cf_getCookie(n) {
  3571. var c = $.fn.carouFredSel.cookie.get(n);
  3572. return (c == '') ? 0 : c;
  3573. }
  3574. // init function
  3575. function in_mapCss($elem, props) {
  3576. var css = {};
  3577. for (var p = 0, l = props.length; p < l; p++)
  3578. {
  3579. css[props[p]] = $elem.css(props[p]);
  3580. }
  3581. return css;
  3582. }
  3583. function in_complementItems(obj, opt, itm, sta) {
  3584. if (!is_object(obj.visibleConf))
  3585. {
  3586. obj.visibleConf = {};
  3587. }
  3588. if (!is_object(obj.sizesConf))
  3589. {
  3590. obj.sizesConf = {};
  3591. }
  3592. if (obj.start == 0 && is_number(sta))
  3593. {
  3594. obj.start = sta;
  3595. }
  3596. // visible items
  3597. if (is_object(obj.visible))
  3598. {
  3599. obj.visibleConf.min = obj.visible.min;
  3600. obj.visibleConf.max = obj.visible.max;
  3601. obj.visible = false;
  3602. }
  3603. else if (is_string(obj.visible))
  3604. {
  3605. // variable visible items
  3606. if (obj.visible == 'variable')
  3607. {
  3608. obj.visibleConf.variable = true;
  3609. }
  3610. // adjust string visible items
  3611. else
  3612. {
  3613. obj.visibleConf.adjust = obj.visible;
  3614. }
  3615. obj.visible = false;
  3616. }
  3617. else if (is_function(obj.visible))
  3618. {
  3619. obj.visibleConf.adjust = obj.visible;
  3620. obj.visible = false;
  3621. }
  3622. // set items filter
  3623. if (!is_string(obj.filter))
  3624. {
  3625. obj.filter = (itm.filter(':hidden').length > 0) ? ':visible' : '*';
  3626. }
  3627. // primary item-size not set
  3628. if (!obj[opt.d['width']])
  3629. {
  3630. // responsive carousel -> set to largest
  3631. if (opt.responsive)
  3632. {
  3633. debug(true, 'Set a '+opt.d['width']+' for the items!');
  3634. obj[opt.d['width']] = ms_getTrueLargestSize(itm, opt, 'outerWidth');
  3635. }
  3636. // non-responsive -> measure it or set to "variable"
  3637. else
  3638. {
  3639. obj[opt.d['width']] = (ms_hasVariableSizes(itm, opt, 'outerWidth'))
  3640. ? 'variable'
  3641. : itm[opt.d['outerWidth']](true);
  3642. }
  3643. }
  3644. // secondary item-size not set -> measure it or set to "variable"
  3645. if (!obj[opt.d['height']])
  3646. {
  3647. obj[opt.d['height']] = (ms_hasVariableSizes(itm, opt, 'outerHeight'))
  3648. ? 'variable'
  3649. : itm[opt.d['outerHeight']](true);
  3650. }
  3651. obj.sizesConf.width = obj.width;
  3652. obj.sizesConf.height = obj.height;
  3653. return obj;
  3654. }
  3655. function in_complementVisibleItems(opt, avl) {
  3656. // primary item-size variable -> set visible items variable
  3657. if (opt.items[opt.d['width']] == 'variable')
  3658. {
  3659. opt.items.visibleConf.variable = true;
  3660. }
  3661. if (!opt.items.visibleConf.variable) {
  3662. // primary size is number -> calculate visible-items
  3663. if (is_number(opt[opt.d['width']]))
  3664. {
  3665. opt.items.visible = Math.floor(opt[opt.d['width']] / opt.items[opt.d['width']]);
  3666. }
  3667. // measure and calculate primary size and visible-items
  3668. else
  3669. {
  3670. opt.items.visible = Math.floor(avl / opt.items[opt.d['width']]);
  3671. opt[opt.d['width']] = opt.items.visible * opt.items[opt.d['width']];
  3672. if (!opt.items.visibleConf.adjust)
  3673. {
  3674. opt.align = false;
  3675. }
  3676. }
  3677. if (opt.items.visible == 'Infinity' || opt.items.visible < 1)
  3678. {
  3679. debug(true, 'Not a valid number of visible items: Set to "variable".');
  3680. opt.items.visibleConf.variable = true;
  3681. }
  3682. }
  3683. return opt;
  3684. }
  3685. function in_complementPrimarySize(obj, opt, all) {
  3686. // primary size set to auto -> measure largest item-size and set it
  3687. if (obj == 'auto')
  3688. {
  3689. obj = ms_getTrueLargestSize(all, opt, 'outerWidth');
  3690. }
  3691. return obj;
  3692. }
  3693. function in_complementSecondarySize(obj, opt, all) {
  3694. // secondary size set to auto -> measure largest item-size and set it
  3695. if (obj == 'auto')
  3696. {
  3697. obj = ms_getTrueLargestSize(all, opt, 'outerHeight');
  3698. }
  3699. // secondary size not set -> set to secondary item-size
  3700. if (!obj)
  3701. {
  3702. obj = opt.items[opt.d['height']];
  3703. }
  3704. return obj;
  3705. }
  3706. function in_getAlignPadding(o, all) {
  3707. var p = cf_getAlignPadding(gi_getCurrentItems(all, o), o);
  3708. o.padding[o.d[1]] = p[1];
  3709. o.padding[o.d[3]] = p[0];
  3710. return o;
  3711. }
  3712. function in_getResponsiveValues(o, all, avl) {
  3713. var visb = cf_getItemAdjustMinMax(Math.ceil(o[o.d['width']] / o.items[o.d['width']]), o.items.visibleConf);
  3714. if (visb > all.length)
  3715. {
  3716. visb = all.length;
  3717. }
  3718. var newS = Math.floor(o[o.d['width']]/visb);
  3719. o.items.visible = visb;
  3720. o.items[o.d['width']] = newS;
  3721. o[o.d['width']] = visb * newS;
  3722. return o;
  3723. }
  3724. // buttons functions
  3725. function bt_pauseOnHoverConfig(p) {
  3726. if (is_string(p))
  3727. {
  3728. var i = (p.indexOf('immediate') > -1) ? true : false,
  3729. r = (p.indexOf('resume') > -1) ? true : false;
  3730. }
  3731. else
  3732. {
  3733. var i = r = false;
  3734. }
  3735. return [i, r];
  3736. }
  3737. function bt_mousesheelNumber(mw) {
  3738. return (is_number(mw)) ? mw : null
  3739. }
  3740. // helper functions
  3741. function is_null(a) {
  3742. return (a === null);
  3743. }
  3744. function is_undefined(a) {
  3745. return (is_null(a) || typeof a == 'undefined' || a === '' || a === 'undefined');
  3746. }
  3747. function is_array(a) {
  3748. return (a instanceof Array);
  3749. }
  3750. function is_jquery(a) {
  3751. return (a instanceof jQuery);
  3752. }
  3753. function is_object(a) {
  3754. return ((a instanceof Object || typeof a == 'object') && !is_null(a) && !is_jquery(a) && !is_array(a) && !is_function(a));
  3755. }
  3756. function is_number(a) {
  3757. return ((a instanceof Number || typeof a == 'number') && !isNaN(a));
  3758. }
  3759. function is_string(a) {
  3760. return ((a instanceof String || typeof a == 'string') && !is_undefined(a) && !is_true(a) && !is_false(a));
  3761. }
  3762. function is_function(a) {
  3763. return (a instanceof Function || typeof a == 'function');
  3764. }
  3765. function is_boolean(a) {
  3766. return (a instanceof Boolean || typeof a == 'boolean' || is_true(a) || is_false(a));
  3767. }
  3768. function is_true(a) {
  3769. return (a === true || a === 'true');
  3770. }
  3771. function is_false(a) {
  3772. return (a === false || a === 'false');
  3773. }
  3774. function is_percentage(x) {
  3775. return (is_string(x) && x.slice(-1) == '%');
  3776. }
  3777. function getTime() {
  3778. return new Date().getTime();
  3779. }
  3780. function deprecated( o, n ) {
  3781. debug(true, o+' is DEPRECATED, support for it will be removed. Use '+n+' instead.');
  3782. }
  3783. function debug(d, m) {
  3784. if (!is_undefined(window.console) && !is_undefined(window.console.log))
  3785. {
  3786. if (is_object(d))
  3787. {
  3788. var s = ' ('+d.selector+')';
  3789. d = d.debug;
  3790. }
  3791. else
  3792. {
  3793. var s = '';
  3794. }
  3795. if (!d)
  3796. {
  3797. return false;
  3798. }
  3799. if (is_string(m))
  3800. {
  3801. m = 'carouFredSel'+s+': ' + m;
  3802. }
  3803. else
  3804. {
  3805. m = ['carouFredSel'+s+':', m];
  3806. }
  3807. window.console.log(m);
  3808. }
  3809. return false;
  3810. }
  3811. // EASING FUNCTIONS
  3812. $.extend($.easing, {
  3813. 'quadratic': function(t) {
  3814. var t2 = t * t;
  3815. return t * (-t2 * t + 4 * t2 - 6 * t + 4);
  3816. },
  3817. 'cubic': function(t) {
  3818. return t * (4 * t * t - 9 * t + 6);
  3819. },
  3820. 'elastic': function(t) {
  3821. var t2 = t * t;
  3822. return t * (33 * t2 * t2 - 106 * t2 * t + 126 * t2 - 67 * t + 15);
  3823. }
  3824. });
  3825. })(jQuery);