
$L.add('itemReviewAjaxSubmitter', new (function ( ) {
        var obj = $L.object(this);
        
        obj._endpoint = 'http://www.lulu.com/reviews/review_item.php';
        obj._submittingFormId;
        
        obj.submit = function ( formId ) {
            obj._submittingFormId = formId;
            obj._$startSpinner( formId);
            var data = obj._$getData(formId);
            obj._$send(data);
            return obj;
        };
        
        obj.callback = function ( response ) {
            if (response.success == true) {
                var l = window.location;
                l.replace(l.pathname);
            } else {
                obj._$displayErrors(response);
                obj._$stopSpinner(obj._submittingFormId);
            }
            return obj;
        };
        
        obj.clearErrors = function () {
            $jq('#'+obj._submittingFormId+'_feedback').remove();
            return obj;
        };
        
        obj.error = function (XMLHttpRequest, textStatus, errorThrown) {
            obj._$displayErrors({errors: [textStatus]});
            obj._$stopSpinner(obj._submittingFormId);
            return obj;
        };

        obj.stopSpinner = function ( ) {
            obj._$stopSpinner(obj._submittingFormId);
            return obj;
        };
        
        obj._$startSpinner = function ( formId ) {
            $jq('#'+formId+' .spinnerImg').css({visibility: 'visible'});
        };
        
        obj._$stopSpinner = function ( formId ) {
            $jq('#'+formId+' .spinnerImg').css({visibility: 'hidden'});
        };
        
        obj._$displayErrors = function ( response ) {
            obj.clearErrors();
            var $fb = $jq('<div>').attr('id', obj._submittingFormId+'_feedback').addClass('UIFeedback error');
            if (typeof response.errors == 'object') {
                for (var i = 0; i < response.errors.length; i++) {
                    $fb.append($jq('<div>').text(obj._getErrorMsgForError(response.errors[i])));
                }
            } else {
                $fb.append($jq('<div>').text(obj._getErrorMsgForError(response)));
            }
            $jq('#' + obj._submittingFormId).prepend($fb);
            $L.dialogBoxManager.select('*').modifiedContent();
        };
        
        obj._getErrorMsgForError = function ( error ) {
            var errMsg = $L.itemReviewDialogI18nDictionary.errors[error];
            if (typeof errMsg == 'undefined' ) {
                errMsg = $L.itemReviewDialogI18nDictionary.errors['default'];
            }
            return errMsg;
        };
        
        obj._$getData = function ( formId ) {
            var data = {};
            data.formId = formId;
            data[$jq('#'+formId+'_fReview_review').attr('name')] = obj._cleanText($jq('#'+formId+'_fReview_review').val());
            data[$jq('#'+formId+'_fReview_rating_inputField').attr('name')] = $jq('#'+formId+'_fReview_rating_inputField').val();
            data[$jq('#'+formId+'_fReview_weread_entity_type').attr('name')] = $jq('#'+formId+'_fReview_weread_entity_type').val();
            data[$jq('#'+formId+'_fReview_weread_entity_id').attr('name')] = $jq('#'+formId+'_fReview_weread_entity_id').val();
            data[$jq('#'+formId+'_fReview_userid').attr('name')] = $jq('#'+formId+'_fReview_userid').val();
            data[$jq('#'+formId+'_fReview_locale').attr('name')] = $jq('#'+formId+'_fReview_locale').val();
            return data;
        };

        obj._cleanText = function ( dirty ) {
            return dirty.replace(/"/g, '&quot;').replace(/\\/g, '&#92;');
        };
        
        obj._$send = function ( d ) {
            $jq.ajax({data: d, cache: false, dataType:"json", type:"POST", url: obj._endpoint, success:obj.callback, error:obj.error});
        };
        
        return obj;
    })());
$L.add('itemTagAjaxSubmitter', new (function ( ) {
        var obj = $L.object(this);
        
        obj._endpoint = 'http://www.lulu.com/tags/tag_item.php';
        obj._submittingFormId;
        
        obj.submit = function ( formId ) {
            obj._submittingFormId = formId;
            obj._$startSpinner( formId);
            var data = obj._$getData(formId);
            obj._$send(data);
            return obj;
        };
        
        obj.callback = function ( response, status ) {
            if (response.success == true) {
                var l = window.location;
                l.replace(l.pathname);
            } else {
                obj._$displayErrors(response);
                obj._$stopSpinner(obj._submittingFormId);
            }
            return obj;
        };
        
        obj.clearErrors = function () {
            $jq('#'+obj._submittingFormId+'_feedback').remove();
            return obj;
        };

        obj.error = function (XMLHttpRequest, textStatus, errorThrown) {
            obj._$displayErrors({errors: [textStatus]});
            obj._$stopSpinner(obj._submittingFormId);
            return obj;
        };

        obj.stopSpinner = function ( ) {
            obj._$stopSpinner(obj._submittingFormId);
            return obj;
        };
        
        obj._$startSpinner = function ( formId ) {
            $jq('#'+formId+' .spinnerImg').css({visibility: 'visible'});
        };
        
        obj._$stopSpinner = function ( formId ) {
            $jq('#'+formId+' .spinnerImg').css({visibility: 'hidden'});
        };
        
        obj._$displayErrors = function ( response ) {
            obj.clearErrors();
            var $fb = $jq('<div>').attr('id', obj._submittingFormId+'_feedback').addClass('UIFeedback error');
            if (typeof response.errors == 'object') {
                for (var i = 0; i < response.errors.length; i++) {
                    $fb.append($jq('<div>').text(obj._getErrorMsgForError(response.errors[i])));
                }
            } else {
                $fb.append($jq('<div>').text(obj._getErrorMsgForError(response)));
            }
            $jq('#' + obj._submittingFormId).prepend($fb);
            $L.dialogBoxManager.select('*').modifiedContent();
        };
        
        obj._getErrorMsgForError = function ( error ) {
            var errMsg = $L.itemTagDialogI18nDictionary.errors[error];
            if (typeof errMsg == 'undefined' ) {
                errMsg = $L.itemTagDialogI18nDictionary.errors['default'];
            }
            return errMsg;
        };
        
        obj._$getData = function ( formId ) {
            var data = {};
            data.formId = formId;
            data[$jq('#'+formId+'_fTagField_tags').attr('name')] = obj._cleanText($jq('#'+formId+'_fTagField_tags').val());
            data['fTagField_tags_original'] = obj._cleanText($jq('#'+formId+'_cancelSourceText').text());
            data[$jq('#'+formId+'_fTagField_weread_entity_type').attr('name')] = $jq('#'+formId+'_fTagField_weread_entity_type').val();
            data[$jq('#'+formId+'_fTagField_weread_entity_id').attr('name')] = $jq('#'+formId+'_fTagField_weread_entity_id').val();
            data[$jq('#'+formId+'_fTagField_userid').attr('name')] = $jq('#'+formId+'_fTagField_userid').val();
            data[$jq('#'+formId+'_fTagField_locale').attr('name')] = $jq('#'+formId+'_fTagField_locale').val();
            return data;
        };

        obj._cleanText = function ( dirty ) {
            return dirty.replace(/"/g, '&quot;').replace(/\\/g, '&#92;');
        };

        obj._$send = function ( d ) {
            $jq.ajax({data: d, cache: false, dataType:"json", type:"POST", url: obj._endpoint, success:obj.callback, error:obj.error});
        };
        
        return obj;
    })());