﻿//****************************************************************
//* 名　　称：显示的框架(新增支持分页)，过滤方法不支持，支持多个数据显示区域一起绑定
//* 功    能：
//* 输    入：params {
//*             objList : [{ID, onDataDisplay, onDataClear, onDataLoading, noresultTempate, paginationTemplate, loadingTemplate}],
//*             service : {requestUrl, transformFunc}
//*             params :
//*             filter : 
//*             bufferSize : 
//*             pagination :
//*             pageSize :
//*             pageService :
//*             pageParams : 
//*             resultHanle : 
//*             erroeHandle :
//*           }
//* 输    出：                            
//* 说    明：          
//* 错误信息：
//*****************************************************************
    var MAX_PAGE_SIZE = 40;
    IIITripAJAX = function( params ) {

        var bLoaded = false;                        //是否载入完成
        
        /*-------------------------------缓存数据-------------------------------------*/
        var bHasData = false;                       //ajax请求是否有数据
        var oData = [];                             //全部缓存数据
        var tempData = [];                          //过滤后的数据（未使用）
        var bufferIndex = 0;                        //缓存的位置
        var bufferSize = params.bufferSize;         //每一次缓存的大小 一般是分页的大小的整数倍
        var innerFilterParams;                      //过滤数据参数
        var innerIsJson = false;                    //是否使用Json
        var dataTotalCount = 0;                     //全部数据数量
        
        /*-------------------------------分页-----------------------------------------*/
        var doPage = params.pagination == null ? false : params.pagination;//是否使用分页
        var pageSize;                               //分页之后一页中显示的数量
        var pageIndex;                              //分页的页码
        var tempDataLength = 0;                     //当前显示的数据长度
        if( doPage == true )
        {
            pageSize = params.pageSize;
            pageIndex = 0;
        }
        
        /*-------------------------------显示的默认-----------------------------------*/
        var divLoadingTemplate = TEMPLATE_LOADING;
        var divNoResultTemplate = TEMPLATE_NORESULT;
        var divPaginationTemplate = TEMPLATE_PAGINATION;
                                    
        /*-------------------------------页面显示的对象-------------------------------*/
        //*input {ID, onDataDisplay, onDataClear, onDataLoading, noresultTempate, paginationTemplate, loadingTemplate}
        var divObj = [];//{divPagination, divLoading, divNoResult, divContent:, object, onDataDisplay, onDataClear, onDataLoading}
        
        var func_onDataTrasform = params.service == null ? null : params.service.transformFunc;//数据转换函数
        var func_onDataTrasform_Json = params.service == null ? null : params.service.transformFunc_Json;//Json数据转换函数
        var func_displayFilter = params.filter == null ? Default_onDisplayFilter : params.filter;//数据过滤函数
        var func_onHandleExecRequest = params.resultHanle == null ? Default_onHandleResult : params.resultHanle;//直接运行的处理方法
        var func_onHandleError = params.errorHandle == null ? Default_onHandleError : params.errorHandle;//数据验证出错时的处理
        
        /*-------------------------------请求的url和参数------------------------------*/
        var dataUrl = params.service == null ? null : params.service.requestUrl;                //request for data
        var dataParams = params.params;
        var pageUrl = params.pageService == null ? null : params.pageService.requestUrl;          //request for data number
        var pageParams = params.pageParams;

        function Default_onHandleResult(resultData) {
        };
        
        function Default_onHandleError(errorData) {
        };
                
        function Default_dataClear(object) {
            object.divContent.empty();
        };
        
        function Default_NoResult() {
        };
        
        function Default_dataDisplay() {
        };
        
        function Default_onDataTrasform(object) {
            return object;
        };
        
        function Default_onDisplayFilter( objList, params ) {
            return objList;
        };
        
        function Default_dataLoading( obj ) {
            showObjLoading(obj);
        };
        
        
        /////////显示divObj标签内容
        function showObjContent( obj) {
            obj.divLoading.hide();
            obj.divNoResult.hide();
            obj.divPagination.show();
            obj.divContent.show();
            
            obj.object.show();
        };
        function showObjLoading( obj) {
            obj.divNoResult.hide();
            obj.divContent.hide();
            obj.divPagination.hide();
            if( !pageMasked )
                obj.divLoading.show();
                
            obj.object.show();
        };
        function showObjNoResult( obj) {
            obj.divLoading.hide();
            obj.divContent.hide();
            obj.divPagination.hide();
            obj.divNoResult.show();
            
            obj.object.show();
        };
        /////////////////////////////////////
        
        //*params {
        //*     service : {requestUrl, transformFunc}
        //*     params :
        //*     pageService :
        //*     pageParams : 
        //*}
        function setRequestHeader( params ) {
            dataUrl = params.service == null ? dataUrl : params.service.requestUrl;        //request for data
            dataParams = params.params == null ? dataParams : params.params;
            pageUrl = params.pageService == null ? pageUrl : params.pageService.requestUrl;    //request for data number
            pageParams = params.pageParams == null ? pageParams : params.pageParams;
            func_onDataTrasform = params.service == null ? func_onDataTrasform : params.service.transformFunc;
            func_onDataTrasform_Json = params.service == null ? func_onDataTrasform_Json : params.service.transformFunc_Json;
        };
        
        function changePageIndex(_pageIndex)
        {
               $(".pagination").prepend("共有搜索结果 "+getDataLength()+" 条   ");
            var beginIndex = _pageIndex * pageSize;
            var endIndex = (_pageIndex+1)*pageSize;
            if( endIndex > (bufferIndex+1) * bufferSize || beginIndex < bufferIndex * bufferSize)
            {
                pageIndex = _pageIndex;
                bufferIndex = Math.floor( (endIndex-0.5)/bufferSize );
                dataParams.nPageIndex = bufferIndex;
                $.each( divObj, function(i,n) {
                    n.onDataClear(n);
                    n.onDataLoading(n);
                });
                if( innerIsJson )
                    doAjaxRequest_Json(innerFilterParams,true);
                else
                    doAjaxRequest(innerFilterParams,true);                    
            }
            else
            {
                
                var pageData = [];
                var IndexOffset = bufferIndex * bufferSize;
                $.each( tempData, function(i,n){
                    if( (i+IndexOffset) >= beginIndex && (i+IndexOffset) < endIndex )
                        pageData.push( n );
                });

                $.each( divObj, function(i,n){
                    n.onDataClear(n);
                    window.scrollTo(0,0);
                    n.onDataDisplay( n, pageData );
                });
                
                
            }
            
        };
        
        //params 过滤的输入参数
        function display(params, isJson) {
             
            //判断是否是json模式
            if( isJson == null )
                innerIsJson = false;
            else
                innerIsJson = true;
            //是否已经载入数据
            if( bLoaded ) {
                onAjaxFinish(params);
            }
            else 
            {

                //init loading ,clear former results
                $.each( divObj, function(i,n) {
                    n.onDataClear(n);
                    n.onDataLoading(n);
                });
                if( innerIsJson )
                    doAjaxRequest_Json( params, true);
                else
                    doAjaxRequest(params, true);
            }
        };
        
        function onAjaxFinish() {
            if( bHasData ) {
                    
                tempData = func_displayFilter(oData, innerFilterParams);          //根据原始数据过滤数据
                
                tempDataLength = tempData.length;
                $.each( divObj, function(i,n) {
                    if( tempData.length == 0 ) {//如果没有数据
                        showObjNoResult( n );
                    }
                    else {
                        var pageCount = (dataTotalCount-1)/pageSize;
                        if( doPage != false && pageCount >= 1)//需要分页
                        {
                            
                            n.divPagination.find(".pagination").pagination(dataTotalCount, {
                                num_edge_entries: 1,
                                num_display_entries:3,
                                items_per_page:pageSize,
                                prev_text:'上一页',
                                next_text:'下一页',
                                current_page:pageIndex,
                                callback: changePageIndex
                            });
                           
                         changePageIndex(pageIndex);
                        } 
                        else//不分页
                        {
                            n.divPagination.remove();
                            n.divPagination = divPaginationTemplate.clone().attr("id", "divPagination_" + n.id);
                            n.object.append(n.divPagination);
                            n.onDataClear(n);
                            n.onDataDisplay( n, tempData );
                        }
                        
                        showObjContent( n );
                    }
                });
                
            }
            else {
                $.each( divObj, function(i,n) {
                    showObjNoResult( n );
                    n.onDataDisplay( n, [] );//绑定空元素
                });
            }
        };
        
        function reset() {
            bLoaded = false;
            pageIndex = 0;
            display(null);
        };
        
        function doAjaxRequest_Json(params, bDisplay) {       
//            innerFilterParams = params;
//            $.each( divObj, function(i,n) {
//                n.onDataLoading(n);                
//                showObjLoading( n );
//            });
            bLoaded = false; bHasData = false;
            oData.length = 0; tempData.length = 0;
            $.ajax({
                type : "POST",
                url  : dataUrl,
                contentType : "application/json;utf-8",
                data : $.toJSON(dataParams),
                error: function(data){
                    alert("error occor\n"+data.responseText);
                    HandleAjaxError(data.responseText);
                },
                complete :function(){
                    //判断是否显示，可以延迟到后面显示
                    //alert("complete");
                    if( bDisplay )   
                        onAjaxFinish();
                },
                success: function(xmlData) {  
                    //alert("success");
                    var result = eval( '(' + xmlData + ')' );
                    dataTotalCount = result.nAllRowCount;
                    if (CheckResult_Json(result) == false){
                        func_onHandleError(result);
                        return;
                    }
                    bLoaded = true;
                    var realData = result.Data;
                    //alert(result.Data);
                    if( result.nAllRowCount == 0 ) {//
                        bHasData = false;
                    }
                    else if( result.nAllRowCount > 0 ) {//多条数据
                      //  alert("many");
                        for( var i = 0 ; i < realData.length ; i ++)
                        {
                            bHasData = true;
                            oData.push( func_onDataTrasform_Json( realData[i] ) );
                        }
                        
                    }
                    else {//单条记录
                            alert("single");
//                        if( realData  ) {
                            bHasData = true;
                            oData.push( func_onDataTrasform_Json( realData ) );
//                        }
                    }
                }
            });
        };
        
        function doAjaxRequest(params, bDisplay) {       
            innerFilterParams = params;
            $.each( divObj, function(i,n) {
                if( bLoaded )
                    n.onDataClear(n);
                n.onDataLoading();
                
                showObjLoading( n );
            });
                    
            bLoaded = false; bHasData = false;
            oData.length = 0; tempData.length = 0;
            
            $.ajax({
                type : "POST",
                url  : dataUrl,
                dataType : "xml",
                data : dataParams,
                error: function(data){
                    HandleAjaxError(data.responseText);
                },
                complete :function(){
                    //判断是否显示，可以延迟到后面显示 
                    if( bDisplay )   
                        onAjaxFinish();
                },
                success: function(xmlData) {
                    if (CheckResult(xmlData) == false){
                        return;
                    }
                    var root = $(xmlData).children();
                    if( root.children("Status").text() == "OK" ){
                        bLoaded = true;
                        if( root.children("Data").find("Table").size() != 0)//返回的是datatalbe
                        {       
                            oData.length = 0;
                            root.children("Data").find("Table").each(function(i) {
                                bHasData = true;   
                                oData.push( func_onDataTrasform($(this)) );
                            });
                        }
//                        else//返回的是直接的text
//                            oData.push( root.children("Data").text() );
                    }
                }
            });
        };
        
        function clear() {
            bLoaded = false; bHasData = false;
            oData.length = 0; tempData.length = 0;
            $.each( divObj, function(i,n){
            });
        };
        
        function clearPageData() {
            $.each( divObj, function(i,n){
                n.onDataClear(n);
            });
        };
        
        function getDataLength() {
            return dataTotalCount;
        };
        
        function getTempDataLength() {
            return tempDataLength;
        };
        
        function isLoaded() {
            return bLoaded;
        };
        
        function execRequest(isJson) {
            //检查是否Json调用
            if( isJson == null ) {
                innerIsJson = false;
                $.ajax({
                    type : "POST",
                    url  : dataUrl,
                    dataType : "xml",
                    data : dataParams,
                    error: function(data){
                        HandleAjaxError(data.responseText);
                    },
                    complete :function(){
                    },
                    success: function(xmlData) {
                        if (CheckResult(xmlData) == false){
                            return;
                        }
                        func_onHandleExecRequest(xmlData);
                    }
                });
            }
            else {
                innerIsJson = true;
                $.ajax({
                    type : "POST",
                    url  : dataUrl,
                    contentType : "application/json;utf-8",
                    data : $.toJSON(dataParams),
                    error: function(data){
//                        HandleAjaxError(data.responseText);
                          alert(data.responseText);
                    },
                    success: function(jsonData) {  
                        bLoaded = true;
                        var result = eval( '(' + jsonData + ')' );
                        if (CheckResult_Json(result) == false){
                            return;
                        }
                        func_onHandleExecRequest(result);
                    }
                });
            }
        };
        function getPageIndex() {
            return pageIndex;            
        };
        function init() {
            //*input {ID, onDataDisplay, onDataClear, onDataLoading, divNoResult, divPagination, divLoading}
            //{divPagination, divLoading, divNoResult, divContent:, object, onDataDisplay, onDataClear, onDataLoading}
            if( typeof( params.objList ) == "undefined" || params.objList.length == 0 )
                return;
            divObj = $.map( params.objList, function(n){
                var id = n.ID;
                var divLoading, divNoResult, divContent, object, divPagination, func_dataDisplay, 
                    func_dataClear, func_dataLoading;
                
                object = $("#" + id );
                divLoading = n.loadingTemplate == null ? divLoadingTemplate.clone().attr("id", "divLoading_" + id) : n.loadingTemplate.clone().attr("id", "divLoading" + id);
                divNoResult = n.noresultTemplate == null ? divNoResultTemplate.clone().attr("id", "divNoResult_" + id) : n.noresultTemplate.clone().attr("id", "divNoResult" + id);
                divPagination = n.paginationTemplate == null ? divPaginationTemplate.clone().attr("id", "divPagination_" + id ) : n.paginationTemplate.clone().attr("id", "divPagination_" + id);
                divContent = object.find(":first");
                func_dataDisplay = n.onDataDisplay == null ? Default_dataDisplay : n.onDataDisplay;
                func_dataClear = n.onDataClear == null ? Default_dataClear : n.onDataClear;
                func_dataLoading = n.onDataLoading == null ? Default_dataLoading : n.onDataLoading;
                    
                object.prepend( divLoading );
                object.prepend( divNoResult );
                
                object.append( divPagination );
               // alert(object.html());
                return {
                        id            : id,
                        divPagination : divPagination, 
                        divLoading    : divLoading, 
                        divNoResult   : divNoResult, 
                        divContent    : divContent, 
                        object        : object, 
                        onDataDisplay : func_dataDisplay, 
                        onDataClear   : func_dataClear, 
                        onDataLoading : func_dataLoading
                       };     
            });
        };
        
        init();
       
        return {
            debug:function() {
                $.each( divObj, function(i, n) {
                    alert( n.object.html() );
                });
            },
            setRequestHeader:function( params ) {
               setRequestHeader( params );
            },
            doAjaxRequest_Json:function(params, bDisplay) {
                doAjaxRequest_Json(params, bDisplay);
            },
            doAjaxRequest:function(params, bDisplay) {
                doAjaxRequest(params, bDisplay);
            },
            //直接显示内容的函数
            display_Json:function(params) {
                display(params, "Json");
            },
            //直接显示内容的函数
            display:function(params) {
                display(params, null);
            },
            //直接调用处理，处理的方法在resultHanle里面定义
            execRequest : function () {
                execRequest();
            },
            execRequest_Json : function () {
                execRequest("Json");
            },
            clearData:function() {
                clearPageData();
                bLoaded = false;
            },
            getData:function(index) {
                var tempData;
                if( index >= 0 && index < oData.length ) 
                    tempData = oData[index];
                return tempData;
            },
            showOnLoading:function() {
                $.each( divObj, function(i,n) {
                    n.onDataClear(n);
                    n.onDataLoading();
                    showObjLoading( n );
                });
            },
            reset:function() {
                reset();
            },
            clear:function() {
                clear();
            },
            oData:oData,
            getDataLength:getDataLength,
            getTempDataLength:getTempDataLength,
            divObj:divObj,
            isLoaded:isLoaded,
            pageIndex: getPageIndex

        };
    };

