santiago1983

学无止境

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
/*
* INFORMATION
* Plugin Name: Client Data Jquery Plugin
* Created Date: 09/07/2012
* Version: 0.0.1
* Deployed to: \\uploadb\imagestore\theknot\jscripts\jquery\plugins\jquery-clientdata.0.0.1.js
* TFS: $/Editorial/Trunk/Websites/common/jscripts/jquery/plugins/jquery-clientdata/jquery.clientdata.js
* Author: Santiago Chen
* Email: 545438641@qq.com
*
* DEPENDENCIES
* jQuery (Attention: tested only with 1.4.3)
* standardModal
*
* SAMPLE FOR USING CLIENTDATA PLUGIN
* $.fn.clientData({
*    modalWidth: "550",          //define modal's width
*    modalHeight: "auto",        //define modal's height
*    thickBorderWidth: 15,       //define border's width 
*    thickBorderOpacity: .5,     //define border's opacity
*    showOverlay: true,             //define whether the overlay is needed or not
*    overlayOpacity: 0,             //define overlay's opacity
*    closeOnOverlayClick: false,    //define whether can close modal by overlay clicking or not
*    onSelect:function(param){
        //onSelect is a function you can defined by yourself to do something you want to.
        //param is optional, but it is needed when you want to handle with the object about client data returned by GetComponentsJson call.
*       //just write codes to do whatever you want here. Aha!
*        }
*    });
*  
* CHANGELOG
* 09/07/2012  drafted by Santiago.
* 
*/

