﻿// ==UserScript==
// @name                楼盘、房源全部的详细页中的对比框功能
// @description	        完成租房对比框中的添加，删除和对比页面的构造
// @created date        2009/11/06 -- 13:28
// @created author      tiger
// @version             1.0.1
// @version owner       Copyright ? 2009-2010 keerr.com All rights reserved.
// ==/UserScript==

/*************************************************
verified time 	:	2009/8/18   8:29
verified author	:	Tiger
verified purpose:	以对比框架构的基本模块来做出针对房型对比的修改
**************************************************/
/*************************************************
verified time 	:	2009/8/19   9:54
verified author	:	Tiger
verified purpose:	当对比框中无任何Item后最小化对比框
**************************************************/
/*************************************************
verified time 	:	2009/8/20   9:58
verified author	:	Tiger
verified purpose:	针对fysearch来修改对比js功能，以d的CookieName来判断是哪个对比框要进行操作
**************************************************/
/*************************************************
verified time 	:	2009/8/20   14:02
verified author	:	Tiger
verified purpose:	修改了对比框中的每个Item的DOM结构
**************************************************/
/*************************************************
verified time 	:	2009/8/20   16:48
verified author	:	Tiger
verified purpose:	根据DOM结构的修改来修改js程序
**************************************************/
/*************************************************
verified time 	:	2009/8/20   17:08
verified author	:	Tiger
verified purpose:	将房源以下的全部对比js整合在一起了
**************************************************/
/*************************************************
verified time 	:	2009/8/21   14:41
verified author	:	Tiger
verified purpose:	修改collapse的动画效果
**************************************************/

/*************************************************
verified time 	:	2009/10/26   9:52
verified author	:	Tiger
verified purpose:	以bylou来修改fly_fy的js
**************************************************/
/*************************************************
verified time 	:	2009/11/5   15:48
verified author	:	Tiger
verified purpose:	修改了只能4个对比的功能，现在的是当第五个时自动顶掉第一个
**************************************************/
/*************************************************
verified time 	:	2009/11/6   10:24
verified author	:	Tiger
verified purpose:	加入了“全部情况功能”
**************************************************/
/*************************************************
verified time 	:	2009/11/6   13:53
verified author	:	Tiger
verified purpose:	以插件的形式作对比js功能
**************************************************/
/*************************************************
verified time 	:	2009/11/9   13:09
verified author	:	Tiger
verified purpose:	update该框架
**************************************************/
/*************************************************
verified time 	:	2009/11/10   11:26
verified author	:	Tiger
verified purpose:	将全部的对比都整合在一起了
**************************************************/
/*************************************************
verified time 	:	2009/12/24   12:57
verified author	:	Tiger
verified purpose:	完成了collapse的样式修补
**************************************************/

