SharePointにJavaScriptでTickerを実装する - jQueryプラグイン化(MOSS Client) (1)

AJAX のために jQuery を使ったので、せっかくだから MOSS の WebService を処理する jQueryプラグインとして作成してみた。
初めて作ってみたのでいろいろ恥ずかしいところがあるかもしれないけどそこはご愛敬。普段は JavaScript をいじらないのでちょっと楽しかった。現状では、ごく一部である下記のサービスに対応している。必要に応じていろいろ追加予定。もし利用される方がいれば各自の責任でご自由にどうぞ。それぞれの説明とかはまた明日以降〜。

Endpoint Function
SiteData.asmx GetWeb
Lists.asxm GetListItems
GetListCollection
Imaging.asmx GetListItems
ListPictureLibrary
////////////////////////////////////////////////////////////////////////////////
//    jQuery Plugin - MOSS Client (by Kz)
 
////////////////////////////////////////////////////////////////////////////////
//    MOSS Clinet Common
var MOSS = MOSS || {
    Imaging: {},
    Lists: {},
    SiteData: {}
};
 
jQuery.extend(MOSS, {
    callSoapService: function(param) {
        $.ajax({
            type: 'POST',
            url: param.url,
            contentType: 'text/xml; charset=utf-8',
            dataType: 'xml',
            processData: false,
            data: param.postData,
            complete: function(data) {
                if (param.callback) {
                    var fault = data.responseXml.selectSingleNode('/soap:Envelope/soap:Body/soap:Fault');
                    var error = null;
                    if (fault) {
                        error = {
                            code: fault.selectSingleNode('faultcode').text,
                            reason: fault.selectSingleNode('faultstring').text,
                            detail: fault.selectSingleNode('detail').text
                        };
                    }
                    param.callback(data, error);
                }
            },
            beforeSend: function(req) {
                req.setRequestHeader('Content-Length', param.postData.length);
                req.setRequestHeader('SOAPAction', param.soapAction);
            }
        });
    }
});
////////////////////////////////////////////////////////////////////////////////
//    SiteData.asmx
jQuery.extend(MOSS.SiteData, {
    servicePath: '/_vti_bin/SiteData.asmx',
 
    getWeb: function(param) {
        MOSS.callSoapService({
            url: param.url ? param.url : this.servicePath,
            postData: '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetWeb xmlns="http://schemas.microsoft.com/sharepoint/soap/" /></soap:Body></soap:Envelope>',
            soapAction: 'http://schemas.microsoft.com/sharepoint/soap/GetWeb',
            callback: function(data, error) {
                if (!param.callback) {
                    return;
                }
                var xmlRes = data.responseXml.selectSingleNode('/soap:Envelope/soap:Body/GetWebResponse');
                if (xmlRes) {
                    var xmlWM = xmlRes.selectSingleNode('sWebMetadata');
                    if (xmlWM) {
                        param.callback({
                            webMetadata: {
                                webID: xmlWM.selectSingleNode('WebID').text,
                                title: xmlWM.selectSingleNode('Title').text,
                                description: xmlWM.selectSingleNode('Description').text,
                                author: xmlWM.selectSingleNode('Author').text,
                                lastModified: xmlWM.selectSingleNode('LastModified').text
                            },
                            data: data,
                            error: error
                        });
                        return;
                    }
                }
                //    Failed?
                param.callback({ data: data, error: error });
            }
        });
    }
});
////////////////////////////////////////////////////////////////////////////////
//    Lists.asmx
jQuery.extend(MOSS.Lists, {
    servicePath: '/_vti_bin/Lists.asmx',
 
    getListCollection: function(param) {
        MOSS.callSoapService({
            url: param.url ? param.url : this.servicePath,
            postData: '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetListCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" /></soap:Body></soap:Envelope>',
            soapAction: 'http://schemas.microsoft.com/sharepoint/soap/GetListCollection',
            callback: function(data, error) {
                if (!param.callback) {
                    return;
                }
                var rows = data.responseXml.selectNodes('/soap:Envelope/soap:Body/GetListCollectionResponse/GetListCollectionResult/Lists/List');
                var listArray = [];
                for (var i = 0; i < rows.length; i++) {
                    listArray.push({
                        url: rows[i].getAttribute('DefaultViewUrl'),
                        id: rows[i].getAttribute('ID'),
                        title: rows[i].getAttribute('Title'),
                        descriptiopn: rows[i].getAttribute('Description')
                    });
                }
                param.callback({
                    lists: listArray,
                    rows: rows,
                    data: data,
                    error: error
                });
            }
        });
    },
 
    getListItems: function(param) {
        var postData = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">' +
                        '<listName>' + param.listName + '</listName>' +
                        (param.viewName ? ('<viewName>' + param.viewName + '</viewName>') : '') +
                        (param.query ? ('<query>' + param.query + '</query>') : '') +
                        (param.fields ? ('<viewFields>' + param.fields + '</viewFields>') : '') +
                        (param.rowLimit ? ('<rowLimit>' + param.rowLimit + '</rowLimit>') : '') +
                        (param.options ? ('<queryOptions>' + param.options + '</queryOptions>') : '') +
                        (param.webID ? ('<webID>' + param.webID + '</webID>') : '') +
                        '</GetListItems></soap:Body></soap:Envelope>';
        MOSS.callSoapService({
            url: param.url ? param.url : this.servicePath,
            postData: postData,
            soapAction: 'http://schemas.microsoft.com/sharepoint/soap/GetListItems',
            callback: function(data, error) {
                if (!param.callback) {
                    return;
                }
                param.callback({
                    rows: data.responseXml.selectNodes('/soap:Envelope/soap:Body/GetListItemsResponse/GetListItemsResult/listitems/rs:data/z:row'),
                    data: data,
                    error: error
                });
            }
        });
    }
});
////////////////////////////////////////////////////////////////////////////////
//    Imaging.asmx
jQuery.extend(MOSS.Imaging, {
    servicePath: '/_vti_bin/Imaging.asmx',
 
    listPictureLibrary: function(param) {
        MOSS.callSoapService({
            url: param.url ? param.url : this.servicePath,
            postData: '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ListPictureLibrary xmlns="http://schemas.microsoft.com/sharepoint/soap/ois/" /></soap:Body></soap:Envelope>',
            soapAction: 'http://schemas.microsoft.com/sharepoint/soap/ois/ListPictureLibrary',
            callback: function(data, error) {
                if (!param.callback) {
                    return;
                }
                var rows = data.responseXml.selectNodes('/soap:Envelope/soap:Body/ListPictureLibraryResponse/ListPictureLibraryResult/PictLib/Library');
                var listArray = [];
                for (var i = 0; i < rows.length; i++) {
                    listArray.push({
                        url: rows[i].getAttribute('url'),
                        id: rows[i].getAttribute('guid'),
                        title: rows[i].getAttribute('title'),
                        name: rows[i].getAttribute('name')
                    });
                }
                param.callback({
                    lists: listArray,
                    rows: rows,
                    data: data,
                    error: error
                });
            }
        });
    },
 
    getListItems: function(param) {
        var postData = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/ois/">' +
                        '<strListName>' + param.listName + '</strListName>' +
                        (param.folder ? ('<strFolder>' + param.folder + '</strFolder>') : '') +
                        '</GetListItems></soap:Body></soap:Envelope>';
        MOSS.callSoapService({
            url: param.url ? param.url : this.servicePath,
            postData: postData,
            soapAction: 'http://schemas.microsoft.com/sharepoint/soap/ois/GetListItems',
            callback: function(data, error) {
                if (!param.callback) {
                    return;
                }
                param.callback({
                    rows: data.responseXml.selectNodes('/soap:Envelope/soap:Body/GetListItemsResponse/GetListItemsResult/Library/z:row'),
                    data: data,
                    error: error
                });
            }
        });
    }
});