JAVASCRIPT 28
Theme.js Guest on 13th July 2020 10:52:09 AM
  1. window.jQuery = window.$ = jQuery;
  2. /*All JS Plugins and Scripts*/
  3.  
  4. /* *** jquery.easing.1.3.js *** */
  5. /*
  6.  * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
  7.  *
  8.  * Uses the built in easing capabilities added In jQuery 1.1
  9.  * to offer multiple easing options
  10.  *
  11.  * TERMS OF USE - jQuery Easing
  12.  *
  13.  * Open source under the BSD License.
  14.  *
  15.  * Copyright © 2008 George McGinley Smith
  16.  * All rights reserved.
  17.  *
  18.  * Redistribution and use in source and binary forms, with or without modification,
  19.  * are permitted provided that the following conditions are met:
  20.  *
  21.  * Redistributions of source code must retain the above copyright notice, this list of
  22.  * conditions and the following disclaimer.
  23.  * Redistributions in binary form must reproduce the above copyright notice, this list
  24.  * of conditions and the following disclaimer in the documentation and/or other materials
  25.  * provided with the distribution.
  26.  *
  27.  * Neither the name of the author nor the names of contributors may be used to endorse
  28.  * or promote products derived from this software without specific prior written permission.
  29.  *
  30.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
  31.  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  32.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  33.  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  34.  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  35.  *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  36.  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  37.  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  38.  * OF THE POSSIBILITY OF SUCH DAMAGE.
  39.  *
  40. */
  41.  
  42. // t: current time, b: begInnIng value, c: change In value, d: duration
  43. jQuery.easing['jswing'] = jQuery.easing['swing'];
  44.  
  45. jQuery.extend( jQuery.easing,
  46. {
  47.         def: 'easeOutQuad',
  48.         swing: function (x, t, b, c, d) {
  49.                 //alert(jQuery.easing.default);
  50.                 return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
  51.         },
  52.         easeInQuad: function (x, t, b, c, d) {
  53.                 return c*(t/=d)*t + b;
  54.         },
  55.         easeOutQuad: function (x, t, b, c, d) {
  56.                 return -c *(t/=d)*(t-2) + b;
  57.         },
  58.         easeInOutQuad: function (x, t, b, c, d) {
  59.                 if ((t/=d/2) < 1) return c/2*t*t + b;
  60.                 return -c/2 * ((--t)*(t-2) - 1) + b;
  61.         },
  62.         easeInCubic: function (x, t, b, c, d) {
  63.                 return c*(t/=d)*t*t + b;
  64.         },
  65.         easeOutCubic: function (x, t, b, c, d) {
  66.                 return c*((t=t/d-1)*t*t + 1) + b;
  67.         },
  68.         easeInOutCubic: function (x, t, b, c, d) {
  69.                 if ((t/=d/2) < 1) return c/2*t*t*t + b;
  70.                 return c/2*((t-=2)*t*t + 2) + b;
  71.         },
  72.         easeInQuart: function (x, t, b, c, d) {
  73.                 return c*(t/=d)*t*t*t + b;
  74.         },
  75.         easeOutQuart: function (x, t, b, c, d) {
  76.                 return -c * ((t=t/d-1)*t*t*t - 1) + b;
  77.         },
  78.         easeInOutQuart: function (x, t, b, c, d) {
  79.                 if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
  80.                 return -c/2 * ((t-=2)*t*t*t - 2) + b;
  81.         },
  82.         easeInQuint: function (x, t, b, c, d) {
  83.                 return c*(t/=d)*t*t*t*t + b;
  84.         },
  85.         easeOutQuint: function (x, t, b, c, d) {
  86.                 return c*((t=t/d-1)*t*t*t*t + 1) + b;
  87.         },
  88.         easeInOutQuint: function (x, t, b, c, d) {
  89.                 if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
  90.                 return c/2*((t-=2)*t*t*t*t + 2) + b;
  91.         },
  92.         easeInSine: function (x, t, b, c, d) {
  93.                 return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
  94.         },
  95.         easeOutSine: function (x, t, b, c, d) {
  96.                 return c * Math.sin(t/d * (Math.PI/2)) + b;
  97.         },
  98.         easeInOutSine: function (x, t, b, c, d) {
  99.                 return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
  100.         },
  101.         easeInExpo: function (x, t, b, c, d) {
  102.                 return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
  103.         },
  104.         easeOutExpo: function (x, t, b, c, d) {
  105.                 return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
  106.         },
  107.         easeInOutExpo: function (x, t, b, c, d) {
  108.                 if (t==0) return b;
  109.                 if (t==d) return b+c;
  110.                 if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
  111.                 return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
  112.         },
  113.         easeInCirc: function (x, t, b, c, d) {
  114.                 return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
  115.         },
  116.         easeOutCirc: function (x, t, b, c, d) {
  117.                 return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
  118.         },
  119.         easeInOutCirc: function (x, t, b, c, d) {
  120.                 if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
  121.                 return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
  122.         },
  123.         easeInElastic: function (x, t, b, c, d) {
  124.                 var s=1.70158;var p=0;var a=c;
  125.                 if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
  126.                 if (a < Math.abs(c)) { a=c; var s=p/4; }
  127.                 else var s = p/(2*Math.PI) * Math.asin (c/a);
  128.                 return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
  129.         },
  130.         easeOutElastic: function (x, t, b, c, d) {
  131.                 var s=1.70158;var p=0;var a=c;
  132.                 if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
  133.                 if (a < Math.abs(c)) { a=c; var s=p/4; }
  134.                 else var s = p/(2*Math.PI) * Math.asin (c/a);
  135.                 return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
  136.         },
  137.         easeInOutElastic: function (x, t, b, c, d) {
  138.                 var s=1.70158;var p=0;var a=c;
  139.                 if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
  140.                 if (a < Math.abs(c)) { a=c; var s=p/4; }
  141.                 else var s = p/(2*Math.PI) * Math.asin (c/a);
  142.                 if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
  143.                 return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
  144.         },
  145.         easeInBack: function (x, t, b, c, d, s) {
  146.                 if (s == undefined) s = 1.70158;
  147.                 return c*(t/=d)*t*((s+1)*t - s) + b;
  148.         },
  149.         easeOutBack: function (x, t, b, c, d, s) {
  150.                 if (s == undefined) s = 1.70158;
  151.                 return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
  152.         },
  153.         easeInOutBack: function (x, t, b, c, d, s) {
  154.                 if (s == undefined) s = 1.70158;
  155.                 if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
  156.                 return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
  157.         },
  158.         easeInBounce: function (x, t, b, c, d) {
  159.                 return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
  160.         },
  161.         easeOutBounce: function (x, t, b, c, d) {
  162.                 if ((t/=d) < (1/2.75)) {
  163.                         return c*(7.5625*t*t) + b;
  164.                 } else if (t < (2/2.75)) {
  165.                         return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
  166.                 } else if (t < (2.5/2.75)) {
  167.                         return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
  168.                 } else {
  169.                         return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
  170.                 }
  171.         },
  172.         easeInOutBounce: function (x, t, b, c, d) {
  173.                 if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
  174.                 return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
  175.         }
  176. });
  177.  
  178. /*
  179.  *
  180.  * TERMS OF USE - EASING EQUATIONS
  181.  *
  182.  * Open source under the BSD License.
  183.  *
  184.  * Copyright © 2001 Robert Penner
  185.  * All rights reserved.
  186.  *
  187.  * Redistribution and use in source and binary forms, with or without modification,
  188.  * are permitted provided that the following conditions are met:
  189.  *
  190.  * Redistributions of source code must retain the above copyright notice, this list of
  191.  * conditions and the following disclaimer.
  192.  * Redistributions in binary form must reproduce the above copyright notice, this list
  193.  * of conditions and the following disclaimer in the documentation and/or other materials
  194.  * provided with the distribution.
  195.  *
  196.  * Neither the name of the author nor the names of contributors may be used to endorse
  197.  * or promote products derived from this software without specific prior written permission.
  198.  *
  199.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
  200.  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  201.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  202.  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  203.  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  204.  *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  205.  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  206.  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  207.  * OF THE POSSIBILITY OF SUCH DAMAGE.
  208.  *
  209.  */
  210.  
  211.  
  212. /* *** jquery.carousel.min *** */
  213. /* jQuery Carousel 0.9.8
  214. Copyright 2010 Thomas Lanciaux and Pierre Bertet.
  215. This software is licensed under the CC-GNU LGPL <http://creativecommons.org/licenses/LGPL/2.1/>
  216. */
  217. ;(function($){
  218.        
  219.         $.fn.carousel = function(params){
  220.                
  221.                 var params = $.extend({
  222.                         direction: "horizontal",
  223.                         loop: false,
  224.                         dispItems: 1,
  225.                         pagination: false,
  226.                         paginationPosition: "inside",
  227.                         nextBtn: '<input type="button" value="" />',
  228.                         prevBtn: '<input type="button" value="" />',
  229.                         btnsPosition: "inside",
  230.                         nextBtnInsert: "insertAfter",
  231.                         prevBtnInsert: "insertBefore",
  232.                         nextBtnInsertFn: false,
  233.                         prevBtnInsertFn: false,
  234.                         autoSlide: false,
  235.                         autoSlideInterval: 3000,
  236.                         delayAutoSlide: false,
  237.                         combinedClasses: false,
  238.                         effect: "slide",
  239.                         slideEasing: "swing",
  240.                         animSpeed: 300,
  241.                         equalWidths: "true",
  242.                         verticalMargin: 0,
  243.                         callback: function () {},
  244.                         useAddress: false,
  245.                         adressIdentifier: "carousel",
  246.                         tabLabel: function (tabNum) { return tabNum; },
  247.                         showEmptyItems: true,
  248.                         ajaxMode:false,
  249.                         ajaxUrl:"",
  250.                         stopSlideBtn: false,
  251.                         stopSlideTextPause: "Pause",
  252.                         stopSlideTextPlay: "Play"
  253.                 }, params);
  254.                
  255.                 // Buttons position
  256.                 if (params.btnsPosition == "outside"){
  257.                         params.prevBtnInsert = "insertBefore";
  258.                         params.nextBtnInsert = "insertAfter";
  259.                 }
  260.                
  261.                 // Slide delay
  262.                 params.delayAutoSlide = 0 + params.delayAutoSlide;
  263.                
  264.                 return this.each(function(){
  265.                        
  266.                         // Env object
  267.                         var env = {
  268.                                 $elts: {},
  269.                                 params: params,
  270.                                 launchOnLoad: []
  271.                         };
  272.                                        
  273.                         // Carousel main container
  274.                         env.$elts.carousel = $(this).addClass("js");
  275.                        
  276.                         // Carousel content
  277.                         env.$elts.content = $(this).children().css({position: "static", "top": 0});
  278.                        
  279.                         // Content wrapper
  280.                         env.$elts.wrap = env.$elts.content.wrap('<div class="carousel-wrap"></div>').parent().css({overflow: "hidden", position: "relative"});
  281.                         env.$elts.content.wrap('<div class="margin-fixer"></div>');
  282.                        
  283.                         // env.steps object
  284.                         env.steps = {
  285.                                 first: 0, // First step
  286.                                 count: env.$elts.content.children().length // Items count
  287.                         };
  288.                        
  289.                         // Loader
  290.                         env.$elts.loader = $('<div class="loader"></div>').css({'position':'absolute'});
  291.                        
  292.                         // Last visible step
  293.                         env.steps.last = env.steps.count - 1;
  294.                        
  295.                         // Pagination
  296.                         if (env.params.pagination) {
  297.                                 initPagination(env);
  298.                         }
  299.                        
  300.                         // Prev Button
  301.                         if ($.isFunction(env.params.prevBtnInsertFn)) {
  302.                                 env.$elts.prevBtn = env.params.prevBtnInsertFn(env.$elts);
  303.                         } else {
  304.                                 if (params.btnsPosition == "outside"){
  305.                                         env.$elts.prevBtn = $(params.prevBtn)[params.prevBtnInsert](env.$elts.carousel);
  306.                                 } else {
  307.                                         env.$elts.prevBtn = $(params.prevBtn)[params.prevBtnInsert](env.$elts.wrap);
  308.                                 }
  309.                         }
  310.                        
  311.                         // Next Button
  312.                         if ($.isFunction(env.params.nextBtnInsertFn)) {
  313.                                 env.$elts.nextBtn = env.params.nextBtnInsertFn(env.$elts);
  314.                         } else {
  315.                                 if (params.btnsPosition == "outside"){
  316.                                         env.$elts.nextBtn = $(params.nextBtn)[params.nextBtnInsert](env.$elts.carousel);
  317.                                 } else {
  318.                                         env.$elts.nextBtn = $(params.nextBtn)[params.nextBtnInsert](env.$elts.wrap);
  319.                                 }
  320.                         }
  321.                        
  322.                         // Add buttons classes / data
  323.                         env.$elts.nextBtn.addClass("carousel-control next carousel-next");
  324.                         env.$elts.prevBtn.addClass("carousel-control previous carousel-previous");
  325.                        
  326.                         // Last items to load in ajaxMode var
  327.                         env.lastItemsToLoad;
  328.                        
  329.                         // Bind events on next / prev buttons
  330.                         initButtonsEvents(env);
  331.                        
  332.                         // Bind events on focus for keyboard control
  333.                         env.$elts.carousel.attr('tabindex',0).add(env.$elts.carousel.children()).bind({
  334.                                 focus : function(e){
  335.                                         $(document).bind('keypress', function(e){
  336.                                                 switch (e.keyCode) {
  337.                                                         case 39 : env.$elts.nextBtn.click(); break;
  338.                                                         case 37 : env.$elts.prevBtn.click(); break;
  339.                                                 }
  340.                                                 switch (e.charCode) {
  341.                                                         case 110 : env.$elts.nextBtn.click(); break;
  342.                                                         case 112 : env.$elts.prevBtn.click(); break;
  343.                                                 }
  344.                                         });
  345.                                 },
  346.                                 blur : function(){
  347.                                         $(document).unbind('keypress');
  348.                                 }
  349.                         });
  350.                        
  351.                         // Address plugin
  352.                         initAddress(env);
  353.                        
  354.                         // On document load...
  355.                         $(function(){
  356.                                
  357.                                 // Launch carousel initialization
  358.                                 initCarousel(env);
  359.                                
  360.                                 // Launch function added to "document ready" event
  361.                                 $.each(env.launchOnLoad, function(i,fn){
  362.                                         fn();
  363.                                 });
  364.                                
  365.                                 // Launch autoslide
  366.                                 if (env.params.autoSlide){
  367.                                         initAutoSlide(env);
  368.                                 }
  369.                                
  370.                                 // Control Slide Button
  371.                                 if(params.stopSlideBtn == true){
  372.                                         env.$elts.stopSlideBtn = $('<button type="button" class="slide-control play">'+params.stopSlideTextPause+'</button>');
  373.                                         createBtnStopAutoslide(env);
  374.                                 }
  375.                                
  376.                         });
  377.                        
  378.                 });
  379.                
  380.         };
  381.        
  382.         // Init carousel dimensions
  383.         function initCarousel(env){
  384.                 //Set max Height with the highest element
  385.                 var $items = env.$elts.content.children();
  386.                 var $maxHeight = 0;
  387.                
  388.                 $items.each(function () {
  389.                         $item = $(this);
  390.                         $itemHeight = $item.outerHeight();
  391.                         if ($itemHeight > $maxHeight) {
  392.                                 $maxHeight = $itemHeight;
  393.                         }
  394.                 });
  395.                 if (env.params.verticalMargin > 0) {
  396.                         $maxHeight = $maxHeight + env.params.verticalMargin;
  397.                 }
  398.                
  399.                 $items.height($maxHeight);
  400.                 // First item
  401.                 var $firstItem = env.$elts.content.children(":first");
  402.                
  403.                 // Width 1/1 : Get default item width
  404.                 env.itemWidth = $firstItem.outerWidth();
  405.                
  406.                 // Width 2/3 : Define content width
  407.                 if (env.params.direction == "vertical"){
  408.                         env.contentWidth = env.itemWidth;
  409.                        
  410.                 } else {
  411.                        
  412.                         if (env.params.equalWidths) {
  413.                                 env.contentWidth = env.itemWidth * env.steps.count;
  414.                                
  415.                         } else {
  416.                                 env.contentWidth = (function(){
  417.                                                 var totalWidth = 0;
  418.                                                
  419.                                                 env.$elts.content.children().each(function(){
  420.                                                         totalWidth += $(this).outerWidth();
  421.                                                 });
  422.                                                
  423.                                                 return totalWidth;
  424.                                         })();
  425.                         }
  426.                 }
  427.                
  428.                 // Width 3/3 : Set content width to container
  429.                 env.$elts.content.width(env.contentWidth);
  430.                
  431.                 // Height 1/2 : Get default item height
  432.                 env.itemHeight = $maxHeight;
  433.                
  434.                 // Height 2/2 : Set content height to container
  435.                 if (env.params.direction == "vertical") {
  436.                         env.$elts.content.css({
  437.                                 height: env.itemHeight * env.steps.count + "px"
  438.                         });
  439.                         env.$elts.content.parent().css({
  440.                                 height: env.itemHeight * env.params.dispItems + "px"
  441.                         });
  442.                 } else {
  443.                         env.$elts.content.parent().css({
  444.                                 height: env.itemHeight + "px"
  445.                         });
  446.                 }
  447.                
  448.                 // Update Next / Prev buttons state
  449.                 updateButtonsState(env);
  450.         }
  451.        
  452.         // Next / Prev buttons events only
  453.         function initButtonsEvents(env){
  454.        
  455.                 env.$elts.nextBtn.add(env.$elts.prevBtn)
  456.                        
  457.                         .bind("enable", function(){
  458.                                
  459.                                 var $this = $(this)
  460.                                         .unbind("click")
  461.                                         .bind("click", function(){
  462.                                                 // Ajax init
  463.                                                 if(env.params.ajaxMode && $this.is('.next') && getActivePageIndex(env) == (getPageTotal(env)-1) && !env.lastItemsToLoad) {
  464.                                                         // Append content in ajax
  465.                                                         ajaxLoad(env);
  466.                                                         // Go to next page of the carousel
  467.                                                         env.$elts.content.ajaxSuccess(function() {
  468.                                                                                                                        
  469.                                                         });
  470.                                                 }else{                                                 
  471.                                                         goToStep( env, getRelativeStep(env, ($this.is(".next")? "next" : "prev" )) );
  472.                                                        
  473.                                                         if(env.params.stopSlideBtn == true){
  474.                                                                 env.$elts.stopSlideBtn.trigger('pause');
  475.                                                         } else {
  476.                                                                 stopAutoSlide(env);
  477.                                                         }
  478.                                                 }                                              
  479.                                         })
  480.                                         .removeClass("disabled").removeAttr('disabled');
  481.                                
  482.                                 // Combined classes (IE6 compatibility)
  483.                                 if (env.params.combinedClasses) {
  484.                                         $this.removeClass("next-disabled previous-disabled").removeAttr("disabled");
  485.                                 }
  486.                         })
  487.                         .bind("disable", function(){
  488.                                
  489.                                 var $this = $(this).unbind("click").addClass("disabled").attr("disabled","disabled");
  490.                                
  491.                                 // Combined classes (IE6 compatibility)
  492.                                 if (env.params.combinedClasses) {
  493.                                        
  494.                                         if ($this.is(".next")) {
  495.                                                 $this.addClass("next-disabled");
  496.                                                
  497.                                         } else if ($this.is(".previous")) {
  498.                                                 $this.addClass("previous-disabled");
  499.                                                
  500.                                         }
  501.                                 }
  502.                         })
  503.                         .hover(function(){
  504.                                 $(this).toggleClass("hover");
  505.                         });
  506.         };
  507.        
  508.         // Pagination
  509.         function initPagination(env) {
  510.                         env.$elts.pagination = $('<div class="center-wrap"><div class="carousel-pagination"><p></p></div></div>')[((env.params.paginationPosition == "outside") ? "insertAfter" : "appendTo")](env.$elts.carousel).find("p");
  511.                         env.$elts.paginationBtns = $([]);
  512.  
  513.                         env.$elts.content.find("li").each(function (i) {
  514.                                 if (i % env.params.dispItems == 0) {
  515.                                         addPage(env, i);
  516.                                 }
  517.                         });
  518.     };
  519.        
  520.         // Add a page in pagintion (@ the end)
  521.         function addPage(env, firststep) {
  522.                 if(env.params.pagination){
  523.                         env.$elts.paginationBtns = env.$elts.paginationBtns.add($('<a role="button"><span>' + env.params.tabLabel(env.$elts.paginationBtns.length + 1) + '</span></a>').data("firstStep", firststep))
  524.                         .appendTo(env.$elts.pagination);
  525.                         env.$elts.paginationBtns.slice(0, 1).addClass("active");
  526.                         env.$elts.paginationBtns.click(function (e) {
  527.                                 goToStep(env, $(this).data("firstStep"));
  528.                                 if(env.params.stopSlideBtn == true){
  529.                                         env.$elts.stopSlideBtn.trigger('pause');
  530.                                 } else {
  531.                                         stopAutoSlide(env);
  532.                                 }
  533.                         });
  534.                 }
  535.         }
  536.        
  537.         // Address plugin
  538.         function initAddress(env) {
  539.                
  540.                 if (env.params.useAddress && $.isFunction($.fn.address)) {
  541.                        
  542.                         $.address
  543.                                 .init(function(e) {
  544.                                         var pathNames = $.address.pathNames();
  545.                                         if (pathNames[0] === env.params.adressIdentifier && !!pathNames[1]) {
  546.                                                 goToStep(env, pathNames[1]-1);
  547.                                         } else {
  548.                                                 $.address.value('/'+ env.params.adressIdentifier +'/1');
  549.                                         }
  550.                                 })
  551.                                 .change(function(e) {
  552.                                         var pathNames = $.address.pathNames();
  553.                                         if (pathNames[0] === env.params.adressIdentifier && !!pathNames[1]) {
  554.                                                 goToStep(env, pathNames[1]-1);
  555.                                         }
  556.                                 });
  557.                 } else {
  558.                         env.params.useAddress = false;
  559.                 }
  560.         };
  561.        
  562.         function goToStep(env, step) {
  563.                
  564.                 // Callback
  565.                 env.params.callback(step);
  566.                
  567.                 // Launch animation
  568.                 transition(env, step);
  569.                
  570.                 // Update first step
  571.                 env.steps.first = step;
  572.                
  573.                 // Update buttons status
  574.                 updateButtonsState(env);
  575.                
  576.                 // Update address (jQuery Address plugin)
  577.                 if ( env.params.useAddress ) {
  578.                         $.address.value('/'+ env.params.adressIdentifier +'/' + (step + 1));
  579.                 }
  580.                
  581.         };
  582.        
  583.         // Get next/prev step, useful for autoSlide
  584.         function getRelativeStep(env, position) {
  585.                 if (position == "prev") {
  586.                         if (!env.params.showEmptyItems) {
  587.                                 if (env.steps.first == 0) {
  588.                                         return ((env.params.loop) ? (env.steps.count - env.params.dispItems) : false);
  589.                                 } else {
  590.                                         return Math.max(0, env.steps.first - env.params.dispItems);
  591.                                 }
  592.                         } else {
  593.                                 if ((env.steps.first - env.params.dispItems) >= 0) {
  594.                                         return env.steps.first - env.params.dispItems;
  595.                                 } else {
  596.                                         return ((env.params.loop) ? (env.steps.count - env.params.dispItems) : false);
  597.                                 }
  598.                         }
  599.                 } else if (position == "next") {
  600.                         if ((env.steps.first + env.params.dispItems) < env.steps.count) {
  601.                                 if (!env.params.showEmptyItems) {
  602.                                         return Math.min(env.steps.first + env.params.dispItems, env.steps.count - env.params.dispItems);
  603.                                 } else {
  604.                                         return env.steps.first + env.params.dispItems;
  605.                                 }
  606.                         } else {
  607.                                 return ((env.params.loop) ? 0 : false);
  608.                         }
  609.                 }
  610.         };
  611.        
  612.         // Animation
  613.         function transition(env, step) {
  614.                
  615.                 // Effect
  616.                 switch (env.params.effect){
  617.                        
  618.                         // No effect
  619.                         case "no":
  620.                                 if (env.params.direction == "vertical"){
  621.                                         env.$elts.content.css("top", -(env.itemHeight * step) + "px");
  622.                                 } else {
  623.                                         env.$elts.content.css("left", -(env.itemWidth * step) + "px");
  624.                                 }
  625.                                 break;
  626.                        
  627.                         // Fade effect
  628.                         case "fade":
  629.                                 if (env.params.direction == "vertical"){
  630.                                         env.$elts.content.hide().css("top", -(env.itemHeight * step) + "px").fadeIn(env.params.animSpeed);
  631.                                 } else {
  632.                                         env.$elts.content.hide().css("margin-left", -(env.itemWidth * step) + "px").fadeIn(env.params.animSpeed);
  633.                                 }
  634.                                 break;
  635.                        
  636.                         // Slide effect
  637.                         default:
  638.                                 if (env.params.direction == "vertical"){
  639.                                         env.$elts.content.stop().animate({
  640.                                                 top : -(env.itemHeight * step) + "px"
  641.                                         }, env.params.animSpeed, env.params.slideEasing);
  642.                                 } else {
  643.                                         env.$elts.content.stop().animate({
  644.                                                 'margin-left' : -(env.itemWidth * step) + "px"
  645.                                         }, env.params.animSpeed, env.params.slideEasing);
  646.                                 }
  647.                                 break;
  648.                 }
  649.                
  650.         };
  651.        
  652.         // Update all buttons state : disabled or not
  653.         function updateButtonsState(env){
  654.                
  655.                 if (getRelativeStep(env, "prev") !== false) {
  656.                         env.$elts.prevBtn.trigger("enable");
  657.                        
  658.                 } else {
  659.                         env.$elts.prevBtn.trigger("disable");
  660.                 }
  661.                
  662.                 if (getRelativeStep(env, "next") !== false) {
  663.                         env.$elts.nextBtn.trigger("enable");
  664.                        
  665.                 } else {
  666.                         env.$elts.nextBtn.trigger("disable");
  667.                 }
  668.                
  669.                 if (env.params.pagination){
  670.                         env.$elts.paginationBtns.removeClass("active")
  671.                         .filter(function(){                    
  672.                                 return ($(this).data("firstStep") == env.steps.first)
  673.                         })
  674.                         .addClass("active");
  675.                 }
  676.         };     
  677.        
  678.         // Launch Autoslide
  679.         function initAutoSlide(env) {
  680.                 env.delayAutoSlide = window.setTimeout(function(){
  681.                         env.autoSlideInterval = window.setInterval(function(){
  682.                                 goToStep( env, getRelativeStep(env, "next") );
  683.                         }, env.params.autoSlideInterval);
  684.                 }, env.params.delayAutoSlide);
  685.         };
  686.        
  687.         // Stop autoslide
  688.         function stopAutoSlide(env) {
  689.                 window.clearTimeout(env.delayAutoSlide);
  690.                 window.clearInterval(env.autoSlideInterval);
  691.                 env.params.delayAutoSlide = 0;
  692.         };
  693.        
  694.         // Create button "stop autoslide"
  695.         function createBtnStopAutoslide(env){
  696.                 var jButton = env.$elts.stopSlideBtn;
  697.                
  698.                 jButton.bind({
  699.                         'play' : function(){
  700.                                 initAutoSlide(env);
  701.                                 jButton.removeClass('pause').addClass('play').html(env.params.stopSlideTextPause);
  702.                         },
  703.                         'pause' : function(){
  704.                                 stopAutoSlide(env);
  705.                                 jButton.removeClass('play').addClass('pause').html(env.params.stopSlideTextPlay);
  706.                         }
  707.                 });
  708.                
  709.                 jButton.click(function(e){
  710.                         if(jButton.is('.play')){
  711.                                 jButton.trigger('pause');
  712.                         } else if (jButton.is('.pause')){
  713.                                 jButton.trigger('play');
  714.                         }
  715.                 });
  716.                
  717.                 jButton.prependTo(env.$elts.wrap);
  718.         };
  719.        
  720.         // Get total number of page in the carousel
  721.         function getPageTotal(env) {
  722.                 return env.$elts.pagination.children().length;
  723.         };
  724.        
  725.         function getActivePageIndex(env){
  726.                 return env.steps.first/env.params.dispItems;
  727.         }
  728.        
  729.         // Load next page via Ajax
  730.         function ajaxLoad(env) {
  731.                 // insert loader
  732.                 env.$elts.carousel.prepend(env.$elts.loader);
  733.                
  734.                 // ajax call                           
  735.                 $.ajax({
  736.                         url: env.params.ajaxUrl,
  737.                         dataType: 'json',
  738.                         success: function(data) {
  739.                                 // set if the last item of the carousel have been loaded and add items to the carousel
  740.                                 env.lastItemsToLoad = data.bLastItemsToLoad;
  741.                                 $(env.$elts.content).append(data.shtml);
  742.                                
  743.                                 // reinit count (number of items have changed after ajax call)
  744.                                 env.steps = {
  745.                                         first: env.steps.first + env.params.dispItems,
  746.                                         count: env.$elts.content.children().length
  747.                                 };
  748.                                 env.steps.last = env.steps.count - 1;
  749.                                
  750.                                 // rewrite carousel dimensions
  751.                                 initCarousel(env);
  752.                                 // rewrite/append pagination
  753.                                 addPage(env,env.steps.first);
  754.                                
  755.                                 // slide to next page
  756.                                 goToStep( env, env.steps.first );
  757.                                 if(env.params.stopSlideBtn == true){
  758.                                         env.$elts.stopSlideBtn.trigger('pause');
  759.                                 } else {
  760.                                         stopAutoSlide(env);
  761.                                 }
  762.                                
  763.                                 // remove loader
  764.                                 env.$elts.loader.remove();
  765.                         }
  766.                 });            
  767.         }
  768.        
  769. })(jQuery);
  770.  
  771.  /* *** jquery.tipsy.js *** */
  772.  // tipsy, facebook style tooltips for jquery
  773. // version 1.0.0a
  774. // (c) 2008-2010 jason frame [[email protected]]
  775. // released under the MIT license
  776.  
  777. (function($) {
  778.    
  779.     function maybeCall(thing, ctx) {
  780.         return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
  781.     };
  782.    
  783.     function Tipsy(element, options) {
  784.         this.$element = $(element);
  785.         this.options = options;
  786.         this.enabled = true;
  787.         this.fixTitle();
  788.     };
  789.    
  790.     Tipsy.prototype = {
  791.         show: function() {
  792.             var title = this.getTitle();
  793.             if (title && this.enabled) {
  794.                 var $tip = this.tip();
  795.                
  796.                 $tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);
  797.                 $tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity
  798.                 $tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).prependTo(document.body);
  799.                
  800.                 var pos = $.extend({}, this.$element.offset(), {
  801.                     width: this.$element[0].offsetWidth,
  802.                     height: this.$element[0].offsetHeight
  803.                 });
  804.                
  805.                 var actualWidth = $tip[0].offsetWidth,
  806.                     actualHeight = $tip[0].offsetHeight,
  807.                     gravity = maybeCall(this.options.gravity, this.$element[0]);
  808.                
  809.                 var tp;
  810.                 switch (gravity.charAt(0)) {
  811.                     case 'n':
  812.                         tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
  813.                         break;
  814.                     case 's':
  815.                         tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
  816.                         break;
  817.                     case 'e':
  818.                         tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
  819.                         break;
  820.                     case 'w':
  821.                         tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
  822.                         break;
  823.                 }
  824.                
  825.                 if (gravity.length == 2) {
  826.                     if (gravity.charAt(1) == 'w') {
  827.                         tp.left = pos.left + pos.width / 2 - 15;
  828.                     } else {
  829.                         tp.left = pos.left + pos.width / 2 - actualWidth + 15;
  830.                     }
  831.                 }
  832.                
  833.                 $tip.css(tp).addClass('tipsy-' + gravity);
  834.                 $tip.find('.tipsy-arrow')[0].className = 'tipsy-arrow tipsy-arrow-' + gravity.charAt(0);
  835.                 if (this.options.className) {
  836.                     $tip.addClass(maybeCall(this.options.className, this.$element[0]));
  837.                 }
  838.                
  839.                 if (this.options.fade) {
  840.                     $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity});
  841.                 } else {
  842.                     $tip.css({visibility: 'visible', opacity: this.options.opacity});
  843.                 }
  844.             }
  845.         },
  846.        
  847.         hide: function() {
  848.             if (this.options.fade) {
  849.                 this.tip().stop().fadeOut(function() { $(this).remove(); });
  850.             } else {
  851.                 this.tip().remove();
  852.             }
  853.         },
  854.        
  855.         fixTitle: function() {
  856.             var $e = this.$element;
  857.             if ($e.attr('title') || typeof($e.attr('original-title')) != 'string') {
  858.                 $e.attr('original-title', $e.attr('title') || '').removeAttr('title');
  859.             }
  860.         },
  861.        
  862.         getTitle: function() {
  863.             var title, $e = this.$element, o = this.options;
  864.             this.fixTitle();
  865.             var title, o = this.options;
  866.             if (typeof o.title == 'string') {
  867.                 title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
  868.             } else if (typeof o.title == 'function') {
  869.                 title = o.title.call($e[0]);
  870.             }
  871.             title = ('' + title).replace(/(^\s*|\s*$)/, "");
  872.             return title || o.fallback;
  873.         },
  874.        
  875.         tip: function() {
  876.             if (!this.$tip) {
  877.                 this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>');
  878.             }
  879.             return this.$tip;
  880.         },
  881.        
  882.         validate: function() {
  883.             if (!this.$element[0].parentNode) {
  884.                 this.hide();
  885.                 this.$element = null;
  886.                 this.options = null;
  887.             }
  888.         },
  889.        
  890.         enable: function() { this.enabled = true; },
  891.         disable: function() { this.enabled = false; },
  892.         toggleEnabled: function() { this.enabled = !this.enabled; }
  893.     };
  894.    
  895.     $.fn.tipsy = function(options) {
  896.        
  897.         if (options === true) {
  898.             return this.data('tipsy');
  899.         } else if (typeof options == 'string') {
  900.             var tipsy = this.data('tipsy');
  901.             if (tipsy) tipsy[options]();
  902.             return this;
  903.         }
  904.        
  905.         options = $.extend({}, $.fn.tipsy.defaults, options);
  906.        
  907.         function get(ele) {
  908.             var tipsy = $.data(ele, 'tipsy');
  909.             if (!tipsy) {
  910.                 tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
  911.                 $.data(ele, 'tipsy', tipsy);
  912.             }
  913.             return tipsy;
  914.         }
  915.        
  916.         function enter() {
  917.             var tipsy = get(this);
  918.             tipsy.hoverState = 'in';
  919.             if (options.delayIn == 0) {
  920.                 tipsy.show();
  921.             } else {
  922.                 tipsy.fixTitle();
  923.                 setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);
  924.             }
  925.         };
  926.        
  927.         function leave() {
  928.             var tipsy = get(this);
  929.             tipsy.hoverState = 'out';
  930.             if (options.delayOut == 0) {
  931.                 tipsy.hide();
  932.             } else {
  933.                 setTimeout(function() { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);
  934.             }
  935.         };
  936.        
  937.         if (!options.live) this.each(function() { get(this); });
  938.        
  939.         if (options.trigger != 'manual') {
  940.             var binder   = options.live ? 'live' : 'bind',
  941.                 eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',
  942.                 eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
  943.             this[binder](eventIn, enter)[binder](eventOut, leave);
  944.         }
  945.        
  946.         return this;
  947.        
  948.     };
  949.    
  950.     $.fn.tipsy.defaults = {
  951.         className: null,
  952.         delayIn: 0,
  953.         delayOut: 0,
  954.         fade: false,
  955.         fallback: '',
  956.         gravity: 'n',
  957.         html: false,
  958.         live: false,
  959.         offset: 0,
  960.         opacity: 1,
  961.         title: 'title',
  962.         trigger: 'hover'
  963.     };
  964.    
  965.     // Overwrite this method to provide options on a per-element basis.
  966.     // For example, you could store the gravity in a 'tipsy-gravity' attribute:
  967.     // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });
  968.     // (remember - do not modify 'options' in place!)
  969.     $.fn.tipsy.elementOptions = function(ele, options) {
  970.         return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
  971.     };
  972.    
  973.     $.fn.tipsy.autoNS = function() {
  974.         return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
  975.     };
  976.    
  977.     $.fn.tipsy.autoWE = function() {
  978.         return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
  979.     };
  980.    
  981.     /**
  982.      * yields a closure of the supplied parameters, producing a function that takes
  983.      * no arguments and is suitable for use as an autogravity function like so:
  984.      *
  985.      * @param margin (int) - distance from the viewable region edge that an
  986.      *        element should be before setting its tooltip's gravity to be away
  987.      *        from that edge.
  988.      * @param prefer (string, e.g. 'n', 'sw', 'w') - the direction to prefer
  989.      *        if there are no viewable region edges effecting the tooltip's
  990.      *        gravity. It will try to vary from this minimally, for example,
  991.      *        if 'sw' is preferred and an element is near the right viewable
  992.      *        region edge, but not the top edge, it will set the gravity for
  993.      *        that element's tooltip to be 'se', preserving the southern
  994.      *        component.
  995.      */
  996.      $.fn.tipsy.autoBounds = function(margin, prefer) {
  997.                 return function() {
  998.                         var dir = {ns: prefer[0], ew: (prefer.length > 1 ? prefer[1] : false)},
  999.                             boundTop = $(document).scrollTop() + margin,
  1000.                             boundLeft = $(document).scrollLeft() + margin,
  1001.                             $this = $(this);
  1002.  
  1003.                         if ($this.offset().top < boundTop) dir.ns = 'n';
  1004.                         if ($this.offset().left < boundLeft) dir.ew = 'w';
  1005.                         if ($(window).width() + $(document).scrollLeft() - $this.offset().left < margin) dir.ew = 'e';
  1006.                         if ($(window).height() + $(document).scrollTop() - $this.offset().top < margin) dir.ns = 's';
  1007.  
  1008.                         return dir.ns + (dir.ew ? dir.ew : '');
  1009.                 }
  1010.         };
  1011.    
  1012. })(jQuery);
  1013.  
  1014.  
  1015. /* *** jquery.prettyPhoto.js *** */
  1016. /* ------------------------------------------------------------------------
  1017.         Class: prettyPhoto
  1018.         Use: Lightbox clone for jQuery
  1019.         Author: Stephane Caron (http://www.no-margin-for-errors.com)
  1020.         Version: 3.1.4
  1021. ------------------------------------------------------------------------- */
  1022. (function($) {
  1023.         $.prettyPhoto = {version: '3.1.4'};
  1024.        
  1025.         $.fn.prettyPhoto = function(pp_settings) {
  1026.                 pp_settings = jQuery.extend({
  1027.                         hook: 'rel', /* the attribute tag to use for prettyPhoto hooks. default: 'rel'. For HTML5, use "data-rel" or similar. */
  1028.                         animation_speed: 'fast', /* fast/slow/normal */
  1029.                         ajaxcallback: function() {},
  1030.                         slideshow: 5000, /* false OR interval time in ms */
  1031.                         autoplay_slideshow: false, /* true/false */
  1032.                         opacity: 0.80, /* Value between 0 and 1 */
  1033.                         show_title: true, /* true/false */
  1034.                         allow_resize: true, /* Resize the photos bigger than viewport. true/false */
  1035.                         allow_expand: true, /* Allow the user to expand a resized image. true/false */
  1036.                         default_width: 500,
  1037.                         default_height: 344,
  1038.                         counter_separator_label: '/', /* The separator for the gallery counter 1 "of" 2 */
  1039.                         theme: 'pp_default', /* light_rounded / dark_rounded / light_square / dark_square / facebook */
  1040.                         horizontal_padding: 20, /* The padding on each side of the picture */
  1041.                         hideflash: false, /* Hides all the flash object on a page, set to TRUE if flash appears over prettyPhoto */
  1042.                         wmode: 'opaque', /* Set the flash wmode attribute */
  1043.                         autoplay: true, /* Automatically start videos: True/False */
  1044.                         modal: false, /* If set to true, only the close button will close the window */
  1045.                         deeplinking: true, /* Allow prettyPhoto to update the url to enable deeplinking. */
  1046.                         overlay_gallery: true, /* If set to true, a gallery will overlay the fullscreen image on mouse over */
  1047.                         overlay_gallery_max: 3000, /* Maximum number of pictures in the overlay gallery */
  1048.                         keyboard_shortcuts: true, /* Set to false if you open forms inside prettyPhoto */
  1049.                         changepicturecallback: function(){}, /* Called everytime an item is shown/changed */
  1050.                         callback: function(){}, /* Called when prettyPhoto is closed */
  1051.                         ie6_fallback: true,
  1052.                         markup: '<div class="pp_pic_holder"> \
  1053.                                                 <div class="ppt">&nbsp;</div> \
  1054.                                                 <div class="pp_top"> \
  1055.                                                         <div class="pp_left"></div> \
  1056.                                                         <div class="pp_middle"></div> \
  1057.                                                         <div class="pp_right"></div> \
  1058.                                                 </div> \
  1059.                                                 <div class="pp_content_container"> \
  1060.                                                         <div class="pp_left"> \
  1061.                                                         <div class="pp_right"> \
  1062.                                                                 <div class="pp_content"> \
  1063.                                                                         <div class="pp_loaderIcon"></div> \
  1064.                                                                         <div class="pp_fade"> \
  1065.                                                                                 <a href="#" class="pp_expand" title="Expand the image">Expand</a> \
  1066.                                                                                 <div class="pp_hoverContainer"> \
  1067.                                                                                         <a class="pp_next" href="#">next</a> \
  1068.                                                                                         <a class="pp_previous" href="#">previous</a> \
  1069.                                                                                 </div> \
  1070.                                                                                 <div id="pp_full_res"></div> \
  1071.                                                                                 <div class="pp_details"> \
  1072.                                                                                         <div class="pp_nav"> \
  1073.                                                                                                 <a href="#" class="pp_arrow_previous">Previous</a> \
  1074.                                                                                                 <p class="currentTextHolder">0/0</p> \
  1075.                                                                                                 <a href="#" class="pp_arrow_next">Next</a> \
  1076.                                                                                         </div> \
  1077.                                                                                         <p class="pp_description"></p> \
  1078.                                                                                         <div class="pp_social">{pp_social}</div> \
  1079.                                                                                         <a class="pp_close" href="#">Close</a> \
  1080.                                                                                 </div> \
  1081.                                                                         </div> \
  1082.                                                                 </div> \
  1083.                                                         </div> \
  1084.                                                         </div> \
  1085.                                                 </div> \
  1086.                                                 <div class="pp_bottom"> \
  1087.                                                         <div class="pp_left"></div> \
  1088.                                                         <div class="pp_middle"></div> \
  1089.                                                         <div class="pp_right"></div> \
  1090.                                                 </div> \
  1091.                                         </div> \
  1092.                                         <div class="pp_overlay"></div>',
  1093.                         gallery_markup: '<div class="pp_gallery"> \
  1094.                                                                 <a href="#" class="pp_arrow_previous">Previous</a> \
  1095.                                                                 <div> \
  1096.                                                                         <ul> \
  1097.                                                                                 {gallery} \
  1098.                                                                         </ul> \
  1099.                                                                 </div> \
  1100.                                                                 <a href="#" class="pp_arrow_next">Next</a> \
  1101.                                                         </div>',
  1102.                         image_markup: '<img id="fullResImage" src="{path}" />',
  1103.                         flash_markup: '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="{width}" height="{height}"><param name="wmode" value="{wmode}" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="{path}" /><embed src="{path}" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="{width}" height="{height}" wmode="{wmode}"></embed></object>',
  1104.                         quicktime_markup: '<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" height="{height}" width="{width}"><param name="src" value="{path}"><param name="autoplay" value="{autoplay}"><param name="type" value="video/quicktime"><embed src="{path}" height="{height}" width="{width}" autoplay="{autoplay}" type="video/quicktime" pluginspage="http://www.apple.com/quicktime/download/"></embed></object>',
  1105.                         iframe_markup: '<iframe src ="{path}" width="{width}" height="{height}" frameborder="no"></iframe>',
  1106.                         inline_markup: '<div class="pp_inline">{content}</div>',
  1107.                         custom_markup: '',
  1108.                         social_tools: '<div class="twitter"><a href="http://twitter.com/share" class="twitter-share-button" data-count="none">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="facebook"><iframe src="//www.facebook.com/plugins/like.php?locale=en_US&href={location_href}&amp;layout=button_count&amp;show_faces=true&amp;width=500&amp;action=like&amp;font&amp;colorscheme=light&amp;height=23" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:23px;" allowTransparency="true"></iframe></div>' /* html or false to disable */
  1109.                 }, pp_settings);
  1110.                
  1111.                 // Global variables accessible only by prettyPhoto
  1112.                 var matchedObjects = this, percentBased = false, pp_dimensions, pp_open,
  1113.                
  1114.                 // prettyPhoto container specific
  1115.                 pp_contentHeight, pp_contentWidth, pp_containerHeight, pp_containerWidth,
  1116.                
  1117.                 // Window size
  1118.                 windowHeight = $(window).height(), windowWidth = $(window).width(),
  1119.  
  1120.                 // Global elements
  1121.                 pp_slideshow;
  1122.                
  1123.                 doresize = true, scroll_pos = _get_scroll();
  1124.        
  1125.                 // Window/Keyboard events
  1126.                 $(window).unbind('resize.prettyphoto').bind('resize.prettyphoto',function(){ _center_overlay(); _resize_overlay(); });
  1127.                
  1128.                 if(pp_settings.keyboard_shortcuts) {
  1129.                         $(document).unbind('keydown.prettyphoto').bind('keydown.prettyphoto',function(e){
  1130.                                 if(typeof $pp_pic_holder != 'undefined'){
  1131.                                         if($pp_pic_holder.is(':visible')){
  1132.                                                 switch(e.keyCode){
  1133.                                                         case 37:
  1134.                                                                 $.prettyPhoto.changePage('previous');
  1135.                                                                 e.preventDefault();
  1136.                                                                 break;
  1137.                                                         case 39:
  1138.                                                                 $.prettyPhoto.changePage('next');
  1139.                                                                 e.preventDefault();
  1140.                                                                 break;
  1141.                                                         case 27:
  1142.                                                                 if(!settings.modal)
  1143.                                                                 $.prettyPhoto.close();
  1144.                                                                 e.preventDefault();
  1145.                                                                 break;
  1146.                                                 };
  1147.                                                 // return false;
  1148.                                         };
  1149.                                 };
  1150.                         });
  1151.                 };
  1152.                
  1153.                 /**
  1154.                 * Initialize prettyPhoto.
  1155.                 */
  1156.                 $.prettyPhoto.initialize = function() {
  1157.                        
  1158.                         settings = pp_settings;
  1159.                         var deviceAgent = navigator.userAgent.toLowerCase();
  1160.                         var agentID = deviceAgent.match(/(iphone|ipod|ipad)/);                                             
  1161.                         if (agentID) {         
  1162.                                 settings.overlay_gallery_max = 0;
  1163.                         }      
  1164.                        
  1165.                         if(settings.theme == 'pp_default') settings.horizontal_padding = 16;
  1166.                         if(settings.ie6_fallback && $.browser.msie && parseInt($.browser.version) == 6) settings.theme = "light_square"; // Fallback to a supported theme for IE6
  1167.                        
  1168.                         // Find out if the picture is part of a set
  1169.                         theRel = $(this).attr(settings.hook);
  1170.                         galleryRegExp = /\[(?:.*)\]/;
  1171.                         isSet = (galleryRegExp.exec(theRel)) ? true : false;
  1172.                        
  1173.                         // Put the SRCs, TITLEs, ALTs into an array.
  1174.                         pp_images = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr(settings.hook).indexOf(theRel) != -1) return $(n).attr('href'); }) : $.makeArray($(this).attr('href'));
  1175.                         pp_titles = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr(settings.hook).indexOf(theRel) != -1) return ($(n).find('img').attr('alt')) ? $(n).find('img').attr('alt') : ""; }) : $.makeArray($(this).find('img').attr('alt'));
  1176.                         pp_descriptions = (isSet) ? jQuery.map(matchedObjects, function(n, i){ if($(n).attr(settings.hook).indexOf(theRel) != -1) return ($(n).attr('title')) ? $(n).attr('title') : ""; }) : $.makeArray($(this).attr('title'));
  1177.                        
  1178.                         if(pp_images.length > settings.overlay_gallery_max) settings.overlay_gallery = false;
  1179.                        
  1180.                         set_position = jQuery.inArray($(this).attr('href'), pp_images); // Define where in the array the clicked item is positionned
  1181.                         rel_index = (isSet) ? set_position : $("a["+settings.hook+"^='"+theRel+"']").index($(this));
  1182.                        
  1183.                         _build_overlay(this); // Build the overlay {this} being the caller
  1184.                        
  1185.                         if(settings.allow_resize)
  1186.                                 $(window).bind('scroll.prettyphoto',function(){ _center_overlay(); });
  1187.                        
  1188.                        
  1189.                         $.prettyPhoto.open();
  1190.                        
  1191.                         return false;
  1192.                 }
  1193.  
  1194.  
  1195.                 /**
  1196.                 * Opens the prettyPhoto modal box.
  1197.                 * @param image {String,Array} Full path to the image to be open, can also be an array containing full images paths.
  1198.                 * @param title {String,Array} The title to be displayed with the picture, can also be an array containing all the titles.
  1199.                 * @param description {String,Array} The description to be displayed with the picture, can also be an array containing all the descriptions.
  1200.                 */
  1201.                 $.prettyPhoto.open = function(event) {
  1202.                         if(typeof settings == "undefined"){ // Means it's an API call, need to manually get the settings and set the variables
  1203.                                 settings = pp_settings;
  1204.                                 if($.browser.msie && $.browser.version == 6) settings.theme = "light_square"; // Fallback to a supported theme for IE6
  1205.                                 pp_images = $.makeArray(arguments[0]);
  1206.                                 pp_titles = (arguments[1]) ? $.makeArray(arguments[1]) : $.makeArray("");
  1207.                                 pp_descriptions = (arguments[2]) ? $.makeArray(arguments[2]) : $.makeArray("");
  1208.                                 isSet = (pp_images.length > 1) ? true : false;
  1209.                                 set_position = (arguments[3])? arguments[3]: 0;
  1210.                                 _build_overlay(event.target); // Build the overlay {this} being the caller
  1211.                         }
  1212.  
  1213.                         if($.browser.msie && $.browser.version == 6) $('select').css('visibility','hidden'); // To fix the bug with IE select boxes
  1214.                        
  1215.                         if(settings.hideflash) $('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','hidden'); // Hide the flash
  1216.  
  1217.                         _checkPosition($(pp_images).size()); // Hide the next/previous links if on first or last images.
  1218.                
  1219.                         $('.pp_loaderIcon').show();
  1220.                
  1221.                         if(settings.deeplinking)
  1222.                                 setHashtag();
  1223.                
  1224.                         // Rebuild Facebook Like Button with updated href
  1225.                         if(settings.social_tools){
  1226.                                 facebook_like_link = settings.social_tools.replace('{location_href}', encodeURIComponent(location.href));
  1227.                                 $pp_pic_holder.find('.pp_social').html(facebook_like_link);
  1228.                         }
  1229.                        
  1230.                         // Fade the content in
  1231.                         if($ppt.is(':hidden')) $ppt.css('opacity',0).show();
  1232.                         $pp_overlay.show().fadeTo(settings.animation_speed,settings.opacity);
  1233.  
  1234.                         // Display the current position
  1235.                         $pp_pic_holder.find('.currentTextHolder').text((set_position+1) + settings.counter_separator_label + $(pp_images).size());
  1236.  
  1237.                         // Set the description
  1238.                         if(typeof pp_descriptions[set_position] != 'undefined' && pp_descriptions[set_position] != ""){
  1239.                                 $pp_pic_holder.find('.pp_description').show().html(unescape(pp_descriptions[set_position]));
  1240.                         }else{
  1241.                                 $pp_pic_holder.find('.pp_description').hide();
  1242.                         }
  1243.                        
  1244.                         // Get the dimensions
  1245.                         movie_width = ( parseFloat(getParam('width',pp_images[set_position])) ) ? getParam('width',pp_images[set_position]) : settings.default_width.toString();
  1246.                         movie_height = ( parseFloat(getParam('height',pp_images[set_position])) ) ? getParam('height',pp_images[set_position]) : settings.default_height.toString();
  1247.                        
  1248.                         // If the size is % based, calculate according to window dimensions
  1249.                         percentBased=false;
  1250.                         if(movie_height.indexOf('%') != -1) { movie_height = parseFloat(($(window).height() * parseFloat(movie_height) / 100) - 150); percentBased = true; }
  1251.                         if(movie_width.indexOf('%') != -1) { movie_width = parseFloat(($(window).width() * parseFloat(movie_width) / 100) - 150); percentBased = true; }
  1252.                        
  1253.                         // Fade the holder
  1254.                         $pp_pic_holder.fadeIn(function(){
  1255.                                 // Set the title
  1256.                                 (settings.show_title && pp_titles[set_position] != "" && typeof pp_titles[set_position] != "undefined") ? $ppt.html(unescape(pp_titles[set_position])) : $ppt.html('&nbsp;');
  1257.                                
  1258.                                 imgPreloader = "";
  1259.                                 skipInjection = false;
  1260.                                
  1261.                                 // Inject the proper content
  1262.                                 switch(_getFileType(pp_images[set_position])){
  1263.                                         case 'image':
  1264.                                                 imgPreloader = new Image();
  1265.  
  1266.                                                 // Preload the neighbour images
  1267.                                                 nextImage = new Image();
  1268.                                                 if(isSet && set_position < $(pp_images).size() -1) nextImage.src = pp_images[set_position + 1];
  1269.                                                 prevImage = new Image();
  1270.                                                 if(isSet && pp_images[set_position - 1]) prevImage.src = pp_images[set_position - 1];
  1271.  
  1272.                                                 $pp_pic_holder.find('#pp_full_res')[0].innerHTML = settings.image_markup.replace(/{path}/g,pp_images[set_position]);
  1273.  
  1274.                                                 imgPreloader.onload = function(){
  1275.                                                         // Fit item to viewport
  1276.                                                         pp_dimensions = _fitToViewport(imgPreloader.width,imgPreloader.height);
  1277.  
  1278.                                                         _showContent();
  1279.                                                 };
  1280.  
  1281.                                                 imgPreloader.onerror = function(){
  1282.                                                         alert('Image cannot be loaded. Make sure the path is correct and image exist.');
  1283.                                                         $.prettyPhoto.close();
  1284.                                                 };
  1285.                                        
  1286.                                                 imgPreloader.src = pp_images[set_position];
  1287.                                         break;
  1288.                                
  1289.                                         case 'youtube':
  1290.                                                 pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
  1291.                                                
  1292.                                                 // Regular youtube link
  1293.                                                 movie_id = getParam('v',pp_images[set_position]);
  1294.                                                
  1295.                                                 // youtu.be link
  1296.                                                 if(movie_id == ""){
  1297.                                                         movie_id = pp_images[set_position].split('youtu.be/index.html');
  1298.                                                         movie_id = movie_id[1];
  1299.                                                         if(movie_id.indexOf('?') > 0)
  1300.                                                                 movie_id = movie_id.substr(0,movie_id.indexOf('?')); // Strip anything after the ?
  1301.  
  1302.                                                         if(movie_id.indexOf('&') > 0)
  1303.                                                                 movie_id = movie_id.substr(0,movie_id.indexOf('&')); // Strip anything after the &
  1304.                                                 }
  1305.  
  1306.                                                 movie = 'http://www.youtube.com/embed/'+movie_id;
  1307.                                                 (getParam('rel',pp_images[set_position])) ? movie+="?rel="+getParam('rel',pp_images[set_position]) : movie+="?rel=1";
  1308.                                                        
  1309.                                                 if(settings.autoplay) movie += "&autoplay=1";
  1310.                                        
  1311.                                                 toInject = settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie);
  1312.                                         break;
  1313.                                
  1314.                                         case 'vimeo':
  1315.                                                 pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
  1316.                                        
  1317.                                                 movie_id = pp_images[set_position];
  1318.                                                 var regExp = /http:\/\/(www\.)?vimeo.com\/(\d+)/;
  1319.                                                 var match = movie_id.match(regExp);
  1320.                                                
  1321.                                                 movie = 'http://player.vimeo.com/video/'+ match[2] +'?title=0&amp;byline=0&amp;portrait=0';
  1322.                                                 if(settings.autoplay) movie += "&autoplay=1;";
  1323.                                
  1324.                                                 vimeo_width = pp_dimensions['width'] + '/embed/?moog_width='+ pp_dimensions['width'];
  1325.                                
  1326.                                                 toInject = settings.iframe_markup.replace(/{width}/g,vimeo_width).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,movie);
  1327.                                         break;
  1328.                                
  1329.                                         case 'quicktime':
  1330.                                                 pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
  1331.                                                 pp_dimensions['height']+=15; pp_dimensions['contentHeight']+=15; pp_dimensions['containerHeight']+=15; // Add space for the control bar
  1332.                                
  1333.                                                 toInject = settings.quicktime_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,pp_images[set_position]).replace(/{autoplay}/g,settings.autoplay);
  1334.                                         break;
  1335.                                
  1336.                                         case 'flash':
  1337.                                                 pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
  1338.                                        
  1339.                                                 flash_vars = pp_images[set_position];
  1340.                                                 flash_vars = flash_vars.substring(pp_images[set_position].indexOf('flashvars') + 10,pp_images[set_position].length);
  1341.  
  1342.                                                 filename = pp_images[set_position];
  1343.                                                 filename = filename.substring(0,filename.indexOf('?'));
  1344.                                        
  1345.                                                 toInject =  settings.flash_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,filename+'?'+flash_vars);
  1346.                                         break;
  1347.                                
  1348.                                         case 'iframe':
  1349.                                                 pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
  1350.                                
  1351.                                                 frame_url = pp_images[set_position];
  1352.                                                 frame_url = frame_url.substr(0,frame_url.indexOf('iframe')-1);
  1353.  
  1354.                                                 toInject = settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,frame_url);
  1355.                                         break;
  1356.                                        
  1357.                                         case 'ajax':
  1358.                                                 doresize = false; // Make sure the dimensions are not resized.
  1359.                                                 pp_dimensions = _fitToViewport(movie_width,movie_height);
  1360.                                                 doresize = true; // Reset the dimensions
  1361.                                        
  1362.                                                 skipInjection = true;
  1363.                                                 $.get(pp_images[set_position],function(responseHTML){
  1364.                                                         toInject = settings.inline_markup.replace(/{content}/g,responseHTML);
  1365.                                                         $pp_pic_holder.find('#pp_full_res')[0].innerHTML = toInject;
  1366.                                                         _showContent();
  1367.                                                 });
  1368.                                                
  1369.                                         break;
  1370.                                        
  1371.                                         case 'custom':
  1372.                                                 pp_dimensions = _fitToViewport(movie_width,movie_height); // Fit item to viewport
  1373.                                        
  1374.                                                 toInject = settings.custom_markup;
  1375.                                         break;
  1376.                                
  1377.                                         case 'inline':
  1378.                                                 // to get the item height clone it, apply default width, wrap it in the prettyPhoto containers , then delete
  1379.                                                 myClone = $(pp_images[set_position]).clone().append('<br clear="all" />').css({'width':settings.default_width}).wrapInner('<div id="pp_full_res"><div class="pp_inline"></div></div>').appendTo($('body')).show();
  1380.                                                 doresize = false; // Make sure the dimensions are not resized.
  1381.                                                 pp_dimensions = _fitToViewport($(myClone).width(),$(myClone).height());
  1382.                                                 doresize = true; // Reset the dimensions
  1383.                                                 $(myClone).remove();
  1384.                                                 toInject = settings.inline_markup.replace(/{content}/g,$(pp_images[set_position]).html());
  1385.                                         break;
  1386.                                 };
  1387.  
  1388.                                 if(!imgPreloader && !skipInjection){
  1389.                                         $pp_pic_holder.find('#pp_full_res')[0].innerHTML = toInject;
  1390.                                
  1391.                                         // Show content
  1392.                                         _showContent();
  1393.                                 };
  1394.                         });
  1395.  
  1396.                         return false;
  1397.                 };
  1398.  
  1399.        
  1400.                 /**
  1401.                 * Change page in the prettyPhoto modal box
  1402.                 * @param direction {String} Direction of the paging, previous or next.
  1403.                 */
  1404.                 $.prettyPhoto.changePage = function(direction){
  1405.                         currentGalleryPage = 0;
  1406.                        
  1407.                         if(direction == 'previous') {
  1408.                                 set_position--;
  1409.                                 if (set_position < 0) set_position = $(pp_images).size()-1;
  1410.                         }else if(direction == 'next'){
  1411.                                 set_position++;
  1412.                                 if(set_position > $(pp_images).size()-1) set_position = 0;
  1413.                         }else{
  1414.                                 set_position=direction;
  1415.                         };
  1416.                        
  1417.                         rel_index = set_position;
  1418.  
  1419.                         if(!doresize) doresize = true; // Allow the resizing of the images
  1420.                         if(settings.allow_expand) {
  1421.                                 $('.pp_contract').removeClass('pp_contract').addClass('pp_expand');
  1422.                         }
  1423.  
  1424.                         _hideContent(function(){ $.prettyPhoto.open(); });
  1425.                 };
  1426.  
  1427.  
  1428.                 /**
  1429.                 * Change gallery page in the prettyPhoto modal box
  1430.                 * @param direction {String} Direction of the paging, previous or next.
  1431.                 */
  1432.                 $.prettyPhoto.changeGalleryPage = function(direction){
  1433.                         if(direction=='next'){
  1434.                                 currentGalleryPage ++;
  1435.  
  1436.                                 if(currentGalleryPage > totalPage) currentGalleryPage = 0;
  1437.                         }else if(direction=='previous'){
  1438.                                 currentGalleryPage --;
  1439.  
  1440.                                 if(currentGalleryPage < 0) currentGalleryPage = totalPage;
  1441.                         }else{
  1442.                                 currentGalleryPage = direction;
  1443.                         };
  1444.                        
  1445.                         slide_speed = (direction == 'next' || direction == 'previous') ? settings.animation_speed : 0;
  1446.  
  1447.                         slide_to = currentGalleryPage * (itemsPerPage * itemWidth);
  1448.  
  1449.                         $pp_gallery.find('ul').animate({left:-slide_to},slide_speed);
  1450.                 };
  1451.  
  1452.  
  1453.                 /**
  1454.                 * Start the slideshow...
  1455.                 */
  1456.                 $.prettyPhoto.startSlideshow = function(){
  1457.                         if(typeof pp_slideshow == 'undefined'){
  1458.                                 $pp_pic_holder.find('.pp_play').unbind('click').removeClass('pp_play').addClass('pp_pause').click(function(){
  1459.                                         $.prettyPhoto.stopSlideshow();
  1460.                                         return false;
  1461.                                 });
  1462.                                 pp_slideshow = setInterval($.prettyPhoto.startSlideshow,settings.slideshow);
  1463.                         }else{
  1464.                                 $.prettyPhoto.changePage('next');      
  1465.                         };
  1466.                 }
  1467.  
  1468.  
  1469.                 /**
  1470.                 * Stop the slideshow...
  1471.                 */
  1472.                 $.prettyPhoto.stopSlideshow = function(){
  1473.                         $pp_pic_holder.find('.pp_pause').unbind('click').removeClass('pp_pause').addClass('pp_play').click(function(){
  1474.                                 $.prettyPhoto.startSlideshow();
  1475.                                 return false;
  1476.                         });
  1477.                         clearInterval(pp_slideshow);
  1478.                         pp_slideshow=undefined;
  1479.                 }
  1480.  
  1481.  
  1482.                 /**
  1483.                 * Closes prettyPhoto.
  1484.                 */
  1485.                 $.prettyPhoto.close = function(){
  1486.                         if($pp_overlay.is(":animated")) return;
  1487.                        
  1488.                         $.prettyPhoto.stopSlideshow();
  1489.                        
  1490.                         $pp_pic_holder.stop().find('object,embed').css('visibility','hidden');
  1491.                        
  1492.                         $('div.pp_pic_holder,div.ppt,.pp_fade').fadeOut(settings.animation_speed,function(){ $(this).remove(); });
  1493.                        
  1494.                         $pp_overlay.fadeOut(settings.animation_speed, function(){
  1495.                                 if($.browser.msie && $.browser.version == 6) $('select').css('visibility','visible'); // To fix the bug with IE select boxes
  1496.                                
  1497.                                 if(settings.hideflash) $('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','visible'); // Show the flash
  1498.                                
  1499.                                 $(this).remove(); // No more need for the prettyPhoto markup
  1500.                                
  1501.                                 $(window).unbind('scroll.prettyphoto');
  1502.                                
  1503.                                 clearHashtag();
  1504.                                
  1505.                                 settings.callback();
  1506.                                
  1507.                                 doresize = true;
  1508.                                
  1509.                                 pp_open = false;
  1510.                                
  1511.                                 delete settings;
  1512.                         });
  1513.                 };
  1514.        
  1515.                 /**
  1516.                 * Set the proper sizes on the containers and animate the content in.
  1517.                 */
  1518.                 function _showContent(){
  1519.                         $('.pp_loaderIcon').hide();
  1520.  
  1521.                         // Calculate the opened top position of the pic holder
  1522.                         projectedTop = scroll_pos['scrollTop'] + ((windowHeight/2) - (pp_dimensions['containerHeight']/2));
  1523.                         if(projectedTop < 0) projectedTop = 0;
  1524.  
  1525.                         $ppt.fadeTo(settings.animation_speed,1);
  1526.  
  1527.                         // Resize the content holder
  1528.                         $pp_pic_holder.find('.pp_content')
  1529.                                 .animate({
  1530.                                         height:pp_dimensions['contentHeight'],
  1531.                                         width:pp_dimensions['contentWidth']
  1532.                                 },settings.animation_speed);
  1533.                        
  1534.                         // Resize picture the holder
  1535.                         $pp_pic_holder.animate({
  1536.                                 'top': projectedTop,
  1537.                                 'left': ((windowWidth/2) - (pp_dimensions['containerWidth']/2) < 0) ? 0 : (windowWidth/2) - (pp_dimensions['containerWidth']/2),
  1538.                                 width:pp_dimensions['containerWidth']
  1539.                         },settings.animation_speed,function(){
  1540.                                 $pp_pic_holder.find('.pp_hoverContainer,#fullResImage').height(pp_dimensions['height']).width(pp_dimensions['width']);
  1541.  
  1542.                                 $pp_pic_holder.find('.pp_fade').fadeIn(settings.animation_speed); // Fade the new content
  1543.  
  1544.                                 // Show the nav
  1545.                                 if(isSet && _getFileType(pp_images[set_position])=="image") { $pp_pic_holder.find('.pp_hoverContainer').show(); }else{ $pp_pic_holder.find('.pp_hoverContainer').hide(); }
  1546.                        
  1547.                                 if(settings.allow_expand) {
  1548.                                         if(pp_dimensions['resized']){ // Fade the resizing link if the image is resized
  1549.                                                 $('a.pp_expand,a.pp_contract').show();
  1550.                                         }else{
  1551.                                                 $('a.pp_expand').hide();
  1552.                                         }
  1553.                                 }
  1554.                                
  1555.                                 if(settings.autoplay_slideshow && !pp_slideshow && !pp_open) $.prettyPhoto.startSlideshow();
  1556.                                
  1557.                                 settings.changepicturecallback(); // Callback!
  1558.                                
  1559.                                 pp_open = true;
  1560.                         });
  1561.                        
  1562.                         _insert_gallery();
  1563.                         pp_settings.ajaxcallback();
  1564.                 };
  1565.                
  1566.                 /**
  1567.                 * Hide the content...DUH!
  1568.                 */
  1569.                 function _hideContent(callback){
  1570.                         // Fade out the current picture
  1571.                         $pp_pic_holder.find('#pp_full_res object,#pp_full_res embed').css('visibility','hidden');
  1572.                         $pp_pic_holder.find('.pp_fade').fadeOut(settings.animation_speed,function(){
  1573.                                 $('.pp_loaderIcon').show();
  1574.                                
  1575.                                 callback();
  1576.                         });
  1577.                 };
  1578.        
  1579.                 /**
  1580.                 * Check the item position in the gallery array, hide or show the navigation links
  1581.                 * @param setCount {integer} The total number of items in the set
  1582.                 */
  1583.                 function _checkPosition(setCount){
  1584.                         (setCount > 1) ? $('.pp_nav').show() : $('.pp_nav').hide(); // Hide the bottom nav if it's not a set.
  1585.                 };
  1586.        
  1587.                 /**
  1588.                 * Resize the item dimensions if it's bigger than the viewport
  1589.                 * @param width {integer} Width of the item to be opened
  1590.                 * @param height {integer} Height of the item to be opened
  1591.                 * @return An array containin the "fitted" dimensions
  1592.                 */
  1593.                 function _fitToViewport(width,height){
  1594.                         resized = false;
  1595.  
  1596.                         _getDimensions(width,height);
  1597.                        
  1598.                         // Define them in case there's no resize needed
  1599.                         imageWidth = width, imageHeight = height;
  1600.  
  1601.                         if( ((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)) && doresize && settings.allow_resize && !percentBased) {
  1602.                                 resized = true, fitting = false;
  1603.                        
  1604.                                 while (!fitting){
  1605.                                         if((pp_containerWidth > windowWidth)){
  1606.                                                 imageWidth = (windowWidth - 200);
  1607.                                                 imageHeight = (height/width) * imageWidth;
  1608.                                         }else if((pp_containerHeight > windowHeight)){
  1609.                                                 imageHeight = (windowHeight - 200);
  1610.                                                 imageWidth = (width/height) * imageHeight;
  1611.                                         }else{
  1612.                                                 fitting = true;
  1613.                                         };
  1614.  
  1615.                                         pp_containerHeight = imageHeight, pp_containerWidth = imageWidth;
  1616.                                 };
  1617.                        
  1618.                                 _getDimensions(imageWidth,imageHeight);
  1619.                                
  1620.                                 if((pp_containerWidth > windowWidth) || (pp_containerHeight > windowHeight)){
  1621.                                         _fitToViewport(pp_containerWidth,pp_containerHeight)
  1622.                                 };
  1623.                         };
  1624.                        
  1625.                         return {
  1626.                                 width:Math.floor(imageWidth),
  1627.                                 height:Math.floor(imageHeight),
  1628.                                 containerHeight:Math.floor(pp_containerHeight),
  1629.                                 containerWidth:Math.floor(pp_containerWidth) + (settings.horizontal_padding * 2),
  1630.                                 contentHeight:Math.floor(pp_contentHeight),
  1631.                                 contentWidth:Math.floor(pp_contentWidth),
  1632.                                 resized:resized
  1633.                         };
  1634.                 };
  1635.                
  1636.                 /**
  1637.                 * Get the containers dimensions according to the item size
  1638.                 * @param width {integer} Width of the item to be opened
  1639.                 * @param height {integer} Height of the item to be opened
  1640.                 */
  1641.                 function _getDimensions(width,height){
  1642.                         width = parseFloat(width);
  1643.                         height = parseFloat(height);
  1644.                        
  1645.                         // Get the details height, to do so, I need to clone it since it's invisible
  1646.                         $pp_details = $pp_pic_holder.find('.pp_details');
  1647.                         $pp_details.width(width);
  1648.                         detailsHeight = parseFloat($pp_details.css('marginTop')) + parseFloat($pp_details.css('marginBottom'));
  1649.                        
  1650.                         $pp_details = $pp_details.clone().addClass(settings.theme).width(width).appendTo($('body')).css({
  1651.                                 'position':'absolute',
  1652.                                 'top':-10000
  1653.                         });
  1654.                         detailsHeight += $pp_details.height();
  1655.                         detailsHeight = (detailsHeight <= 34) ? 36 : detailsHeight; // Min-height for the details
  1656.                         if($.browser.msie && $.browser.version==7) detailsHeight+=8;
  1657.                         $pp_details.remove();
  1658.                        
  1659.                         // Get the titles height, to do so, I need to clone it since it's invisible
  1660.                         $pp_title = $pp_pic_holder.find('.ppt');
  1661.                         $pp_title.width(width);
  1662.                         titleHeight = parseFloat($pp_title.css('marginTop')) + parseFloat($pp_title.css('marginBottom'));
  1663.                         $pp_title = $pp_title.clone().appendTo($('body')).css({
  1664.                                 'position':'absolute',
  1665.                                 'top':-10000
  1666.                         });
  1667.                         titleHeight += $pp_title.height();
  1668.                         $pp_title.remove();
  1669.                        
  1670.                         // Get the container size, to resize the holder to the right dimensions
  1671.                         pp_contentHeight = height + detailsHeight;
  1672.                         pp_contentWidth = width;
  1673.                         pp_containerHeight = pp_contentHeight + titleHeight + $pp_pic_holder.find('.pp_top').height() + $pp_pic_holder.find('.pp_bottom').height();
  1674.                         pp_containerWidth = width;
  1675.                 }
  1676.        
  1677.                 function _getFileType(itemSrc){
  1678.                         if (itemSrc.match(/youtube\.com\/watch/i) || itemSrc.match(/youtu\.be/i)) {
  1679.                                 return 'youtube';
  1680.                         }else if (itemSrc.match(/vimeo\.com/i)) {
  1681.                                 return 'vimeo';
  1682.                         }else if(itemSrc.match(/\b.mov\b/i)){
  1683.                                 return 'quicktime';
  1684.                         }else if(itemSrc.match(/\b.swf\b/i)){
  1685.                                 return 'flash';
  1686.                         }else if(itemSrc.match(/\biframe=true\b/i)){
  1687.                                 return 'iframe';
  1688.                         }else if(itemSrc.match(/\bajax=true\b/i)){
  1689.                                 return 'ajax';
  1690.                         }else if(itemSrc.match(/\bcustom=true\b/i)){
  1691.                                 return 'custom';
  1692.                         }else if(itemSrc.substr(0,1) == '#'){
  1693.                                 return 'inline';
  1694.                         }else{
  1695.                                 return 'image';
  1696.                         };
  1697.                 };
  1698.        
  1699.                 function _center_overlay(){
  1700.                         if(doresize && typeof $pp_pic_holder != 'undefined') {
  1701.                                 scroll_pos = _get_scroll();
  1702.                                 contentHeight = $pp_pic_holder.height(), contentwidth = $pp_pic_holder.width();
  1703.  
  1704.                                 projectedTop = (windowHeight/2) + scroll_pos['scrollTop'] - (contentHeight/2);
  1705.                                 if(projectedTop < 0) projectedTop = 0;
  1706.                                
  1707.                                 if(contentHeight > windowHeight)
  1708.                                         return;
  1709.  
  1710.                                 $pp_pic_holder.css({
  1711.                                         'top': projectedTop,
  1712.                                         'left': (windowWidth/2) + scroll_pos['scrollLeft'] - (contentwidth/2)
  1713.                                 });
  1714.                         };
  1715.                 };
  1716.        
  1717.                 function _get_scroll(){
  1718.                         if (self.pageYOffset) {
  1719.                                 return {scrollTop:self.pageYOffset,scrollLeft:self.pageXOffset};
  1720.                         } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
  1721.                                 return {scrollTop:document.documentElement.scrollTop,scrollLeft:document.documentElement.scrollLeft};
  1722.                         } else if (document.body) {// all other Explorers
  1723.                                 return {scrollTop:document.body.scrollTop,scrollLeft:document.body.scrollLeft};
  1724.                         };
  1725.                 };
  1726.        
  1727.                 function _resize_overlay() {
  1728.                         windowHeight = $(window).height(), windowWidth = $(window).width();
  1729.                        
  1730.                         if(typeof $pp_overlay != "undefined") $pp_overlay.height($(document).height()).width(windowWidth);
  1731.                 };
  1732.        
  1733.                 function _insert_gallery(){
  1734.                         if(isSet && settings.overlay_gallery && _getFileType(pp_images[set_position])=="image" && (settings.ie6_fallback && !($.browser.msie && parseInt($.browser.version) == 6))) {
  1735.                                 itemWidth = 52+5; // 52 beign the thumb width, 5 being the right margin.
  1736.                                 navWidth = (settings.theme == "facebook" || settings.theme == "pp_default") ? 50 : 30; // Define the arrow width depending on the theme
  1737.                                
  1738.                                 itemsPerPage = Math.floor((pp_dimensions['containerWidth'] - 100 - navWidth) / itemWidth);
  1739.                                 itemsPerPage = (itemsPerPage < pp_images.length) ? itemsPerPage : pp_images.length;
  1740.                                 totalPage = Math.ceil(pp_images.length / itemsPerPage) - 1;
  1741.  
  1742.                                 // Hide the nav in the case there's no need for links
  1743.                                 if(totalPage == 0){
  1744.                                         navWidth = 0; // No nav means no width!
  1745.                                         $pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').hide();
  1746.                                 }else{
  1747.                                         $pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').show();
  1748.                                 };
  1749.  
  1750.                                 galleryWidth = itemsPerPage * itemWidth;
  1751.                                 fullGalleryWidth = pp_images.length * itemWidth;
  1752.                                
  1753.                                 // Set the proper width to the gallery items
  1754.                                 $pp_gallery
  1755.                                         .css('margin-left',-((galleryWidth/2) + (navWidth/2)))
  1756.                                         .find('div:first').width(galleryWidth+5)
  1757.                                         .find('ul').width(fullGalleryWidth)
  1758.                                         .find('li.selected').removeClass('selected');
  1759.                                
  1760.                                 goToPage = (Math.floor(set_position/itemsPerPage) < totalPage) ? Math.floor(set_position/itemsPerPage) : totalPage;
  1761.  
  1762.                                 $.prettyPhoto.changeGalleryPage(goToPage);
  1763.                                
  1764.                                 $pp_gallery_li.filter(':eq('+set_position+')').addClass('selected');
  1765.                         }else{
  1766.                                 $pp_pic_holder.find('.pp_content').unbind('mouseenter mouseleave');
  1767.                                 // $pp_gallery.hide();
  1768.                         }
  1769.                 }
  1770.        
  1771.                 function _build_overlay(caller){
  1772.                         // Inject Social Tool markup into General markup
  1773.                         if(settings.social_tools)
  1774.                                 facebook_like_link = settings.social_tools.replace('{location_href}', encodeURIComponent(location.href));
  1775.  
  1776.                         settings.markup = settings.markup.replace('{pp_social}','');
  1777.                        
  1778.                         $('body').append(settings.markup); // Inject the markup
  1779.                        
  1780.                         $pp_pic_holder = $('.pp_pic_holder') , $ppt = $('.ppt'), $pp_overlay = $('div.pp_overlay'); // Set my global selectors
  1781.                        
  1782.                         // Inject the inline gallery!
  1783.                         if(isSet && settings.overlay_gallery) {
  1784.                                 currentGalleryPage = 0;
  1785.                                 toInject = "";
  1786.                                 for (var i=0; i < pp_images.length; i++) {
  1787.                                         if(!pp_images[i].match(/\b(jpg|jpeg|png|gif)\b/gi)){
  1788.                                                 classname = 'default';
  1789.                                                 img_src = '';
  1790.                                         }else{
  1791.                                                 classname = '';
  1792.                                                 img_src = pp_images[i];
  1793.                                         }
  1794.                                         toInject += "<li class='"+classname+"'><a href='#'><img src='" + img_src + "' width='50' alt='' /></a></li>";
  1795.                                 };
  1796.                                
  1797.                                 toInject = settings.gallery_markup.replace(/{gallery}/g,toInject);
  1798.                                
  1799.                                 $pp_pic_holder.find('#pp_full_res').after(toInject);
  1800.                                
  1801.                                 $pp_gallery = $('.pp_pic_holder .pp_gallery'), $pp_gallery_li = $pp_gallery.find('li'); // Set the gallery selectors
  1802.                                
  1803.                                 $pp_gallery.find('.pp_arrow_next').click(function(){
  1804.                                         $.prettyPhoto.changeGalleryPage('next');
  1805.                                         $.prettyPhoto.stopSlideshow();
  1806.                                         return false;
  1807.                                 });
  1808.                                
  1809.                                 $pp_gallery.find('.pp_arrow_previous').click(function(){
  1810.                                         $.prettyPhoto.changeGalleryPage('previous');
  1811.                                         $.prettyPhoto.stopSlideshow();
  1812.                                         return false;
  1813.                                 });
  1814.                                
  1815.                                 $pp_pic_holder.find('.pp_content').hover(
  1816.                                         function(){
  1817.                                                 $pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeIn();
  1818.                                         },
  1819.                                         function(){
  1820.                                                 $pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeOut();
  1821.                                         });
  1822.  
  1823.                                 itemWidth = 52+5; // 52 beign the thumb width, 5 being the right margin.
  1824.                                 $pp_gallery_li.each(function(i){
  1825.                                         $(this)
  1826.                                                 .find('a')
  1827.                                                 .click(function(){
  1828.                                                         $.prettyPhoto.changePage(i);
  1829.                                                         $.prettyPhoto.stopSlideshow();
  1830.                                                         return false;
  1831.                                                 });
  1832.                                 });
  1833.                         };
  1834.                        
  1835.                        
  1836.                         // Inject the play/pause if it's a slideshow
  1837.                         if(settings.slideshow){
  1838.                                 $pp_pic_holder.find('.pp_nav').prepend('<a href="#" class="pp_play">Play</a>')
  1839.                                 $pp_pic_holder.find('.pp_nav .pp_play').click(function(){
  1840.                                         $.prettyPhoto.startSlideshow();
  1841.                                         return false;
  1842.                                 });
  1843.                         }
  1844.                        
  1845.                         $pp_pic_holder.attr('class','pp_pic_holder ' + settings.theme); // Set the proper theme
  1846.                        
  1847.                         $pp_overlay
  1848.                                 .css({
  1849.                                         'opacity':0,
  1850.                                         'height':$(document).height(),
  1851.                                         'width':$(window).width()
  1852.                                         })
  1853.                                 .bind('click',function(){
  1854.                                         if(!settings.modal) $.prettyPhoto.close();
  1855.                                 });
  1856.  
  1857.                         $('a.pp_close').bind('click',function(){ $.prettyPhoto.close(); return false; });
  1858.  
  1859.  
  1860.                         if(settings.allow_expand) {
  1861.                                 $('a.pp_expand').bind('click',function(e){
  1862.                                         // Expand the image
  1863.                                         if($(this).hasClass('pp_expand')){
  1864.                                                 $(this).removeClass('pp_expand').addClass('pp_contract');
  1865.                                                 doresize = false;
  1866.                                         }else{
  1867.                                                 $(this).removeClass('pp_contract').addClass('pp_expand');
  1868.                                                 doresize = true;
  1869.                                         };
  1870.                                
  1871.                                         _hideContent(function(){ $.prettyPhoto.open(); });
  1872.                        
  1873.                                         return false;
  1874.                                 });
  1875.                         }
  1876.                
  1877.                         $pp_pic_holder.find('.pp_previous, .pp_nav .pp_arrow_previous').bind('click',function(){
  1878.                                 $.prettyPhoto.changePage('previous');
  1879.                                 $.prettyPhoto.stopSlideshow();
  1880.                                 return false;
  1881.                         });
  1882.                
  1883.                         $pp_pic_holder.find('.pp_next, .pp_nav .pp_arrow_next').bind('click',function(){
  1884.                                 $.prettyPhoto.changePage('next');
  1885.                                 $.prettyPhoto.stopSlideshow();
  1886.                                 return false;
  1887.                         });
  1888.                        
  1889.                         _center_overlay(); // Center it
  1890.                 };
  1891.  
  1892.                 if(!pp_alreadyInitialized && getHashtag()){
  1893.                         pp_alreadyInitialized = true;
  1894.                        
  1895.                         // Grab the rel index to trigger the click on the correct element
  1896.                         hashIndex = getHashtag();
  1897.                         hashRel = hashIndex;
  1898.                         hashIndex = hashIndex.substring(hashIndex.indexOf('http://www.gt3themes.com/')+1,hashIndex.length-1);
  1899.                         hashRel = hashRel.substring(0,hashRel.indexOf('http://www.gt3themes.com/'));
  1900.  
  1901.                         // Little timeout to make sure all the prettyPhoto initialize scripts has been run.
  1902.                         // Useful in the event the page contain several init scripts.
  1903.                         setTimeout(function(){ $("a["+pp_settings.hook+"^='"+hashRel+"']:eq("+hashIndex+")").trigger('click'); },50);
  1904.                 }
  1905.                
  1906.                 return this.unbind('click.prettyphoto').bind('click.prettyphoto',$.prettyPhoto.initialize); // Return the jQuery object for chaining. The unbind method is used to avoid click conflict when the plugin is called more than once
  1907.         };
  1908.        
  1909.         function getHashtag(){
  1910.                 url = location.href;
  1911.                 hashtag = (url.indexOf('#prettyPhoto') !== -1) ? decodeURI(url.substring(url.indexOf('#prettyPhoto')+1,url.length)) : false;
  1912.  
  1913.                 return hashtag;
  1914.         };
  1915.        
  1916.         function setHashtag(){
  1917.                 if(typeof theRel == 'undefined') return; // theRel is set on normal calls, it's impossible to deeplink using the API
  1918.                 location.hash = theRel + '/'+rel_index+'/';
  1919.         };
  1920.        
  1921.         function clearHashtag(){
  1922.                 if ( location.href.indexOf('#prettyPhoto') !== -1 ) location.hash = "prettyPhoto";
  1923.         }
  1924.        
  1925.         function getParam(name,url){
  1926.           name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  1927.           var regexS = "[\\?&]"+name+"=([^&#]*)";
  1928.           var regex = new RegExp( regexS );
  1929.           var results = regex.exec( url );
  1930.           return ( results == null ) ? "" : results[1];
  1931.         }
  1932.        
  1933. })(jQuery);
  1934.  
  1935. var pp_alreadyInitialized = false; // Used for the deep linking to make sure not to call the same function several times.
  1936.  
  1937.  
  1938. /* *** hoverIntent.js *** */
  1939. (function($){
  1940.         /* hoverIntent by Brian Cherne */
  1941.         $.fn.hoverIntent = function(f,g) {
  1942.                 // default configuration options
  1943.                 var cfg = {
  1944.                         sensitivity: 7,
  1945.                         interval: 100,
  1946.                         timeout: 0
  1947.                 };
  1948.                 // override configuration options with user supplied object
  1949.                 cfg = $.extend(cfg, g ? { over: f, out: g } : f );
  1950.  
  1951.                 // instantiate variables
  1952.                 // cX, cY = current X and Y position of mouse, updated by mousemove event
  1953.                 // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
  1954.                 var cX, cY, pX, pY;
  1955.  
  1956.                 // A private function for getting mouse position
  1957.                 var track = function(ev) {
  1958.                         cX = ev.pageX;
  1959.                         cY = ev.pageY;
  1960.                 };
  1961.  
  1962.                 // A private function for comparing current and previous mouse position
  1963.                 var compare = function(ev,ob) {
  1964.                         ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
  1965.                         // compare mouse positions to see if they've crossed the threshold
  1966.                         if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
  1967.                                 $(ob).unbind("mousemove",track);
  1968.                                 // set hoverIntent state to true (so mouseOut can be called)
  1969.                                 ob.hoverIntent_s = 1;
  1970.                                 return cfg.over.apply(ob,[ev]);
  1971.                         } else {
  1972.                                 // set previous coordinates for next time
  1973.                                 pX = cX; pY = cY;
  1974.                                 // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
  1975.                                 ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
  1976.                         }
  1977.                 };
  1978.  
  1979.                 // A private function for delaying the mouseOut function
  1980.                 var delay = function(ev,ob) {
  1981.                         ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
  1982.                         ob.hoverIntent_s = 0;
  1983.                         return cfg.out.apply(ob,[ev]);
  1984.                 };
  1985.  
  1986.                 // A private function for handling mouse 'hovering'
  1987.                 var handleHover = function(e) {
  1988.                         // next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
  1989.                         var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
  1990.                         while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
  1991.                         if ( p == this ) { return false; }
  1992.  
  1993.                         // copy objects to be passed into t (required for event object to be passed in IE)
  1994.                         var ev = jQuery.extend({},e);
  1995.                         var ob = this;
  1996.  
  1997.                         // cancel hoverIntent timer if it exists
  1998.                         if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
  1999.  
  2000.                         // else e.type == "onmouseover"
  2001.                         if (e.type == "mouseover") {
  2002.                                 // set "previous" X and Y position based on initial entry point
  2003.                                 pX = ev.pageX; pY = ev.pageY;
  2004.                                 // update "current" X and Y position based on mousemove
  2005.                                 $(ob).bind("mousemove",track);
  2006.                                 // start polling interval (self-calling timeout) to compare mouse coordinates over time
  2007.                                 if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
  2008.  
  2009.                         // else e.type == "onmouseout"
  2010.                         } else {
  2011.                                 // unbind expensive mousemove event
  2012.                                 $(ob).unbind("mousemove",track);
  2013.                                 // if hoverIntent state is true, then call the mouseOut function after the specified delay
  2014.                                 if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
  2015.                         }
  2016.                 };
  2017.  
  2018.                 // bind the function to the two event listeners
  2019.                 return this.mouseover(handleHover).mouseout(handleHover);
  2020.         };
  2021.        
  2022. })(jQuery);
  2023.  
  2024.  
  2025. /* *** superfish.js *** */
  2026.  
  2027. /*
  2028.  * Superfish v1.4.8 - jQuery menu widget
  2029.  * Copyright (c) 2008 Joel Birch
  2030.  *
  2031.  * Dual licensed under the MIT and GPL licenses:
  2032.  *      http://www.opensource.org/licenses/mit-license.php
  2033.  *      http://www.gnu.org/licenses/gpl.html
  2034.  *
  2035.  * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
  2036.  */
  2037.  
  2038. ;(function($){
  2039.         $.fn.superfish = function(op){
  2040.  
  2041.                 var sf = $.fn.superfish,
  2042.                         c = sf.c,
  2043.                         $arrow = $(['<span class="',c.arrowClass,'"> &#187;</span>'].join('')),
  2044.                         over = function(){
  2045.                                 var $$ = $(this), menu = getMenu($$);
  2046.                                 clearTimeout(menu.sfTimer);
  2047.                                 $$.showSuperfishUl().siblings().hideSuperfishUl();
  2048.                         },
  2049.                         out = function(){
  2050.                                 var $$ = $(this), menu = getMenu($$), o = sf.op;
  2051.                                 clearTimeout(menu.sfTimer);
  2052.                                 menu.sfTimer=setTimeout(function(){
  2053.                                         o.retainPath=($.inArray($$[0],o.$path)>-1);
  2054.                                         $$.hideSuperfishUl();
  2055.                                         if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
  2056.                                 },o.delay);    
  2057.                         },
  2058.                         getMenu = function($menu){
  2059.                                 var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
  2060.                                 sf.op = sf.o[menu.serial];
  2061.                                 return menu;
  2062.                         },
  2063.                         addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
  2064.                        
  2065.                 return this.each(function() {
  2066.                         var s = this.serial = sf.o.length;
  2067.                         var o = $.extend({},sf.defaults,op);
  2068.                         o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
  2069.                                 $(this).addClass([o.hoverClass,c.bcClass].join(' '))
  2070.                                         .filter('li:has(ul)').removeClass(o.pathClass);
  2071.                         });
  2072.                         sf.o[s] = sf.op = o;
  2073.                        
  2074.                         $('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
  2075.                                 if (o.autoArrows) addArrow( $('>a:first-child',this) );
  2076.                         })
  2077.                         .not('.'+c.bcClass)
  2078.                                 .hideSuperfishUl();
  2079.                        
  2080.                         var $a = $('a',this);
  2081.                         $a.each(function(i){
  2082.                                 var $li = $a.eq(i).parents('li');
  2083.                                 $a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
  2084.                         });
  2085.                         o.onInit.call(this);
  2086.                        
  2087.                 }).each(function() {
  2088.                         var menuClasses = [c.menuClass];
  2089.                         if (sf.op.dropShadows  && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
  2090.                         $(this).addClass(menuClasses.join(' '));
  2091.                 });
  2092.         };
  2093.  
  2094.         var sf = $.fn.superfish;
  2095.         sf.o = [];
  2096.         sf.op = {};
  2097.         sf.IE7fix = function(){
  2098.                 var o = sf.op;
  2099.                 if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
  2100.                         this.toggleClass(sf.c.shadowClass+'-off');
  2101.                 };
  2102.         sf.c = {
  2103.                 bcClass     : 'sf-breadcrumb',
  2104.                 menuClass   : 'sf-js-enabled',
  2105.                 anchorClass : 'sf-with-ul',
  2106.                 arrowClass  : 'sf-sub-indicator',
  2107.                 shadowClass : 'sf-shadow'
  2108.         };
  2109.         sf.defaults = {
  2110.                 hoverClass      : 'sfHover',
  2111.                 pathClass       : 'overideThisToUse',
  2112.                 pathLevels      : 1,
  2113.                 delay           : 800,
  2114.                 animation       : {opacity:'show'},
  2115.                 speed           : 'normal',
  2116.                 autoArrows      : false,
  2117.                 dropShadows : true,
  2118.                 disableHI       : false,                // true disables hoverIntent detection
  2119.                 onInit          : function(){}, // callback functions
  2120.                 onBeforeShow: function(){},
  2121.                 onShow          : function(){},
  2122.                 onHide          : function(){}
  2123.         };
  2124.         $.fn.extend({
  2125.                 hideSuperfishUl : function(){
  2126.                         var o = sf.op,
  2127.                                 not = (o.retainPath===true) ? o.$path : '';
  2128.                         o.retainPath = false;
  2129.                         var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
  2130.                                         .find('>ul').hide().css('visibility','hidden');
  2131.                         o.onHide.call($ul);
  2132.                         return this;
  2133.                 },
  2134.                 showSuperfishUl : function(){
  2135.                         var o = sf.op,
  2136.                                 sh = sf.c.shadowClass+'-off',
  2137.                                 $ul = this.addClass(o.hoverClass)
  2138.                                         .find('>ul:hidden').css('visibility','visible');
  2139.                         sf.IE7fix.call($ul);
  2140.                         o.onBeforeShow.call($ul);
  2141.                         $ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
  2142.                         return this;
  2143.                 }
  2144.         });
  2145.  
  2146. })(jQuery);
  2147.  
  2148.  
  2149. /* *** jquery.form.js *** */
  2150. /*
  2151.  * jQuery Form Plugin
  2152.  * version: 2.05 (02/29/2008)
  2153.  * @requires jQuery v1.2.2 or later
  2154.  *
  2155.  * Examples at: http://malsup.com/jquery/form/
  2156.  * Dual licensed under the MIT and GPL licenses:
  2157.  *   http://www.opensource.org/licenses/mit-license.php
  2158.  *   http://www.gnu.org/licenses/gpl.html
  2159.  *
  2160.  * Revision: $Id$
  2161.  */
  2162.  (function($) {
  2163. /**
  2164.  * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX.
  2165.  *
  2166.  * ajaxSubmit accepts a single argument which can be either a success callback function
  2167.  * or an options Object.  If a function is provided it will be invoked upon successful
  2168.  * completion of the submit and will be passed the response from the server.
  2169.  * If an options Object is provided, the following attributes are supported:
  2170.  *
  2171.  *  target:   Identifies the element(s) in the page to be updated with the server response.
  2172.  *            This value may be specified as a jQuery selection string, a jQuery object,
  2173.  *            or a DOM element.
  2174.  *            default value: null
  2175.  *
  2176.  *  url:      URL to which the form data will be submitted.
  2177.  *            default value: value of form's 'action' attribute
  2178.  *
  2179.  *  type:     The method in which the form data should be submitted, 'GET' or 'POST'.
  2180.  *            default value: value of form's 'method' attribute (or 'GET' if none found)
  2181.  *
  2182.  *  data:     Additional data to add to the request, specified as key/value pairs (see $.ajax).
  2183.  *
  2184.  *  beforeSubmit:  Callback method to be invoked before the form is submitted.
  2185.  *            default value: null
  2186.  *
  2187.  *  success:  Callback method to be invoked after the form has been successfully submitted
  2188.  *            and the response has been returned from the server
  2189.  *            default value: null
  2190.  *
  2191.  *  dataType: Expected dataType of the response.  One of: null, 'xml', 'script', or 'json'
  2192.  *            default value: null
  2193.  *
  2194.  *  semantic: Boolean flag indicating whether data must be submitted in semantic order (slower).
  2195.  *            default value: false
  2196.  *
  2197.  *  resetForm: Boolean flag indicating whether the form should be reset if the submit is successful
  2198.  *
  2199.  *  clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful
  2200.  *
  2201.  *
  2202.  * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for
  2203.  * validating the form data.  If the 'beforeSubmit' callback returns false then the form will
  2204.  * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data
  2205.  * in array format, the jQuery object, and the options object passed into ajaxSubmit.
  2206.  * The form data array takes the following form:
  2207.  *
  2208.  *     [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
  2209.  *
  2210.  * If a 'success' callback method is provided it is invoked after the response has been returned
  2211.  * from the server.  It is passed the responseText or responseXML value (depending on dataType).
  2212.  * See jQuery.ajax for further details.
  2213.  *
  2214.  *
  2215.  * The dataType option provides a means for specifying how the server response should be handled.
  2216.  * This maps directly to the jQuery.httpData method.  The following values are supported:
  2217.  *
  2218.  *      'xml':    if dataType == 'xml' the server response is treated as XML and the 'success'
  2219.  *                   callback method, if specified, will be passed the responseXML value
  2220.  *      'json':   if dataType == 'json' the server response will be evaluted and passed to
  2221.  *                   the 'success' callback, if specified
  2222.  *      'script': if dataType == 'script' the server response is evaluated in the global context
  2223.  *
  2224.  *
  2225.  * Note that it does not make sense to use both the 'target' and 'dataType' options.  If both
  2226.  * are provided the target will be ignored.
  2227.  *
  2228.  * The semantic argument can be used to force form serialization in semantic order.
  2229.  * This is normally true anyway, unless the form contains input elements of type='image'.
  2230.  * If your form must be submitted with name/value pairs in semantic order and your form
  2231.  * contains an input of type='image" then pass true for this arg, otherwise pass false
  2232.  * (or nothing) to avoid the overhead for this logic.
  2233.  *
  2234.  *
  2235.  * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this:
  2236.  *
  2237.  * $("#form-id").submit(function() {
  2238.  *     $(this).ajaxSubmit(options);
  2239.  *     return false; // cancel conventional submit
  2240.  * });
  2241.  *
  2242.  * When using ajaxForm(), however, this is done for you.
  2243.  *
  2244.  * @example
  2245.  * $('#myForm').ajaxSubmit(function(data) {
  2246.  *     alert('Form submit succeeded! Server returned: ' + data);
  2247.  * });
  2248.  * @desc Submit form and alert server response
  2249.  *
  2250.  *
  2251.  * @example
  2252.  * var options = {
  2253.  *     target: '#myTargetDiv'
  2254.  * };
  2255.  * $('#myForm').ajaxSubmit(options);
  2256.  * @desc Submit form and update page element with server response
  2257.  *
  2258.  *
  2259.  * @example
  2260.  * var options = {
  2261.  *     success: function(responseText) {
  2262.  *         alert(responseText);
  2263.  *     }
  2264.  * };
  2265.  * $('#myForm').ajaxSubmit(options);
  2266.  * @desc Submit form and alert the server response
  2267.  *
  2268.  *
  2269.  * @example
  2270.  * var options = {
  2271.  *     beforeSubmit: function(formArray, jqForm) {
  2272.  *         if (formArray.length == 0) {
  2273.  *             alert('Please enter data.');
  2274.  *             return false;
  2275.  *         }
  2276.  *     }
  2277.  * };
  2278.  * $('#myForm').ajaxSubmit(options);
  2279.  * @desc Pre-submit validation which aborts the submit operation if form data is empty
  2280.  *
  2281.  *
  2282.  * @example
  2283.  * var options = {
  2284.  *     url: myJsonUrl.php,
  2285.  *     dataType: 'json',
  2286.  *     success: function(data) {
  2287.  *        // 'data' is an object representing the the evaluated json data
  2288.  *     }
  2289.  * };
  2290.  * $('#myForm').ajaxSubmit(options);
  2291.  * @desc json data returned and evaluated
  2292.  *
  2293.  *
  2294.  * @example
  2295.  * var options = {
  2296.  *     url: myXmlUrl.php,
  2297.  *     dataType: 'xml',
  2298.  *     success: function(responseXML) {
  2299.  *        // responseXML is XML document object
  2300.  *        var data = $('myElement', responseXML).text();
  2301.  *     }
  2302.  * };
  2303.  * $('#myForm').ajaxSubmit(options);
  2304.  * @desc XML data returned from server
  2305.  *
  2306.  *
  2307.  * @example
  2308.  * var options = {
  2309.  *     resetForm: true
  2310.  * };
  2311.  * $('#myForm').ajaxSubmit(options);
  2312.  * @desc submit form and reset it if successful
  2313.  *
  2314.  * @example
  2315.  * $('#myForm).submit(function() {
  2316.  *    $(this).ajaxSubmit();
  2317.  *    return false;
  2318.  * });
  2319.  * @desc Bind form's submit event to use ajaxSubmit
  2320.  *
  2321.  *
  2322.  * @name ajaxSubmit
  2323.  * @type jQuery
  2324.  * @param options  object literal containing options which control the form submission process
  2325.  * @cat Plugins/Form
  2326.  * @return jQuery
  2327.  */
  2328. $.fn.ajaxSubmit = function(options) {
  2329.     if (typeof options == 'function')
  2330.         options = { success: options };
  2331.  
  2332.     options = $.extend({
  2333.         url:  this.attr('action') || window.location.toString(),
  2334.         type: this.attr('method') || 'GET'
  2335.     }, options || {});
  2336.  
  2337.     // hook for manipulating the form data before it is extracted;
  2338.     // convenient for use with rich editors like tinyMCE or FCKEditor
  2339.     var veto = {};
  2340.     this.trigger('form-pre-serialize', [this, options, veto]);
  2341.     if (veto.veto) return this;
  2342.  
  2343.     var a = this.formToArray(options.semantic);
  2344.     if (options.data) {
  2345.         for (var n in options.data)
  2346.             a.push( { name: n, value: options.data[n] } );
  2347.     }
  2348.  
  2349.     // give pre-submit callback an opportunity to abort the submit
  2350.     if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this;
  2351.  
  2352.     // fire vetoable 'validate' event
  2353.     this.trigger('form-submit-validate', [a, this, options, veto]);
  2354.     if (veto.veto) return this;
  2355.  
  2356.     var q = $.param(a);
  2357.  
  2358.     if (options.type.toUpperCase() == 'GET') {
  2359.         options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
  2360.         options.data = null;  // data is null for 'get'
  2361.     }
  2362.     else
  2363.         options.data = q; // data is the query string for 'post'
  2364.  
  2365.     var $form = this, callbacks = [];
  2366.     if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
  2367.     if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
  2368.  
  2369.     // perform a load on the target only if dataType is not provided
  2370.     if (!options.dataType && options.target) {
  2371.         var oldSuccess = options.success || function(){};
  2372.         callbacks.push(function(data) {
  2373.             $(options.target).html(data).each(oldSuccess, arguments);
  2374.         });
  2375.     }
  2376.     else if (options.success)
  2377.         callbacks.push(options.success);
  2378.  
  2379.     options.success = function(data, status) {
  2380.         for (var i=0, max=callbacks.length; i < max; i++)
  2381.             callbacks[i](data, status, $form);
  2382.     };
  2383.  
  2384.     // are there files to upload?
  2385.     var files = $('input:file', this).fieldValue();
  2386.     var found = false;
  2387.     for (var j=0; j < files.length; j++)
  2388.         if (files[j])
  2389.             found = true;
  2390.  
  2391.     // options.iframe allows user to force iframe mode
  2392.    if (options.iframe || found) {
  2393.        // hack to fix Safari hang (thanks to Tim Molendijk for this)
  2394.        // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
  2395.        if ($.browser.safari && options.closeKeepAlive)
  2396.            $.get(options.closeKeepAlive, fileUpload);
  2397.        else
  2398.            fileUpload();
  2399.        }
  2400.    else
  2401.        $.ajax(options);
  2402.  
  2403.     // fire 'notify' event
  2404.     this.trigger('form-submit-notify', [this, options]);
  2405.     return this;
  2406.  
  2407.  
  2408.     // private function for handling file uploads (hat tip to YAHOO!)
  2409.     function fileUpload() {
  2410.         var form = $form[0];
  2411.         var opts = $.extend({}, $.ajaxSettings, options);
  2412.  
  2413.         var id = 'jqFormIO' + (new Date().getTime());
  2414.         var $io = $('<iframe id="' + id + '" name="' + id + '" />');
  2415.         var io = $io[0];
  2416.         var op8 = $.browser.opera && window.opera.version() < 9;
  2417.         if ($.browser.msie || op8) io.src = 'javascript:false;document.write("");';
  2418.         $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
  2419.  
  2420.         var xhr = { // mock object
  2421.             responseText: null,
  2422.             responseXML: null,
  2423.             status: 0,
  2424.             statusText: 'n/a',
  2425.             getAllResponseHeaders: function() {},
  2426.             getResponseHeader: function() {},
  2427.             setRequestHeader: function() {}
  2428.         };
  2429.  
  2430.         var g = opts.global;
  2431.         // trigger ajax global events so that activity/block indicators work like normal
  2432.         if (g && ! $.active++) $.event.trigger("ajaxStart");
  2433.         if (g) $.event.trigger("ajaxSend", [xhr, opts]);
  2434.  
  2435.         var cbInvoked = 0;
  2436.         var timedOut = 0;
  2437.  
  2438.         // take a breath so that pending repaints get some cpu time before the upload starts
  2439.         setTimeout(function() {
  2440.             // make sure form attrs are set
  2441.             var encAttr = form.encoding ? 'encoding' : 'enctype';
  2442.             var t = $form.attr('target'), a = $form.attr('action');
  2443.             $form.attr({
  2444.                 target:   id,
  2445.                 method:  'POST',
  2446.                 action:   opts.url
  2447.             });
  2448.             form[encAttr] = 'multipart/form-data';
  2449.  
  2450.             // support timout
  2451.             if (opts.timeout)
  2452.                 setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
  2453.  
  2454.             // add iframe to doc and submit the form
  2455.             $io.appendTo('body');
  2456.             io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
  2457.             form.submit();
  2458.             // reset attrs
  2459.             $form.attr({ action: a, target: t });
  2460.         }, 10);
  2461.  
  2462.         function cb() {
  2463.             if (cbInvoked++) return;
  2464.  
  2465.             io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
  2466.  
  2467.             var ok = true;
  2468.             try {
  2469.                 if (timedOut) throw 'timeout';
  2470.                 // extract the server response from the iframe
  2471.                 var data, doc;
  2472.                 doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
  2473.                 xhr.responseText = doc.body ? doc.body.innerHTML : null;
  2474.                 xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
  2475.                 xhr.getResponseHeader = function(header){
  2476.                     var headers = {'content-type': opts.dataType};
  2477.                     return headers[header];
  2478.                 };
  2479.  
  2480.                 if (opts.dataType == 'json' || opts.dataType == 'script') {
  2481.                     var ta = doc.getElementsByTagName('textarea')[0];
  2482.                     xhr.responseText = ta ? ta.value : xhr.responseText;
  2483.                 }
  2484.                 else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
  2485.                     xhr.responseXML = toXml(xhr.responseText);
  2486.                 }
  2487.                 data = $.httpData(xhr, opts.dataType);
  2488.             }
  2489.             catch(e){
  2490.                 ok = false;
  2491.                 $.handleError(opts, xhr, 'error', e);
  2492.             }
  2493.  
  2494.             // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
  2495.             if (ok) {
  2496.                 opts.success(data, 'success');
  2497.                 if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
  2498.             }
  2499.             if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
  2500.             if (g && ! --$.active) $.event.trigger("ajaxStop");
  2501.             if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
  2502.  
  2503.             // clean up
  2504.             setTimeout(function() {
  2505.                 $io.remove();
  2506.                 xhr.responseXML = null;
  2507.             }, 100);
  2508.         };
  2509.  
  2510.         function toXml(s, doc) {
  2511.             if (window.ActiveXObject) {
  2512.                 doc = new ActiveXObject('Microsoft.XMLDOM');
  2513.                 doc.async = 'false';
  2514.                 doc.loadXML(s);
  2515.             }
  2516.             else
  2517.                 doc = (new DOMParser()).parseFromString(s, 'text/xml');
  2518.             return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
  2519.         };
  2520.     };
  2521. };
  2522.  
  2523. /**
  2524.  * ajaxForm() provides a mechanism for fully automating form submission.
  2525.  *
  2526.  * The advantages of using this method instead of ajaxSubmit() are:
  2527.  *
  2528.  * 1: This method will include coordinates for <input type="image" /> elements (if the element
  2529.  *    is used to submit the form).
  2530.  * 2. This method will include the submit element's name/value data (for the element that was
  2531.  *    used to submit the form).
  2532.  * 3. This method binds the submit() method to the form for you.
  2533.  *
  2534.  * Note that for accurate x/y coordinates of image submit elements in all browsers
  2535.  * you need to also use the "dimensions" plugin (this method will auto-detect its presence).
  2536.  *
  2537.  * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
  2538.  * passes the options argument along after properly binding events for submit elements and
  2539.  * the form itself.  See ajaxSubmit for a full description of the options argument.
  2540.  *
  2541.  *
  2542.  * @example
  2543.  * var options = {
  2544.  *     target: '#myTargetDiv'
  2545.  * };
  2546.  * $('#myForm').ajaxSForm(options);
  2547.  * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response
  2548.  *       when the form is submitted.
  2549.  *
  2550.  *
  2551.  * @example
  2552.  * var options = {
  2553.  *     success: function(responseText) {
  2554.  *         alert(responseText);
  2555.  *     }
  2556.  * };
  2557.  * $('#myForm').ajaxSubmit(options);
  2558.  * @desc Bind form's submit event so that server response is alerted after the form is submitted.
  2559.  *
  2560.  *
  2561.  * @example
  2562.  * var options = {
  2563.  *     beforeSubmit: function(formArray, jqForm) {
  2564.  *         if (formArray.length == 0) {
  2565.  *             alert('Please enter data.');
  2566.  *             return false;
  2567.  *         }
  2568.  *     }
  2569.  * };
  2570.  * $('#myForm').ajaxSubmit(options);
  2571.  * @desc Bind form's submit event so that pre-submit callback is invoked before the form
  2572.  *       is submitted.
  2573.  *
  2574.  *
  2575.  * @name   ajaxForm
  2576.  * @param  options  object literal containing options which control the form submission process
  2577.  * @return jQuery
  2578.  * @cat    Plugins/Form
  2579.  * @type   jQuery
  2580.  */
  2581. $.fn.ajaxForm = function(options) {
  2582.     return this.ajaxFormUnbind().bind('submit.form-plugin',function() {
  2583.         $(this).ajaxSubmit(options);
  2584.         return false;
  2585.     }).each(function() {
  2586.         // store options in hash
  2587.         $(":submit,input:image", this).bind('click.form-plugin',function(e) {
  2588.             var $form = this.form;
  2589.             $form.clk = this;
  2590.             if (this.type == 'image') {
  2591.                 if (e.offsetX != undefined) {
  2592.                     $form.clk_x = e.offsetX;
  2593.                     $form.clk_y = e.offsetY;
  2594.                 } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
  2595.                     var offset = $(this).offset();
  2596.                     $form.clk_x = e.pageX - offset.left;
  2597.                     $form.clk_y = e.pageY - offset.top;
  2598.                 } else {
  2599.                     $form.clk_x = e.pageX - this.offsetLeft;
  2600.                     $form.clk_y = e.pageY - this.offsetTop;
  2601.                 }
  2602.             }
  2603.             // clear form vars
  2604.             setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
  2605.         });
  2606.     });
  2607. };
  2608.  
  2609.  
  2610. /**
  2611.  * ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
  2612.  *
  2613.  * @name   ajaxFormUnbind
  2614.  * @return jQuery
  2615.  * @cat    Plugins/Form
  2616.  * @type   jQuery
  2617.  */
  2618. $.fn.ajaxFormUnbind = function() {
  2619.     this.unbind('submit.form-plugin');
  2620.     return this.each(function() {
  2621.         $(":submit,input:image", this).unbind('click.form-plugin');
  2622.     });
  2623.  
  2624. };
  2625.  
  2626. /**
  2627.  * formToArray() gathers form element data into an array of objects that can
  2628.  * be passed to any of the following ajax functions: $.get, $.post, or load.
  2629.  * Each object in the array has both a 'name' and 'value' property.  An example of
  2630.  * an array for a simple login form might be:
  2631.  *
  2632.  * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
  2633.  *
  2634.  * It is this array that is passed to pre-submit callback functions provided to the
  2635.  * ajaxSubmit() and ajaxForm() methods.
  2636.  *
  2637.  * The semantic argument can be used to force form serialization in semantic order.
  2638.  * This is normally true anyway, unless the form contains input elements of type='image'.
  2639.  * If your form must be submitted with name/value pairs in semantic order and your form
  2640.  * contains an input of type='image" then pass true for this arg, otherwise pass false
  2641.  * (or nothing) to avoid the overhead for this logic.
  2642.  *
  2643.  * @example var data = $("#myForm").formToArray();
  2644.  * $.post( "myscript.cgi", data );
  2645.  * @desc Collect all the data from a form and submit it to the server.
  2646.  *
  2647.  * @name formToArray
  2648.  * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
  2649.  * @type Array<Object>
  2650.  * @cat Plugins/Form
  2651.  */
  2652. $.fn.formToArray = function(semantic) {
  2653.     var a = [];
  2654.     if (this.length == 0) return a;
  2655.  
  2656.     var form = this[0];
  2657.     var els = semantic ? form.getElementsByTagName('*') : form.elements;
  2658.     if (!els) return a;
  2659.     for(var i=0, max=els.length; i < max; i++) {
  2660.         var el = els[i];
  2661.         var n = el.name;
  2662.         if (!n) continue;
  2663.  
  2664.         if (semantic && form.clk && el.type == "image") {
  2665.             // handle image inputs on the fly when semantic == true
  2666.             if(!el.disabled && form.clk == el)
  2667.                 a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
  2668.             continue;
  2669.         }
  2670.  
  2671.         var v = $.fieldValue(el, true);
  2672.         if (v && v.constructor == Array) {
  2673.             for(var j=0, jmax=v.length; j < jmax; j++)
  2674.                 a.push({name: n, value: v[j]});
  2675.         }
  2676.         else if (v !== null && typeof v != 'undefined')
  2677.             a.push({name: n, value: v});
  2678.     }
  2679.  
  2680.     if (!semantic && form.clk) {
  2681.         // input type=='image' are not found in elements array! handle them here
  2682.         var inputs = form.getElementsByTagName("input");
  2683.         for(var i=0, max=inputs.length; i < max; i++) {
  2684.             var input = inputs[i];
  2685.             var n = input.name;
  2686.             if(n && !input.disabled && input.type == "image" && form.clk == input)
  2687.                 a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
  2688.         }
  2689.     }
  2690.     return a;
  2691. };
  2692.  
  2693.  
  2694. /**
  2695.  * Serializes form data into a 'submittable' string. This method will return a string
  2696.  * in the format: name1=value1&amp;name2=value2
  2697.  *
  2698.  * The semantic argument can be used to force form serialization in semantic order.
  2699.  * If your form must be submitted with name/value pairs in semantic order then pass
  2700.  * true for this arg, otherwise pass false (or nothing) to avoid the overhead for
  2701.  * this logic (which can be significant for very large forms).
  2702.  *
  2703.  * @example var data = $("#myForm").formSerialize();
  2704.  * $.ajax('POST', "myscript.cgi", data);
  2705.  * @desc Collect all the data from a form into a single string
  2706.  *
  2707.  * @name formSerialize
  2708.  * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
  2709.  * @type String
  2710.  * @cat Plugins/Form
  2711.  */
  2712. $.fn.formSerialize = function(semantic) {
  2713.     //hand off to jQuery.param for proper encoding
  2714.     return $.param(this.formToArray(semantic));
  2715. };
  2716.  
  2717.  
  2718. /**
  2719.  * Serializes all field elements in the jQuery object into a query string.
  2720.  * This method will return a string in the format: name1=value1&amp;name2=value2
  2721.  *
  2722.  * The successful argument controls whether or not serialization is limited to
  2723.  * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  2724.  * The default value of the successful argument is true.
  2725.  *
  2726.  * @example var data = $("input").fieldSerialize();
  2727.  * @desc Collect the data from all successful input elements into a query string
  2728.  *
  2729.  * @example var data = $(":radio").fieldSerialize();
  2730.  * @desc Collect the data from all successful radio input elements into a query string
  2731.  *
  2732.  * @example var data = $("#myForm :checkbox").fieldSerialize();
  2733.  * @desc Collect the data from all successful checkbox input elements in myForm into a query string
  2734.  *
  2735.  * @example var data = $("#myForm :checkbox").fieldSerialize(false);
  2736.  * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string
  2737.  *
  2738.  * @example var data = $(":input").fieldSerialize();
  2739.  * @desc Collect the data from all successful input, select, textarea and button elements into a query string
  2740.  *
  2741.  * @name fieldSerialize
  2742.  * @param successful true if only successful controls should be serialized (default is true)
  2743.  * @type String
  2744.  * @cat Plugins/Form
  2745.  */
  2746. $.fn.fieldSerialize = function(successful) {
  2747.     var a = [];
  2748.     this.each(function() {
  2749.         var n = this.name;
  2750.         if (!n) return;
  2751.         var v = $.fieldValue(this, successful);
  2752.         if (v && v.constructor == Array) {
  2753.             for (var i=0,max=v.length; i < max; i++)
  2754.                 a.push({name: n, value: v[i]});
  2755.         }
  2756.         else if (v !== null && typeof v != 'undefined')
  2757.             a.push({name: this.name, value: v});
  2758.     });
  2759.     //hand off to jQuery.param for proper encoding
  2760.     return $.param(a);
  2761. };
  2762.  
  2763.  
  2764. /**
  2765.  * Returns the value(s) of the element in the matched set.  For example, consider the following form:
  2766.  *
  2767.  *  <form><fieldset>
  2768.  *      <input name="A" type="text" />
  2769.  *      <input name="A" type="text" />
  2770.  *      <input name="B" type="checkbox" value="B1" />
  2771.  *      <input name="B" type="checkbox" value="B2"/>
  2772.  *      <input name="C" type="radio" value="C1" />
  2773.  *      <input name="C" type="radio" value="C2" />
  2774.  *  </fieldset></form>
  2775.  *
  2776.  *  var v = $(':text').fieldValue();
  2777.  *  // if no values are entered into the text inputs
  2778.  *  v == ['','']
  2779.  *  // if values entered into the text inputs are 'foo' and 'bar'
  2780.  *  v == ['foo','bar']
  2781.  *
  2782.  *  var v = $(':checkbox').fieldValue();
  2783.  *  // if neither checkbox is checked
  2784.  *  v === undefined
  2785.  *  // if both checkboxes are checked
  2786.  *  v == ['B1', 'B2']
  2787.  *
  2788.  *  var v = $(':radio').fieldValue();
  2789.  *  // if neither radio is checked
  2790.  *  v === undefined
  2791.  *  // if first radio is checked
  2792.  *  v == ['C1']
  2793.  *
  2794.  * The successful argument controls whether or not the field element must be 'successful'
  2795.  * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  2796.  * The default value of the successful argument is true.  If this value is false the value(s)
  2797.  * for each element is returned.
  2798.  *
  2799.  * Note: This method *always* returns an array.  If no valid value can be determined the
  2800.  *       array will be empty, otherwise it will contain one or more values.
  2801.  *
  2802.  * @example var data = $("#myPasswordElement").fieldValue();
  2803.  * alert(data[0]);
  2804.  * @desc Alerts the current value of the myPasswordElement element
  2805.  *
  2806.  * @example var data = $("#myForm :input").fieldValue();
  2807.  * @desc Get the value(s) of the form elements in myForm
  2808.  *
  2809.  * @example var data = $("#myForm :checkbox").fieldValue();
  2810.  * @desc Get the value(s) for the successful checkbox element(s) in the jQuery object.
  2811.  *
  2812.  * @example var data = $("#mySingleSelect").fieldValue();
  2813.  * @desc Get the value(s) of the select control
  2814.  *
  2815.  * @example var data = $(':text').fieldValue();
  2816.  * @desc Get the value(s) of the text input or textarea elements
  2817.  *
  2818.  * @example var data = $("#myMultiSelect").fieldValue();
  2819.  * @desc Get the values for the select-multiple control
  2820.  *
  2821.  * @name fieldValue
  2822.  * @param Boolean successful true if only the values for successful controls should be returned (default is true)
  2823.  * @type Array<String>
  2824.  * @cat Plugins/Form
  2825.  */
  2826. $.fn.fieldValue = function(successful) {
  2827.     for (var val=[], i=0, max=this.length; i < max; i++) {
  2828.         var el = this[i];
  2829.         var v = $.fieldValue(el, successful);
  2830.         if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
  2831.             continue;
  2832.         v.constructor == Array ? $.merge(val, v) : val.push(v);
  2833.     }
  2834.     return val;
  2835. };
  2836.  
  2837. /**
  2838.  * Returns the value of the field element.
  2839.  *
  2840.  * The successful argument controls whether or not the field element must be 'successful'
  2841.  * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  2842.  * The default value of the successful argument is true.  If the given element is not
  2843.  * successful and the successful arg is not false then the returned value will be null.
  2844.  *
  2845.  * Note: If the successful flag is true (default) but the element is not successful, the return will be null
  2846.  * Note: The value returned for a successful select-multiple element will always be an array.
  2847.  * Note: If the element has no value the return value will be undefined.
  2848.  *
  2849.  * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]);
  2850.  * @desc Gets the current value of the myPasswordElement element
  2851.  *
  2852.  * @name fieldValue
  2853.  * @param Element el The DOM element for which the value will be returned
  2854.  * @param Boolean successful true if value returned must be for a successful controls (default is true)
  2855.  * @type String or Array<String> or null or undefined
  2856.  * @cat Plugins/Form
  2857.  */
  2858. $.fieldValue = function(el, successful) {
  2859.     var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
  2860.     if (typeof successful == 'undefined') successful = true;
  2861.  
  2862.     if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
  2863.         (t == 'checkbox' || t == 'radio') && !el.checked ||
  2864.         (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
  2865.         tag == 'select' && el.selectedIndex == -1))
  2866.             return null;
  2867.  
  2868.     if (tag == 'select') {
  2869.         var index = el.selectedIndex;
  2870.         if (index < 0) return null;
  2871.         var a = [], ops = el.options;
  2872.         var one = (t == 'select-one');
  2873.         var max = (one ? index+1 : ops.length);
  2874.         for(var i=(one ? index : 0); i < max; i++) {
  2875.             var op = ops[i];
  2876.             if (op.selected) {
  2877.                 // extra pain for IE...
  2878.                 var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
  2879.                 if (one) return v;
  2880.                 a.push(v);
  2881.             }
  2882.         }
  2883.         return a;
  2884.     }
  2885.     return el.value;
  2886. };
  2887.  
  2888.  
  2889. /**
  2890.  * Clears the form data.  Takes the following actions on the form's input fields:
  2891.  *  - input text fields will have their 'value' property set to the empty string
  2892.  *  - select elements will have their 'selectedIndex' property set to -1
  2893.  *  - checkbox and radio inputs will have their 'checked' property set to false
  2894.  *  - inputs of type submit, button, reset, and hidden will *not* be effected
  2895.  *  - button elements will *not* be effected
  2896.  *
  2897.  * @example $('form').clearForm();
  2898.  * @desc Clears all forms on the page.
  2899.  *
  2900.  * @name clearForm
  2901.  * @type jQuery
  2902.  * @cat Plugins/Form
  2903.  */
  2904. $.fn.clearForm = function() {
  2905.     return this.each(function() {
  2906.         $('input,select,textarea', this).clearFields();
  2907.     });
  2908. };
  2909.  
  2910. /**
  2911.  * Clears the selected form elements.  Takes the following actions on the matched elements:
  2912.  *  - input text fields will have their 'value' property set to the empty string
  2913.  *  - select elements will have their 'selectedIndex' property set to -1
  2914.  *  - checkbox and radio inputs will have their 'checked' property set to false
  2915.  *  - inputs of type submit, button, reset, and hidden will *not* be effected
  2916.  *  - button elements will *not* be effected
  2917.  *
  2918.  * @example $('.myInputs').clearFields();
  2919.  * @desc Clears all inputs with class myInputs
  2920.  *
  2921.  * @name clearFields
  2922.  * @type jQuery
  2923.  * @cat Plugins/Form
  2924.  */
  2925. $.fn.clearFields = $.fn.clearInputs = function() {
  2926.     return this.each(function() {
  2927.         var t = this.type, tag = this.tagName.toLowerCase();
  2928.         if (t == 'text' || t == 'password' || tag == 'textarea')
  2929.             this.value = '';
  2930.         else if (t == 'checkbox' || t == 'radio')
  2931.             this.checked = false;
  2932.         else if (tag == 'select')
  2933.             this.selectedIndex = -1;
  2934.     });
  2935. };
  2936.  
  2937.  
  2938. /**
  2939.  * Resets the form data.  Causes all form elements to be reset to their original value.
  2940.  *
  2941.  * @example $('form').resetForm();
  2942.  * @desc Resets all forms on the page.
  2943.  *
  2944.  * @name resetForm
  2945.  * @type jQuery
  2946.  * @cat Plugins/Form
  2947.  */
  2948. $.fn.resetForm = function() {
  2949.     return this.each(function() {
  2950.         // guard against an input with the name of 'reset'
  2951.         // note that IE reports the reset function as an 'object'
  2952.         if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
  2953.             this.reset();
  2954.     });
  2955. };
  2956.  
  2957.  
  2958. /**
  2959.  * Enables or disables any matching elements.
  2960.  *
  2961.  * @example $(':radio').enabled(false);
  2962.  * @desc Disables all radio buttons
  2963.  *
  2964.  * @name select
  2965.  * @type jQuery
  2966.  * @cat Plugins/Form
  2967.  */
  2968. $.fn.enable = function(b) {
  2969.     if (b == undefined) b = true;
  2970.     return this.each(function() {
  2971.         this.disabled = !b
  2972.     });
  2973. };
  2974.  
  2975. /**
  2976.  * Checks/unchecks any matching checkboxes or radio buttons and
  2977.  * selects/deselects and matching option elements.
  2978.  *
  2979.  * @example $(':checkbox').select();
  2980.  * @desc Checks all checkboxes
  2981.  *
  2982.  * @name select
  2983.  * @type jQuery
  2984.  * @cat Plugins/Form
  2985.  */
  2986. $.fn.select = function(select) {
  2987.     if (select == undefined) select = true;
  2988.     return this.each(function() {
  2989.         var t = this.type;
  2990.         if (t == 'checkbox' || t == 'radio')
  2991.             this.checked = select;
  2992.         else if (this.tagName.toLowerCase() == 'option') {
  2993.             var $sel = $(this).parent('select');
  2994.             if (select && $sel[0] && $sel[0].type == 'select-one') {
  2995.                 // deselect all other options
  2996.                 $sel.find('option').select(false);
  2997.             }
  2998.             this.selected = select;
  2999.         }
  3000.     });
  3001. };
  3002.  
  3003. })(jQuery);
  3004.  
  3005.  
  3006. /* *** jquery.nivo.slider.js *** */
  3007. /*
  3008.  * jQuery Nivo Slider v3.1
  3009.  * http://nivo.dev7studios.com
  3010.  *
  3011.  * Copyright 2012, Dev7studios
  3012.  * Free to use and abuse under the MIT license.
  3013.  * http://www.opensource.org/licenses/mit-license.php
  3014.  */
  3015.  
  3016. (function(a){var b=function(b,c){var d=a.extend({},a.fn.nivoSlider.defaults,c);var e={currentSlide:0,currentImage:"",totalSlides:0,running:false,paused:false,stop:false,controlNavEl:false};var f=a(b);f.data("nivo:vars",e).addClass("nivoSlider");var g=f.children();g.each(function(){var b=a(this);var c="";if(!b.is("img")){if(b.is("a")){b.addClass("nivo-imageLink");c=b}b=b.find("img:first")}var d=d===0?b.attr("width"):b.width(),f=f===0?b.attr("height"):b.height();if(c!==""){c.css("display","none")}b.css("display","none");e.totalSlides++});if(d.randomStart){d.startSlide=Math.floor(Math.random()*e.totalSlides)}if(d.startSlide>0){if(d.startSlide>=e.totalSlides){d.startSlide=e.totalSlides-1}e.currentSlide=d.startSlide}if(a(g[e.currentSlide]).is("img")){e.currentImage=a(g[e.currentSlide])}else{e.currentImage=a(g[e.currentSlide]).find("img:first")}if(a(g[e.currentSlide]).is("a")){a(g[e.currentSlide]).css("display","block")}var h=a('<img class="nivo-main-image" src="#" />');h.attr("src",e.currentImage.attr("src")).show();f.append(h);a(window).resize(function(){f.children("img").width(f.width());h.attr("src",e.currentImage.attr("src"));h.stop().height("auto");a(".nivo-slice").remove();a(".nivo-box").remove()});f.append(a('<div class="nivo-caption"></div>'));var i=function(b){var c=a(".nivo-caption",f);if(e.currentImage.attr("title")!=""&&e.currentImage.attr("title")!=undefined){var d=e.currentImage.attr("title");if(d.substr(0,1)=="#")d=a(d).html();if(c.css("display")=="block"){setTimeout(function(){c.html(d)},b.animSpeed)}else{c.html(d);c.stop().fadeIn(b.animSpeed)}}else{c.stop().fadeOut(b.animSpeed)}};i(d);var j=0;if(!d.manualAdvance&&g.length>1){j=setInterval(function(){o(f,g,d,false)},d.pauseTime)}if(d.directionNav){f.append('<div class="nivo-directionNav"><a class="nivo-prevNav">'+d.prevText+'</a><a class="nivo-nextNav">'+d.nextText+"</a></div>");a("a.nivo-prevNav",f).live("click",function(){if(e.running){return false}clearInterval(j);j="";e.currentSlide-=2;o(f,g,d,"prev")});a("a.nivo-nextNav",f).live("click",function(){if(e.running){return false}clearInterval(j);j="";o(f,g,d,"next")})}if(d.controlNav){e.controlNavEl=a('<div class="nivo-controlNav"></div>');f.after(e.controlNavEl);for(var k=0;k<g.length;k++){if(d.controlNavThumbs){e.controlNavEl.addClass("nivo-thumbs-enabled");var l=g.eq(k);if(!l.is("img")){l=l.find("img:first")}if(l.attr("data-thumb"))e.controlNavEl.append('<a class="nivo-control" rel="'+k+'"><img src="'+l.attr("data-thumb")+'" alt="" /></a>')}else{e.controlNavEl.append('<a class="nivo-control" rel="'+k+'">'+(k+1)+"</a>")}}a("a:eq("+e.currentSlide+")",e.controlNavEl).addClass("active");a("a",e.controlNavEl).bind("click",function(){if(e.running)return false;if(a(this).hasClass("active"))return false;clearInterval(j);j="";h.attr("src",e.currentImage.attr("src"));e.currentSlide=a(this).attr("rel")-1;o(f,g,d,"control")})}if(d.pauseOnHover){f.hover(function(){e.paused=true;clearInterval(j);j=""},function(){e.paused=false;if(j===""&&!d.manualAdvance){j=setInterval(function(){o(f,g,d,false)},d.pauseTime)}})}f.bind("nivo:animFinished",function(){h.attr("src",e.currentImage.attr("src"));e.running=false;a(g).each(function(){if(a(this).is("a")){a(this).css("display","none")}});if(a(g[e.currentSlide]).is("a")){a(g[e.currentSlide]).css("display","block")}if(j===""&&!e.paused&&!d.manualAdvance){j=setInterval(function(){o(f,g,d,false)},d.pauseTime)}d.afterChange.call(this)});var m=function(b,c,d){if(a(d.currentImage).parent().is("a"))a(d.currentImage).parent().css("display","block");a('img[src="'+d.currentImage.attr("src")+'"]',b).not(".nivo-main-image,.nivo-control img").width(b.width()).css("visibility","hidden").show();var e=a('img[src="'+d.currentImage.attr("src")+'"]',b).not(".nivo-main-image,.nivo-control img").parent().is("a")?a('img[src="'+d.currentImage.attr("src")+'"]',b).not(".nivo-main-image,.nivo-control img").parent().height():a('img[src="'+d.currentImage.attr("src")+'"]',b).not(".nivo-main-image,.nivo-control img").height();for(var f=0;f<c.slices;f++){var g=Math.round(b.width()/c.slices);if(f===c.slices-1){b.append(a('<div class="nivo-slice" name="'+f+'"><img src="'+d.currentImage.attr("src")+'" style="position:absolute; width:'+b.width()+"px; height:auto; display:block !important; top:0; left:-"+(g+f*g-g)+'px;" /></div>').css({left:g*f+"px",width:b.width()-g*f+"px",height:e+"px",opacity:"0",overflow:"hidden"}))}else{b.append(a('<div class="nivo-slice" name="'+f+'"><img src="'+d.currentImage.attr("src")+'" style="position:absolute; width:'+b.width()+"px; height:auto; display:block !important; top:0; left:-"+(g+f*g-g)+'px;" /></div>').css({left:g*f+"px",width:g+"px",height:e+"px",opacity:"0",overflow:"hidden"}))}}a(".nivo-slice",b).height(e);h.stop().animate({height:a(d.currentImage).height()},c.animSpeed)};var n=function(b,c,d){if(a(d.currentImage).parent().is("a"))a(d.currentImage).parent().css("display","block");a('img[src="'+d.currentImage.attr("src")+'"]',b).not(".nivo-main-image,.nivo-control img").width(b.width()).css("visibility","hidden").show();var e=Math.round(b.width()/c.boxCols),f=Math.round(a('img[src="'+d.currentImage.attr("src")+'"]',b).not(".nivo-main-image,.nivo-control img").height()/c.boxRows);for(var g=0;g<c.boxRows;g++){for(var i=0;i<c.boxCols;i++){if(i===c.boxCols-1){b.append(a('<div class="nivo-box" name="'+i+'" rel="'+g+'"><img src="'+d.currentImage.attr("src")+'" style="position:absolute; width:'+b.width()+"px; height:auto; display:block; top:-"+f*g+"px; left:-"+e*i+'px;" /></div>').css({opacity:0,left:e*i+"px",top:f*g+"px",width:b.width()-e*i+"px"}));a('.nivo-box[name="'+i+'"]',b).height(a('.nivo-box[name="'+i+'"] img',b).height()+"px")}else{b.append(a('<div class="nivo-box" name="'+i+'" rel="'+g+'"><img src="'+d.currentImage.attr("src")+'" style="position:absolute; width:'+b.width()+"px; height:auto; display:block; top:-"+f*g+"px; left:-"+e*i+'px;" /></div>').css({opacity:0,left:e*i+"px",top:f*g+"px",width:e+"px"}));a('.nivo-box[name="'+i+'"]',b).height(a('.nivo-box[name="'+i+'"] img',b).height()+"px")}}}h.stop().animate({height:a(d.currentImage).height()},c.animSpeed)};var o=function(b,c,d,e){var f=b.data("nivo:vars");if(f&&f.currentSlide===f.totalSlides-1){d.lastSlide.call(this)}if((!f||f.stop)&&!e){return false}d.beforeChange.call(this);if(!e){h.attr("src",f.currentImage.attr("src"))}else{if(e==="prev"){h.attr("src",f.currentImage.attr("src"))}if(e==="next"){h.attr("src",f.currentImage.attr("src"))}}f.currentSlide++;if(f.currentSlide===f.totalSlides){f.currentSlide=0;d.slideshowEnd.call(this)}if(f.currentSlide<0){f.currentSlide=f.totalSlides-1}if(a(c[f.currentSlide]).is("img")){f.currentImage=a(c[f.currentSlide])}else{f.currentImage=a(c[f.currentSlide]).find("img:first")}if(d.controlNav){a("a",f.controlNavEl).removeClass("active");a("a:eq("+f.currentSlide+")",f.controlNavEl).addClass("active")}i(d);a(".nivo-slice",b).remove();a(".nivo-box",b).remove();var g=d.effect,j="";if(d.effect==="random"){j=new Array("sliceDownRight","sliceDownLeft","sliceUpRight","sliceUpLeft","sliceUpDown","sliceUpDownLeft","fold","fade","boxRandom","boxRain","boxRainReverse","boxRainGrow","boxRainGrowReverse");g=j[Math.floor(Math.random()*(j.length+1))];if(g===undefined){g="fade"}}if(d.effect.indexOf(",")!==-1){j=d.effect.split(",");g=j[Math.floor(Math.random()*j.length)];if(g===undefined){g="fade"}}if(f.currentImage.attr("data-transition")){g=f.currentImage.attr("data-transition")}f.running=true;var k=0,l=0,o="",q="",r="",s="";if(g==="sliceDown"||g==="sliceDownRight"||g==="sliceDownLeft"){m(b,d,f);k=0;l=0;o=a(".nivo-slice",b);if(g==="sliceDownLeft"){o=a(".nivo-slice",b)._reverse()}o.each(function(){var c=a(this);c.css({top:"0px"});if(l===d.slices-1){setTimeout(function(){c.animate({opacity:"1.0"},d.animSpeed,"",function(){b.trigger("nivo:animFinished")})},100+k)}else{setTimeout(function(){c.animate({opacity:"1.0"},d.animSpeed)},100+k)}k+=50;l++})}else if(g==="sliceUp"||g==="sliceUpRight"||g==="sliceUpLeft"){m(b,d,f);k=0;l=0;o=a(".nivo-slice",b);if(g==="sliceUpLeft"){o=a(".nivo-slice",b)._reverse()}o.each(function(){var c=a(this);c.css({bottom:"0px"});if(l===d.slices-1){setTimeout(function(){c.animate({opacity:"1.0"},d.animSpeed,"",function(){b.trigger("nivo:animFinished")})},100+k)}else{setTimeout(function(){c.animate({opacity:"1.0"},d.animSpeed)},100+k)}k+=50;l++})}else if(g==="sliceUpDown"||g==="sliceUpDownRight"||g==="sliceUpDownLeft"){m(b,d,f);k=0;l=0;var t=0;o=a(".nivo-slice",b);if(g==="sliceUpDownLeft"){o=a(".nivo-slice",b)._reverse()}o.each(function(){var c=a(this);if(l===0){c.css("top","0px");l++}else{c.css("bottom","0px");l=0}if(t===d.slices-1){setTimeout(function(){c.animate({opacity:"1.0"},d.animSpeed,"",function(){b.trigger("nivo:animFinished")})},100+k)}else{setTimeout(function(){c.animate({opacity:"1.0"},d.animSpeed)},100+k)}k+=50;t++})}else if(g==="fold"){m(b,d,f);k=0;l=0;a(".nivo-slice",b).each(function(){var c=a(this);var e=c.width();c.css({top:"0px",width:"0px"});if(l===d.slices-1){setTimeout(function(){c.animate({width:e,opacity:"1.0"},d.animSpeed,"",function(){b.trigger("nivo:animFinished")})},100+k)}else{setTimeout(function(){c.animate({width:e,opacity:"1.0"},d.animSpeed)},100+k)}k+=50;l++})}else if(g==="fade"){m(b,d,f);q=a(".nivo-slice:first",b);q.css({width:b.width()+"px"});q.animate({opacity:"1.0"},d.animSpeed*2,"",function(){b.trigger("nivo:animFinished")})}else if(g==="slideInRight"){m(b,d,f);q=a(".nivo-slice:first",b);q.css({width:"0px",opacity:"1"});q.animate({width:b.width()+"px"},d.animSpeed*2,"",function(){b.trigger("nivo:animFinished")})}else if(g==="slideInLeft"){m(b,d,f);q=a(".nivo-slice:first",b);q.css({width:"0px",opacity:"1",left:"",right:"0px"});q.animate({width:b.width()+"px"},d.animSpeed*2,"",function(){q.css({left:"0px",right:""});b.trigger("nivo:animFinished")})}else if(g==="boxRandom"){n(b,d,f);r=d.boxCols*d.boxRows;l=0;k=0;s=p(a(".nivo-box",b));s.each(function(){var c=a(this);if(l===r-1){setTimeout(function(){c.animate({opacity:"1"},d.animSpeed,"",function(){b.trigger("nivo:animFinished")})},100+k)}else{setTimeout(function(){c.animate({opacity:"1"},d.animSpeed)},100+k)}k+=20;l++})}else if(g==="boxRain"||g==="boxRainReverse"||g==="boxRainGrow"||g==="boxRainGrowReverse"){n(b,d,f);r=d.boxCols*d.boxRows;l=0;k=0;var u=0;var v=0;var w=[];w[u]=[];s=a(".nivo-box",b);if(g==="boxRainReverse"||g==="boxRainGrowReverse"){s=a(".nivo-box",b)._reverse()}s.each(function(){w[u][v]=a(this);v++;if(v===d.boxCols){u++;v=0;w[u]=[]}});for(var x=0;x<d.boxCols*2;x++){var y=x;for(var z=0;z<d.boxRows;z++){if(y>=0&&y<d.boxCols){(function(c,e,f,h,i){var j=a(w[c][e]);var k=j.width();var l=j.height();if(g==="boxRainGrow"||g==="boxRainGrowReverse"){j.width(0).height(0)}if(h===i-1){setTimeout(function(){j.animate({opacity:"1",width:k,height:l},d.animSpeed/1.3,"",function(){b.trigger("nivo:animFinished")})},100+f)}else{setTimeout(function(){j.animate({opacity:"1",width:k,height:l},d.animSpeed/1.3)},100+f)}})(z,y,k,l,r);l++}y--}k+=100}}};var p=function(a){for(var b,c,d=a.length;d;b=parseInt(Math.random()*d,10),c=a[--d],a[d]=a[b],a[b]=c);return a};var q=function(a){if(this.console&&typeof console.log!=="undefined"){console.log(a)}};this.stop=function(){if(!a(b).data("nivo:vars").stop){a(b).data("nivo:vars").stop=true;q("Stop Slider")}};this.start=function(){if(a(b).data("nivo:vars").stop){a(b).data("nivo:vars").stop=false;q("Start Slider")}};d.afterLoad.call(this);return this};a.fn.nivoSlider=function(c){return this.each(function(d,e){var f=a(this);if(f.data("nivoslider")){return f.data("nivoslider")}var g=new b(this,c);f.data("nivoslider",g)})};a.fn.nivoSlider.defaults={effect:"random",slices:15,boxCols:8,boxRows:4,animSpeed:500,pauseTime:3e3,startSlide:0,directionNav:true,controlNav:true,controlNavThumbs:false,pauseOnHover:true,manualAdvance:false,prevText:"Prev",nextText:"Next",randomStart:false,beforeChange:function(){},afterChange:function(){},slideshowEnd:function(){},lastSlide:function(){},afterLoad:function(){}};a.fn._reverse=[].reverse})(jQuery);
  3017.  
  3018.  
  3019. /* *** jquery.touchwipe.min.js *** */
  3020. /**
  3021.  * jQuery Plugin to obtain touch gestures from iPhone, iPod Touch and iPad, should also work with Android mobile phones (not tested yet!)
  3022.  * Common usage: wipe images (left and right to show the previous or next image)
  3023.  *
  3024.  * @author Andreas Waltl, netCU Internetagentur (http://www.netcu.de)
  3025.  * @version 1.1.1 (9th December 2010) - fix bug (older IE's had problems)
  3026.  * @version 1.1 (1st September 2010) - support wipe up and wipe down
  3027.  * @version 1.0 (15th July 2010)
  3028.  */
  3029. /*(function($){$.fn.touchwipe=function(settings){var config={min_move_x:20,min_move_y:20,wipeLeft:function(){},wipeRight:function(){},wipeUp:function(){},wipeDown:function(){},preventDefaultEvents:true};if(settings)$.extend(config,settings);this.each(function(){var startX;var startY;var isMoving=false;function cancelTouch(){this.removeEventListener('touchmove',onTouchMove);startX=null;isMoving=false}function onTouchMove(e){if(config.preventDefaultEvents){e.preventDefault()}if(isMoving){var x=e.touches[0].pageX;var y=e.touches[0].pageY;var dx=startX-x;var dy=startY-y;if(Math.abs(dx)>=config.min_move_x){cancelTouch();if(dx>0){config.wipeLeft()}else{config.wipeRight()}}else if(Math.abs(dy)>=config.min_move_y){cancelTouch();if(dy>0){config.wipeDown()}else{config.wipeUp()}}}}function onTouchStart(e){if(e.touches.length==1){startX=e.touches[0].pageX;startY=e.touches[0].pageY;isMoving=true;this.addEventListener('touchmove',onTouchMove,false)}}if('ontouchstart'in document.documentElement){this.addEventListener('touchstart',onTouchStart,false)}});return this}})(jQuery);*/
  3030.        
  3031.  
  3032. /* *** script.js *** */
  3033. var demo = true;
  3034. var ie = false;
  3035. var mobileDevice = false;
  3036. var smallDevice = false;
  3037. var androidDevice = false;
  3038. if(
  3039.         navigator.userAgent.match(/Android/i) ||
  3040.         navigator.userAgent.match(/webOS/i) ||
  3041.         navigator.userAgent.match(/iPhone/i) ||
  3042.         navigator.userAgent.match(/iPad/i) ||
  3043.         navigator.userAgent.match(/iPod/i))
  3044. {
  3045.         mobileDevice = true;
  3046. }
  3047. if ($.browser.msie && $.browser.version < 9) {
  3048.     ie = true; 
  3049. }
  3050. if (navigator.userAgent.match(/Android/i)) {
  3051.         var androidDevice = true;
  3052.         $('html').addClass('android');
  3053. }
  3054. if (navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPod/i)) {
  3055.         var smallDevice = true;
  3056.         $('html').addClass('smallDevice');
  3057. }
  3058.  
  3059. $(document).ready(function() {
  3060.  
  3061.         $('.fullscreen_slider').css('margin-left' , -1*($(window).width()-$('.container').width())/2+'px').width($(window).width());
  3062.  
  3063.         if ($(window).width() > 760) {
  3064.                 $('.price_item').width(Math.floor($('.price_table_wrapper').width()/4));
  3065.         }
  3066.  
  3067.         $('.header_social_content').width(20+(36*$('.header_social_content').find('li').size()));
  3068.         $('.header_social_block').addClass('head_hided');
  3069.         $('.footer_social_content').width(20+(36*$('.footer_social_content').find('li').size()));
  3070.  
  3071.  
  3072.         if ($('.module_revolution_slider').hasClass('rs-fullscreen_wrapper')) {
  3073.                 $('html').addClass('fs-slider');
  3074.                 setMar = -1*($(window).width()-$('.container').width())/2;
  3075.                 $('header').find('nav').css({'margin-left' : setMar+'px', 'padding-left' : (-1*setMar)+'px', 'padding-right' : (-1*setMar)+'px'});             
  3076.         }
  3077.  
  3078.         /*btn2top*/
  3079.         if ($(window).width() > 1200) {
  3080.                 $('.footer_tools').append('<a href="javascript:void(0)" class="btn2top"></a>');
  3081.                 //var back2top_int = setInterval(back2top_btn, 100);
  3082.                 $('.btn2top').live('click', function(){
  3083.                         $("html:not(:animated)" +( !$.browser.opera ? ",body:not(:animated)" : "")).animate({ scrollTop: 0}, 500 );  
  3084.                         return false;          
  3085.                 });            
  3086.         }
  3087.        
  3088.         /*Diagram Shortcode*/
  3089.     $('.skill_div').each(function(){
  3090.         parent_width = $(this).parent('.diagram_bg').width()-68;
  3091.         set_width = (parseInt($(this).attr('data-percent'))*parent_width)/100;
  3092.         $(this).stop().animate({'width' : set_width + 'px'},1000);
  3093.     });
  3094.                                                    
  3095.         $('.header_tool_toggler').click(function(){
  3096.                 $('.header_social_block').addClass('head_hided');
  3097.                 $('div.header_tool_block').removeClass('toggled');
  3098.                 $(this).parent('.header_tool_block').addClass('toggled');
  3099.         });
  3100.         $('.header_social_toggler').click(function(){
  3101.                 $('div.header_tool_block').removeClass('toggled');
  3102.                 $('.header_social_block').removeClass('head_hided');
  3103.         });
  3104.         $('.footer_tool_toggler').click(function(){
  3105.                 $('.footer_social_block').addClass('head_hided');              
  3106.                 $('div.footer_tool_block').removeClass('toggled');
  3107.                 $(this).parent('.footer_tool_block').addClass('toggled');
  3108.         });
  3109.         $('.footer_social_toggler').click(function(){
  3110.                 $('div.footer_tool_block').removeClass('toggled');
  3111.                 $('.footer_social_block').removeClass('head_hided');
  3112.         });            
  3113.         //var fixd_menu = setInterval(scrolled_menu, 100);       
  3114.  
  3115.         if ($('.custom_bg_cont').size() > 0) {
  3116.                 $('html').addClass('user_bg_layout');
  3117.                 $('.header_wrapper').wrap('<div class="header_layout"/>');
  3118.                 if ($('.custom_bg_cont').hasClass('bg_pic')) {
  3119.                         $('html').addClass('user_pic_layout');
  3120.                 }
  3121.         }
  3122.         //Menu SetUp and animation
  3123.         $('.menu').find('li:has(ul)').addClass('has-menu');
  3124.         $('.menu').children('li.has-menu').addClass('level1');
  3125.         $('.menu').find('li.level1').find('ul.sub-menu').children('li.has-menu').addClass('level2');
  3126.         /*$('ul.menu').superfish({
  3127.                 delay:300,
  3128.                 dropShadows:false,
  3129.                 autoArrows:false,
  3130.                 speed:300
  3131.         });*/
  3132.        
  3133.         mainmenu_items = $('header').find('.menu').children('li').size();
  3134.         menu_item_size = Math.floor($('header').find('.menu').width()/mainmenu_items);
  3135.         $('header').find('.menu').children('li').each(function(){              
  3136.                 if ($(this).children('a').attr('title')) {
  3137.                         $(this).children('a').append("<span>"+$(this).children('a').attr('title')+"</span>");
  3138.                 }
  3139.                 $(this).width(menu_item_size);
  3140.                 if ($(this).hasClass('has-menu')) {
  3141.                         $(this).children('ul.sub-menu').width(menu_item_size);
  3142.                 }
  3143.         });
  3144.                
  3145.         //MobileMenu
  3146.         $('.header_wrapper').append('<a href="javascript:void(0)" class="menu_toggler"/>');
  3147.         $('header').append('<div class="mobile_menu_wrapper"><ul class="mobile_menu container"/></div>');      
  3148.         $('.mobile_menu').html($('header').find('.menu').html());
  3149.         $('.menu_toggler').live('click', function(){
  3150.                 $('.mobile_menu_wrapper').slideToggle(300);
  3151.         });
  3152.         $('header .menu').find('li').each(function(){
  3153.                 cur_link = $(this).children("a");
  3154.         });
  3155.        
  3156.         //Input and Textarea Click-Clear
  3157.         $('input[type=text]').focus(function() {
  3158.                 if($(this).attr('readonly') || $(this).attr('readonly') == 'readonly') return false;
  3159.                 if ($(this).val() === $(this).attr('title')) {
  3160.                                 $(this).val('');
  3161.                 }  
  3162.                 }).blur(function() {
  3163.                 if($(this).attr('readonly') || $(this).attr('readonly') == 'readonly') return false;
  3164.                 if ($(this).val().length === 0) {
  3165.                         $(this).val($(this).attr('title'));
  3166.                 }                        
  3167.         });    
  3168.         $('textarea').focus(function() {
  3169.                 if ($(this).text() === $(this).attr('title')) {
  3170.                                 $(this).text('');
  3171.                         }        
  3172.                 }).blur(function() {
  3173.                 if ($(this).text().length === 0) {
  3174.                         $(this).text($(this).attr('title'));
  3175.                 }                        
  3176.         });    
  3177.        
  3178.         //FeedBack Form
  3179.         $('.content_block').find('.form_field').each(function(){
  3180.                 $(this).width($(this).parent('form').width()-36);
  3181.         });    
  3182.         $('.feedback_go').click(function(){
  3183.                 var par = $(this).parents(".feedback_form");
  3184.                 var name = par.find(".field-name").val();
  3185.                 var email = par.find(".field-email").val();
  3186.                 var message = par.find(".field-message").val();
  3187.                 var subject = par.find(".field-subject").val();
  3188.                 if (email.indexOf('@') < 0) {                  
  3189.                         email = "mail_error";
  3190.                 }
  3191.                 if (email.indexOf('.') < 0) {                  
  3192.                         email = "mail_error";
  3193.                 }
  3194.                 $.ajax({
  3195.                         url: "mail.php",
  3196.                         type: "POST",
  3197.                         data: { name: name, email: email, message: message, subject: subject },
  3198.                         success: function(data) {
  3199.                                 $('.ajaxanswer').hide().empty().html(data).show("slow");
  3200.                                 setTimeout("$('.ajaxanswer').fadeOut('slow')",5000);
  3201.                   }
  3202.                 });
  3203.         });
  3204.        
  3205.         //Portfolio
  3206.         var $container = $('.portfolio_block');
  3207.  
  3208.     $('.accordion').each(function(){
  3209.         if ($(this).find('.expanded_yes').size() < 1) {
  3210.             marked_h5 = 0;
  3211.         } else {
  3212.             marked_h5 = parseInt($(this).find('.expanded_yes').attr('data-count'));
  3213.         }
  3214.         activeTab = marked_h5-1;
  3215.         $(this).accordion({
  3216.             autoHeight: false,
  3217.             active: activeTab,
  3218.             collapsible: false
  3219.         });
  3220.     });
  3221.        
  3222.         $('.shortcode_toggles_item_title').click(function(){
  3223.                 $(this).next().slideToggle();
  3224.                 $(this).toggleClass('ui-state-active');
  3225.         });
  3226.        
  3227.         footer_setup();
  3228.         $('.carouselslider').each(function(){
  3229.                 dispNum = parseInt($(this).attr('data-count'));
  3230.                 if ($(window).width()< 760) {
  3231.                         dispNum = 1;
  3232.                 }
  3233.                 $(this).carousel({
  3234. //                      dispItems: dispNum,
  3235. //                      showEmptyItems: 0      
  3236.                         interval: 3000
  3237.                 });
  3238.         });    
  3239.        
  3240. });    
  3241.  
  3242. $(window).load(function(){     
  3243.         $('.rs-fullscreen').css('margin-left' , -1*($(window).width()-$('.container').width())/2+'px').width($(window).width());
  3244.         /*VideoFrames*/
  3245.         $('.video_frame').each(function(){
  3246.                 $(this).height(($(this).width()/16)*9);
  3247.         });
  3248.        
  3249.         /* Flickr */
  3250.         $('.widget_flickr').find('.flickr_badge_image').each(function(){
  3251.                 $(this).find('a').append('<div class="flickr_fadder"/>')
  3252.         });
  3253.  
  3254.         /*shortcode_messagebox close*/
  3255.         $('.shortcode_messagebox').find('.box_close').click(function(){
  3256.                 $(this).parents('.module_messageboxes').fadeOut(400);
  3257.         });
  3258.        
  3259.         if (!mobileDevice) {
  3260.                 //$('.header_social_content').find('a').tipsy({gravity: 'n', fade: true});
  3261.                 $('.footer_social_content').find('a').tipsy({gravity: 's', fade: true});
  3262.         }
  3263.        
  3264.         footer_setup();
  3265.         $('.commentlist').find('.stand_comment').each(function(){
  3266.                 set_width = $(this).width() - $(this).find('.commentava').width() - 45;
  3267.                 $(this).find('.thiscommentbody').width(set_width);
  3268.         });            
  3269.        
  3270.         //Portfolio
  3271.         $('.prettyPhoto').prettyPhoto();
  3272.        
  3273.         if ($('.columns1').html()) {
  3274.                 $('.portfolio_block').isotope('reLayout');
  3275.         }
  3276.                
  3277.         $('.nivoSlider').each(function(){
  3278.                 $(this).nivoSlider({
  3279.                         directionNavHide:false,
  3280.                         effect:'fade',
  3281.                         pauseTime:4000
  3282.                 });
  3283.         });    
  3284.  
  3285.         if (($(window).width() > 1200) && ie == false) {
  3286.                 $('.recent_posts').find('li').each(function(){
  3287.                         $(this).find('.recent_posts_content').width($(this).width()-$(this).find('.img_wrapper').width()-40);
  3288.                 });
  3289.         }
  3290.         if ($(window).width() < 760) {
  3291.                 $('.recent_posts').find('li').each(function(){
  3292.                         $(this).find('.recent_posts_content').width($(this).width()-$(this).find('.img_wrapper').width()-40);
  3293.                 });
  3294.         }      
  3295.        
  3296. });
  3297.  
  3298. $(window).resize(function(){
  3299.         if ($(window).width() > 760) {
  3300.                 $('.price_item').width(Math.floor($('.price_table_wrapper').width()/4));
  3301.         }
  3302.        
  3303.         $('.rs-fullscreen').css('margin-left' , -1*($(window).width()-$('.container').width())/2+'px').width($(window).width());
  3304.         setMar = -1*($(window).width()-$('.container').width())/2;
  3305.         $('header').find('nav').css({'margin-left' : setMar+'px', 'padding-left' : (-1*setMar)+'px', 'padding-right' : (-1*setMar)+'px'});
  3306.  
  3307.         if (($(window).width() > 1200) && ie == false) {
  3308.                 $('.recent_posts').find('li').each(function(){
  3309.                         $(this).find('.recent_posts_content').width($(this).width()-$(this).find('.img_wrapper').width()-40);
  3310.                 });
  3311.         }
  3312.         if ($(window).width() < 760) {
  3313.                 $('.recent_posts').find('li').each(function(){
  3314.                         $(this).find('.recent_posts_content').width($(this).width()-$(this).find('.img_wrapper').width()-40);
  3315.                 });
  3316.         }      
  3317.                
  3318.         footer_setup();
  3319.     $('.skill_div').each(function(){
  3320.         parent_width = $(this).parent('.diagram_bg').width()-68;
  3321.         set_width = (parseInt($(this).attr('data-percent'))*parent_width)/100;
  3322.         $(this).stop().animate({'width' : set_width + 'px'},1000);
  3323.     });
  3324.         mainmenu_items = $('header').find('.menu').children('li').size();
  3325.         menu_item_size = Math.floor($('header').find('.menu').width()/mainmenu_items);
  3326.         $('header').find('.menu').children('li').each(function(){              
  3327.                 $(this).width(menu_item_size);
  3328.                 if ($(this).hasClass('has-menu')) {
  3329.                         $(this).children('ul.sub-menu').width(menu_item_size);
  3330.                 }
  3331.         });
  3332.  
  3333.         $('.content_block').find('.form_field').each(function(){
  3334.                 $(this).width($(this).parent('form').width()-36);
  3335.         });    
  3336.        
  3337.         $('.fullscreen_slider').css('margin-left' , -1*($(window).width()-$('.container').width())/2+'px').width($(window).width());
  3338.  
  3339. });
  3340.  
  3341. function footer_setup() {
  3342.         $('.content_wrapper').css('min-height', $(window).height()-$('header').height()-$('footer').height()-150-$('.pre_footer').height()+'px');
  3343. }
  3344.  
  3345. function back2top_btn() {      
  3346.         if($(window).scrollTop() > $('header').height()) {
  3347.                 $('body').find('.btn2top').fadeIn(300);
  3348.         }
  3349.         else {
  3350.                 $('body').find('.btn2top').fadeOut(300);
  3351.         }
  3352. }
  3353.  
  3354.  
  3355. /* *** jquery.tweet.js *** */
  3356. // jquery.tweet.js - See http://tweet.seaofclouds.com/ or https://github.com/seaofclouds/tweet for more info
  3357. // Copyright (c) 2008-2011 Todd Matthews & Steve Purcell
  3358. (function (factory) {
  3359.   if (typeof define === 'function' && define.amd)
  3360.     define(['jquery'], factory); // AMD support for RequireJS etc.
  3361.   else
  3362.     factory(jQuery);
  3363. }(function ($) {
  3364.   $.fn.tweet = function(o){
  3365.     var s = $.extend({
  3366.       username: null,                           // [string or array] required unless using the 'query' option; one or more twitter screen names (use 'list' option for multiple names, where possible)
  3367.       list: null,                               // [string]   optional name of list belonging to username
  3368.       favorites: false,                         // [boolean]  display the user's favorites instead of his tweets
  3369.       query: null,                              // [string]   optional search query (see also: http://search.twitter.com/operators)
  3370.       avatar_size: null,                        // [integer]  height and width of avatar if displayed (48px max)
  3371.       count: 3,                                 // [integer]  how many tweets to display?
  3372.       fetch: null,                              // [integer]  how many tweets to fetch via the API (set this higher than 'count' if using the 'filter' option)
  3373.       page: 1,                                  // [integer]  which page of results to fetch (if count != fetch, you'll get unexpected results)
  3374.       retweets: true,                           // [boolean]  whether to fetch (official) retweets (not supported in all display modes)
  3375.       intro_text: null,                         // [string]   do you want text BEFORE your your tweets?
  3376.       outro_text: null,                         // [string]   do you want text AFTER your tweets?
  3377.       join_text:  null,                         // [string]   optional text in between date and tweet, try setting to "auto"
  3378.       auto_join_text_default: "I said,",        // [string]   auto text for non verb: "I said" bullocks
  3379.       auto_join_text_ed: "I",                   // [string]   auto text for past tense: "I" surfed
  3380.       auto_join_text_ing: "I am",               // [string]   auto tense for present tense: "I was" surfing
  3381.       auto_join_text_reply: "I replied to",     // [string]   auto tense for replies: "I replied to" @someone "with"
  3382.       auto_join_text_url: "I was looking at",   // [string]   auto tense for urls: "I was looking at" http:...
  3383.       loading_text: null,                       // [string]   optional loading text, displayed while tweets load
  3384.       refresh_interval: null,                   // [integer]  optional number of seconds after which to reload tweets
  3385.       twitter_url: "twitter.com",               // [string]   custom twitter url, if any (apigee, etc.)
  3386.       twitter_api_url: "api.twitter.com",       // [string]   custom twitter api url, if any (apigee, etc.)
  3387.       twitter_search_url: "search.twitter.com", // [string]   custom twitter search url, if any (apigee, etc.)
  3388.       template: "{avatar}{time}{join}{text}",   // [string or function] template used to construct each tweet <li> - see code for available vars
  3389.       comparator: function(tweet1, tweet2) {    // [function] comparator used to sort tweets (see Array.sort)
  3390.         return tweet2["tweet_time"] - tweet1["tweet_time"];
  3391.       },
  3392.       filter: function(tweet) {                 // [function] whether or not to include a particular tweet (be sure to also set 'fetch')
  3393.         return true;
  3394.       }
  3395.       // You can attach callbacks to the following events using jQuery's standard .bind() mechanism:
  3396.       //   "loaded" -- triggered when tweets have been fetched and rendered
  3397.     }, o);
  3398.  
  3399.     // See http://daringfireball.net/2010/07/improved_regex_for_matching_urls
  3400.     var url_regexp = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»""'']))/gi;
  3401.  
  3402.     // Expand values inside simple string templates with {placeholders}
  3403.     function t(template, info) {
  3404.       if (typeof template === "string") {
  3405.         var result = template;
  3406.         for(var key in info) {
  3407.           var val = info[key];
  3408.           result = result.split('{'+key+'}').join(val === null ? '' : val);
  3409.         }
  3410.         return result;
  3411.       } else return template(info);
  3412.     }
  3413.     // Export the t function for use when passing a function as the 'template' option
  3414.     $.extend({tweet: {t: t}});
  3415.  
  3416.     function replacer (regex, replacement) {
  3417.       return function() {
  3418.         var returning = [];
  3419.         this.each(function() {
  3420.           returning.push(this.replace(regex, replacement));
  3421.         });
  3422.         return $(returning);
  3423.       };
  3424.     }
  3425.  
  3426.     function escapeHTML(s) {
  3427.       return s.replace(/</g,"&lt;").replace(/>/g,"^&gt;");
  3428.     }
  3429.  
  3430.     $.fn.extend({
  3431.       linkUser: replacer(/(^|[\W])@(\w+)/gi, "$1<span class=\"at\">@</span><a href=\"http://"+s.twitter_url+"/$2\">$2</a>"),
  3432.       // Support various latin1 (\u00**) and arabic (\u06**) alphanumeric chars
  3433.       linkHash: replacer(/(?:^| )[\#]+([\w\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff\u0600-\u06ff]+)/gi,
  3434.                          ' <a href="http://'+s.twitter_search_url+'/search?q=&tag=$1&lang=all'+
  3435.                          ((s.username && s.username.length == 1 && !s.list) ? '&from='+s.username.join("%2BOR%2B") : '')+
  3436.                          '" class="tweet_hashtag">#$1</a>'),
  3437.       makeHeart: replacer(/(&lt;)+[3]/gi, "<tt class='heart'>&#x2665;</tt>")
  3438.     });
  3439.  
  3440.     function linkURLs(text, entities) {
  3441.       return text.replace(url_regexp, function(match) {
  3442.         var url = (/^[a-z]+:/i).test(match) ? match : "http://"+match;
  3443.         var text = match;
  3444.         for(var i = 0; i < entities.length; ++i) {
  3445.           var entity = entities[i];
  3446.           if (entity.url == url && entity.expanded_url) {
  3447.             url = entity.expanded_url;
  3448.             text = entity.display_url;
  3449.             break;
  3450.           }
  3451.         }
  3452.         return "<a href=\""+escapeHTML(url)+"\">"+escapeHTML(text)+"</a>";
  3453.       });
  3454.     }
  3455.  
  3456.     function parse_date(date_str) {
  3457.       // The non-search twitter APIs return inconsistently-formatted dates, which Date.parse
  3458.       // cannot handle in IE. We therefore perform the following transformation:
  3459.       // "Wed Apr 29 08:53:31 +0000 2009" => "Wed, Apr 29 2009 08:53:31 +0000"
  3460.       return Date.parse(date_str.replace(/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, '$1,$2$4$3'));
  3461.     }
  3462.  
  3463.     function extract_relative_time(date) {
  3464.       var toInt = function(val) { return parseInt(val, 10); };
  3465.       var relative_to = new Date();
  3466.       var delta = toInt((relative_to.getTime() - date) / 1000);
  3467.       if (delta < 1) delta = 0;
  3468.       return {
  3469.         days:    toInt(delta / 86400),
  3470.         hours:   toInt(delta / 3600),
  3471.         minutes: toInt(delta / 60),
  3472.         seconds: toInt(delta)
  3473.       };
  3474.     }
  3475.  
  3476.     function format_relative_time(time_ago) {
  3477.       if ( time_ago.days > 2 )     return 'about ' + time_ago.days + ' days ago';
  3478.       if ( time_ago.hours > 24 )   return 'about a day ago';
  3479.       if ( time_ago.hours > 2 )    return 'about ' + time_ago.hours + ' hours ago';
  3480.       if ( time_ago.minutes > 45 ) return 'about an hour ago';
  3481.       if ( time_ago.minutes > 2 )  return 'about ' + time_ago.minutes + ' minutes ago';
  3482.       if ( time_ago.seconds > 1 )  return 'about ' + time_ago.seconds + ' seconds ago';
  3483.       return 'just now';
  3484.     }
  3485.  
  3486.     function build_auto_join_text(text) {
  3487.       if (text.match(/^(@([A-Za-z0-9-_]+)) .*/i)) {
  3488.         return s.auto_join_text_reply;
  3489.       } else if (text.match(url_regexp)) {
  3490.         return s.auto_join_text_url;
  3491.       } else if (text.match(/^((\w+ed)|just) .*/im)) {
  3492.         return s.auto_join_text_ed;
  3493.       } else if (text.match(/^(\w*ing) .*/i)) {
  3494.         return s.auto_join_text_ing;
  3495.       } else {
  3496.         return s.auto_join_text_default;
  3497.       }
  3498.     }
  3499.  
  3500.     function build_api_url() {
  3501.       var proto = ('https:' == document.location.protocol ? 'https:' : 'http:');
  3502.       var count = (s.fetch === null) ? s.count : s.fetch;
  3503.       var common_params = '&include_entities=1&callback=?';
  3504.       if (s.list) {
  3505.         return proto+"//"+s.twitter_api_url+"/1/"+s.username[0]+"/lists/"+s.list+"/statuses.json?page="+s.page+"&per_page="+count+common_params;
  3506.       } else if (s.favorites) {
  3507.         return proto+"//"+s.twitter_api_url+"/favorites/"+s.username[0]+".json?page="+s.page+"&count="+count+common_params;
  3508.       } else if (s.query === null && s.username.length == 1) {
  3509.         return proto+'//'+s.twitter_api_url+'/1/statuses/user_timeline.json?screen_name='+s.username[0]+'&count='+count+(s.retweets ? '&include_rts=1' : '')+'&page='+s.page+common_params;
  3510.       } else {
  3511.         var query = (s.query || 'from:'+s.username.join(' OR from:'));
  3512.         return proto+'//'+s.twitter_search_url+'/search.json?&q='+encodeURIComponent(query)+'&rpp='+count+'&page='+s.page+common_params;
  3513.       }
  3514.     }
  3515.  
  3516.     function extract_avatar_url(item, secure) {
  3517.       if (secure) {
  3518.         return ('user' in item) ?
  3519.           item.user.profile_image_url_https :
  3520.           extract_avatar_url(item, false).
  3521.             replace(/^http:\/\/[a-z0-9]{1,3}\.twimg\.com\//, "https://s3.amazonaws.com/twitter_production/");
  3522.       } else {
  3523.         return item.profile_image_url || item.user.profile_image_url;
  3524.       }
  3525.     }
  3526.  
  3527.     // Convert twitter API objects into data available for
  3528.     // constructing each tweet <li> using a template
  3529.     function extract_template_data(item){
  3530.       var o = {};
  3531.       o.item = item;
  3532.       o.source = item.source;
  3533.       o.screen_name = item.from_user || item.user.screen_name;
  3534.       // The actual user name is not returned by all Twitter APIs, so please do not
  3535.       // file an issue if it is empty:
  3536.       o.name = item.from_user_name || item.user.name;
  3537.       o.retweet = typeof(item.retweeted_status) != 'undefined';
  3538.  
  3539.       o.tweet_time = parse_date(item.created_at);
  3540.       o.join_text = s.join_text == "auto" ? build_auto_join_text(item.text) : s.join_text;
  3541.       o.tweet_id = item.id_str;
  3542.       o.twitter_base = "http://"+s.twitter_url+"/";
  3543.       o.user_url = o.twitter_base+o.screen_name;
  3544.       o.tweet_url = o.user_url+"/status/"+o.tweet_id;
  3545.       o.reply_url = o.twitter_base+"intent/tweet?in_reply_to="+o.tweet_id;
  3546.       o.retweet_url = o.twitter_base+"intent/retweet?tweet_id="+o.tweet_id;
  3547.       o.favorite_url = o.twitter_base+"intent/favorite?tweet_id="+o.tweet_id;
  3548.       o.retweeted_screen_name = o.retweet && item.retweeted_status.user.screen_name;
  3549.       o.tweet_relative_time = format_relative_time(extract_relative_time(o.tweet_time));
  3550.       o.entities = item.entities ? (item.entities.urls || []).concat(item.entities.media || []) : [];
  3551.       o.tweet_raw_text = o.retweet ? ('RT @'+o.retweeted_screen_name+' '+item.retweeted_status.text) : item.text; // avoid '...' in long retweets
  3552.       o.tweet_text = $([linkURLs(o.tweet_raw_text, o.entities)]).linkUser().linkHash()[0];
  3553.       o.retweeted_tweet_text = $([linkURLs