(function($) {
    var _offset, //全局变量，鼠标滚动触发的scrollAd（）函数用到的变量，记录滚动值
        _hideTimeOut = null,
        _totalDuibi = 0;
    var d = {
        CookieOptions: {// cookie的统一参数集
            path: '/',
            domain: '',
            expires: 2,
            secure: false
        },
        StaticName: {// 估计名称，一般不变化
            dbkId: "#duibikuang",
            OnImg: "/images/duibi_b.gif",           // list的对比图片，未选中的classname
            OffImg: "/images/duibi_a.jpg",
            ContentName: "newhouse_content",        // 对比框的内容部分的classname
            //CheckedName: "duibi_on",              // list的对比图片，选中后的classname
            CookieName: "duibi_"                    // cookie name的前缀
        },
        url2duibi: "/lp/Lp_Room_Balance.aspx?hid=", // 对比页面的url
        TypeName: "", // 对比的类别名
        preId: "", // 该类别标记的id的前缀，以便快速取得相应的数字ID
        holderSelector: ".duibi_whole", // 确定一个item整个父容器的jquery的selector
        addBtnSelector: ".duibi_button", // 添加对比的加号button处的jquery的selector，比如："a[id^='duibi_hx_']"，".duibi_button"
        addBtnImgSelector: ".dbbtnimg", // 对比“加号”“对号”图片img的jquery的selector 
        //sourceSelector: ".dbs", // 详细具体内容的jquery的selector
        ContentMark: {// 标记需要取得数据的jquery的selector字符串。（现在考虑的对比框只能显示两列数据，所以就放置两块selector）
            s1: "",
            s2: ""
        }
    };

    $.duibi = function(options) {
        var s = options ? $.extend({}, d, options) : d;

        /// <summary>
        /// 移除对比框中的Item项目
        /// </summary>
        /// <param name=""></param>
        /// <param name=""></param>
        function removeItemFunction(FlyItemID, duibi_href, CookieName) {
            $("#fly_" + FlyItemID).remove();
            $("#" + FlyItemID + " " + s.addBtnImgSelector).attr("src", s.StaticName.OffImg);
            _totalDuibi--;

            // 判断Item>0， false最小化对比框
            if (_totalDuibi === 0) {
                $(".newhose_duibi02").hide("normal");
                $("#" + s.StaticName.ContentName).slideUp("normal").hide();
                $("#duibikuang").hide();
            }
            cleanCookie(FlyItemID, CookieName, s.CookieOptions);
            $("#duibi_total").text("(" + _totalDuibi + ")");
            duibi_href = duibi_href.replace(FlyItemID.replace("hx_desc_", "") + ",", "");
            $("#go2duibi").attr("href", duibi_href);

            $("[lpid=" + FlyItemID + "]").find(s.addBtnImgSelector).attr("src", s.StaticName.OffImg);
        }

        /// <summary>
        /// Item的关闭功能
        /// </summary>
        /// <param name="SourceName">list栏目中的未选中的class name</param>
        /// <param name="ContentName">对比框的内容div的ID</param>
        /// <param name="CheckedName">list栏目中的选中后的class name</param>
        /// <param name="CookieName">cookie name</param>
        /// <param name="t">点击的对象</param>
        function closeItemFunction(CookieName, t) {
            var duibi_href = $("#go2duibi").attr("href"),
                FlyItemID = $(t).parents("li").attr("id").replace("fly_", "");
            removeItemFunction(FlyItemID, duibi_href, CookieName);
        }

        /// <summary>
        /// 得到相应的ID后组装cookie的value
        /// </summary>
        /// <param name="flyID">需要删除的Itemde的ID</param>
        function assembleCookieValue(FlyID, TypeName) {
            var $_source = $("#" + FlyID.replace("duibi_", TypeName + "_")),
        duibi_img = $.trim($(".second_main_lilestcon_tu", $_source).find("a").html()),
        duibi_link = $.trim($(".duibi_linktitle", $_source).find("a").attr("href")),
        duibi_title = $.trim($(".duibi_linktitle", $_source).text()),
        duibi_price = $.trim($(".duibi_price", $_source).text());
            return FlyID + "--" + duibi_img + "--" + duibi_link + "--" + duibi_title + "--" + duibi_price;
        }

        /// <summary>
        /// 处理clean cookie
        /// </summary>
        /// <param name="duibi_value"></param>
        /// <param name="CookieName"></param>
        /// <param name="settings"></param>
        /// <param name="flagBool">两种处理cookie value string的方式，其实是一样的结果</param>
        function cleanCookie(duibi_value, CookieName, settings, flagBool) {
            var value = $.cookie(CookieName),
        cleanValue, temp = [],
        valueArr = value.split("&&&");

            for (var i = 0; i < valueArr.length; i++) {
                if (valueArr[i].indexOf(duibi_value) == -1) {
                    temp.push(valueArr[i]);
                }
            }
            value = temp.join("&&&");

            $.cookie(CookieName, value, s.CookieOptions);
            return true;
        }

        /// <summary>
        /// 处理update cookie
        /// </summary>
        /// <param name="duibi_value"></param>
        /// <param name="CookieName"></param>
        /// <param name="settings"></param>
        function updateCookie(duibi_value, CookieName, settings) {
            var value = $.cookie(CookieName);
            if (value === null) {
                value = duibi_value;
            } else if (value.indexOf(duibi_value) == -1) {
                value = value + '&&&' + duibi_value;
            }
            $.cookie(CookieName, value, s.CookieOptions);
            return true;
        }

        /// <summary>
        /// 对比框框架函数的入口函数，初始化对比框的初始cookie this function is designed for duibiku compare's initialization.
        /// </summary>
        /// <param name="name">对比框div的ID</param>
        /// <param name="SourceName">未选中前的classname</param>
        /// <param name="ContentName">对比框的内容部分的classname</param>
        /// <param name="CheckedName">选中后的classname</param>
        /// <param name="CookieName">Cookie Name</param>
        function initFlyDiv(CookieName) {
            var $_dbk = $(s.StaticName.dbkId);
            _offset = ($(window).height() - $_dbk.height()) / 2 + $(document).scrollTop();

            function showAd(time) {
                // 先进行cookie的组装，在组装的同时判断cookie是否有值
                if (assembleDuibi(CookieName)) {
                    $_dbk.show();
                }
            }

            function hideAd(time) {
                setTimeout(function() { $_dbk.hide(); }, time);
            }

            function scrollAd() {
                $_dbk.animate({ top: _offset }, { duration: 700, queue: false });
            }

            // 关闭对比框
            $('#close').click(function() {
                $_dbk.hide();
            });

            showAd(800); //页面加载完毕多久后显示广告
            scrollAd();

            $(window).scroll(function() {
                _offset = (Math.round($(window).height()) - $_dbk.height()) / 2 + $(document).scrollTop();
                scrollAd();
            });

            /// <summary>
            /// 关闭、展开内容部分
            /// </summary>
            /// <param name=""></param>
            /// <param name=""></param>
            $("#duibi_collapse").click(function() {
                var $_content = $("#newhouse_content");
                //clearTimeout(_hideTimeOut);
                if ($_content.css("display") != "none") {

                    $(".newhose_duibi02").hide();
                    $_content.slideUp().hide();
                    $("#duibikuang").width(130);
                }
                else {
                    $("#duibikuang").width(230);
                    $_content.fadeIn("fast");
                    $_content.nextAll("div:last").show();    //这里必须注意DOM结构
                    $(window).scroll(function() {
                        _offset = Math.round($(window).height() / 3 * 2) - $_dbk.height() + $(document).scrollTop();
                        scrollAd();
                    });
                }
            });

            /// <summary>
            /// 全部清空
            /// </summary>
            /// <param name=""></param>
            /// <param name=""></param> 
            $("#cleanall").click(function() {
                $("#" + s.StaticName.ContentName + " li").find(".duibi_close").click();
            });

            /// <summary>
            /// 从cookie获取数据来组装对比框
            /// </summary>
            /// <param name=""></param>
            /// <param name=""></param>
            function assembleDuibi(CookieName) {
                var CookieValue = $.cookie(CookieName),
                    CookieArr = CookieValue ? CookieValue.split("&&&") : [],
                    duibi_ID, duibi_img, duibi_link, duibi_title, duibi_price,
                    FlagOfExist = false,
                    flyItemArr,
                    DbUrl = s.url2duibi; //s["url2duibiku_" + CookieName.split("_")[1]];

                // 对比框进行初始化 清除content中的全部li元素来进行初始化
                $("#" + s.StaticName.ContentName + " li").remove();
                $("span#duibi_total").text("(0)");
                $("#go2duibi").attr("href", DbUrl);
                _totalDuibi = 0;

                for (var i = 0; i < CookieArr.length; i++) {
                    if (CookieArr[i] !== "") {
                        flyItemArr = CookieArr[i].split("--");
                        duibi1 = flyItemArr[0];
                        duibi2 = flyItemArr[1];
                        duibi3 = flyItemArr[2];
                        $("[lpid=" + duibi1 + "]").find(s.addBtnImgSelector).attr("src", s.StaticName.OnImg);
                        $("#newhouse_content").find("div.clear").before(
                            '<li id="fly_' + duibi1 + '"><dl><dd class="duibi_close"><img src="/images/duibi_close.gif" width="14" height="14" alt="移除"  title="移除"/></dd><dd class="ftitle">' + duibi2 + '</dd><dd class="price"><strong>' + duibi3 + '</strong></dd></li>'
                        );
                        _totalDuibi++;
                        FlagOfExist = true;
                        DbUrl += duibi1.replace(s.preId, "") + ",";
                    }
                }
                if (CookieArr.length !== 0) {
                    $("span#duibi_total").text("(" + _totalDuibi + ")");
                    $("#go2duibi").attr("href", DbUrl);
                }

                return FlagOfExist;
            }
        }

        /// <summary>
        /// 添加对比初始化
        /// </summary>
        /// <param name=""></param>
        /// <param name=""></param>
        function initAddDuibi(CookieName) {
            $(s.addBtnSelector).click(function() {
                var duibi_ID = $(this).parents(s.holderSelector).attr("lpid");

                var $_holder = $("[lpid="+duibi_ID+"]"), //.find(s.sourceSelector), 
                    duibi1 = $.trim($_holder.find(s.ContentMark.s1).text()),        //标记为1号的数据
                    duibi2 = $.trim($_holder.eq(0).find(s.ContentMark.s2).text()),     //标记为2号的数据
                //duibi3 = $.trim($_holder.find("li:eq(3) span").text()),     //标记为3号的数据
                //duibi4 = $.trim($_holder.find("li:eq(6)").text()),
                    $_content = $("#" + s.StaticName.ContentName),
                    FlyValue = "";
                if ($(s.addBtnImgSelector, $_holder).attr("src") === s.StaticName.OffImg) {
                    if (_totalDuibi >= 4) {
                        $_content.find("li:eq(0) .duibi_close").click();
                    }
                    $_content.find("div.clear").before(
                        '<li id="fly_' + duibi_ID + '"><dl><dd class="duibi_close"><img src="/images/duibi_close.gif" width="14" height="14" alt="移除"  title="移除"/></dd><dd class="ftitle">' + duibi1 + '</dd><dd class="price"><strong>' + duibi2 + '</strong></dd></li>'
                    );
                    if ($("#duibikuang").css("display") === "none" || $("." + s.StaticName.ContentName).css("display" === "none")) {
                        $("#duibikuang").width(230).show("fast");
                        $_content.show("fast");
                        $_content.nextAll("div:last").show("fast");
                    }
                    $_content.parent().animate({ top: ($(window).height() - $("#" + s.StaticName.ContentName).parent().height()) / 2 + $(document).scrollTop() - 20, width: 230 }, { duration: 800, queue: false });
                    _totalDuibi++;
                    $("#duibi_total").text("(" + _totalDuibi + ")");
                    // 处理列表处的样式，当被选中时改变img的src，并将真个li都设置成蓝色背景
                    $_holder.find(s.addBtnImgSelector).attr("src", s.StaticName.OnImg);
                    FlyValue = duibi_ID + "--" + duibi1 + "--" + duibi2;
                    // 处理cookie
                    updateCookie(FlyValue, CookieName, s.CookieOptions);

                    var duibi_href = $("#go2duibi").attr("href");
                    if (duibi_href) {
                        $("#go2duibi").attr("href", duibi_href + duibi_ID.replace(s.preId, "") + ",");
                    }
                    else {
                        $("#go2duibi").attr("href", s.url2duibiku + duibi_ID.replace(s.preId, "") + ",");
                    }
                    $("#fly_" + duibi_ID).find(".duibi_close").click(function() {
                        closeItemFunction(CookieName, this);
                        var duibi_href = $("#go2duibi").attr("href");
                        duibi_href = duibi_href.replace(duibi_ID.replace(s.preId, "") + ",", "");
                        $("#go2duibi").attr("href", duibi_href);
                    });
                }
                else {             //??????????????????????????????
                    var duibi_href = $("#go2duibi").attr("href");

                    removeItemFunction(duibi_ID, duibi_href, CookieName);
                    
                    
                }
            });
        }

        /// <summary>
        /// 初始化对比框内的“关闭函数”
        /// </summary>
        /// <param name="SourceName">未选中前的classname</param>
        /// <param name="ContentName">对比框中的ul的#ID value</param>
        /// <param name="CheckedName">选中后的classname</param>
        /// <param name="CookieName">cookie name</param>
        function initCloseDuibi(CookieName) {
            $(".duibi_close").click(function() {
                closeItemFunction(CookieName, this);
            });
        }

        /// <summary>
        /// 初始入口
        /// </summary>
        /// <param name=""></param>
        /// <param name=""></param>
        function initDuibi(TypeName) {
            var CookieName = s.StaticName.CookieName + TypeName;
            initFlyDiv(CookieName);
            initAddDuibi(CookieName);
            initCloseDuibi(CookieName);
        }
        initDuibi(s.TypeName);
    }
})(jQuery);






