﻿// jQuery request Plugin
//
// Version 1.01
// By Sobo Lubin
// 28 Jan 2009
//
// Usage:
// demo one:
// $.cRequest().setAction("aa.aspx").append("ichi","ni","san","you","go").setFnName("getGirl")
//                .setOrder(["cols desc","colg","coln asc"]).setExPostData("Ejyu","Ebyakuu").setPaging(5,13)
//                .setWhere({keyValueObjArray:[{job:"student"},{age:23,op:"<"},{weight:"60kg",op:">="}],opEnumArray:["|","&"]})
//                .setDataType("json").setRequestUrl("ajax.aspx").setAsync(true).setErrPage("/page/err.html")
//                .doAjax(callBack);
// demo two:
// $.cRequest({
//                  action:"bb.aspx",
//                  fnName:"getName",
//                  exPostData:["ex1","ex2"],
//                  postData:["pd1","pd2"],
//                  paging:[6,20],
//                  orderBy:["cols desc","colg","coln asc"],
//                  where:{keyValueObjArray:[{job:"student"},{age:23,op:"<"},{weight:"60kg",op:">="}],opEnumArray:["|","&"]},
//                  dataType:"json",
//                  requestUrl:"ajax.aspx",
//                  async:true,
//                  errPage:"/ajax/err.html"
//               }).doAjax(callBack);
//
// Options:  action -string
//           fnName -string
//           exPostData -array
//           postData -array
//           paging -array
//           orderBy -array
//           where -object
//           dataType -string
//           requestUrl -string
//           async - boolean
//           errPage -string  


//function searchParse(){
//            var resultObj = {};
//            var search = window.location.search;
//            if(search && search.length > 1){
//                var search = search.substring(1);
//                var items = search.split('&');     
//                for(var index = 0 ; index < items.length ; index++ ){   
//                    if(! items[index]){
//                        continue;
//                    }             
//                    var kv = items[index].split('='); 
//                    resultObj[kv[0]] = typeof kv[1] === "undefined" ? "":kv[1];
//                }                
//            } 
//            return resultObj;           
//        }

