/**
 * @function 幻灯片
 * @encode utf-8
 * @copyright (C) lijun
 * @file MagicSlide.js
 * @author lijun
 * @version 1.0
 * @date 2007-11-04
 * @modify 2008-2-4 添加标题
 */

/**
 * 构造函数
 * @param id 幻灯片标识
 * @param target 幻灯片展示位置
 * @param width  宽度
 * @param height 高度
 * @param interval 间隔周期，最小/默认值为3000
 */
function MagicSlide(id, target, width, height, interval)
{
    this.id = (typeof(id) == "undefined") ? "M_S_0_" : id + "_";
    this.width = (typeof(width) != "number" || width <= 0) ? 363 : width;
    this.height = (typeof(height) != "number" || height <= 0) ? 196 : height;
    this.interval = (typeof(interval) != "number" || interval < 3000) ? 3000 : interval; 
    this.images = new Array();
    this.target = target;
    this.index = 0;
    this.subjectHeight = 0;
    this.intervalId = null;
    this.timer = new Function();
    this.ie = ((navigator.appName).indexOf("Microsoft") != -1) ? true : false;
    this.alpha = this.ie ? "filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=65,finishOpacity=65);" : "-moz-opacity:.65!important; opacity:.65!important;";
}
/**
 * 根据ID获取元素
 * @param id 元素ID
 * @return 元素对象
 */
MagicSlide.prototype.$ = function(id)
{
    return document.getElementById(id);
}
/**
 * 幻灯片效果
 * @return 幻灯片效果
 */
MagicSlide.prototype.effects = function()
{
    var effs = new Array();
    effs.push("filter:progid:DXImageTransform.Microsoft.barn(duration=2,motion=out,orientation=vertical);");
    effs.push("filter:progid:DXImageTransform.Microsoft.barn(duration=2,motion=in,orientation=vertical);");
    effs.push("filter:progid:DXImageTransform.Microsoft.barn(duration=2,motion=out,orientation=horizontal);");
    effs.push("filter:progid:DXImageTransform.Microsoft.barn(duration=2,motion=in,orientation=horizontal);");
    effs.push("filter:blendTrans(duration=2);");
    effs.push("filter:progid:DXImageTransform.Microsoft.blinds(duration=2,bands=10,Direction=down);");
    effs.push("filter:progid:DXImageTransform.Microsoft.blinds(duration=2,bands=10,Direction=up);");
    effs.push("filter:progid:DXImageTransform.Microsoft.blinds(duration=2,bands=30,Direction=right);");
    effs.push("filter:progid:DXImageTransform.Microsoft.blinds(duration=2,bands=30,Direction=left);");
    effs.push("filter:progid:DXImageTransform.Microsoft.checkerBoard(duration=2,squaresX=12,squaresY=10,Direction=down);");
    effs.push("filter:progid:DXImageTransform.Microsoft.checkerBoard(duration=2,squaresX=12,squaresY=10,Direction=up);");
    effs.push("filter:progid:DXImageTransform.Microsoft.checkerBoard(duration=2,squaresX=12,squaresY=10,Direction=left);");
    effs.push("filter:progid:DXImageTransform.Microsoft.checkerBoard(duration=2,squaresX=12,squaresY=10,Direction=right);");
    effs.push("filter:progid:DXImageTransform.Microsoft.fade(duration=2,overlap=1.0);");
    effs.push("filter:progid:DXImageTransform.Microsoft.gradientWipe(duration=2,gradientSize=1.0,motion=forward);");
    effs.push("filter:progid:DXImageTransform.Microsoft.gradientWipe(duration=2,gradientSize=1.0,motion=reverse);");
    effs.push("filter:progid:DXImageTransform.Microsoft.inset(duration=2);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=PLUS,motion=out);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=PLUS,motion=in);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=DIAMOND,motion=out);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=DIAMOND,motion=in);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=CIRCLE,motion=out);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=CIRCLE,motion=in);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=CROSS,motion=out);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=CROSS,motion=in);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=SQUARE,motion=out);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=SQUARE,motion=in);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=STAR,motion=out);");
    effs.push("filter:progid:DXImageTransform.Microsoft.iris(duration=2,irisStyle=STAR,motion=in);");
    effs.push("filter:progid:DXImageTransform.Microsoft.pixelate(enabled=false,duration=2,maxSquare=10);");
    effs.push("filter:progid:DXImageTransform.Microsoft.radialWipe(duration=2,wipeStyle=CLOCK);");
    effs.push("filter:progid:DXImageTransform.Microsoft.radialWipe(duration=2,wipeStyle=WEDGE);");
    effs.push("filter:progid:DXImageTransform.Microsoft.radialWipe(duration=2,wipeStyle=RADIAL);");
    effs.push("filter:progid:DXImageTransform.Microsoft.randomBars(duration=2,orientation=horizontal);");
    effs.push("filter:progid:DXImageTransform.Microsoft.randomBars(duration=2,orientation=vertical);");
    effs.push("filter:progid:DXImageTransform.Microsoft.randomDissolve(duration=2);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=0);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=1);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=2);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=3);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=4);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=5);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=6);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=7);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=8);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=9);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=10);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=11);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=12);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=13);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=14);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=15);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=16);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=17);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=18);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=19);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=20);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=21);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=22);");
    effs.push("filter:progid:DXImageTransform.Microsoft.revealTrans(duration=2,transition=23);");
    effs.push("filter:progid:DXImageTransform.Microsoft.slide(duration=2,bands=10,slideStyle=HIDE);");
    effs.push("filter:progid:DXImageTransform.Microsoft.slide(duration=2,bands=10,slideStyle=PUSH);");
    effs.push("filter:progid:DXImageTransform.Microsoft.slide(duration=2,bands=10,slideStyle=SWAP);");
    effs.push("filter:progid:DXImageTransform.Microsoft.spiral(duration=2,gridSizeX=15,gridSizeY=15);");
    effs.push("filter:progid:DXImageTransform.Microsoft.stretch(duration=2,stretchStyle=SPIN);");
    effs.push("filter:progid:DXImageTransform.Microsoft.stretch(duration=2,stretchStyle=HIDE);");
    effs.push("filter:progid:DXImageTransform.Microsoft.stretch(duration=2,stretchStyle=PUSH);");
    effs.push("filter:progid:DXImageTransform.Microsoft.strips(duration=2,motion=leftup);");
    effs.push("filter:progid:DXImageTransform.Microsoft.strips(duration=2,motion=leftdown);");
    effs.push("filter:progid:DXImageTransform.Microsoft.strips(duration=2,motion=rightup);");
    effs.push("filter:progid:DXImageTransform.Microsoft.strips(duration=2,motion=rightdown);");
    effs.push("filter:progid:DXImageTransform.Microsoft.wheel(duration=2,spokes=16);");
    effs.push("filter:progid:DXImageTransform.Microsoft.zigzag(duration=2,gridSizeX=20,gridSizeY=20);");
    return effs;
}
/**
 * 获取位置
 */
