﻿//SynPortal所使用Jquery插件的集合
/*中文版修改了flyout和crsooSlide 的提示文字
*This kit includes SimpleModal,PrettyCheckboxes,Jqzoom , flyout and crossSlide
*
* SimpleModal 1.2.2 - jQuery Plugin
* http://www.ericmmartin.com/projects/simplemodal/
* Copyright (c) 2008 Eric Martin
* Dual licensed under the MIT and GPL licenses
* Revision: $Id: jquery.simplemodal.js 181 2008-12-16 16:51:44Z emartin24 $
*/
(function($) { var ie6 = $.browser.msie && parseInt($.browser.version) == 6 && !window['XMLHttpRequest'], ieQuirks = $.browser.msie && !$.boxModel, w = []; $.modal = function(data, options) { return $.modal.impl.init(data, options); }; $.modal.close = function() { $.modal.impl.close(); }; $.fn.modal = function(options) { return $.modal.impl.init(this, options); }; $.modal.defaults = { opacity: 50, overlayId: 'simplemodal-overlay', overlayCss: {}, containerId: 'simplemodal-container', containerCss: {}, dataCss: {}, zIndex: 1000, close: true, closeHTML: '<a class="modalCloseImg" title="Close"></a>', closeClass: 'simplemodal-close', position: null, persist: false, onOpen: null, onShow: null, onClose: null }; $.modal.impl = { opts: null, dialog: {}, init: function(data, options) { if (this.dialog.data) { return false; } this.opts = $.extend({}, $.modal.defaults, options); this.zIndex = this.opts.zIndex; this.occb = false; if (typeof data == 'object') { data = data instanceof jQuery ? data : $(data); if (data.parent().parent().size() > 0) { this.dialog.parentNode = data.parent(); if (!this.opts.persist) { this.dialog.orig = data.clone(true); } } } else if (typeof data == 'string' || typeof data == 'number') { data = $('<div/>').html(data); } else { alert('SimpleModal Error: Unsupported data type: ' + typeof data); return false; } this.dialog.data = data.addClass('simplemodal-data').css(this.opts.dataCss); data = null; this.create(); this.open(); if ($.isFunction(this.opts.onShow)) { this.opts.onShow.apply(this, [this.dialog]); } return this; }, create: function() { w = this.getDimensions(); if (ie6) { this.dialog.iframe = $('<iframe src="javascript:false;"/>').css($.extend(this.opts.iframeCss, { display: 'none', opacity: 0, position: 'fixed', height: w[0], width: w[1], zIndex: this.opts.zIndex, top: 0, left: 0 })).appendTo('body'); } this.dialog.overlay = $('<div/>').attr('id', this.opts.overlayId).addClass('simplemodal-overlay').css($.extend(this.opts.overlayCss, { display: 'none', opacity: this.opts.opacity / 100, height: w[0], width: w[1], position: 'fixed', left: 0, top: 0, zIndex: this.opts.zIndex + 1 })).appendTo('body'); this.dialog.container = $('<div/>').attr('id', this.opts.containerId).addClass('simplemodal-container').css($.extend(this.opts.containerCss, { display: 'none', position: 'fixed', zIndex: this.opts.zIndex + 2 })).append(this.opts.close ? $(this.opts.closeHTML).addClass(this.opts.closeClass) : '').appendTo('body'); this.setPosition(); if (ie6 || ieQuirks) { this.fixIE(); } this.dialog.container.append(this.dialog.data.hide()); }, bindEvents: function() { var self = this; $('.' + this.opts.closeClass).bind('click.simplemodal', function(e) { e.preventDefault(); self.close(); }); $(window).bind('resize.simplemodal', function() { w = self.getDimensions(); self.setPosition(); if (ie6 || ieQuirks) { self.fixIE(); } else { self.dialog.iframe && self.dialog.iframe.css({ height: w[0], width: w[1] }); self.dialog.overlay.css({ height: w[0], width: w[1] }); } }); }, unbindEvents: function() { $('.' + this.opts.closeClass).unbind('click.simplemodal'); $(window).unbind('resize.simplemodal'); }, fixIE: function() { var p = this.opts.position; $.each([this.dialog.iframe || null, this.dialog.overlay, this.dialog.container], function(i, el) { if (el) { var bch = 'document.body.clientHeight', bcw = 'document.body.clientWidth', bsh = 'document.body.scrollHeight', bsl = 'document.body.scrollLeft', bst = 'document.body.scrollTop', bsw = 'document.body.scrollWidth', ch = 'document.documentElement.clientHeight', cw = 'document.documentElement.clientWidth', sl = 'document.documentElement.scrollLeft', st = 'document.documentElement.scrollTop', s = el[0].style; s.position = 'absolute'; if (i < 2) { s.removeExpression('height'); s.removeExpression('width'); s.setExpression('height', '' + bsh + ' > ' + bch + ' ? ' + bsh + ' : ' + bch + ' + "px"'); s.setExpression('width', '' + bsw + ' > ' + bcw + ' ? ' + bsw + ' : ' + bcw + ' + "px"'); } else { var te, le; if (p && p.constructor == Array) { if (p[0]) { var top = typeof p[0] == 'number' ? p[0].toString() : p[0].replace(/px/, ''); te = top.indexOf('%') == -1 ? top + ' + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"' : parseInt(top.replace(/%/, '')) + ' * ((' + ch + ' || ' + bch + ') / 100) + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"'; } if (p[1]) { var left = typeof p[1] == 'number' ? p[1].toString() : p[1].replace(/px/, ''); le = left.indexOf('%') == -1 ? left + ' + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"' : parseInt(left.replace(/%/, '')) + ' * ((' + cw + ' || ' + bcw + ') / 100) + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"'; } } else { te = '(' + ch + ' || ' + bch + ') / 2 - (this.offsetHeight / 2) + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"'; le = '(' + cw + ' || ' + bcw + ') / 2 - (this.offsetWidth / 2) + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"'; } s.removeExpression('top'); s.removeExpression('left'); s.setExpression('top', te); s.setExpression('left', le); } } }); }, getDimensions: function() { var el = $(window); var h = $.browser.opera && $.browser.version > '9.5' && $.fn.jquery <= '1.2.6' ? document.documentElement['clientHeight'] : el.height(); return [h, el.width()]; }, setPosition: function() { var top, left, hCenter = (w[0] / 2) - ((this.dialog.container.height() || this.dialog.data.height()) / 2), vCenter = (w[1] / 2) - ((this.dialog.container.width() || this.dialog.data.width()) / 2); if (this.opts.position && this.opts.position.constructor == Array) { top = this.opts.position[0] || hCenter; left = this.opts.position[1] || vCenter; } else { top = hCenter; left = vCenter; } this.dialog.container.css({ left: left, top: top }); }, open: function() { this.dialog.iframe && this.dialog.iframe.show(); if ($.isFunction(this.opts.onOpen)) { this.opts.onOpen.apply(this, [this.dialog]); } else { this.dialog.overlay.show(); this.dialog.container.show(); this.dialog.data.show(); } this.bindEvents(); }, close: function() { if (!this.dialog.data) { return false; } if ($.isFunction(this.opts.onClose) && !this.occb) { this.occb = true; this.opts.onClose.apply(this, [this.dialog]); } else { if (this.dialog.parentNode) { if (this.opts.persist) { this.dialog.data.hide().appendTo(this.dialog.parentNode); } else { this.dialog.data.remove(); this.dialog.orig.appendTo(this.dialog.parentNode); } } else { this.dialog.data.remove(); } this.dialog.container.remove(); this.dialog.overlay.remove(); this.dialog.iframe && this.dialog.iframe.remove(); this.dialog = {}; } this.unbindEvents(); } }; })(jQuery);


