(function() {

YAHOO.namespace("phanfare.service");

YAHOO.util.Connect.setDefaultPostHeader(false);
YAHOO.util.Connect.initHeader('Content-Type', 'application/json; charset=UTF-8', true); 

YAHOO.phanfare.service.Service = function() {
};

YAHOO.phanfare.service.Service.prototype = {
    onSuccess: function( o ) {
        var r = new Object;
        try {
            r = YAHOO.lang.JSON.parse( o.responseText );
        }
        catch( x ) {
            alert("JSON Parse failed: " + x + " " + o.responseText);
            if( !o.argument.callbacks.scope ) {
                o.argument.callbacks.failure( o.argument.state, null, true );
            } else {
                o.argument.callbacks.failure.apply( o.argument.callbacks.scope, [ o.argument.state, null, true ] );
            }
            return;
        }
        
        if( r.return_code == 0 ) {
            if( o.argument.callbacks && o.argument.callbacks.success ) {
                if( !o.argument.callbacks.scope ) {
                    o.argument.callbacks.success( o.argument.state, r );
                } else {
                    o.argument.callbacks.success.apply( o.argument.callbacks.scope, [ o.argument.state, r, false ] );
                }
            }
        } else {
            if( !o.argument.callbacks.scope ) {
                o.argument.callbacks.failure( o.argument.state, r );
            } else {
                o.argument.callbacks.failure.apply( o.argument.callbacks.scope, [ o.argument.state, r, false ] );
            }
        }
    },
    
    onFailure: function( o ) {
        if( ( o.status == 0 ) || ( o.status == -1 ) ) {
            // 0 = network failure
            // 1 = timeout
            if( !o.argument.callbacks.scope ) {
                o.argument.callbacks.failure( o.argument.state, null, true );
            } else {
                o.argument.callbacks.failure.apply( o.argument.callbacks.scope, [ o.argument.state, null, true ] );
            }
        } else {
            var r = new Object;
            try {
                alert( o.responseText );
                r = YAHOO.lang.JSON.parse( o.responseText );
            }
            catch( x ) {
                alert("JSON Parse failed: " + x + " " + o.responseText);
                if( !o.argument.callbacks.scope ) {
                    o.argument.callbacks.failure( o.argument.state, null, true );
                } else {
                    o.argument.callbacks.failure.apply( o.argument.callbacks.scope, [ o.argument.state, null, true ] );
                }
                return;
            }
            
            // .NET exception
            if( r.Message )
            {
                //alert( r.ExceptionType + ': ' + r.Message + '\r\n' + r.StackTrace );
                r.return_code = -100;
                r.error_message = r.ExceptionType + "<br/>" + r.Message + "<br/>" + r.StackTrace;
            }
            
            if( !o.argument.callbacks.scope ) {
                o.argument.callbacks.failure( o.argument.state, r, false );
            } else {
                o.argument.callbacks.failure.apply( o.argument.callbacks.scope, [ o.argument.state, r, false ] );
            }
        }
    },
    
    getCallbacks: function( callbacks ) {
        var serviceCallbacks = {
            cache: false,
            success: this.onSuccess,
            failure: this.onFailure,
            timeout: 60000,
            argument: { callbacks: callbacks, state: callbacks.state }
        };
        return serviceCallbacks;
    },
    
    GetComments: function( session_cookie, target_uid, album_id, callbacks )
    {
        YAHOO.util.Connect.asyncRequest('POST',"/webclient/Service.asmx/GetComments", this.getCallbacks( callbacks ), YAHOO.lang.JSON.stringify({session_cookie:session_cookie, target_uid:target_uid, album_id:album_id }));
    },
    
    GetImageGps: function( session_cookie, target_uid, album_id, image_id, callbacks )
    {
        YAHOO.util.Connect.asyncRequest('POST',"/webclient/Service.asmx/GetImageGps", this.getCallbacks( callbacks ), YAHOO.lang.JSON.stringify({session_cookie:session_cookie, target_uid:target_uid, album_id:album_id, image_id:image_id }));
    },
    
    LeaveComment: function( session_cookie, target_uid, album_id, image_id, comment, full_name, email_address, captcha_hash, captcha_text, callbacks )
    {
        YAHOO.util.Connect.asyncRequest('POST',"/webclient/Service.asmx/LeaveComment", this.getCallbacks( callbacks ), YAHOO.lang.JSON.stringify({session_cookie:session_cookie, target_uid:target_uid, album_id:album_id, image_id:image_id, comment:comment, full_name:full_name, email_address:email_address, captcha_hash:captcha_hash, captcha_text:captcha_text }));
    },
    
    DeleteComment: function( session_cookie, target_uid, album_id, image_id, comment_id, callbacks )
    {
        YAHOO.util.Connect.asyncRequest('POST',"/webclient/Service.asmx/DeleteComment", this.getCallbacks( callbacks ), YAHOO.lang.JSON.stringify({session_cookie:session_cookie, target_uid:target_uid, album_id:album_id, image_id:image_id, comment_id:comment_id }));
    },
    
    GetLightAlbumListFast: function(session_cookie, target_uid, site_id, callbacks) {
        YAHOO.util.Connect.asyncRequest('POST',"/webclient/Service.asmx/GetLightAlbumListFast", this.getCallbacks( callbacks ), YAHOO.lang.JSON.stringify({session_cookie:session_cookie, target_uid:target_uid, site_id:site_id}));
    },
    
    GetAlbums: function(session_cookie, target_uid, album_ids, group_id, full_load, thumbs, callbacks) {
        YAHOO.util.Connect.asyncRequest('POST',"/webclient/Service.asmx/GetAlbums", this.getCallbacks( callbacks ), YAHOO.lang.JSON.stringify({session_cookie:session_cookie, target_uid:target_uid, album_ids:album_ids, group_id:group_id, full_load:full_load, thumbs:thumbs}));
    },
    
    GetSiteAlbums: function(session_cookie, target_uid, site_id, album_ids, callbacks) {
        YAHOO.util.Connect.asyncRequest('POST',"/webclient/Service.asmx/GetSiteAlbums", this.getCallbacks( callbacks ), YAHOO.lang.JSON.stringify({session_cookie:session_cookie, target_uid:target_uid, site_id:site_id, album_ids:album_ids, thumbs:false}));
    },
    
    GetTocRandomImages: function( url, callbacks ) {
        YAHOO.util.Connect.asyncRequest('GET', url, this.getCallbacks( callbacks ) );
    },
    
    AuthenticateToSite: function(session_cookie, target_uid, site_id, password, callbacks) {
        YAHOO.util.Connect.asyncRequest('POST',"/webclient/Service.asmx/AuthenticateToSite", this.getCallbacks( callbacks ), YAHOO.lang.JSON.stringify({session_cookie:session_cookie, target_uid:target_uid, site_id:site_id, password:password}));
    },
    
    GetCommentCaptcha: function(session_cookie, callbacks) {
        YAHOO.util.Connect.asyncRequest('POST',"/webclient/Service.asmx/GetCommentCaptcha", this.getCallbacks( callbacks ), YAHOO.lang.JSON.stringify({session_cookie:session_cookie}));
    },
    
    GetRawLink: function(session_cookie, target_uid, album_id, image_id, callbacks) {
        YAHOO.util.Connect.asyncRequest('POST',"/webclient/Service.asmx/GetRawLink", this.getCallbacks( callbacks ), YAHOO.lang.JSON.stringify({session_cookie:session_cookie, target_uid:target_uid, album_id:album_id, image_id:image_id}));
    }
};

})();