//var searchObj = searchParse();
//var value = searchObj["fda"]

 ;(function($){
        $.extend({
            cRequest:function(obj){
                
                //處理Where條件
                function setWhereCdt(wObj){
                        // keyValueObjArray:[{name:'ken'},{age:23}...]  opEnumArray:[&,|]  
                        // keyValueObj 原型 {key:value,op:'>'} op可以不寫，默認等號(=)  
                        // var wObj = {keyValueObjArray:[],opEnumArray:[]};
                    var wArr = [];
                    
                    if(typeof wObj === "object"){
                          if( (wObj.keyValueObjArray instanceof Array) && wObj.opEnumArray instanceof Array ){
                                if((wObj.keyValueObjArray.length - wObj.opEnumArray.length) == 1){
                                    for(var i = 0; i< wObj.keyValueObjArray.length ;i++){
                                        var op = "";
                                        var objKey = "";
                                        var objValue = "";
                                        var hasOp = false;
                                        
                                        for(var key in wObj.keyValueObjArray[i]){
                                            if(key!="op"){
                                                objKey = key;
                                                objValue = wObj.keyValueObjArray[i][key];
                                                
                                                if(typeof objValue === "string"){
                                                    objValue = "'"+objValue+"'";
                                                }
                                                
                                            }else{
                                                hasOp = true;
                                                if(wObj.keyValueObjArray[i][key]!="="){
                                                    op = wObj.keyValueObjArray[i][key];
                                                }else{
                                                    op = "=";
                                                }                                
                                            }
                                        }
                                        if(!hasOp){
                                            op = "=";
                                        }
                                      
                                      
                                        wArr.push($.strFormat("{0} {2} {1}",objKey,objValue,op));
                                        
                                        switch(wObj.opEnumArray[i]){
                                            case "&":
                                                wArr.push("and");
                                                break;
                                            case "|":
                                                wArr.push("or");
                                                break;
                                            default:break;
                                        }
                                }
                            }
                        }
                    }
                    return wArr.join(" ");
                }
                
                
                //處理排序條件
                function setOrderByCdt(arr){
                    //必須為字母
                    //var reg = /[a-zA-Z][a-zA-Z\d]*/gi;
                    //是否指定降序，默認升序
                    //var regTaxis = /desc/gi;
                    var orderArr = [];
                    if(arr instanceof Array){
                        if(arr.length){
                            for(var i=0; i<arr.length; i++){
                                if(typeof arr[i] === "string"){
                                    var tArr = arr[i].split(" ");
                                    if(tArr[1] == "desc" || tArr[1] == "asc"){
                                        orderArr.push(arr[i]);
                                    }else{
                                        orderArr.push(arr[i] + " " + "asc");
                                    }
                                }
                            }
                        }
                    }
                    return orderArr;
                }

                if(!obj) var obj = {};
                obj.async = obj.async || true; //是否異步
                obj.requestUrl = obj.requestUrl || "../AjaxHandler.ashx"; //請求地址
                obj.dataType = obj.dataType || "json";
                obj.action = obj.action || ""; //要跳轉的頁面地址
                obj.fnName = obj.fnName || ""; //請求的方法名
                obj.exPostData = obj.exPostData || []; //額外請求的數據
                obj.postData = obj.postData || []; //請求數據
                obj.paging = obj.paging || [1,20]; //分頁數據 固定長度：2
                obj.orderBy = setOrderByCdt(obj.orderBy) || []; //排序數據
                obj.where = setWhereCdt(obj.where) || []; //查詢條件
                obj.errPage = obj.errPage || "error.html"; //錯誤頁面
                
                
                //構建類
                function req(){
                    
                    //設置跳轉頁面
                    this.setAction = function(act){
                        if(typeof act === "string"){
                            obj.action = act;
                        }
                        return this;
                    }
                    
                    //設置請求方法名
                    this.setFnName = function(fnName){
                        if(typeof fnName === "string"){
                            obj.fnName = fnName;
                        }
                        return this;
                    }
                    
                    //添加請求數據
                    this.append = function(){
                        if(arguments.length){
                            for(var i = 0 ;i<arguments.length;i++){
                                obj.postData.push(arguments[i]);
                            }
                        }
                        return this;
                    }
                    
                    //設置請求額外數據
                    this.setExPostData = function(){
                        if(arguments.length){
                            for(var i=0; i<arguments.length; i++){
                                obj.exPostData.push(arguments[i]);
                            }
                        }
                        return this;
                    }
                    
                    //設置分頁
                    this.setPaging = function(pageIndex,pageSize){
                        //pageInde:從1開始 默認第一頁，每頁20行數據
                        if(obj.paging[0] == 1 && obj.paging[1] == 20)obj.paging = [];
                        typeof pageIndex === "number" ? obj.paging.push(pageIndex) : obj.paging.push(1);
                        typeof pageSize === "number" ? obj.paging.push(pageSize) :obj.paging.push(20);
                        return this; 
                    }
                    

                    //設置字段排序
                    this.setOrder = function(oArr){
                        obj.orderBy = setOrderByCdt(oArr);
                        return this;
                    }
                    
                    //設置Where條件
                    this.setWhere = function(wObj){
                        obj.where = setWhereCdt(wObj);
                        return this;
                    }
                    
                    //傳遞的數據
                    function getPassData(){
                        var jsonObj = {
                                        action:obj.action,
                                        fnName:obj.fnName,
                                        postData:obj.postData.join(),
                                        where:obj.where,
                                        orderBy:obj.orderBy.join(),
                                        paging:obj.paging.join(),
                                        exPostData:obj.exPostData.join()
                                      }
                        return jsonObj;
                    }
                    
                    //設置選項
                    //設置數據格式
                    this.setDataType = function(dt){
                        var regDataType = /^(json|xml|jsonp|text|html)$/gi;
                        if(regDataType.test(dt)){
                            obj.dataType = dt;
                        }
                        return this;
                    }
                    
                    //設置請求頁面
                    this.setRequestUrl = function(rUrl){
                        if(typeof rUrl === "string"){
                           // obj.requestUrl = encodeURI(rUrl);
                           obj.requestUrl = rUrl;
                        }
                        return this;
                    }
                    
                    //設置是否異步
                    this.setAsync = function(isAsync){
                        if(typeof isAsync === "boolean"){
                            obj.async = isAsync;
                        }
                        return this;
                    }
                    
                    //設置錯誤頁面路徑
                    this.setErrPage = function(errPath){
                        if(typeof errPath === "string"){
                            //obj.errPage = encodeURI(errPath);
                            obj.errPage = errPath;
                        }
                        return this;
                    }
                    
                    //異步請求
                    this.doAjax = function(callback){
                          $.ajax({
                               type: "POST",
                               url: obj.requestUrl,
                               async:obj.async,
                               data: getPassData(),
                               dataType:obj.dataType,
                               success: function(msg){
                                    if(typeof callback === "function"){
                                         callback(msg);
                                    }
                              }
                          });
                    }
                }
                
                return new req();
            },
            strFormat:function(){
                if( arguments.length == 0 )
                    return null;
                var str = arguments[0]; 
                for(var i=1;i<arguments.length;i++) {
                    var re = new RegExp('\\{' + (i-1) + '\\}','gm');
                    str = str.replace(re, arguments[i]);
                }
                return str;
            },
           searchParse:function(){
                var resultObj = {};
                var search = window.location.search;
                if(search && search.length > 1){
                    var search = search.substring(1);
                    var items = search.split('&');     
                    for(var index = 0 ; index < items.length ; index++ ){   
                        if(! items[index]){
                            continue;
                        }             
                        var kv = items[index].split('='); 
                        resultObj[kv[0]] = typeof kv[1] === "undefined" ? "":kv[1];
                    }                
                } 
                return resultObj;       
               }
        });
        
    })(jQuery);