/*
Accordion - Super simple javascript accordion jQuery plugin
http://www.unwrongest.com/projects/accordion/
*/
(function($) {
    $.fn.extend({
        accordion: function() {
            return this.each(function() {
                if ($(this).data('accordiated'))
                    return false;
                $.each($(this).find('ul, li>div'), function() {
                    $(this).data('accordiated', true);
                    $(this).hide();
                });
                $.each($(this).find('a:not(.foo)'), function() {
                    $(this).click(function(e) {
                        activate(e.target);
                        return void (0);
                    });
                });

                var active = false;
                if (location.hash)
                    active = $(this).find('a[href=' + location.hash + ']')[0];
                else if ($(this).find('li.current'))
                    active = $(this).find('li.current a')[0];

                if (active) {
                    activate(active, 'toggle', 'parents');
                    $(active).parents().show();
                }

                function activate(el, effect, parents) {
                    $(el)[(parents || 'parent')]('li').toggleClass('active').siblings().removeClass('active').children('ul, div').slideUp('fast');
                    $(el).siblings('ul, div')[(effect || 'slideToggle')]((!effect) ? 'fast' : null);
                }

            });
        }
    });
})(jQuery);

/* ------------------------------------------------------------------------
prettyCheckboxes
	
Developped By: Stephane Caron (http://www.no-margin-for-errors.com)
Inspired By: All the non user friendly custom checkboxes solutions ;)
Version: 1.0.1
	
Copyright: Feel free to redistribute the script/modify it, as
long as you leave my infos at the top.
------------------------------------------------------------------------- */

jQuery.fn.prettyCheckboxes = function(settings) {
    settings = jQuery.extend({
        checkboxWidth: 17,
        checkboxHeight: 17,
        className: 'prettyCheckbox',
        display: 'list'
    }, settings);

    $(this).each(function() {
        // Find the label
        $label = $('label[for="' + $(this).attr('id') + '"]');

        // Add the checkbox holder to the label
        $label.prepend("<span class='holderWrap'><span class='holder'></span></span>");

        // If the checkbox is checked, display it as checked
        if ($(this).is(':checked')) { $label.addClass('checked'); };

        // Assign the class on the label
        $label.addClass(settings.className).addClass($(this).attr('type')).addClass(settings.display);

        // Assign the dimensions to the checkbox display
        $label.find('span.holderWrap').width(settings.checkboxWidth).height(settings.checkboxHeight);
        $label.find('span.holder').width(settings.checkboxWidth);

        // Hide the checkbox
        $(this).addClass('hiddenCheckbox');

        // Associate the click event
        $label.bind('click', function() {
            $('input#' + $(this).attr('for')).triggerHandler('click');

            if ($('input#' + $(this).attr('for')).is(':checkbox')) {
                $(this).toggleClass('checked');
                $('input#' + $(this).attr('for')).checked = true;
            } else {
                $toCheck = $('input#' + $(this).attr('for'));

                // Uncheck all radio
                $('input[name="' + $toCheck.attr('name') + '"]').each(function() {
                    $('label[for="' + $(this).attr('id') + '"]').removeClass('checked');
                });

                $(this).addClass('checked');
                $toCheck.checked = true;
            };
        });

        $('input#' + $label.attr('for')).bind('keypress', function(e) {
            if (e.keyCode == 32) {
                if ($.browser.msie) {
                    $('label[for="' + $(this).attr('id') + '"]').toggleClass("checked");
                } else {
                    $(this).trigger('click');
                }
                return false;
            };
        });
    });
};

checkAllPrettyCheckboxes = function(caller, container) {
    if ($(caller).is(':checked')) {
        // Find the label corresponding to each checkbox and click it
        $(container).find('input[type=checkbox]:not(:checked)').each(function() {
            $('label[for="' + $(this).attr('id') + '"]').trigger('click');
            if ($.browser.msie) {
                $(this).attr('checked', 'checked');
            } else {
                $(this).trigger('click');
            };
        });
    } else {
        $(container).find('input[type=checkbox]:checked').each(function() {
            $('label[for="' + $(this).attr('id') + '"]').trigger('click');
            if ($.browser.msie) {
                $(this).attr('checked', '');
            } else {
                $(this).trigger('click');
            };
        });
    };
};