(function($){    
    $.fn.clientData = function(options){
        //PARAMS:
        var defaults = {
            modalWidth: "550",
            modalHeight: "auto",
            thickBorderWidth: 15,
            thickBorderOpacity: .5,
            showOverlay: true,
            overlayOpacity: 0,
            closeOnOverlayClick: false,
            onSelect: function(param){console.log(param)}
            };
            
        var opts = $.extend(defaults, options);
        
        //load contents with standModal
        (function initialData(){
            XO.standardModal.makeModal("clientData", {
                width: opts.modalWidth + 'px'  ,
                height: 'auto',
                thickBorderWidth: opts.thickBorderWidth,
                thickBorderOpacity: opts.thickBorderOpacity,
                showOverlay: opts.showOverlay,
                overlayOpacity: opts.overlayOpacity,
                closeDestroysModal: true,
                restoreContentOnDestroy: false,
                closeOnOverlayClick: opts.closeOnOverlayClick,
                content: domFactory.searchBox.initial(), //contents loaded here
                events: { onClose: function(){domFactory.closeAndRestore()}}
                });
            domFactory.searchBox.clientCheck();
            $('.xo_stdModalContent').resize(function(){
                $(".xo_stdModalThickBorder").height($('.xo_stdModal').height()+2*(opts.thickBorderWidth+6));//6 pixel is the width of xo_stdModal's border 
                });
            domElement.contentWrap.bind('selectCallBack',function(event){opts.onSelect(event.message);})
            })()    
        }
        
        //parts for dom
        var domElement = {
                //wrap
                contentWrap:     $("<div></div>"),
                
                //searchbox  
                searchBox:         $('<table id="searchBox"></table>'),
                checkBox:         $('<tr><td>Include Expired Campaigns:</td><td><input type="checkbox" id="checkBox" disabled="disabled"/></td><li>'),
                clientRow:         $('<tr><td>Client:</td><td><input type="text" id="txtClient"/></td><li>'),
                campaignRow:     $('<tr><td>Campaign:</td><td><select id="campaignSelect" disabled="disabled"></select></td><li>'),
                
                //droplist
                dropList:         $('<ul></ul>'),
                
                //resultbox
                resultCounter:   $('<div style="text-align:left;padding:6px 6px 16px 6px;"></div>'),
                
                //resultTable
                resultTable:     $('<table style="width:100%;text-align:left;padding:12px 0; border-top:solid 1px #999; border-bottom: solid 1px #999;"></table>'),
                resultTableTop: $('<tr style="font-Size:12px; font-weight:bold; color:#999999;"><td width="17%">Component Id</td><td width="13%">FatTail Id</td><td width="14%">Description</td><td width="30%">Notes</td><td width="13%">Start Date</td><td width="13%">End Date</td></tr>'),
                
                //paging
                paging:            $('<div style="margin:12px 0; font-size:12px;"><span id="prePage" style="margin:0 30px 0 0">&lt;Previous Page</span><span id="currentPage" style="margin:0 30px 0 0"></span><span id="nextPage">Next Page&gt;</span></div>'),
                
                //txt loader
                txtLoader:         $('<span style="color:#336; font-size:10px; width:22px; height:16px; display:inline-block; background:url(http://www.xoedge.com/clientdata/img/loading_size_16.gif) no-repeat 4px 0; vertical-align: middle;"></span>'),
                txtLoader2:     $('<span style="color:#336; font-size:10px; width:106px; height:9px; display:inline-block; background:url(http://www.xoedge.com/clientdata/img/loading_size_32.gif) no-repeat 4px 0; vertical-align: middle;"></span>'),
                //tips: no record
                noRecord:        $('<span style="color:#B00; font-size:10px;;">&nbsp;No Record</span>')
            };
            
        //domFactory
        var domFactory = {
                
            searchBox:{
                //initial
                initial: function(){
                    domElement.searchBox.prepend(domElement.checkBox,domElement.clientRow,domElement.campaignRow);
                    domElement.contentWrap.prepend(domElement.searchBox)
                    return domElement.contentWrap
                },
                
                tempClient: '', //restrict the times of search event
                //clientCheck
                clientCheck: function(){
                    //var tempClient;
                    domFactory.dropList.initial();
                    $("#txtClient").keyup(function(){
                        
                        if(domFactory.searchBox.tempClient !== $(this).val().replace(/^\s*/, '')){
                            domFactory.searchBox.tempClient = $(this).val().replace(/^\s*/, '');
                            if(domFactory.searchBox.tempClient.length >= 3){
                                serverCall.callClient(domFactory.searchBox.tempClient);
                                }
                            else{
                                $('#checkBox').attr('disabled','disabled');
                                domFactory.dropList.reStore();
                                if(domElement.txtLoader)domElement.txtLoader.remove();
                                }
                            }
                        })
                    },
                
                reStore: function(){
                    $("#checkBox").attr("checked",false);
                    $("#txtClient").val("");
                    if(domElement.clientRow.find('span').length>0){
                        domElement.clientRow.find('span').remove();
                        }
                    }    
                },
            
            //dom for droplist
            dropList: {
                initial: function(){
                    domElement.dropList.css({
                        position:'absolute',
                        left: $('#txtClient').position().left,
                        top: $('#txtClient').position().top+$('#txtClient').height()+6, //width of border from some dom elemnts
                        background: "#ffffff",
                        width: $('#txtClient').width(),
                        padding: '0px',
                        margin: '0px',
                        border: "solid 2px #cccccc"
                        });    
                    },
                onChange: function(obj){
                    domElement.dropList.empty();
                    if(obj.length>0){
                        $('#checkBox').attr('disabled','');
                        if(domElement.clientRow.find('span').length>0){
                            domElement.clientRow.find('span').remove();
                            }
                        $.each(obj,function(index,element){
                            domElement.dropList.append(
                                $("<li>"+element.ClientName+"</li>").attr('data-accountID',element.ClientAccountID)
                                    .css({cursor: "pointer"})
                                    .click(function(){
                                        domFactory.searchBox.tempClient = $(this).html();
                                        $('#txtClient').val($(this).html())
                                        serverCall.callCampaign($(this).attr('data-accountID')); 
                                        domFactory.dropList.reStore();
                                        $('#checkBox').attr('disabled','disabled');    
                                    })
                                );
                            })
                        domElement.contentWrap.append(domElement.dropList);
                        }
                    else{
                        $('#checkBox').attr('disabled','disabled');
                        (domElement.txtLoader)?domElement.txtLoader.replaceWith(domElement.noRecord):$('#txtClient').after(domElement.noRecord);
                        }
                    },
                reStore: function(){
                    domElement.dropList.empty().remove();
                    }
                },
            
            campaignRow:{
                onChange: function(obj){
                    domFactory.campaignRow.reStore();
                    $('#campaignSelect').unbind('change');
                    if(obj.length>0){
                        $.each(obj,function(index,element){
                            $('#campaignSelect').append($('<option>' + element.CampaignName + '</option>').attr('value',element.CampaignID))
                            })    
                        if(obj.length>1){$('#campaignSelect').prepend('<option value="undefine">Please select</option>')}    
                        $('#campaignSelect').attr('disabled','');
                        //the below is handler for ajax callComponent.
                        if(obj.length==1){
                            serverCall.callComponent(obj[0].CampaignID);
                            }    
                        $('#campaignSelect').change(function(){
                            serverCall.callComponent($(this).val());
                            })
                        }
                    else{
                        (domElement.txtLoader)?domElement.txtLoader.replaceWith(domElement.noRecord):$('#campaignSelect').after(domElement.noRecord);
                        $('#campaignSelect').attr('disabled','disabled');
                        }
                    },
                reStore: function(){
                    domElement.campaignRow.find('#campaignSelect').empty().attr({'value':'','disabled':'disabled'});
                    }
                },
                
            //resultCounter
            resultCounter:{
                initial: function(param){
                    domFactory.resultCounter.reStore();
                    domElement.resultCounter.html(param.totalAmount+((param.totalAmount==1)?' result found':' results found')).insertAfter(domElement.searchBox);
                    },
                reStore: function(){
                    domElement.resultCounter.empty().remove();
                    }
                },
            
            //resultTable
            resultTable:{
                initial: function(param){
                    domFactory.resultTable.reStore();
                    domElement.resultTable.insertAfter(domElement.resultCounter);
                    domElement.resultTable.append(domElement.resultTableTop);
                    domFactory.resultTable.onConstruct(param);
                    },
                onConstruct: function(param){
                    for(var i=0; i<param.components.length; i++){
                        domElement.resultTable.append(
                            $('<tr><td width="17%"><a>'+param.components[i].ClientCampaignComponentID+'</a></td>'
                                 +'<td width="13%">'+param.components[i].SourceComponentID+'</td>'
                                 +'<td width="14%">'+param.components[i].ComponentDesc+'</td>'
                                 +'<td width="30%">'+param.components[i].Notes+'</td>'
                                 +'<td width="13%">'+utils.covertDate(param.components[i].ComponentStartDate)+'</td>'
                                 +'<td width="13%">'+utils.covertDate(param.components[i].ComponentEndDate)+'</td></tr>')
                                 .css({fontSize: '10px',verticalAlign: 'top'})     
                            );
                        }
                    domElement.resultTable.find('a')
                        .css({textDecoration:'underline',cursor:'pointer',color:'#0037AA'})
                        .click(function(){domElement.contentWrap.trigger({type:'selectCallBack', message:param})});    
                    },
                reStore: function(){
                    domElement.resultTable.empty().remove();
                    }
                },
            
            //paging
            paging:{
                initial:function(param,page){
                    domElement.paging.insertAfter(domElement.resultTable);
                    domFactory.paging.countPage(param,page)
                    },
                countPage: function(param,page){
                    //display current pageNum
                    $('#currentPage').html('Page '+page+' of '+param.totalPages);
                    //modify pre Btn;
                    if(page>1){
                        $('#prePage').css({
                            cursor:'pointer',
                            color: '#333'
                            }).click(function(){
                                serverCall.callComponent(param.components[0].CampaignID,(page-1));
                                })
                        }
                    if(page==1){
                        $('#prePage').css({cursor:'default',color: '#ccc'}).unbind('click')
                        }
                    //modify next Btn 
                    if(page<param.totalPages){
                        $('#nextPage').css({
                            cursor:'pointer',
                            color: '#333'
                            }).click(function(){
                                serverCall.callComponent(param.components[0].CampaignID,(page+1));
                                })
                        }
                    if(page==param.totalPages){
                        $('#nextPage').css({cursor:'default',color:'#ccc'}).unbind('click');
                            }    
                        },
                    reStore: function(){
                        domElement.paging.remove();
                        }
                },
            
            //closeAndResore    
            closeAndRestore:function(){
                domFactory.searchBox.reStore();
                domFactory.dropList.reStore();
                domFactory.campaignRow.reStore();
                domFactory.resultCounter.reStore();
                domFactory.resultTable.reStore();
                domFactory.paging.reStore();
                }    
            
            };

        //serverCall
        var serverCall = {
            baseURL: "http://www.theknot.com/national/clientdata/api/v1/",
            
            callClient: function(param){                
                (domElement.clientRow.find('span').length>0)?domElement.clientRow.find('span').replaceWith(domElement.txtLoader):$('#txtClient').after(domElement.txtLoader);        

                var postData = "client="+encodeURIComponent(param);
                $.ajax({
                    url: serverCall.baseURL + "GetClientsJson",
                    dataType: 'jsonp',
                    type: 'GET',
                    cache: false,
                    data: postData,
                    success: function(data, status) {
                        domFactory.dropList.onChange(data);
                        },
                    error: function(xhr, desc, err) {alert('Ajax error on GetClientsJson(): ' + desc);},
                    complete: function(){if(domElement.txtLoader)domElement.txtLoader.remove();}
                    })
                },
                
            callCampaign: function(param){                
                (domElement.campaignRow.find('span').length>0)?domElement.campaignRow.find('span').replaceWith(domElement.txtLoader):$('#campaignSelect').after(domElement.txtLoader);
                $('#campaignSelect').attr('disabled','disabled');        
                var expired = $('#checkBox').attr('checked');
                var postData = "ClientAccountID="+encodeURIComponent(param)+"&expired="+expired;
                $.ajax({
                    url: serverCall.baseURL + "GetCampaignsJson",
                    dataType: 'jsonp',
                    type: 'GET',
                    cache: false,
                    data: postData,
                    success: function(data, status) {
                        domFactory.campaignRow.onChange(data);
                        },
                    error: function(xhr, desc, err) {alert('Ajax error on GetCampaignsJson(): ' + desc);},
                    complete: function(){if(domElement.txtLoader)domElement.txtLoader.remove();}
                    })
                },
                
            callComponent: function(param, pageindex){                
                if(param !=='undefine'){
                    domElement.resultCounter.remove();
                    domElement.resultTable.remove();
                    domElement.paging.remove();
                    domElement.searchBox.after(domElement.txtLoader2);
                    var _index = pageindex || 1;
                    var postData = "CampaignID="+encodeURIComponent(param)+"&pageIndex="+_index;
                    $.ajax({
                        url: serverCall.baseURL + "GetComponentsJson",
                        dataType: 'jsonp',
                        type: 'GET',
                        cache: false,
                        data: postData,
                        success: function(data, status) {
                            domFactory.resultCounter.initial(data); //count result found
                            if(data.totalAmount>0){
                                domFactory.resultTable.initial(data);//display result found
                                domFactory.paging.initial(data,_index); //display paging
                                } 
                            },
                        error: function(xhr, desc, err) {alert('Ajax error on GetComponentsJson(): ' + desc);},
                        complete: function(){if(domElement.txtLoader2)domElement.txtLoader2.remove();}
                    })
                
                    }
                }
            };
            
        var utils = {
            covertDate : function (dateString) {
                if(dateString){
                    var dateNo = dateString.split('(')[1].split(')')[0],
                        obj = eval('(' + "{Date: new Date(" + dateNo + ")}" + ')'),
                        dateValue = obj["Date"];
                    return (dateValue.getMonth() + 1) + "/" + dateValue.getDate() + "/" + dateValue.getFullYear();
                    }
                else{return "";}    
                },    
            configHandler :function(){
                //css
                var cssLink = document.createElement('link');
                cssLink.href = 'http://www.xoedge.com/clientdata/style/style.css';
                cssLink.rel = 'stylesheet';
                document.head.appendChild(cssLink);
                //standard modal
                var smScript = document.createElement('script');
                smScript.src = 'http://www.xoedge.com/jscripts/shared/xo/xo.modal/xo.standardModal-0.0.2.min.js';
                document.body.appendChild(smScript);
                }()
            };
        
/*
 * jQuery resize event - v1.1 - 3/14/2010
 * http://benalman.com/projects/jquery-resize-plugin/
 * 
 * Copyright (c) 2010 "Cowboy" Ben Alman
 * Dual licensed under the MIT and GPL licenses.
 * http://benalman.com/about/license/
 */
(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=10;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this);
        
    })(jQuery)
posted on 2012-09-07 23:11  santiago1983  阅读(211)  评论(0编辑  收藏  举报