﻿/*  @author: huangxu
*  @date:   2009-9
*  @import: jquery，/Edu/UserControl/Data/JSONHandler.ashx?for=9
*  @usage:  
        
var school=schoolSelect.create({target:'txtSchool'});//target=目标元素的id 元素可以为任意元素，如input,span等
var school=schoolSelect.create({target:'txtSchool',other:false});//默认显示其他学校
var school=schoolSelect.create({target:'txtSchool',schoolChanged:function(){}});//订阅学校选择变化事件
        
school.getSelected();//返回{id:i,name:n}
        
schoolSelect.bind('txtSchool',1);//向目标元素绑定
*/
var schoolSelect = {};

(function(def) {
    /*重构版本*/

    //全局
    def.holder = [];

    //HTML片段缓存
    def.cachedHTML = {};

    def.newSchool = function(i, n) { return { id: i, name: n }; }

    //获取组件实例
    def.create = function(args) {
        with (def) {
            return holder[holder.push(new schoolUI(args)) - 1];
        }
    }

    //向目标元素绑定学校名称
    def.bind = function(id, target) {
        //debugger;
        //从数据文件直接获取
        for (var i in schoolJSON) {
            var flag = false; //是否找到
            for (var j = 0; j < schoolJSON[i].length; j++) {
                if (schoolJSON[i][j].SchoolId == id) {
                    var jqEl = $('#' + target);
                    if (jqEl.is('input'))
                        jqEl.val(schoolJSON[i][j].SchoolName);
                    else
                        jqEl.html(schoolJSON[i][j].SchoolName);

                    //从缓存中更新对应组件
                    $.each(def.holder, function(index, s) {
                        if (s.flag == target) {
                            s.selected = def.newSchool(schoolJSON[i][j].SchoolId, schoolJSON[i][j].SchoolName);
                        }
                    });

                    flag = true;
                    break;
                }
            }
            if (flag) break;
        }
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //组件定义
    var schoolUI = function() { this._initialize.apply(this, arguments); };
    schoolUI.prototype = {
        _initialize: function(args) {
            this.flag = args.target; //标记=目标元素id
            this.target = $('#' + args.target);
            this.selected = this._newSchool(0, '');
            this.other = args.other ? args.other : true;
            //            //事件
            this.schoolChanged = args.schoolChanged || function() { };

            //            //基本绑定
            this._setTargetEventBind();

            if (this.target.is('input'))
                this.target.attr('readonly', true);
        },
        /*以下为呈现处理*/
        _prepareContainer: function(fn) {
            var header = 'header';
            this.container = $(def.container);
            if (typeof (def.cachedHTML[header]) == 'undefined') {
                //全局片段缓存
                def.cachedHTML[header] = this._prepareHeaderHTML(this._getAreaTreeJSON());
                //装配主容器
                this._setContainer(header);
                //PS:执行回调 由旧数据获取方式而沿用
                fn();
            } else {
                this._setContainer(header);
                fn();
            }
        },
        //生成省市区选择
        _prepareHeaderHTML: function(data) {
            //以下拼接代码沿用旧版本
            var provinceHTML = '';
            var citysHTML = '';
            var areasHTML = '';
            var $this = this;
            var startDate = new Date();
            var endDate = null;

            var provinceBuilder = new Sys.StringBuilder();
            var citysBuilder = new Sys.StringBuilder();
            var areasBuilder = new Sys.StringBuilder();

            for (var i = 0, provinceLength = data.length; i < provinceLength; i++) {
                var province = data[i];
                if (province.AreaName == "全国") {
                    continue;
                }
                provinceBuilder.append(String.format(def.link, province.AreaId, province.AreaName));

                var cityBuilder = new Sys.StringBuilder();
                var cityList = province.ChildAreaInfoList;
                for (var j = 0, cityLength = cityList.length; j < cityLength; j++) {
                    var city = cityList[j];
                    cityBuilder.append(String.format(def.link, city.AreaId, city.AreaName));

                    var areaBuilder = new Sys.StringBuilder();
                    var areaList = city.ChildAreaInfoList;
                    for (var k = 0, areaLength = areaList.length; k < areaLength; k++) {
                        var area = areaList[k];
                        areaBuilder.append(String.format(def.link, area.AreaId, area.AreaName));
                    }
                    areasBuilder.append(String.format(def.areaRegion, city.AreaId, areaBuilder.toString()));
                }
                citysBuilder.append(String.format(def.cityRegion, province.AreaId, cityBuilder.toString()));

            }
            return String.format(def.provinceRegion, provinceBuilder.toString()) + citysBuilder.toString() + areasBuilder.toString();
            //            $.each(data, function(i, province) {//省
            //                provinceHTML += String.format(def.link, province.AreaId, province.AreaName);

            //                var cityHTML = '';
            //                $.each(province.ChildAreaInfoList, function(j, city) {//市
            //                    cityHTML += String.format(def.link, city.AreaId, city.AreaName);

            //                    var areaHTML = '';
            //                    $.each(city.ChildAreaInfoList, function(k, area) {//地区
            //                        areaHTML += String.format(def.link, area.AreaId, area.AreaName);
            //                    });
            //                    //其他
            //                    //areaHTML += $this.other ? def.linkOther : '';
            //                    areasHTML += String.format(def.areaRegion, city.AreaId, areaHTML);
            //                });
            //                citysHTML += String.format(def.cityRegion, province.AreaId, cityHTML);
            //            });
            //            var s = String.format(def.provinceRegion, provinceHTML) + citysHTML + areasHTML;
        },
        //追加学校列表
        _appendSchoolBlock: function(i, data) {
            var schoolHTML = '';
            $.each(data, function(i, school) {
                schoolHTML += String.format(def.link, school.SchoolId, school.SchoolName);
            });
            this.container.append(String.format(def.schoolRegion, i, schoolHTML));
        },
        _setContainer: function(key) {
            this.container.append(def.cachedHTML[key]);
            this.container.append(def.otherRegion);
            this._setContainerEventBind();
        },
        _setBlockDisplay: function(c, i) {
            this.container.find('div[class*=' + c + ']').hide();
            this.container.find('div[class*=' + c + '][id=' + i + ']').show();
        },
        /*事件绑定*/
        _setContainerEventBind: function() {
            var $this = this;
            $this.container.click(
                function(e) {
                    var srcEl = $(e.target);

                    //选择学校
                    if (srcEl.is('a') && srcEl.parent().hasClass('.school_js')) {
                        $this._setSelected(srcEl.attr('id'), srcEl.text());
                        return;
                    }
                    //增加其他学校
                    if (srcEl.hasClass('.otherAdd_js')) {
                        var name = $this.container.find('div.other_js input').val();
                        $this._setSelected(0, name);
                        return;
                    }

                    if (srcEl.is('a')) {
                        srcEl.siblings().removeClass('selected');
                        srcEl.addClass('selected');
                    } else return;
                    //选择省
                    if (srcEl.is('a') && srcEl.parent().hasClass('.province_js')) {
                        $this.container.find('.city_js').hide();
                        $this.container.find('.area_js').hide();
                        $this.container.find('.school_js').hide();
                        $this._setBlockDisplay('city_js', srcEl.attr('id'));

                        if ($this.container.find('.city_js[id="' + srcEl.attr('id') + '"]:eq(0) a').length > 0) {
                            $this.container.find('.city_js[id="' + srcEl.attr('id') + '"]:eq(0) a:eq(0)').click();
                        }

                        //选择市
                    } else if (srcEl.is('a') && srcEl.parent().hasClass('.city_js')) {

                        $this.container.find('.area_js').hide();
                        $this.container.find('.school_js').hide();
                        $this._setBlockDisplay('area_js', srcEl.attr('id'));

                        if ($this.container.find('.area_js[id="' + srcEl.attr('id') + '"]:eq(0) a').length > 0) {
                            $this.container.find('.area_js[id="' + srcEl.attr('id') + '"]:eq(0) a:eq(0)').click();
                        }
                        else {
                            $this.container.find('.area_js').hide();
                            $this._setBlockDisplay('school_js', 0);
                            var areaId = srcEl.attr('id');

                            if ($this.container.find('div[class*=school_js][id=' + areaId + ']').length == 0) {
                                $.getJSON(
                                '/Edu/UserControl/Data/JsonHandler.ashx?for=9&areaId=' + areaId,
                                function(data) {
                                    //未初始化学校列表 TODO:全局缓存优化

                                    $this._appendSchoolBlock(areaId, data);
                                    $this._setBlockDisplay('school_js', areaId);
                                }
                            );
                            } else
                                $this._setBlockDisplay('school_js', areaId);

                            //                            $this._setBlockDisplay('school_js', 0);
                            //                            if ($this.container.find('div[class*=school_js][id=' + srcEl.attr('id') + ']').length == 0) {
                            //                                $this._appendSchoolBlock(srcEl.attr('id'), $this._getSchoolJSON(srcEl.attr('id')));
                            //                                $this._setBlockDisplay('school_js', srcEl.attr('id'));
                            //                            }
                            //                            else
                            //                                $this._setBlockDisplay('school_js', srcEl.attr('id'));
                        }

                        //选择地区
                    } else if (srcEl.is('a') && srcEl.parent().hasClass('.area_js')) {

                        $this.container.find('.school_js').hide();
                        //其他
                        if (srcEl.hasClass('other_js')) {
                            $this.container.find('div.other_js').show();
                            $this._setBlockDisplay('school_js', 0);
                            return;
                        } else
                            $this.container.find('div.other_js').hide();

                        var areaId = srcEl.attr('id');

                        if ($this.container.find('div[class*=school_js][id=' + areaId + ']').length == 0) {
                            $.getJSON(
                                '/Edu/UserControl/Data/JsonHandler.ashx?for=9&areaId=' + areaId,
                                function(data) {
                                    //未初始化学校列表 TODO:全局缓存优化

                                    $this._appendSchoolBlock(areaId, data);
                                    $this._setBlockDisplay('school_js', areaId);
                                }
                            );
                        } else
                            $this._setBlockDisplay('school_js', areaId);


                    }
                }
            );
        },
        _setTargetEventBind: function() {
            var $this = this;
            $this.target.click(function() { $this.display(); });
        },
        /*辅助*/
        _newSchool: function(i, n) {
            return def.newSchool(i, n);
        },
        _setSelected: function(i, n) {
            if (this.target.is('input'))
                this.target.val(n);
            else
                this.target.html(n);
            this.selected = this._newSchool(i, n);
            this.schoolChanged.apply(null, [this.selected]);
            this._close();
        },

        ///////////////////////////////////////////////////////////////////////////////
        //从数据文件获取地区树
        _getAreaTreeJSON: function() {
            if (typeof (areaTreeJSON) == 'undefined') {
                alert('数据文件未加载完成');
                return {};
            }
            return areaTreeJSON;
        },
        //从数据文件获取学校列表 i=地区id
        _getSchoolJSON: function(i) {
            return schoolJSON[i + ''];
        },
        ///////////////////////////////////////////////////////////////////////////////

        _close: function() {
            this.popU.close();
        },
        /*公开*/
        display: function() {
            //通用层  
            if (typeof (this.popU) == 'undefined') {
                var $this = this;
                this._prepareContainer(
                    function() {
                        //处理初次显示
                        //$this.container.find('.province a').slice(1).hide();
                        //                        $this.container.find('.province_js').hide(); //临时处理 隐藏其他省份
                        $this.container.find('.province_js a:first').click();
                        //$this.container.find('.city:first a:first').click();
                        //$this.container.find('.area:first a:first').click();

                        $this.popU = new PopU();
                        $this.popU.initPop({
                            type: 'jquery',
                            title: '学校选择',
                            contents: $this.container,
                            tipsAtObj: $this.target,
                            w: 600,
                            h: 110,
                            closeIsHide: true,
                            onOverlay: 1,
                            onNoFn: function() { $this._close(); },
                            onShowFn: function() { $(".popU").bgiframe(); } //IE6遮罩层修正
                        });
                        $this.popU.pubWindow.find("div.ft").prepend('<span style="float:left;line-height:26px;"><a href="http://idea.591up.com/Detail.aspx?subjectID=5" target="_blank">找不到您要选择的学校？可点击这里进行反馈</a></span>');
                        $this.popU.showPop();
                    }
                );
            } else
                this.popU.showPop();
        },
        getSelected: function() {
            return this.selected;
        },
        clearSelected: function() {
            if (typeof (this.container) != 'undefined') {
                this._setSelected(0, '');
            }
        }
    }

    //模板
    def.container = '<div class="popBd SchoolSelect content_js">'
    //省
    //市
    //地区
    //学校
        + '</div>';
    def.provinceRegion = '<div class="bd TabSelect province_js">{0}</div>';
    def.cityRegion = '<div class="bd TabSelect city_js" id="{0}" style="display:none">{1}</div>';
    def.areaRegion = '<div class="bd TabSelect area_js" id="{0}" style="display:none">{1}</div>';
    def.schoolRegion = '<div class="bd schoolList school_js" id="{0}" style="display:none">{1}</div>';
    def.link = '<a href="javascript:;" id="{0}">{1}</a> ';
    def.linkOther = '<a href="javascript:;" style="color:green;font-weight:bold" class="other_js">其他学校</a> ';
    def.otherRegion = '<div class="bd other_js" style="display:none">请填写学校：<input maxlength="20" /> <span class="btn"><span><button class="otherAdd_js">确定</button></span></span></div>'
})(schoolSelect);
/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * $LastChangedDate: 2007-07-21 18:45:56 -0500 (Sat, 21 Jul 2007) $
 * $Rev: 2447 $
 *
 * Version 2.1.1
 */
(function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+'style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+'"/>';return this.each(function(){if($('> iframe.bgiframe',this).length==0)this.insertBefore(document.createElement(html),this.firstChild);});}return this;};})(jQuery);