/*
* JQZoom Evolution 1.0.1 - Javascript Image magnifier
*
* Copyright (c) Engineer Renzi Marco(www.mind-projects.it)
*
* $Date: 12-12-2008
*
*	ChangeLog:
*  
* $License : GPL,so any change to the code you should copy and paste this section,and would be nice to report this to me(renzi.mrc@gmail.com).
*/
(function($) {
    $.fn.jqzoom = function(options) {
        var settings = {
            zoomType: 'standard', //standard/reverse/innerzoom
            zoomWidth: 200, 	//zoomed width default width
            zoomHeight: 200, 	//zoomed div default width
            xOffset: 10, 	//zoomed div default offset
            yOffset: 0,
            position: "right", //zoomed div default position,offset position is to the right of the image
            lens: true, //zooming lens over the image,by default is 1;
            lensReset: false,
            imageOpacity: 0.2,
            title: true,
            alwaysOn: false,
            showEffect: 'show',
            hideEffect: 'hide',
            fadeinSpeed: 'fast',
            fadeoutSpeed: 'slow',
            preloadImages: true,
            showPreload: true,
            preloadText: 'Loading zoom',
            preloadPosition: 'center'   //bycss
        };

        //extending options
        options = options || {};
        $.extend(settings, options);


        return this.each(function() {
            var a = $(this);
            var aTitle = a.attr('title'); //variabile per memorizzare il titolo href
            $(a).removeAttr('title');
            $(a).css('outline-style', 'none');


            var img = $("img", this);
            var imageTitle = img.attr('title');
            img.removeAttr('title'); //variabile per memorizzare il titolo immagine


            var smallimage = new Smallimage(img);
            var smallimagedata = {};
            //imageborder
            var btop = 0;
            var bleft = 0;

            var loader = null;     //variabile per memorizzare oggetto loader
            loader = new Loader();

            var ZoomTitle = (trim(aTitle).length > 0) ? aTitle :
			(trim(imageTitle).length > 0) ? imageTitle : null;  //setting zoomtitle
            var ZoomTitleObj = new zoomTitle();

            var largeimage = new Largeimage(a[0].href);

            var lens = new Lens();
            var lensdata = {};
            //lensborder



            var largeimageloaded = false;
            var scale = {}; //rapporto tra immagine grande e piccola scale.x/scale.y
            var stage = null; // quadrato che mostra l'immagine ingrandita
            var running = false; // running = true quando si verifica l'evento che mostra lo zoom(adesso mouseover).
            var mousepos = {};
            var firstime = 0;
            var preloadshow = false;
            var isMouseDown = false;
            var dragstatus = false
            //loading smallimagedata
            smallimage.loadimage();

            //ritorna false al click dell href
            $(this).click(function() { return false; });

            //se settato alwaysOn attivo lo Zoom e lo mostro.

            //attivo al mouseover
            $(this).hover(function(e) {
                mousepos.x = e.pageX;
                mousepos.y = e.pageY;
                activate();
            }, function() {
                deactivate();
            });


            //ALWAYS ON
            if (settings.alwaysOn) {
                setTimeout(function() { activate(); }, 150);
            }


            function activate() {

                if (!running) {

                    //finding border
                    smallimage.findborder();

                    running = true;

                    //rimuovo il titolo al mouseover
                    imageTitle = img.attr('title');
                    img.removeAttr('title');
                    aTitle = a.attr('title');
                    $(a).removeAttr('title');

                    //se non c?creo l'oggetto largeimage
                    if (!largeimage || $.browser.safari) {
                        largeimage = new Largeimage(a[0].href);
                    }

                    //se l'immagine grande non ?stata caricata la carico
                    if (!largeimageloaded || $.browser.safari) {
                        largeimage.loadimage();
                    } else {
                        //after preload
                        if (settings.zoomType != 'innerzoom') {
                            stage = new Stage();
                            stage.activate();
                        }
                        lens = new Lens;
                        lens.activate();
                    }

                    //hack per MAC
                    /*	if($.browser.safari)
                    {
                    if(settings.zoomType != 'innerzoom') //se innerzoom non mostro la finestra dello zoom
                    {
                    stage = new Stage();
                    stage.activate();
                    }
                    if($('div.jqZoomPup').length <= 0)
                    {
                    lens = new Lens();
                    }
                    //if(settings.zoomType == 'innerzoom'){lens = new Lens()};
                    lens.activate();
                    (settings.alwaysOn) ? lens.center() : lens.setposition(null);
                    }
                    */
                    a[0].blur();
                    //alert($('div.jqZoomPup').length);
                    return false;
                }




            }

            function deactivate() {
                if (settings.zoomType == 'reverse' && !settings.alwaysOn) {
                    img.css({ 'opacity': 1 });
                }

                if (!settings.alwaysOn) {
                    //resetting parameters
                    running = false;
                    largeimageloaded = false;
                    $(lens.node).unbind('mousemove');
                    lens.remove();
                    if ($('div.jqZoomWindow').length > 0) {
                        stage.remove();
                    }
                    if ($('div.jqZoomTitle').length > 0) {
                        ZoomTitleObj.remove();
                    }
                    //resetting title
                    img.attr('title', imageTitle);
                    a.attr('title', aTitle);
                    $().unbind();

                    a.unbind('mousemove');
                    //resetto il parametro che mi dice che ?la prima volta che mostor lo zoom
                    firstime = 0;
                    //remove ieiframe
                    if (jQuery('.zoom_ieframe').length > 0) {
                        jQuery('.zoom_ieframe').remove();
                    }
                } else {
                    if (settings.lensReset) {
                        switch (settings.zoomType) {
                            case 'innerzoom':
                                largeimage.setcenter();
                                break;
                            default:
                                lens.center();
                                break;
                        }
                    }
                }

                //non so se serve da provare
                if (settings.alwaysOn) {
                    activate();
                }
            };





            //smallimage
            function Smallimage(image) {
                this.node = image[0];

                this.loadimage = function() {
                    this.node.src = image[0].src;
                };
                this.findborder = function() {
                    var bordertop = '';
                    bordertop = $(img).css('border-top-width');
                    btop = '';
                    var borderleft = '';
                    borderleft = $(img).css('border-left-width');
                    bleft = '';
                    /*if($.browser.msie)
                    {
                    var temp = bordertop.split(' ');

					bordertop = temp[1];
                    var temp = borderleft.split(' ');
                    borderleft = temp[1];
                    }*/

                    if (bordertop) {
                        for (i = 0; i < 3; i++) {
                            var x = [];
                            x = bordertop.substr(i, 1);

                            if (isNaN(x) == false) {
                                btop = btop + '' + bordertop.substr(i, 1);
                            } else {
                                break;
                            }
                        }
                    }

                    if (borderleft) {
                        for (i = 0; i < 3; i++) {
                            if (!isNaN(borderleft.substr(i, 1))) {
                                bleft = bleft + borderleft.substr(i, 1)
                            } else {
                                break;
                            }
                        }
                    }
                    btop = (btop.length > 0) ? eval(btop) : 0;
                    bleft = (bleft.length > 0) ? eval(bleft) : 0;


                }
                this.node.onload = function() {
                    //setto il cursor e la posizione dell'href


                    a.css({ 'cursor': 'crosshair', 'display': 'block' });

                    if (a.css('position') != 'absolute' && a.parent().css('position')) {
                        a.css({ 'cursor': 'crosshair', 'position': 'relative', 'display': 'block' });
                    }
                    if (a.parent().css('position') != 'absolute') {
                        a.parent().css('position', 'relative');
                        //a.css('position','relative');
                    }
                    else {
                        //a.css('position','relative');
                    }
                    if ($.browser.safari || $.browser.opera) {
                        $(img).css({ position: 'absolute', top: '0px', left: '0px' });
                    }
                    /*if(a.css('position')!= 'absolute' && a.parent().css('position'))
                    {
                    a.css({'cursor':'crosshair','position':'relative','display':'block'});
                    }
                    if(a.parent().css('position') != 'absolute')
                    {
                    alert('in');
                    a.parent().css('position','relative');
                    //a.css('position','relative');
                    }
                    else{
                    //a.css('position','relative');
                    }*/



                    /*
                    if(a.parent().css('position') != 'relative' && a.css('position') != 'absolute')
                    {
                    a.css({'cursor':'crosshair','position':'relative','display':'block'});
                    }*/

                    //al docuemnt ready viene caricato l'src quindi viene azionato l'onload e carico tutti i dati
                    smallimagedata.w = $(this).width();
                    smallimagedata.h = $(this).height();


                    //non viene fatta assegnazione alla variabile globale
                    smallimagedata.h = $(this).height();
                    smallimagedata.pos = $(this).offset();
                    smallimagedata.pos.l = $(this).offset().left;
                    smallimagedata.pos.t = $(this).offset().top;
                    smallimagedata.pos.r = smallimagedata.w + smallimagedata.pos.l;
                    smallimagedata.pos.b = smallimagedata.h + smallimagedata.pos.t;

                    //per sicurezza setto l'altezza e la width dell'href
                    a.height(smallimagedata.h);
                    a.width(smallimagedata.w);


                    //PRELOAD IMAGES
                    if (settings.preloadImages) {
                        largeimage.loadimage();
                    }



                };



                return this;
            };



            //Lens
            function Lens() {


                //creating element and adding class
                this.node = document.createElement("div");
                $(this.node).addClass('jqZoomPup');

                this.node.onerror = function() {
                    $(lens.node).remove();
                    lens = new Lens();
                    lens.activate();
                };




                //funzione privata per il caricamento dello zoom
                this.loadlens = function() {


                    switch (settings.zoomType) {
                        case 'reverse':
                            this.image = new Image();
                            this.image.src = smallimage.node.src; // fires off async
                            this.node.appendChild(this.image);
                            $(this.node).css({ 'opacity': 1 });
                            break;
                        case 'innerzoom':

                            this.image = new Image();
                            this.image.src = largeimage.node.src; // fires off async
                            this.node.appendChild(this.image);
                            $(this.node).css({ 'opacity': 1 });
                            break
                        default:
                            break;
                    }



                    switch (settings.zoomType) {
                        case 'innerzoom':
                            lensdata.w = smallimagedata.w;
                            lensdata.h = smallimagedata.h;
                            break;
                        default:
                            lensdata.w = (settings.zoomWidth) / scale.x;
                            lensdata.h = (settings.zoomHeight) / scale.y;
                            break;
                    }

                    $(this.node).css({
                        width: lensdata.w + 'px',
                        height: lensdata.h + 'px',
                        position: 'absolute',
                        /*cursor: 'crosshair',*/
                        display: 'none',
                        //border: '1px solid blue'
                        borderWidth: 1 + 'px'
                    });
                    a.append(this.node);
                }
                return this;
            };

            Lens.prototype.activate = function() {
                //carico la lente
                this.loadlens();

                switch (settings.zoomType) {
                    case 'reverse':
                        img.css({ 'opacity': settings.imageOpacity });

                        (settings.alwaysOn) ? lens.center() : lens.setposition(null);
                        //lens.center();
                        //bindo ad a il mousemove della lente
                        a.bind('mousemove', function(e) {
                            mousepos.x = e.pageX;
                            mousepos.y = e.pageY;
                            lens.setposition(e);
                        });
                        break;
                    case 'innerzoom':

                        //	lens = new Lens();
                        //	lens.activate();

                        $(this.node).css({ top: 0, left: 0 });
                        if (settings.title) {
                            ZoomTitleObj.loadtitle();
                        }

                        largeimage.setcenter();

                        a.bind('mousemove', function(e) {
                            mousepos.x = e.pageX;
                            mousepos.y = e.pageY;
                            largeimage.setinner(e);

                            /*if(settings.zoomType == 'innerzoom' && running)
                            {
                            $(a).mousemove(function(){
                            if($('div.jqZoomPup').length <= 0)
                            {
                            lens = new Lens();
                            lens.activate();
                            }
                            });
                            }*/

                            /*if($('div.jqZoomPup').length <= 0)
                            {
                            lens = new Lens();
                            lens.activate();
                            }*/

                        });
                        break;
                    default:
                        /*$(document).mousemove(function(e){
                        if(isMouseDown && dragstatus != false){
                        lens.setposition( e );
                        }
                        });
                        lens.center()


					dragstatus = 'on'
                        $(document).mouseup(function(e){
                        if(isMouseDown && dragstatus != false){
                        isMouseDown = false;
                        dragstatus = false;

					}
					});

					$(this.node).mousedown(function(e){
                        $('div.jqZoomPup').css("cursor", "move");
                        $(this.node).css("position", "absolute");

				// set z-index
					$(this.node).css("z-index", parseInt( new Date().getTime()/1000 ));
                        if($.browser.safari)
                        {
                        $(a).css("cursor", "move");
                        }
                        isMouseDown    = true;
                        dragstatus = 'on';
                        lens.setposition( e );
                        });
                        */


                        (settings.alwaysOn) ? lens.center() : lens.setposition(null);

                        //bindo ad a il mousemove della lente
                        $(a).bind('mousemove', function(e) {

                            mousepos.x = e.pageX;
                            mousepos.y = e.pageY;
                            lens.setposition(e);
                        });

                        break;
                }


                return this;
            };

            Lens.prototype.setposition = function(e) {


                if (e) {
                    mousepos.x = e.pageX;
                    mousepos.y = e.pageY;
                }

                if (firstime == 0) {
                    var lensleft = (smallimagedata.w) / 2 - (lensdata.w) / 2;
                    var lenstop = (smallimagedata.h) / 2 - (lensdata.h) / 2;
                    //ADDED

                    $('div.jqZoomPup').show()
                    if (settings.lens) {
                        this.node.style.visibility = 'visible';
                    }
                    else {
                        this.node.style.visibility = 'hidden';
                        $('div.jqZoomPup').hide();
                    }
                    //ADDED
                    firstime = 1;

                } else {
                    var lensleft = mousepos.x - smallimagedata.pos.l - (lensdata.w) / 2;
                    var lenstop = mousepos.y - smallimagedata.pos.t - (lensdata.h) / 2;
                }


                //a sinistra
                if (overleft()) {
                    lensleft = 0 + bleft;
                } else
                //a destra
                    if (overright()) {
                    if ($.browser.msie) {
                        lensleft = smallimagedata.w - lensdata.w + bleft + 1;
                    } else {
                        lensleft = smallimagedata.w - lensdata.w + bleft - 1;
                    }


                }

                //in alto
                if (overtop()) {
                    lenstop = 0 + btop;
                } else
                //sotto
                    if (overbottom()) {

                    if ($.browser.msie) {
                        lenstop = smallimagedata.h - lensdata.h + btop + 1;
                    } else {
                        lenstop = smallimagedata.h - lensdata.h - 1 + btop;
                    }

                }
                lensleft = parseInt(lensleft);
                lenstop = parseInt(lenstop);

                //setto lo zoom ed un eventuale immagine al centro
                $('div.jqZoomPup', a).css({ top: lenstop, left: lensleft });

                if (settings.zoomType == 'reverse') {
                    $('div.jqZoomPup img', a).css({ 'position': 'absolute', 'top': -(lenstop - btop + 1), 'left': -(lensleft - bleft + 1) });
                }

                this.node.style.left = lensleft + 'px';
                this.node.style.top = lenstop + 'px';

                //setto l'immagine grande
                largeimage.setposition();

                function overleft() {
                    return mousepos.x - (lensdata.w + 2 * 1) / 2 - bleft < smallimagedata.pos.l;
                }

                function overright() {

                    return mousepos.x + (lensdata.w + 2 * 1) / 2 > smallimagedata.pos.r + bleft;
                }

                function overtop() {
                    return mousepos.y - (lensdata.h + 2 * 1) / 2 - btop < smallimagedata.pos.t;
                }

                function overbottom() {
                    return mousepos.y + (lensdata.h + 2 * 1) / 2 > smallimagedata.pos.b + btop;
                }

                return this;
            };


            //mostra la lente al centro dell'immagine
            Lens.prototype.center = function() {
                $('div.jqZoomPup', a).css('display', 'none');
                var lensleft = (smallimagedata.w) / 2 - (lensdata.w) / 2;
                var lenstop = (smallimagedata.h) / 2 - (lensdata.h) / 2;
                this.node.style.left = lensleft + 'px';
                this.node.style.top = lenstop + 'px';
                $('div.jqZoomPup', a).css({ top: lenstop, left: lensleft });

                if (settings.zoomType == 'reverse') {
                    /*if($.browser.safari){
                    alert('safari');
                    alert(2*bleft);
                    $('div.jqZoomPup img',a).css({'position': 'absolute','top': -( lenstop - btop +1) ,'left': -(lensleft - 2*bleft)  });
                    }else
                    {*/
                    $('div.jqZoomPup img', a).css({ 'position': 'absolute', 'top': -(lenstop - btop + 1), 'left': -(lensleft - bleft + 1) });
                    //}
                }

                largeimage.setposition();
                if ($.browser.msie) {
                    $('div.jqZoomPup', a).show();
                } else {
                    setTimeout(function() { $('div.jqZoomPup').fadeIn('fast'); }, 10);
                }
            };


            //ritorna l'offset
            Lens.prototype.getoffset = function() {
                var o = {};
                o.left = parseInt(this.node.style.left);
                o.top = parseInt(this.node.style.top);
                return o;
            };

            //rimuove la lente
            Lens.prototype.remove = function() {

                if (settings.zoomType == 'innerzoom') {
                    $('div.jqZoomPup', a).fadeOut('fast', function() { /*$('div.jqZoomPup img').remove();*/$(this).remove(); });
                } else {
                    //$('div.jqZoomPup img').remove();
                    $('div.jqZoomPup', a).remove();
                }
            };

            Lens.prototype.findborder = function() {
                var bordertop = '';
                bordertop = $('div.jqZoomPup').css('borderTop');
                //alert(bordertop);
                lensbtop = '';
                var borderleft = '';
                borderleft = $('div.jqZoomPup').css('borderLeft');
                lensbleft = '';
                if ($.browser.msie) {
                    var temp = bordertop.split(' ');

                    bordertop = temp[1];
                    var temp = borderleft.split(' ');
                    borderleft = temp[1];
                }

                if (bordertop) {
                    for (i = 0; i < 3; i++) {
                        var x = [];
                        x = bordertop.substr(i, 1);

                        if (isNaN(x) == false) {
                            lensbtop = lensbtop + '' + bordertop.substr(i, 1);
                        } else {
                            break;
                        }
                    }
                }

                if (borderleft) {
                    for (i = 0; i < 3; i++) {
                        if (!isNaN(borderleft.substr(i, 1))) {
                            lensbleft = lensbleft + borderleft.substr(i, 1)
                        } else {
                            break;
                        }
                    }
                }


                lensbtop = (lensbtop.length > 0) ? eval(lensbtop) : 0;
                lensbleft = (lensbleft.length > 0) ? eval(lensbleft) : 0;
            }

            //LARGEIMAGE
            function Largeimage(url) {
                this.url = url;
                this.node = new Image();

                /*if(settings.preloadImages)
                {
                preload.push(new Image());
                preload.slice(-1).src = url ;
                }*/

                this.loadimage = function() {


                    if (!this.node)
                        this.node = new Image();

                    this.node.style.position = 'absolute';
                    this.node.style.display = 'none';
                    this.node.style.left = '-5000px';
                    this.node.style.top = '10px';
                    loader = new Loader();

                    if (settings.showPreload && !preloadshow) {
                        loader.show();
                        preloadshow = true;
                    }

                    document.body.appendChild(this.node);
                    this.node.src = this.url; // fires off async
                }

                this.node.onload = function() {
                    this.style.display = 'block';
                    var w = Math.round($(this).width());
                    var h = Math.round($(this).height());

                    this.style.display = 'none';

                    //setting scale
                    scale.x = (w / smallimagedata.w);
                    scale.y = (h / smallimagedata.h);





                    if ($('div.preload').length > 0) {
                        $('div.preload').remove();
                    }

                    largeimageloaded = true;

                    if (settings.zoomType != 'innerzoom' && running) {
                        stage = new Stage();
                        stage.activate();
                    }

                    if (running) {
                        //alert('in');
                        lens = new Lens();

                        lens.activate();

                    }
                    //la attivo

                    if ($('div.preload').length > 0) {
                        $('div.preload').remove();
                    }
                }
                return this;
            }


            Largeimage.prototype.setposition = function() {
                this.node.style.left = Math.ceil(-scale.x * parseInt(lens.getoffset().left) + bleft) + 'px';
                this.node.style.top = Math.ceil(-scale.y * parseInt(lens.getoffset().top) + btop) + 'px';
            };

            //setto la posizione dell'immagine grande nel caso di innerzoom
            Largeimage.prototype.setinner = function(e) {
                this.node.style.left = Math.ceil(-scale.x * Math.abs(e.pageX - smallimagedata.pos.l)) + 'px';
                this.node.style.top = Math.ceil(-scale.y * Math.abs(e.pageY - smallimagedata.pos.t)) + 'px';
                $('div.jqZoomPup img', a).css({ 'position': 'absolute', 'top': this.node.style.top, 'left': this.node.style.left });
            };


            Largeimage.prototype.setcenter = function() {
                this.node.style.left = Math.ceil(-scale.x * Math.abs((smallimagedata.w) / 2)) + 'px';
                this.node.style.top = Math.ceil(-scale.y * Math.abs((smallimagedata.h) / 2)) + 'px';


                $('div.jqZoomPup img', a).css({ 'position': 'absolute', 'top': this.node.style.top, 'left': this.node.style.left });
            };


            //STAGE
            function Stage() {

                var leftpos = smallimagedata.pos.l;
                var toppos = smallimagedata.pos.t;
                //creating element and class
                this.node = document.createElement("div");
                $(this.node).addClass('jqZoomWindow');

                $(this.node)
				.css({
				    position: 'absolute',
				    width: Math.round(settings.zoomWidth) + 'px',
				    height: Math.round(settings.zoomHeight) + 'px',
				    display: 'none',
				    zIndex: 10000,
				    overflow: 'hidden'
				});

                //fa il positionamento
                switch (settings.position) {
                    case "right":

                        leftpos = (smallimagedata.pos.r + Math.abs(settings.xOffset) + settings.zoomWidth < screen.width)
				? (smallimagedata.pos.l + smallimagedata.w + Math.abs(settings.xOffset))
				: (smallimagedata.pos.l - settings.zoomWidth - Math.abs(settings.xOffset));

                        topwindow = smallimagedata.pos.t + settings.yOffset + settings.zoomHeight;
                        toppos = (topwindow < screen.height && topwindow > 0)
				? smallimagedata.pos.t + settings.yOffset
				: smallimagedata.pos.t;

                        break;
                    case "left":

                        leftpos = (smallimagedata.pos.l - Math.abs(settings.xOffset) - settings.zoomWidth > 0)
				? (smallimagedata.pos.l - Math.abs(settings.xOffset) - settings.zoomWidth)
				: (smallimagedata.pos.l + smallimagedata.w + Math.abs(settings.xOffset));

                        topwindow = smallimagedata.pos.t + settings.yOffset + settings.zoomHeight;
                        toppos = (topwindow < screen.height && topwindow > 0)
				? smallimagedata.pos.t + settings.yOffset
				: smallimagedata.pos.t;

                        break;
                    case "top":

                        toppos = (smallimagedata.pos.t - Math.abs(settings.yOffset) - settings.zoomHeight > 0)
				? (smallimagedata.pos.t - Math.abs(settings.yOffset) - settings.zoomHeight)
				: (smallimagedata.pos.t + smallimagedata.h + Math.abs(settings.yOffset));


                        leftwindow = smallimagedata.pos.l + settings.xOffset + settings.zoomWidth;
                        leftpos = (leftwindow < screen.width && leftwindow > 0)
				? smallimagedata.pos.l + settings.xOffset
				: smallimagedata.pos.l;

                        break;
                    case "bottom":


                        toppos = (smallimagedata.pos.b + Math.abs(settings.yOffset) + settings.zoomHeight < $('body').height())
				? (smallimagedata.pos.b + Math.abs(settings.yOffset))
				: (smallimagedata.pos.t - settings.zoomHeight - Math.abs(settings.yOffset));


                        leftwindow = smallimagedata.pos.l + settings.xOffset + settings.zoomWidth;
                        leftpos = (leftwindow < screen.width && leftwindow > 0)
				? smallimagedata.pos.l + settings.xOffset
				: smallimagedata.pos.l;

                        break;
                    default:

                        leftpos = (smallimagedata.pos.l + smallimagedata.w + settings.xOffset + settings.zoomWidth < screen.width)
				? (smallimagedata.pos.l + smallimagedata.w + Math.abs(settings.xOffset))
				: (smallimagedata.pos.l - settings.zoomWidth - Math.abs(settings.xOffset));

                        toppos = (smallimagedata.pos.b + Math.abs(settings.yOffset) + settings.zoomHeight < screen.height)
				? (smallimagedata.pos.b + Math.abs(settings.yOffset))
				: (smallimagedata.pos.t - settings.zoomHeight - Math.abs(settings.yOffset));

                        break;
                }

                this.node.style.left = leftpos + 'px';
                this.node.style.top = toppos + 'px';
                return this;
            }


            Stage.prototype.activate = function() {

                if (!this.node.firstChild)
                    this.node.appendChild(largeimage.node);


                if (settings.title) {
                    ZoomTitleObj.loadtitle();
                }



                document.body.appendChild(this.node);


                switch (settings.showEffect) {
                    case 'show':
                        $(this.node).show();
                        break;
                    case 'fadein':
                        $(this.node).fadeIn(settings.fadeinSpeed);
                        break;
                    default:
                        $(this.node).show();
                        break;
                }

                $(this.node).show();

                if ($.browser.msie && $.browser.version < 7) {
                    this.ieframe = $('<iframe class="zoom_ieframe" frameborder="0" src="#"></iframe>')
	          .css({ position: "absolute", left: this.node.style.left, top: this.node.style.top, zIndex: 99, width: settings.zoomWidth, height: settings.zoomHeight })
	          .insertBefore(this.node);
                };


                largeimage.node.style.display = 'block';
            }

            Stage.prototype.remove = function() {
                switch (settings.hideEffect) {
                    case 'hide':
                        $('.jqZoomWindow').remove();
                        break;
                    case 'fadeout':
                        $('.jqZoomWindow').fadeOut(settings.fadeoutSpeed);
                        break;
                    default:
                        $('.jqZoomWindow').remove();
                        break;
                }
            }

            function zoomTitle() {

                this.node = jQuery('<div />')
				.addClass('jqZoomTitle')
				.html('' + ZoomTitle + '');

                this.loadtitle = function() {
                    if (settings.zoomType == 'innerzoom') {
                        $(this.node)
					.css({ position: 'absolute',
					    top: smallimagedata.pos.b + 3,
					    left: (smallimagedata.pos.l + 1),
					    width: smallimagedata.w
					})
					.appendTo('body');
                    } else {
                        $(this.node).appendTo(stage.node);
                    }
                };
            }

            zoomTitle.prototype.remove = function() {
                $('.jqZoomTitle').remove();
            }


            function Loader() {

                this.node = document.createElement("div");
                $(this.node).addClass('preload');
                $(this.node).html(settings.preloadText); //appendo il testo

                $(this.node)
				.appendTo("body")
				.css('visibility', 'hidden');



                this.show = function() {
                    switch (settings.preloadPosition) {
                        case 'center':
                            loadertop = smallimagedata.pos.t + (smallimagedata.h - $(this.node).height()) / 2;
                            loaderleft = smallimagedata.pos.l + (smallimagedata.w - $(this.node).width()) / 2;
                            break;
                        default:
                            var loaderoffset = this.getoffset();
                            loadertop = !isNaN(loaderoffset.top) ? smallimagedata.pos.t + loaderoffset.top : smallimagedata.pos.t + 0;
                            loaderleft = !isNaN(loaderoffset.left) ? smallimagedata.pos.l + loaderoffset.left : smallimagedata.pos.l + 0;
                            break;
                    }

                    //setting position
                    $(this.node).css({
                        top: loadertop,
                        left: loaderleft,
                        position: 'absolute',
                        visibility: 'visible'
                    });
                }
                return this;
            }

            Loader.prototype.getoffset = function() {
                var o = null;
                o = $('div.preload').offset();
                return o;
            }

        });
    }
})(jQuery);