MagicSlide.prototype.getPosition = function()
{
    var slide = this.$(this.target);
    var top = 0, left=0;
    while(slide = slide.offsetParent)
	{
		top += slide.offsetTop;
		left += slide.offsetLeft;
	}
    return {x:left, y:top};
}
/**
 * 获取幻灯效果
 * @param index 幻灯效果索引，下标从0开始
 * @return 幻灯效果
 */
MagicSlide.prototype.getEffect = function(index)
{
    var effs = this.effects();
    var size = effs.length;
    if (index > size || index < 0)
    {
        index = 0;
    }
    return effs[index];
}
/**
 * 随机获取幻灯效果
 * @return 幻灯效果
 */
MagicSlide.prototype.getRandomEffect = function()
{
    var effs = this.effects();
    var size = effs.length;
    var rand = Math.floor(Math.random() * size);
    return effs[rand];
}
/**
 * 获取滤镜项目
 * @param filter 滤镜
 * @return 滤镜项目
 */
MagicSlide.prototype.getFilterItem = function(filter)
{
    var start1 = "filter:progid:".length;
    var start2 = "filter:".length;
    var item = null;
    if (filter.indexOf(":progid:") != -1)
    {
        item = filter.substring(start1, filter.indexOf("("));
    }
    else
    {
        item = filter.substring(start2, filter.indexOf("("));
    }
    return item;
}
/**
 * 加载图像
 * @param src 图片源路径
 * @param link 链接地址，无链接地址时为null
 * @param subject 主题
 * @param alt 图片无效时的替代文字说明，无替代文字时为null
 * @return
 */
MagicSlide.prototype.loadImage = function(src, link, subject, alt)
{
    var div = document.createElement("div");
    var title = document.createElement("div");
    var img = new Image(this.width, this.height);
    img.setAttribute("border", "0");
    img.setAttribute("align", "absmiddle");
    img.setAttribute("src", src);
    img.setAttribute("id", this.id + "MagicSlide_Image_" + this.images.length);
    if (null != alt)
    {
        if (null != link) alt = "Magic Slide\r\nSubject\t: " + alt + "\r\nURL\t: " + link
        img.setAttribute("alt", alt);
    }
    if (null != link)
    {
        img.attachEvent("onclick", function(){try{window.open(link);}catch(e){}});
        title.attachEvent("onclick", function(){try{window.open(link);}catch(e){}});
    }    
    img.style.cssText = "cursor:pointer;";
    title.style.cssText = "cursor:pointer; font-size:12px; text-align:center; height:20px; padding:4px 0px;";
    div.setAttribute("id", this.id + "MagicSlide_Image_DIV_" + + this.images.length);
    div.appendChild(img);
    if (null != subject)
    {
        this.subjectHeight = 20;
        title.setAttribute("id", this.id + "MagicSlide_Subject_" + this.images.length);
        title.innerHTML = subject;
        div.appendChild(title);
    }
    this.images.push(div);
}
/**
 * 重置所有数字标签的背景色以及字体颜色
 */
MagicSlide.prototype.resetQuickNumberStatus = function()
{
    var qn = null;
    var img = null;
    for (var i = 0; i < this.images.length; i++)
    {
        qn = this.$(this.id + "MagicSlide_QuickNumber_" + i);
        if (null != qn)
        {
            qn.style.backgroundColor = "#FFFFFF";
            qn.style.color = "#ff7200";
        }
    }
}
/**
 * 数字标签
 * @param num 数字
 * @return dom节点
 */
MagicSlide.prototype.quickNumber = function(num)
{
    var div = document.createElement("div");
    var __MagicSlide = this;
    div.setAttribute("id", this.id + "MagicSlide_QuickNumber_" + num);
    div.style.cssText = "cursor:pointer; margin:0px 4px 0px 0px; text-align:center; line-height:10px; " +
            "padding-top:2px; display:inline; position:relative; background-color:#FFFFFF; " +
            "font-family:Fixedsys, Arial; " +
            "height:14px; width:20px; border:1px solid #bbbbbb; font-size:12px; color:#ff7200;" + this.alpha;
    div.attachEvent("onclick", function(){
        clearInterval(__MagicSlide.intervalId);
        __MagicSlide.gotoPlay(num);
        __MagicSlide.intervalId = setInterval(__MagicSlide.timer, __MagicSlide.interval);
    });
    div.appendChild(document.createTextNode((num + 1) < 10 ? "0" + (num + 1) : (num + 1)));
    return div;
}
/**
 * 生成数字快捷标签
 */
MagicSlide.prototype.generateQuickNumberBar = function()
{
    var bar = document.createElement("div")
    var arrow = document.createElement("div");
    var pos = this.getPosition();
    var left = 0, top = 0;
    arrow.setAttribute("id", this.id + "MagicSlide_QuickNumber_Arrow");
    arrow.style.cssText = "cursor:default;margin:0px 3px 0px 0px; text-align:center; line-height:8px;" +
            " padding-top:4px; display:inline; position:relative; background-color:transparent;" +
            " font-family:Webdings; " +
            "height:14px; width:14px; font-size:12px; color:#800000;" + this.alpha;
    if(this.ie)
    {
        arrow.appendChild(document.createTextNode(8));
        top = this.height - 16;
        bar.style.cssText = "width:"+ this.width +"; height:16px; text-align:right; z-index:9999; position:absolute; left:" + left + "px; top:" + top + "px;";
    }
    else
    {
        arrow.appendChild(document.createTextNode(">>"));
        bar.style.cssText = "width:"+ this.width +"; height:16px; text-align:right; z-index:9999; position:relative; top:-"+(this.subjectHeight + 25)+"px;";
    }
    bar.appendChild(arrow);
    for (var i = 0; i < this.images.length; i++)
    {
        bar.appendChild(this.quickNumber(i));
    }
    this.$(this.target).appendChild(bar);
}
/**
 * 替换图片
 * @param newImage 新图片
 */
MagicSlide.prototype.replaceImage = function(newImage)
{
    var target = this.$(this.target);
    target.replaceChild(newImage, target.firstChild);
}
/**
 * 跳转到指定的幻灯片
 * @param index 幻灯片索引
 */
MagicSlide.prototype.gotoPlay = function(index)
{
    this.index = index;
    var imgs = this.images;
    var effect = this.getRandomEffect();
    var target = this.$(this.target);
    target.style.cssText = "width:" + this.width + "px; height:" + (this.height + this.subjectHeight) + "px;";
    this.resetQuickNumberStatus();
    this.$(this.id + "MagicSlide_QuickNumber_" + this.index).style.backgroundColor = "#800000";
    this.$(this.id + "MagicSlide_QuickNumber_" + this.index).style.color = "#FFFFFF";
    if (this.ie)
    {
        target.style.cssText = "width:" + this.width + "px; height:" + (this.height + this.subjectHeight) + "px;" + effect;
        target.filters.item(this.getFilterItem(effect)).apply();
        target.filters.item(this.getFilterItem(effect)).play();
    }
    this.replaceImage(imgs[this.index]);
    this.index++;
}
/**
 * 自动播放幻灯片
 */
MagicSlide.prototype.autoPlay = function()
{
    var imgs = this.images;
    var __MagicSlide = this;
    this.generateQuickNumberBar(); 
    this.index = 0;
    this.timer = function timer()
    {
        if (__MagicSlide.index > imgs.length - 1)
        {
            __MagicSlide.index = 0;
        }
        __MagicSlide.gotoPlay(__MagicSlide.index);
    }
    this.timer();
    this.intervalId = setInterval(this.timer, this.interval);
}