function trim(stringa) {
    while (stringa.substring(0, 1) == ' ') {
        stringa = stringa.substring(1, stringa.length);
    }
    while (stringa.substring(stringa.length - 1, stringa.length) == ' ') {
        stringa = stringa.substring(0, stringa.length - 1);
    }
    return stringa;
}


/* jQuery FlyOut - Jolyon Terwilliger, Nixbox Web Designs - http://nixboxdesigns.com/jquery.flyout.php */
$.fn.extend({ flyout: function(c) { var d = false; var e = false; var f; var g; var h; var i; var j; var k = new Image(); var l = 'img'; var m; this.click(function() { if (e == true) { return false } if (d) { putAway(this) } else { flyOut(this) } return false }); var o = jQuery.extend({ outSpeed: 1000, inSpeed: 500, outEase: 'swing', inEase: 'swing', loadingSrc: null, loader: 'loader', loaderZIndex: 500, widthMargin: 40, heightMargin: 40, loadingText: "装入中……", closeTip: " - 点击这里关闭", destPadding: 20, startOffsetX: 0, startOffsetY: 0, startHeight: 0, startWidth: 0, flyOutStart: function() { }, flyOutFinish: function() { }, putAwayStart: function() { }, putAwayFinish: function() { }, shownClass: 'shown' }, c); function flyOut(b) { e = true; f = $(b); g = $('img', b); k = new Image(); sL = $(window).scrollLeft(); sT = $(window).scrollTop(); h = g.offset(); h.left += o.startOffsetX; h.top += o.startOffsetY; i = (o.startHeight > 0 ? o.startHeight : g.height()); j = (o.startWidth > 0 ? o.startWidth : g.width()); $('<div></div>').attr('id', o.loader).appendTo('body').css({ 'position': 'absolute', 'top': h.top, 'left': h.left, 'height': i, 'width': j, 'opacity': .5, 'display': 'block', 'z-index': o.loaderZIndex }); if (o.loadingSrc) { $('#' + o.loader).append($('<img/>').load(function() { $(this).css({ 'position': 'relative', 'top': i / 2 - (this.height / 2), 'left': j / 2 - (this.width / 2) }).attr('alt', o.loadingText) }).attr('src', o.loadingSrc)) } else { $('#' + o.loader).css('background-color', '#000').append($('<span></span>').text(o.loadingText).css({ 'position': 'relative', 'top': '2px', 'left': '2px', 'color': '#FFF', 'font-size': '9px' })) } $(k).load(function() { imgtag = $('<img/>').attr('src', f.attr('href')).attr('title', g.attr('title') + o.closeTip).attr('alt', g.attr('alt') + o.closeTip).height(i).width(j); o.flyOutStart.call(b); if (o.destElement) { var a = $(o.destElement); max_x = a.innerWidth() - (o.destPadding * 2); max_y = a.innerHeight() - (o.destPadding * 2) } else { max_x = $(window).width() - o.widthMargin; if ($.browser.opera) wh = document.getElementsByTagName('html')[0].clientHeight; else wh = $(window).height(); max_y = wh - o.heightMargin } width = k.width; height = k.height; x_dim = max_x / width; y_dim = max_y / height; if (x_dim <= y_dim) { y_dim = x_dim } else { x_dim = y_dim } dw = Math.round(width * x_dim); dh = Math.round(height * y_dim); if (dw > width) { dw = width } if (dh > height) { dh = height } if (o.destElement) { dPos = a.offset(); dl = Math.round((a.outerWidth() / 2) - (dw / 2) + dPos.left); dt = Math.round((a.outerHeight() / 2) - (dh / 2) + dPos.top) } else { dl = Math.round(($(window).width() / 2) - (dw / 2) + sL); if ($.browser.opera) wh = document.getElementsByTagName('html')[0].clientHeight; else wh = $(window).height(); dt = Math.round((wh / 2) - (dh / 2) + sT) } $('#' + o.loader).empty().css('opacity', 1).append(imgtag).width('auto').height('auto').animate({ top: dt, left: dl }, { duration: o.outSpeed, queue: false, easing: o.outEase }); $('#' + o.loader + ' ' + l).animate({ height: dh, width: dw }, o.outSpeed, o.outEase, function() { o.flyOutFinish.call(b); d = b; f.addClass(o.shownClass); e = false; $('#' + o.loader + ' ' + l).click(function() { putAway(null) }) }) }); k.src = f.attr('href') } function putAway(a) { if (e == true || d == false) { return false } o.putAwayStart.call(d); e = true; h = g.offset(); h.left += o.startOffsetX; h.top += o.startOffsetY; $('#' + o.loader).animate({ top: h.top, left: h.left }, { duration: o.inSpeed, queue: false, easing: o.inEase }); $('#' + o.loader + ' ' + l).animate({ height: i, width: j }, o.inSpeed, o.inEase, function() { $('#' + o.loader).css('display', 'none').remove(); o.putAwayFinish.call(d); e = false; k = null; if (a && a != d) { d = false; flyOut(a) } d = false; f.removeClass(o.shownClass) }) } return this } });



/*
* Copyright 2007-2009 by Tobia Conforto <tobia.conforto@gmail.com>
*
* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General
* Public License as published by the Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along with this program; if not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Versions: 0.1    2007-08-19  Initial release
*                  2008-08-21  Re-released under GPL v2
*           0.1.1  2008-09-18  Compatibility with prototype.js
*           0.2    2008-10-15  Linkable images, contributed by Tim Rainey <tim@zmlabs.com>
*           0.3    2008-10-22  Added option to repeat the animation a number of times, then stop
*           0.3.1  2008-11-11  Better error messages
*           0.3.2  2008-11-11  Fixed a couple of CSS bugs, contributed by Erwin Bot <info@ixgcms.nl>
*           0.3.3  2008-12-14  Added onclick option
*           0.3.4  2009-03-12  Added shuffle option, contributed by Ralf Santbergen <ralf_santbergen@hotmail.com>
*           0.3.5  2009-03-12  Fixed usage of href parameter in 'Ken Burns' mode
*/

jQuery.fn.crossSlide = function(opts, plan) {
    var self = this,
			self_width = this.width(),
			self_height = this.height();

    // generic utilities
    function format(str) {
        for (var i = 1; i < arguments.length; i++)
            str = str.replace(new RegExp('\\{' + (i - 1) + '}', 'g'), arguments[i]);
        return str;
    }

    function abort() {
        arguments[0] = 'crossSlide: ' + arguments[0];
        throw format.apply(null, arguments);
    }

    // first preload all the images, while getting their actual width and height
    (function(proceed) {

        var n_loaded = 0;
        function loop(i, img) {
            // for (i = 0; i < plan.length; i++) but with independent var i, img (for the closures)
            img.onload = function(e) {
                n_loaded++;
                plan[i].width = img.width;
                plan[i].height = img.height;
                if (n_loaded == plan.length)
                    proceed();
            }
            img.src = plan[i].src;
            if (i + 1 < plan.length)
                loop(i + 1, new Image());
        }
        loop(0, new Image());

    })(function() {  // then proceed

        // utility to parse "from" and "to" parameters
        function parse_position_param(param) {
            var zoom = 1;
            var tokens = param.replace(/^\s*|\s*$/g, '').split(/\s+/);
            if (tokens.length > 3) throw new Error();
            if (tokens[0] == 'center')
                if (tokens.length == 1)
                tokens = ['center', 'center'];
            else if (tokens.length == 2 && tokens[1].match(/^[\d.]+x$/i))
                tokens = ['center', 'center', tokens[1]];
            if (tokens.length == 3)
                zoom = parseFloat(tokens[2].match(/^([\d.]+)x$/i)[1]);
            var pos = tokens[0] + ' ' + tokens[1];
            if (pos == 'left top' || pos == 'top left') return { xrel: 0, yrel: 0, zoom: zoom };
            if (pos == 'left center' || pos == 'center left') return { xrel: 0, yrel: .5, zoom: zoom };
            if (pos == 'left bottom' || pos == 'bottom left') return { xrel: 0, yrel: 1, zoom: zoom };
            if (pos == 'center top' || pos == 'top center') return { xrel: .5, yrel: 0, zoom: zoom };
            if (pos == 'center center') return { xrel: .5, yrel: .5, zoom: zoom };
            if (pos == 'center bottom' || pos == 'bottom center') return { xrel: .5, yrel: 1, zoom: zoom };
            if (pos == 'right top' || pos == 'top right') return { xrel: 1, yrel: 0, zoom: zoom };
            if (pos == 'right center' || pos == 'center right') return { xrel: 1, yrel: .5, zoom: zoom };
            if (pos == 'right bottom' || pos == 'bottom right') return { xrel: 1, yrel: 1, zoom: zoom };
            return {
                xrel: parseInt(tokens[0].match(/^(\d+)%$/)[1]) / 100,
                yrel: parseInt(tokens[1].match(/^(\d+)%$/)[1]) / 100,
                zoom: zoom
            };
        }

        // utility to compute the css for a given phase between p.from and p.to
        // phase = 1: begin fade-in,  2: end fade-in,  3: begin fade-out,  4: end fade-out
        function position_to_css(p, phase) {
            switch (phase) {
                case 1:
                    var pos = 0;
                    break;
                case 2:
                    var pos = fade_ms / (p.time_ms + 2 * fade_ms);
                    break;
                case 3:
                    var pos = 1 - fade_ms / (p.time_ms + 2 * fade_ms);
                    break;
                case 4:
                    var pos = 1;
                    break;
            }
            return {
                left: Math.round(p.from.left + pos * (p.to.left - p.from.left)),
                top: Math.round(p.from.top + pos * (p.to.top - p.from.top)),
                width: Math.round(p.from.width + pos * (p.to.width - p.from.width)),
                height: Math.round(p.from.height + pos * (p.to.height - p.from.height))
            };
        }

        // check global params
        if (!opts.fade)
            abort('缺少fade参数。');
        if (opts.speed && opts.sleep)
            abort('你不能同时设定speed和sleep参数。');
        // conversion from sec to ms; from px/sec to px/ms
        var fade_ms = Math.round(opts.fade * 1000);
        if (opts.sleep)
            var sleep = Math.round(opts.sleep * 1000);
        if (opts.speed)
            var speed = opts.speed / 1000,
					fade_px = Math.round(fade_ms * speed);

        // set container css
        self.empty().css({
            overflow: 'hidden',
            padding: 0
        });
        if (!self.css('position').match(/absolute|relative|fixed/))
            self.css({ position: 'relative' });
        if (!self.width() || !self.height())
            abort('容器没有自己的宽度和高度。');

        // random sorting
        if (opts.shuffle)
            plan.sort(function() {
                return Math.random() - 0.5;
            });

        // prepare each image
        for (var i = 0; i < plan.length; ++i) {

            var p = plan[i];
            if (!p.src)
                abort('缺少图像{0}的src参数。', i + 1);

            if (speed) { // speed/dir mode

                // check parameters and translate speed/dir mode into full mode (from/to/time)
                switch (p.dir) {
                    case 'up':
                        p.from = { xrel: .5, yrel: 0, zoom: 1 };
                        p.to = { xrel: .5, yrel: 1, zoom: 1 };
                        var slide_px = p.height - self_height - 2 * fade_px;
                        break;
                    case 'down':
                        p.from = { xrel: .5, yrel: 1, zoom: 1 };
                        p.to = { xrel: .5, yrel: 0, zoom: 1 };
                        var slide_px = p.height - self_height - 2 * fade_px;
                        break;
                    case 'left':
                        p.from = { xrel: 0, yrel: .5, zoom: 1 };
                        p.to = { xrel: 1, yrel: .5, zoom: 1 };
                        var slide_px = p.width - self_width - 2 * fade_px;
                        break;
                    case 'right':
                        p.from = { xrel: 1, yrel: .5, zoom: 1 };
                        p.to = { xrel: 0, yrel: .5, zoom: 1 };
                        var slide_px = p.width - self_width - 2 * fade_px;
                        break;
                    default:
                        abort('缺少图像{0}的"dir" 参数或者格式不正确。', i + 1);
                }
                if (slide_px <= 0)
                    abort('图像数量{0}相对于期望的淡化间隔太少了。', i + 1);
                p.time_ms = Math.round(slide_px / speed);

            } else if (!sleep) { // full mode

                // check and parse parameters
                if (!p.from || !p.to || !p.time)
                    abort('图像{0}缺少speed/sleep选项, 或from/to/time参数。', i + 1);
                try {
                    p.from = parse_position_param(p.from)
                } catch (e) {
                    abort('图像{0}的"from"参数格式不正确。', i + 1);
                }
                try {
                    p.to = parse_position_param(p.to)
                } catch (e) {
                    abort('图像{0}的"to"参数格式不正确。', i + 1);
                }
                if (!p.time)
                    abort('图像{0}的"time"参数格式不正确。', i + 1);
                p.time_ms = Math.round(p.time * 1000)
            }

            // precalculate left/top/width/height bounding values
            if (p.from)
                jQuery.each([p.from, p.to], function(i, from_to) {
                    from_to.width = Math.round(p.width * from_to.zoom);
                    from_to.height = Math.round(p.height * from_to.zoom);
                    from_to.left = Math.round((self_width - from_to.width) * from_to.xrel);
                    from_to.top = Math.round((self_height - from_to.height) * from_to.yrel);
                });

            // append the image (or anchor) element to the container
            var elm;
            if (p.href)
                elm = jQuery(format('<a href="{0}"><img src="{1}"/></a>', p.href, p.src));
            else
                elm = jQuery(format('<img src="{0}"/>', p.src));
            if (p.onclick)
                elm.click(p.onclick);
            elm.appendTo(self);
        }
        speed = undefined;  // speed mode has now been translated to full mode

        // find images to animate and set initial css attributes
        var imgs = self.find('img').css({
            position: 'absolute',
            visibility: 'hidden',
            top: 0,
            left: 0,
            border: 0
        });

        // show first image
        imgs.eq(0).css({ visibility: 'visible' });
        if (!sleep)
            imgs.eq(0).css(position_to_css(plan[0], 2));

        // create animation chain
        var countdown = opts.loop;
        function create_chain(i, chainf) {
            // building the chain backwards, or inside out

            if (i % 2 == 0) {
                if (sleep) {

                    // still image sleep

                    var i_sleep = i / 2,
							i_hide = (i_sleep - 1 + plan.length) % plan.length,
							img_sleep = imgs.eq(i_sleep),
							img_hide = imgs.eq(i_hide);

                    var newf = function() {
                        img_hide.css('visibility', 'hidden');
                        setTimeout(chainf, sleep);
                    };

                } else {

                    // single image slide

                    var i_slide = i / 2,
							i_hide = (i_slide - 1 + plan.length) % plan.length,
							img_slide = imgs.eq(i_slide),
							img_hide = imgs.eq(i_hide),
							time = plan[i_slide].time_ms,
							slide_anim = position_to_css(plan[i_slide], 3);

                    var newf = function() {
                        img_hide.css('visibility', 'hidden');
                        img_slide.animate(slide_anim, time, 'linear', chainf);
                    };

                }
            } else {
                if (sleep) {

                    // still image cross-fade

                    var i_from = Math.floor(i / 2),
							i_to = Math.ceil(i / 2) % plan.length,
							img_from = imgs.eq(i_from),
							img_to = imgs.eq(i_to),
							from_anim = {},
							to_init = { visibility: 'visible' },
							to_anim = {};

                    if (i_to > i_from) {
                        to_init.opacity = 0;
                        to_anim.opacity = 1;
                    } else {
                        from_anim.opacity = 0;
                    }

                    var newf = function() {
                        img_to.css(to_init);
                        if (from_anim.opacity != undefined)
                            img_from.animate(from_anim, fade_ms, 'linear', chainf);
                        else
                            img_to.animate(to_anim, fade_ms, 'linear', chainf);
                    };

                } else {

                    // cross-slide + cross-fade

                    var i_from = Math.floor(i / 2),
							i_to = Math.ceil(i / 2) % plan.length,
							img_from = imgs.eq(i_from),
							img_to = imgs.eq(i_to),
							from_anim = position_to_css(plan[i_from], 4),
							to_init = position_to_css(plan[i_to], 1),
							to_anim = position_to_css(plan[i_to], 2);

                    if (i_to > i_from) {
                        to_init.opacity = 0;
                        to_anim.opacity = 1;
                    } else {
                        from_anim.opacity = 0;
                    }
                    to_init.visibility = 'visible';

                    var newf = function() {
                        img_from.animate(from_anim, fade_ms, 'linear');
                        img_to.css(to_init);
                        img_to.animate(to_anim, fade_ms, 'linear', chainf);
                    };

                }
            }

            // if the loop option was requested, push a countdown check
            if (opts.loop && i == plan.length * 2 - 2) {
                var newf_orig = newf;
                newf = function() {
                    if (--countdown) newf_orig();
                }
            }

            if (i > 0)
                return create_chain(i - 1, newf);
            else
                return newf;
        }
        var animation = create_chain(plan.length * 2 - 1, function() { return animation(); });

        // start animation
        animation();

    });

    return self;
};
