
    function InlineField( dl ) {

        this.dl = dl;
        this.dt = $('dt',this.dl)[0];
        this.subject = $(this.dl).attr('subject');
        this.handler = new window[this.dl.getAttribute('handler')]( this );
        this.type = this.dt.getAttribute('type');
        this.property = this.dt.getAttribute('property');
        this.range = this.dt.getAttribute('range').split('||');
    }

    InlineField.fieldForNode = function( node ) {
        var dl = (node.nodeName == 'DL'? [node] : $(node).parents('dl:first'));
        if (dl.length > 0) {
            dl = dl[0];
            if (dl._field) {
                return dl._field;
            } else {
                return (dl._field = new InlineField( dl ));
            }
        }
        if (dl.length < 1) {
            var div = $(node).parents('.hasInlineField');
//alert(div+'/'+div.length);
            if (div.length > 0) {
                return div[0].field;
            }
        }
        return null;
    }

    InlineField.prototype.button = function( cls, action ) {
        var a = document.createElement('A');
        $(a).addClass( cls )
            .addClass( 'btn md' + (cls != 'add' ? ' default' : '') )
            .text(cls)
            .click( action );

        return a;
    };

    InlineField.prototype.newControlWrapper = function( control ) {
        var div = document.createElement('DIV');
        $(div).addClass( 'controlWrapper' );
        div.control = control;
        div.appendChild( InlineField.deleteButton( control ) );
        div.appendChild( control );
        return div;
    };

    InlineField.prototype.buildNewControl = function( canonicalValue, displayValue ) {
        var control = this.handler.buildControl( this.subject, this.property, this.type, this.range, canonicalValue, displayValue );
        // control.style.width = '95%';
        return control;
    }

    InlineField.prototype.addNewControl = function() {
        var field = InlineField.fieldForNode( this );
        if (field.handler.addHandler) {
            var currentValues = new Array();
            $('dd',field.dl).each( function() {
                var displayValue = this.innerHTML;
                var canonicalValue = $('div.__canonical',this);
                canonicalValue = (canonicalValue.length > 0 ? canonicalValue[0] : null);
                if (canonicalValue != null) {
                    this.removeChild( canonicalValue );
                    displayValue = this.innerHTML;
                    this.appendChild( canonicalValue );
                    canonicalValue = canonicalValue.innerHTML;
                } else {
                    canonicalValue = displayValue;
                }
                currentValues.push( { canonicalValue: canonicalValue, displayValue: displayValue } );
            });
            return field.handler.addHandler( field, currentValues );
        }
        var control = field.buildNewControl( null, null );
        var wrapper = field.newControlWrapper( control );
        $(wrapper).hide();
        $('div.buttons',field.popup).before( wrapper );
        if (control.onReady) control.onReady();
        $(wrapper).show();
        control.focus();
    }

    InlineField.deleteButton = function( control ) {
        var a = $('<input type="checkbox" class="delete" checked="true"></input>')[0];
        $(a).click( function() {
            var wrapper = $(this).parents('div.controlWrapper')[0];
            if (wrapper.control && wrapper.control.dispose) wrapper.control.dispose();
            $(wrapper).remove();
        });
        return a;
    }

    InlineField.prototype.setValuesAndCloseEditor = function( values ) {
        var field = this;
        $(field.dl).removeClass('editing');
        $('div.buttons',this.popup)[0].innerHTML = '';
        $('div.buttons',this.popup)[0].style.background = 'url(/images/spinner-sm-eee.gif) bottom center no-repeat';
        $.post( "/_iform/setValues",
            { subject: this.subject, predicate: this.property, values: values, component: this.handler.component },
            function( data ) {
                $(field.popup).remove();
                var refresh = false;
                $('div.controlWrapper',this.popup).each( function() {
                    if (this.control && this.control.refreshRequired) refresh = refresh || this.control.refreshRequired();
                    if (this.control && this.control.dispose) this.control.dispose();
                });
                var dl = $(data.replace(/^\s*|\s*$/g,''))[0];
                try{
                    field.dl.parentNode.replaceChild(dl,field.dl);
                    InlineField.initField( dl );
                } catch ( error ) {
                }
                if (refresh) location.reload( true );
            }
        );
    }

    InlineField.prototype.doneEditing = function() {
        var field = (this instanceof InlineField? this : InlineField.fieldForNode( this ));
        $(field.dl).removeClass('editing');
        $('div.controlWrapper',field.popup).each( function() { this.style.opacity = 0.5; });
        $('div.buttons',field.popup)[0].innerHTML = '';
        $('div.buttons',field.popup)[0].style.background = 'url(/images/spinner-sm-eee.gif) bottom center no-repeat';
        if (field.handler.submit) {
//            alert(2); return;
            field.handler.submit( function() {
                $.get( "/_iform/renderField",
                    { subject: field.subject, predicate: field.property, component: field.handler.component },
                    function( data ) {
                        $(field.popup).remove();
                        $('div.controlWrapper',field.popup).each( function() {
                            if (this.control && this.control.dispose) this.control.dispose();
                        });
                        var dl = $(data.replace(/^\s*|\s*$/g,''))[0];
                        try{
                            field.dl.parentNode.replaceChild(dl,field.dl);
                            InlineField.initField( dl );
                        } catch ( error ) {
                        }
                    }
                );
            });
        } else {
//            alert(1); return;
            var values = new Array();
            $('div.controlWrapper',field.popup).each( function() {
                var value = (this.control.getCanonicalValue? this.control.getCanonicalValue() : null);
                value = ( value? value : this.control.value );
                if (value != null) values.push( value );
            });
            $.post( "/_iform/setValues",
                { subject: field.subject, predicate: field.property, values: values, component: field.handler.component },
                function( data ) {
                    $(field.popup).remove();
                    var refresh = false;
                    $('div.controlWrapper',field.popup).each( function() {
                        if (this.control && this.control.refreshRequired) refresh = refresh || this.control.refreshRequired();
                        if (this.control && this.control.dispose) this.control.dispose();
                    });
                    var dl = $(data.replace(/^\s*|\s*$/g,''))[0];
                    field.dl.parentNode.replaceChild(dl,field.dl);
                    InlineField.initField( dl );
                    if (refresh) location.reload( true );
                }
            );
        }
    }

    InlineField.hideField = function() {
        $(this).parents('dl.ifield').fadeOut('normal',function() {
            var iform = $(this).parents('.iform');
            $(this).remove();
            if (iform.length > 0) {
                iform[0].iform.save();
            }
        });
    }

    var firstControl = null;
    InlineField.initField = function( dl ) {
        $('dt', dl).click(function(){
            InlineField.editField( this );
            return false;
        });
        $('dt a.remove',dl).click( InlineField.hideField );
//        var iform = $(dl).parents('div.iform');
//        if (iform.length > 0) {
//            iform = iform[0].iform;
//            InlineField.initField( dl );
//        }
    }

    InlineField.prototype.cancelEditing = function() {
        try {
            $(this.popup).remove();
        } catch ( error ) {}
        this.editing = null;
        $(this.dl).removeClass('editing');
        $(this.dl).parents('.iform').removeClass('editing');
        $('div.controlWrapper',this.popup).each( function() {
            if (this.control && this.control.dispose) this.control.dispose();
        });
        // no longer nessary? since we fixed layers by adding them to the body tag not the dl - Kai + Jim
        //this.dl.innerHTML = this.dl.originalInnerHTML;
        InlineField.initField( this.dl );
        this.dl._field = null;
    }

    InlineField.editField = function( clickTarget ) {
        var firstControl = null;
        var field = InlineField.fieldForNode( clickTarget );
        if (field.editing) return;
        field.editing = true;
        $(field.dl).addClass('editing');
        $(field.dl).parents('.iform').addClass('editing');
        field.dl.originalInnerHTML = field.dl.innerHTML;
        var div = document.createElement('DIV');
        $(div).addClass('hasInlineField');
        div.field = field;
        field.popup = div;
        $(div).addClass('inlineEditorBox');
        // div.style.top = ($('dd',field.dl)[0].offsetTop) + 'px';// - ($(field.dl).is('sbs')? 16 : 1)) + 'px';
        // div.style.left = ($('dd',field.dl)[0].offsetLeft) + 'px';// - ($(field.dl).is('sbs')? 16 : 22)) + 'px';
        div.appendChild($('<div class="nwcorner"></div>')[0]);
        div.appendChild($('<div class="necorner"></div>')[0]);
        div.appendChild($('<div class="swcorner"></div>')[0]);
        div.appendChild($('<div class="secorner"></div>')[0]);
        $(field.dl).children('dd').each(
            function() {
                if (this.getAttribute('new') == 'true' && field.handler.skipEmptyControls) {
                    return;
                }
                var displayValue = this.innerHTML;
                var canonicalValue = $('div.__canonical',this);
                canonicalValue = (canonicalValue.length > 0? canonicalValue[0] : null);
                if (canonicalValue != null) {
                    this.removeChild( canonicalValue );
                    displayValue = this.innerHTML;
                    this.appendChild( canonicalValue );
                    canonicalValue = canonicalValue.innerHTML;
                } else if (this.getAttribute('new') != 'true') {
                    canonicalValue = displayValue;
                }
                var control = field.buildNewControl( canonicalValue, displayValue );
                if (firstControl == null) firstControl = control;
                div.appendChild( field.newControlWrapper( control ) );
            }
        );
        var buttons = document.createElement('DIV');
        $(buttons).addClass('buttons');
        buttons.appendChild( field.button( 'save', field.doneEditing ) );
        buttons.appendChild( field.button( 'cancel', function() {
            field.cancelEditing();
        } ) );

        var addButton = field.button( 'add', field.addNewControl );
        $(addButton).addClass('left');
        buttons.appendChild( addButton );

        div.appendChild( buttons );
        var pos = $(field.dl).offset();
        $(div).css({'left': pos.left, 'top': (parseInt(pos.top) + 20)}); // editor offset
        $(div).appendTo('body').show();

        $('div.controlWrapper', div).each( function() {
            if (this.control && this.control.onReady) {
                this.control.onReady();
            }
        });
        if (firstControl) {
            setTimeout(function(){ try{ firstControl.focus() } catch(e){} }, 100);
        } else if (field.handler.addHandler) {
            field.handler.addHandler( field, new Array() );
        }
    }

    $(function() {
        initIFields( document.body );
    });

    function initIFields( node ) {
        // FL-4621 backdoor way to make items uneditable on pages which are 'new'
        // if page is 'new' don't init ifield
        if ( $('div.twineForm.new').length == 0) {
            $('dl.ifield.editable dt', node ).click(function(){
                InlineField.editField( this );
                return false;
            });
            $('dl.ifield.editable dt a.remove', node ).click(function(){
                InlineField.hideField();
                return false;
            });
        }
    }
    

        $(function() {
            $('#main a.openRemoveFromThisSpot').live('click', function() {
                var options = {
                    title: 'Remove',
                    width: 350,
                    ajaxUrl: this.href,
                    ajaxCache: false,
                    buttons: {
                        'Remove': function() {
                            $('div.ui-dialog-buttonpane button', this).addClass('disabled');
                            $('form', this).trigger('submit');
                            return false;
                        },
                        'Cancel': function() {
                            $(this).dialog('close');
                            return false;
                        }
                    }
                }

                if ( $(this).hasClass('removeWithAjax') ) {
                    var $deleteItem = $(this).parents('li.blog-item:first');
                    $.extend(options, {
                        callback: function( id ) {
                            var dialogId = id;
                            $('form', dialogId).ajaxForm({
                                dataType: 'json',
                                success: function( data ) {
                                    $(dialogId).dialog('close');
                                    $deleteItem.fadeOut('normal', function() {
                                        $(this).remove();
                                    });
                                    if ( data.message ) {
                                        content.info(data.message);
                                    }
                                },
                                error: function() {
                                    $(dialogId).dialog('close');
                                    content.alert("Permission denied");
                                }
                            });
                        }
                    });
                }
                content.modalAjax('#removeFromThisSpot', options);
                return false;
            });

            $('a#bulk-remove').click(function() {
                var options = {
                    title: 'Remove',
                    width: 350,
                    ajaxUrl: this.href + '?' + $('ul.item-summary input:checkbox').serialize(),
                    ajaxCache: false,
                    buttons: {
                        'Remove': function() {
                            $('div.ui-dialog-buttonpane button', this).addClass('disabled');
                            $('form', this).triggerHandler('submit');
                            return false;
                        },
                        'Cancel': function() {
                            $(this).dialog('close');
                            return false;
                        }
                    },
                    callback: function( data ) {
                        var dialogId = this.id;
                        $('form', dialogId).ajaxForm({
                            dataType: 'json',
                            success: function( data ) {
                                $(dialogId).dialog('close');
                                $deleteItem.fadeOut('normal', function() {
                                    $(this).remove();
                                });
                                if ( !(data.message == '' || data.message == null ||
                                       data.message == 'undefined') ) {
                                    content.info(data.message);
                                }
                            },
                            error: function() {
                                $(dialogId).dialog('close');
                                content.alert("Permission denied");
                            }
                        });
                    }
                }

                var $deleteItem = $(this).parents('li.blog-item:first');
                content.modalAjax('#removeFromThisSpot', options);
                return false;
            });
        });
    

        /**/
        $(function(){
            var reportOptions = {
                title: 'Report This',
                width: 400,
                buttons: {
                    'Send': function() { $('form', this).trigger('submit') },
                    'Cancel': function() {
                        $(this).dialog('close');
                        return false;
                    }
                }
            }

            $('#reportIt').click(function() {
                content.modal('#report', reportOptions);
                changeValidator();
                return false;
            });
            $('a.report-button').live('click', function() {
                var url = this.href;
                $.extend(reportOptions, { 
                   callback: function(){ 
                       $('#reportUrl').val(url);
                       $('#reportReturnUrl').val(location.href);
                   }
                });
                content.modal('#report', reportOptions);
                changeValidator();
                return false;
            });
            function changeValidator() {
                if ( $('#reportForm select').val() && $.trim($('#description').val()) ) {
                    $('#report button.lg:first').removeClass('disabled');
                } else {
                    $('#report button.lg:first').addClass('disabled');
                }
            }
            $('#reportForm select').change(changeValidator);
            $('#description').keyup(changeValidator);

            $('#reportForm').submit(function() {
                if ( $('#report select').val() == '' ) {
                    content.info("Please select a reason");
                    return false;
                } else if ( !$.trim($('#description').val()) ) {
                    content.info("Please enter a message");
                    return false;
                }
                else {
                    $('#report').dialog('close');
                    return true; // submit the form
                }
            });
        });
        /**/
    

var _htmlFieldIDIndex = 0;
var myConfig = {
    // General options
    mode: 'textareas',
    theme: 'advanced',
    editor_selector: 'init',
    plugins: 'safari,inlinepopups,nonbreaking,fullscreen',
    init_instance_callback: function(){ $('#mce____toolbar1 a').attr('tabIndex', '-1') },

    // Theme options
    // theme_advanced_buttons1 : 'bold,italic,underline,|,bullist,numlist,outdent,indent,|,formatselect,link,unlink,image,code,help',
    theme_advanced_buttons1 : 'bold,italic,underline,|,bullist,numlist,outdent,indent,|,formatselect,link,unlink,image,code,fullscreen',
    theme_advanced_buttons2 : '',
    theme_advanced_buttons3 : '',
    theme_advanced_buttons4 : '',
    theme_advanced_toolbar_location : 'top',
    theme_advanced_toolbar_align : 'left',
    nonbreaking_force_tab : true,
    fullscreen_new_window : true,
    fullscreen_settings : {
        theme_advanced_path_location : "top"
    },
    width : '470',
    height : '200'
};
function IHTMLField() {
    tinyMCE.init(myConfig);

    this.component = '{radar://components/iform}htmlfield';
    this.buildControl = function( subject, property, type, range, canonicalValue, displayValue ) {
        var div = document.createElement('DIV');
        var id = 'mce__' + _htmlFieldIDIndex++;
        var $input = $('<textarea id="' + id + '" class="htmledit" style="margin-left: 24px"></textarea>');
        $input.val(canonicalValue);
        div.input = $input[0];
        $(div)
            .append($input)
            .addClass('IHTMLField');

        div.onReady = function() {
            tinyMCE.execCommand( 'mceAddControl', false, div.input.id );
            // FL-4525 HACK: get rid of Add button for RTE - kai
            $('div.inlineEditorBox div.buttons a.add').remove();
        };
        div.dispose = function() { };
        div.getCanonicalValue = function() {
            try {
                return tinyMCE.get(div.input.id).getContent();
            } catch ( error ) {
                return div.input.value;
            }
        };
        div.refreshRequired = function() { return true; }
        return div;
    };
};



$('a.postToAnotherSpotDialog').live('click', function(e){
    e.stopPropagation();
    e.preventDefault();
    var options = {
        title: 'Share this item with another twine',
        // height: 400,
        width: 400,
        ajaxUrl: this.href,
        ajaxCache: false,
        buttons: { 'Share': function() { $('form', this).submit() } },
        callback: function(firstLoad) {
            /* omniture code to track share attempts */
            if ( typeof(s_account) !== 'undefined' ) {
                var s=s_gi(s_account);
                s.linkTrackVars='events';
                s.linkTrackEvents='event27';
                s.events='event27';
                s.tl(true,'o','share attempt');
            }
            /* omniture code end */
            if (firstLoad) {
                var id = this.id;
                var $dialog = $(id).parent();
                // select first option in dialog when only one exists - Kai
                var $opts = $('select[multiple] option:not([disabled])', id);
                if ( $opts.length === 1 ) $opts[0].selected = true;
                else $dialog.find('.ui-dialog-buttonpane button').addClass('ui-state-disabled');

                $('select.multi').change(function () {
                    $('select.multi option:selected:not([disabled])').each(function () {
                        $dialog.find('.ui-dialog-buttonpane button').removeClass('ui-state-disabled');
                    });
                });

                $('form', id).ajaxForm({
                    dataType: 'json',
                    beforeSubmit: function() {
                        if ( $dialog.find('.ui-dialog-buttonpane button:first').hasClass('ui-state-disabled') ){ return false; };
                        content.disableButton($dialog.find('.ui-dialog-buttonpane button:first'));
                    },
                    success: function(data) {
                        content.info(data.message);
                        $(id).dialog('close');
                    },
                    error: function(xhr, status, ex) {
                        // kill this error function when ie6+7 are working perfectly - kb
                        var msg = ""; 
                        msg += status + "\n"; 
                        msg += xhr.status + "\n\n"; 
                        msg += ex; 
                        debug('REPORT: ' + msg);
                        $(id).dialog('close');
                    }
                });
            }
        }
    }
    content.modalAjax('#postToAnotherSpot', options);
    return true;
});
$('a.withViaEmailDialog').live('click', function(e){
    e.stopPropagation();
    e.preventDefault();
    var options = {
        title: 'Share this item via Email',
        // height: 400,
        width: 400,
        ajaxUrl: this.href,
        ajaxCache: false,
        buttons: { 'Share': function() { $('form', this).submit() } },
        callback: function(firstLoad) {
            if (firstLoad) {
                /* omniture code to track share attempts */
                if ( typeof(s_account) !== 'undefined' ) {
                    var s=s_gi(s_account);
                    s.linkTrackVars='events';
                    s.linkTrackEvents='event27';
                    s.events='event27';
                    s.tl(true,'o','share attempt');
                }
                /* omniture code end */
                var id = this.id;
                var $dialog = $(id).parent();

                $('textarea:last', id).placeholder({blankSubmit: false});
                $dialog.find('.ui-dialog-buttonpane button:first').addClass('ui-state-disabled');
                $('.email-list textarea', id).blur(function(){
                    $dialog.find('.ui-dialog-buttonpane button:first')
                        [$(this).val()?'removeClass':'addClass']('ui-state-disabled');
                });
                $('form', id).ajaxForm({
                    dataType: 'json',
                    beforeSubmit: function(formArray, $form) {
                        // email validation pattern
                        var email = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$/i
                        var $emailField = $('.email-list textarea', id);
                        $emailField.parent().prev('div.oops').remove(); // clear previous message
                        if ( ! $emailField.val() ) { return false; }
                        // trim, remove trailing ',', split on space or ',' and normalize to ', '
                        $emailField.val($.trim($emailField.val()).replace(/\s*,$/,'').split(/\s*,\s*|\s+/).join(', '));
                        // update addresses element
                        $.grep(formArray, function(f){ return f.name == 'addresses' }).value = $emailField.val();
                        // check email address format
                        var invalid = $.grep($emailField.val().split(', '), function(addr){ 
                            return email.test(addr);
                        }, true);
                        if ( invalid.length ) {
                            $emailField.parent()
                                .before('<div class="oops" style="font-weight: bold; margin-bottom: 10px">Please fix these addresses: '+ invalid.join(', ') +'</div>');
                            return false;
                        }
                        content.disableButton($dialog.find('.ui-dialog-buttonpane button:first').removeClass('ui-state-disabled'));
                        return true;
                    },
                    success: function(data) {
                        content.info(data.message);
                        $(id).dialog('close');
                    }
                });
            }
        }
    }
    content.modalAjax('#withViaEmail', options);
    return false;
});
/**/
$('a.withService').live('click', function(){
    $.post(this.href, null, function(data){
        if ( data && data.redirect ) {
            document.location.href = data.redirect;
        }
        else if ( data && data.message ) {
            content.info(data.message);
        }
    },'json');
    return false;
});
/**/



        function IDateField() {
            this.component = '{radar://components/iform}datefield';
            this.newInput = function( cls, value ) {
                var input = document.createElement( 'INPUT' );
                $(input).addClass( cls );
                input.value = value;
                return input;
            };
            this.button = function( cls, action ) {
                var a = document.createElement('A');
                a.innerHTML = '';
                $(a).addClass( cls );
                $(a).click( action );
                return a;
            };
            this.buildControl = function( subject, property, type, range, canonicalValue, displayValue ) {
                if (canonicalValue == null) {
                    canonicalValue = type + '/1970/01/01/00/00/00/AM'
                }
                var div = document.createElement('DIV');
                $(div).addClass('IDateField');
                var date = null;
                var time = null;
                var values = canonicalValue.split('/');
                if (values[0] == 'DATETIME') {
                    date = this.newInput( 'date', values[2] + '/' + values[3] + '/' + values[1] );
                    time = this.newInput( 'time', values[4] + ':' + values[5] + ' ' + values[7] );
                } else if (values[0] == 'DATE') {
                    date = this.newInput( 'date', values[2] + '/' + values[3] + '/' + values[1] );
                } else if (values[0] == 'TIME') {
                    time = this.newInput( 'time', values[4] + ':' + values[5] + ' ' + values[7] );
                } else if (values[0] == 'YEAR') {
                    return null; // to be done
                } else if (values[0] == 'MONTH') {
                    return null; // to be done
                } else if (values[0] == 'DAY') {
                    return null; // to be done
                } else if (values[0] == 'YEARMONTH') {
                    return null; // to be done
                } else if (values[0] == 'MONTHDAY') {
                    return null; // to be done
                } else {
                    return null;
                }
                if (date != null) {
                    div.appendChild(date);
                    div.appendChild( this.button( 'date', function() { openDateChooser($('input',this.parentNode)[0]) } ) );
                }
                if (time != null) {
                    if (date != null) {
                        div.appendChild( document.createTextNode( ' @ ' ) );
                    }
                    div.appendChild(time);
                    div.appendChild( this.button( 'time', function() { } ) );
                }
                div.getCanonicalValue = function() {
                    //  yyyy-MM-dd hh:mm:ss
                    var date = $('input.date',this);
                    var time = $('input.time',this);
                    var value;
                    if (date.length > 0) {
                        date = date[0].value.split('/');
                        var year = (date[2].length == 2? '20' : (date[2].length == 1? '200' : '')) + date[2];
                        var month = (date[0].length == 1? '0' : '') + date[0];
                        var day = (date[1].length == 1? '0' : '') + date[1];
                        value = year + '-' + month + '-' + day;
                    } else {
                        value = '1970-01-01';
                    }
                    if (time.length > 0) {
                        time = time[0].value.replace(/^\s*|\s*$/g,'').replace(/[\s:]+/g,'/').split('/');
                        var hour = parseInt( time[0] );
                        if (hour < 12 && time.length > 2 && time[2].toLowerCase() == 'pm') {
                            hour += 12;
                        } else if (hour == 12 && time.length > 2 && time[2].toLowerCase() == 'am') {
                            hour = 0;
                        }
                        hour = (hour < 10? '0' : '') + hour;
                        var minute = (time[1].length == 1? '0' : '') + time[1];
                        value += ' ' + hour + ':' + minute + ':00.0';
                    } else {
                        value += ' 00:00:00.0';
                    }
                    return value;
                };
                div.focus = function() {
                    if (date != null) date.focus();
                    else if (time != null) time.focus();
                }
                return div;
            };
        };
        var _dateFieldCalendarDiv;
        var _dateFieldCalendar;
        function openDateChooser( input ) {
            if (_dateFieldCalendar == null) {
                _dateFieldCalendar = new CalendarPopup('_dateFieldCalendarDiv');
//                _dateFieldCalendar.setReturnFunction( 'applyNewDate' );
                _dateFieldCalendar.showYearNavigation();
                _dateFieldCalendar.showYearNavigationInput()
            }
            _dateFieldCalendar.input = input;
//            _dateFieldCalendarDiv.style.display = 'none';
            _dateFieldCalendar.select(input,null,'MM/dd/yyyy')
        }

    

        function IComboField() {
            this.component = '{radar://components/iform}combofield';
            this.buildControl = function( subject, property, type, range, canonicalValue, displayValue ) {
                var select = $('select.IComboField[property="' + property + '"]')[0].cloneNode( true );
                select.style.display = null;
                select.value = canonicalValue;
                return select;
            };
            this.getCanonicalValue = function( control ) {
                return control.value;
            };
        };
    

        var _binaryFieldFrameIndex = 0;
        var _binaryFieldSubmitCallback;
        function IBinaryField() {
            this.existing = new Array();
            this.frames = new Array();
            this.component = '{radar://components/iform}binaryfield';
            this.buildControl = function( subject, property, type, range, canonicalValue, displayValue ) {
                if (canonicalValue != null) {
                    var input = document.createElement('INPUT');
                    $(input).addClass('IBinaryField');
                    /* trim html string to convert to jQuery html wrapped object for parsing */
                    input.value = $($.trim(displayValue)).find('*[binaryname]:first').attr('binaryname');
                    input.disabled = true;
                    input.canonicalValue = canonicalValue;
                    input.subject = subject;
                    input.property = property;
                    this.existing.push( input );
                    input.dispose = function() {
                        this.disposed = true;
                    }
                    return input;
                } else {
                    var name = '_binaryFieldFrame' + _binaryFieldFrameIndex++;
                    var prop = property.replace(/\:/g,'%3A').replace(/\//g,'%2F').replace(/\#/g,'%23');
                    var subj = subject.replace(/\:/g,'%3A').replace(/\//g,'%2F').replace(/\#/g,'%23');
                    var url = '/_/html/components/iform/binaryfield.html?mode=control&property=' + prop + '&subject=' + subj + '&contentType=text%2Fhtml';
                    var iframe = $('<iframe name="' + name + '" src="' + url + '" width="300" height="35" frameborder="0" style="padding: 0; margin-top: -10px;" scrolling="no"></iframe>')[0];
                    this.frames.push(name);
                    return iframe;
                }
            };
            this.getCanonicalValue = function( control ) {
                return control.canonicalValue;
            };
            this.submit = function( callback ) {
                if (this.submitting) {
                    return;
                }
                this.submitting = true;
                _binaryFieldSubmitCallback = callback;
                var remainingFrames = (this.frames.length > 0? '' : null);
                for (var i = 0; i < this.frames.length; i++) {
                    remainingFrames += (i > 0? ',' : '') + this.frames[i];
                }
                var toDelete = null;
                for (var i = 0; i < this.existing.length; i++) {
                    if (this.existing[i].disposed) {
                        if (!toDelete) {
                            toDelete = new Array();
                        }
                        toDelete.push( this.existing[i].canonicalValue );
                    }
                }
                if (toDelete) {
                    $.post( "/_iform/removeValues",
                        { subject: this.existing[0].subject, predicate: this.existing[0].property, value: toDelete, component: this.component },
                        function( data ) {
                            window.setTimeout('_binarySubmitUpdate(\'' + null + '\',\'' + remainingFrames + '\',true)',100);
                        }
                    );
                    return;
                }
                window.setTimeout('_binarySubmitUpdate(\'' + null + '\',\'' + remainingFrames + '\',true)',100);
            }
        };
        function _binarySubmitUpdate( frameName, remainingFrames, first ) {
            if (!window.frames[frameName] && remainingFrames == 'null') {
                _binaryFieldSubmitCallback();
                return;
            }
            var span = (first? null : $('span',window.frames[frameName].document.body));
            if (first || span.length > 0) {
                if (remainingFrames && remainingFrames != 'null') {
                    var frames = remainingFrames.split(',');
                    if (frames.length > 0) {
                        var frame = null;
                        var ix = 0;
                        frameName = null;
                        while (!frame && ix < frames.length) {
                            frameName = frames[ix++];
                            frame = window.frames[frameName];
                        }
                        if (!frame) {
                            _binaryFieldSubmitCallback();
                        } else {
                            remainingFrames = (frames.length > ix? '' : null);
                            for (var i = ix; i < frames.length; i++) {
                                remainingFrames += (i > ix? ',' : '') + frames[i];
                            }
                            frame.document.forms['binary'].submit();
                            window.setTimeout('_binarySubmitUpdate(\'' + frameName + '\',\'' + remainingFrames + '\')',100);
                        }
                    } else {
                        _binaryFieldSubmitCallback();
                    }
                } else {
                    _binaryFieldSubmitCallback();
                }
            } else {
                window.setTimeout('_binarySubmitUpdate(\'' + frameName + '\',\'' + remainingFrames + '\')',100);
            }
        }
    

        function IObjectField( fieldAgent ) {
            this.fieldAgent = fieldAgent;
            this.component = '{radar://components/iform}objectfield';
            this.skipEmptyControls = true;
            this.button = function( cls, action ) {
                var a = document.createElement('A');
                a.innerHTML = '';
                $(a).addClass( cls );
                $(a).click( action );
                return a;
            };
            this.buildControl = function( subject, property, type, range, canonicalValue, displayValue ) {
                var input = $('<input class="IObjectField" disabled="true" style="background-color: white; color: black;"></input>')[0];
                input.property = property;
                input.range = range;
                input.field = this;
                if (displayValue != null) {
                    try {
                        // unwrap the anchor text
                        input.value = $(displayValue)[0].innerHTML;
                    } catch ( error ) {
                        input.value = displayValue;
                    }
                } else {
                    input.value = canonicalValue;
                }
                if (canonicalValue != null) input.uri = canonicalValue;
                input.getCanonicalValue = function() {
                    return (this.uri != null? this.uri : this.value);
                };
                return input;
            };
            this.addHandler = function( fieldAgent, currentValues ) {
                var dialog = new Dialog( 600, 400 );
                var query = '';
                for (var i = 0; i < fieldAgent.range.length; i++) {
                    query += (i != 0? ' or ' : '') + 'isA ' + (fieldAgent.range[i] != 'rdfs:Resource'? fieldAgent.range[i] : 'basic:Item');
                }
                var sel = '';
                for (var i = 0; i < currentValues.length; i++) {
                    sel += (i == 0? '' : ',') + currentValues[i].canonicalValue;
                }
                // TODO: use routing.  why is jexl derefing not working, either with or without the $$ trick?
                dialog.open( '/kb/objectChooser', { query: query, selection: sel }, function( dialogContentNode ) {
                    var objectPicker = $('.objectChooser',dialogContentNode)[0].component;
                    objectPicker.onDone( function( objectPicker ) {
                        var values = new Array();
                        var sel = objectPicker.getSelection();
                        for (var i = 0; i < sel.length; i++) {
                            values.push(sel[i].uri);
                        }
                        fieldAgent.setValuesAndCloseEditor( values );
                        dialog.close();
                    });
                    objectPicker.onCancel( function() {
                        dialog.close();
                        if (currentValues.length == 0) {
                            fieldAgent.cancelEditing();
                        }
                    });
                });
            }
        };
        function updateObjectField ( input ) {
            var uriInput = $(input).next('input')[0];
            if (input.value.toLowerCase() != uriInput.getAttribute('originalLabel').toLowerCase()) {
                uriInput.value = null;
            } else {
                input.value = uriInput.getAttribute('originalLabel');
                uriInput.value = uriInput.getAttribute('originalURI');
            }
        }
        jQuery(function($) {
            $('input.IObjectField.init').each( function() {
                var query = '(';
                var range = this.getAttribute('range').split(',');
                for (var i = 0; i < range.length; i++) {
                    range[i] = range[i].replace(/^\s*|\s*$/g,'');
                    if (range[i].length > 0) {
                        query += (i != 0? ' or ' : '') + 'isA ' + range[i];
                    }
                }
                query += ' and radar-internal:instanceLabel containsIgnoreCase %%)';
                var input = this;
                new Typeahead( input, query, function( input, selection ) {
                    var uriInput = $(input).next('input')[0];
                    uriInput.value = selection.uri;
                } );
            });
        });
    

function IURLField() {
    this.component = '{radar://components/iform}urlfield';
    this.buildControl = function( subject, property, type, range, canonicalValue, displayValue ) {
        var input = document.createElement('INPUT');
        $(input).addClass('IURLField');
        input.value = canonicalValue;
        return input;
    };
    this.getCanonicalValue = function( control ) {
        return control.value;
    };
};


            $(function(){
                function trunc(str, len) {
                    str = str ? ((str.length > len) ? str.substring(0, len).replace(/(\w+)$/, '...') : str) : '';
                    return $.trim(str);
                }
                var title;
                $('#paginateItem a.arrow').hover(
                    function(){ 
                        if ( this.title ) {
                            title = this.title;
                            this.title = '';
                            var $$ = $('<div class="page-title">'+ trunc(title, 55) +'</div>');
                            $('#paginateItem .page-stats').before($$);
                            $$.fadeIn('slow');
                            $('#paginateItem .page-stats').stop().css('opacity', 0);
                        }
                    }, function(){
                        if ( title ) {
                            this.title = title;
                            $('#paginateItem .page-title').remove();
                            $('#paginateItem .page-stats').animate({'opacity': 1}, 'slow');
                        }
                    }
                );
            });
            function updateCommentCount(by) {
                var currentCount = parseInt($('#stats .comments .count').html());
                if ( isNaN(currentCount) ) {
                    currentCount = 0;
                }
                currentCount = currentCount + by;
                if ( currentCount < 0 ) {
                    currentCount = 0;
                }
                if ( currentCount == 0 ) {
                    $('#stats .comments a').html('<span class="count"></span>Make a comment');
                } else if ( currentCount == 1 ) {
                    $('#stats .comments a').html('<span class="count">1</span> Comment');
                } else {
                    $('#stats .comments a').html('<span class="count">' + currentCount + '</span> Comments');
                }
            }
            function showCommentActions(comment, actions) {
                $('#comments .actions li').css('visibility', 'hidden');
                var actions_li = comment.find('.actions:first li');
                actions_li.hide();
                actions_li.filter(actions).css('visibility', 'visible');
                actions_li.filter(actions).show();
            }
            function hideCommentActions(comment, actions) {
                $('#comments .actions li').css('visibility', 'visible');
                var actions_li = comment.find('.actions:first li');
                actions_li.show();
                actions_li.filter(actions).hide();
            }
            function msieHeightFix(objects) {
                if ( jQuery.browser.msie ) { objects.css('height', '101%'); }
            }
            function msieHide(objects) {
                if ( jQuery.browser.msie ) { objects.hide(); }
            }
            function msieShow(objects) {
                if ( jQuery.browser.msie ) { objects.show(); }
            }
            function msieRedraw(objects) {
                if ( jQuery.browser.msie ) { objects.hide().show(); }
            }
            $(document).ready(function() {
                $('#comments .comment .actions .edit a').live('click', function() {
                    var comment = $(this).closest('.comment');
                    var comment_text = comment.find('blockquote:first div.formatted-content');
                    var comment_form = comment.find('form:first');
                    var comment_form_textarea = comment_form.find('textarea');
                    var comment_actions = comment.find('.actions:first');

                    comment_text.hide();
                    comment_form_textarea.show();
                    comment_form.show();
                    showCommentActions(comment, '.instructions, .cancel, .submit');
                    $('#comments .add-comment').css('visibility', 'hidden');

                    comment_form.attr('action', "http://www.twine.com/item-comment/update");
                    comment_form_textarea.focus();
                    comment_form_textarea.growfield();

                    comment_actions.find('.cancel a').click(function() {
                        comment_form.hide();
                        comment_form_textarea.val(comment_text.html());
                        comment_text.show();
                        hideCommentActions(comment, '.instructions, .cancel, .submit');
                        $('#comments .add-comment').css('visibility', 'visible');
                        return false;
                    });

                    comment_actions.find('.submit a').click(function() {
                        comment_form.ajaxSubmit({
                            success: function() {
                                comment_form.hide();
                                comment_text.html(comment_form_textarea.val());
                                comment_text.show();
                                hideCommentActions(comment, '.instructions, .cancel, .submit');
                                $('#comments .add-comment').css('visibility', 'visible');
                                if ( typeof(s_account) !== 'undefined' ) {
                                    var s=s_gi(s_account);
                                    s.linkTrackVars='events';
                                    s.linkTrackEvents='event2';
                                    s.events='event2';
                                    s.tl(true,'o','edit comment');
                                }
                                // window.location = window.location;
                            }
                        });
                        return false;
                    });

                    return false;
                });

                $('#comments .comment .actions .remove a').live('click', function() {
                    $(this).unbind('click');
                    var comment = $(this).closest('.comment');
                    var comment_form = comment.find('form:first');

                    comment_form.attr('action', "http://www.twine.com/item-comment/destroy");

                    comment_form.ajaxSubmit({
                        success: function() {
                            comment.find('blockquote:first').html('This comment has been removed.');
                            comment.find('blockquote:first').addClass('removed');
                            comment.find('.tail:first').addClass('tail-removed');
                            comment.find('.tail:first').removeClass('tail');
                            comment.children('cite, ul.thread').remove();
                            comment.children('.actions, ul.thread').remove();
                            updateCommentCount(-1);
                        }
                    });
                    return false;
                });

                $('#comments .comment .actions .reply a').live('click', function() {
                    var reply_a = $(this);
                    var group = $(this).closest('.group');
                    var thread = $(this).closest('.comment');
                    $.get("http://www.twine.com/item-comment/add", {
                        isPrivate : reply_a.attr('isPrivate'),
                        isInRegardToUri : reply_a.attr('isInRegardToUri'),
                        isInResponseToUri : reply_a.attr('isInResponseToUri')
                    }, function(data) {
                        var comment = $(data);
                        var comment_text = comment.find('blockquote div.formatted-content');
                        var comment_form = comment.find('form');
                        var comment_form_textarea = comment_form.find('textarea');
                        var comment_actions = comment.find('.actions:first');

                        comment.hide();
                        thread.append($('<ul class="thread"></ul>').append(comment));

                        comment_text.hide();
                        comment_form_textarea.show();
                        comment_form.show();
                        showCommentActions(comment, '.instructions, .cancel, .submit');
                        $('#comments .add-comment').css('visibility', 'hidden');

                        msieHide(group.nextAll('.group').find('.thread:first'));
                        comment.slideDown('normal', function() {
                            msieHeightFix(comment);
                            comment_form_textarea.focus();
                            msieShow(group.nextAll('.group').find('.thread:first'));
                        });

                        comment.addClass('new-reply');
                        comment_form.attr('action', "http://www.twine.com/item-comment/create");
                        comment_form_textarea.growfield();

                        comment_actions.find('.cancel a').click(function() {
                            comment.slideUp('normal', function() {
                                $('#comments .actions li, #comments .add-comment').css('visibility', 'visible');
                                msieRedraw(group.nextAll('.group').find('.thread:first'));
                            });
                            return false;
                        });

                        comment_actions.find('.submit a').click(function() {
                            var self = this;
                            comment_form.ajaxSubmit({
                                target: $('#comments .new-reply'),
                                beforeSubmit: function() {
                                    if($(self).hasClass('ui-action-submitting')) {
                                        return false;
                                    }
                                    $(self).addClass('ui-action-submitting');
                                },
                                success: function() {
                                    $('#comments .new-reply').removeClass('new-reply');
                                    $('#comments .actions li, #comments .add-comment').css('visibility', 'visible');
                                    updateCommentCount(+1);
                                    if ( typeof(s_account) !== 'undefined' ) {
                                        var s=s_gi(s_account);
                                        s.linkTrackVars='events';
                                        s.linkTrackEvents='event2';
                                        s.events='event2';
                                        s.tl(true,'o','reply to comment');
                                    }
                                    // window.location = window.location;
                                }
                            });
                            return false;
                        });
                    }, 'html');
                    return false;
                });

                $('#comments .group .add-comment').click(function() {
                    var add_comment = $(this);
                    var group = $(this).closest('.group');
                    var thread = group.find('.thread:first');
                    $.get("http://www.twine.com/item-comment/add", {
                        isFirst : add_comment.attr('isFirst'),
                        isPrivate : add_comment.attr('isPrivate'),
                        isInRegardToUri : add_comment.attr('isInRegardToUri'),
                        isInResponseToUri : add_comment.attr('isInResponseToUri')
                    }, function(data) {
                        var comment = $(data);
                        var comment_text = comment.find('blockquote div.formatted-content');
                        var comment_form = comment.find('form');
                        var comment_form_textarea = comment_form.find('textarea');
                        var comment_actions = comment.find('.actions');

                        comment.hide();
                        thread.append(comment);

                        comment_text.hide();
                        comment_form_textarea.show();
                        comment_form.show();
                        showCommentActions(comment, '.instructions, .cancel, .submit');
                        $('#comments .add-comment').css('visibility', 'hidden');

                        comment.addClass('new-comment');
                        comment_form.attr('action', "http://www.twine.com/item-comment/create");
                        comment_form_textarea.growfield();

                        if ( add_comment.attr('isFirst') ) {
                            comment_form_textarea.css('font-style', 'italic');
                            comment_form_textarea.val('Say Something!');
                        }

                        comment.find('form:first, .cancel:first a, .submit:first a').click(function() {
                            if ( $('#join').length > 0 ) {
                                $(this).unbind('click');
                                content.modalAjax('#redirectSignUp', {
                                    title: 'Become A Member',
                                    buttons: {
                                        'Join Twine': function() { $('form', this).trigger('submit'); }
                                    }
                                });
                                return false;
                            } else {
                                if ( comment_form_textarea.val() == 'Say Something!' ) {
                                    comment_form_textarea.val('');
                                    comment_form_textarea.css('font-style', 'normal');
                                }
                            }
                        });
                        msieHide(group.nextAll('.group').find('.thread:first'));
                        comment.slideDown('normal', function() {
                            msieHeightFix(comment);
                            if ( add_comment.attr('isFirst') ) {
                                add_comment.removeAttr('isFirst');
                            } else {
                                comment_form_textarea.focus();
                            }
                            msieShow(group.nextAll('.group').find('.thread:first'));
                        });

                        comment_actions.find('.cancel a').click(function() {
                            comment.slideUp('normal', function() {
                                comment.remove();
                                $('#comments .actions li, #comments .add-comment').css('visibility', 'visible');
                                msieRedraw(group.nextAll('.group').find('.thread:first'));
                            });
                            return false;
                        });

                        comment_actions.find('.submit a').click(function() {
                            var self = this;
                            comment_form.ajaxSubmit({
                                target: $('#comments .new-comment'),
                                beforeSubmit: function() {
                                    if($(self).hasClass('ui-action-submitting')) {
                                        return false;
                                    }
                                    $(self).addClass('ui-action-submitting');
                                },
                                success: function() {
                                    $('#comments .new-comment').removeClass('new-comment');
                                    $('#comments .actions li, #comments .add-comment').css('visibility', 'visible');
                                    updateCommentCount(+1);
                                    if ( typeof(s_account) !== 'undefined' ) {
                                        var s=s_gi(s_account);
                                        s.linkTrackVars='events';
                                        s.linkTrackEvents='event2';
                                        s.events='event2';
                                        s.tl(true,'o','add comment');
                                    }
                                    // window.location = window.location;
                                }
                            });
                            return false;
                        });
                    }, 'html');
                    return false;
                });

                if ($('#comments li.comment').length == 0) {
                    $('#public-comments .add-comment').attr('isFirst', true);
                    $('#public-comments .add-comment').trigger('click');
                }

                $('#comments .comment .actions .instructions').live('click', function() {
                    content.modal('#someHTML', {
                        title: 'Allowed HTML',
                        width: 400,
                        buttons: { 'OK': function() {
                            $(this).dialog('close');
                        }}
                    });
                    return false;
                });
            });

            function enableAddTagForm() {
                $('#add-tag').hide();
                $('#add-tag-fields').fadeIn('normal', function() {
                    $('#add-tag-fields input[name=value]').focus();
                });
            }

            function disableAddTagForm() {
                $('#add-tag-fields').fadeOut('normal', function() {
                    $('#add-tag').show();
                    $('#add-tag-form input[name=value]').val('');
                });
            }

            function embedMedia() {
                if ($('.media').length > 0) {
                    $.include('/js/lib/jquery.media.js', function() {
                        $.fn.media.defaults.mp3Player = '/js/lib/player.swf';
                        $.fn.media.defaults.flvPlayer = '/js/lib/player.swf';
                        $('.media').media({
                            width: 422,
                            height: 316
                        });
                        if ('.media-instructions') {
                            $('.media-instructions').hide();
                        }
                    });
                }
            }

            $(document).ready(function() {

                $('#add-tag').click(function() {
                    enableAddTagForm();
                    return false;
                });

                $('#add-tag-form').ajaxForm({
                    target: $('#community-tag-list'),
                    beforeSubmit: function() {
                        var field = $('#add-tag-form input[name=value]');
                        if (/^\s*$/.test(field.val())) {
                            disableAddTagForm();
                            return false;
                        }
                        return true;
                    },
                    success: function() {
                        disableAddTagForm();
                    }
                });

                $('a.remove-tag').live('click', function() {
                    var removeTag = $(this);
                    var previousTag = removeTag.closest('li').prev();
                    var nextTag = removeTag.closest('li').next();
                    $('#remove-tag-form input[name=value]').val(removeTag.attr('value'));
                    $('#remove-tag-form').ajaxSubmit({
                        success: function() {
                            removeTag.closest('li').fadeOut('normal', function() {
                                $(this).remove();
                                if ( previousTag && nextTag.length == 0) {
                                    previousTag.contents().filter(function() {
                                        return this.innerHTML == ',';
                                    }).remove();
                                }
                            });
                        }
                    });
                    return false;
                });

                $('#collect').click(function(){
                    var options = {
                         dataType: 'json',
                         success: function(data) {
                             content.info(data.message);
                         },
                         error: function() {
                             content.alert('An error has occured. Please try again or contact support.');
                         }
                    };
                    $('#collect-form').ajaxSubmit(options);
                 });

                embedMedia();

                $('#edit-item-label').click(function() {
                    $('#item-label').click();
                });
            });

        

        function ITextField( fieldAgent ) {
            this.fieldAgent = fieldAgent;
            this.component = '{radar://components/iform}textfield';
            this.buildControl = function( subject, property, type, range, canonicalValue, displayValue ) {
                var input = document.createElement('INPUT');
                $(input).addClass('ITextField');
                input.value = canonicalValue;
                $(input).keydown(function( event ) {
                    if ( event.keyCode == 13 ) {
                        fieldAgent.doneEditing();
                    }
                });
                return input;
            };
        }
        ;
    

        function IBooleanField() {
            this.component = '{radar://components/iform}booleanfield';
            this.buildControl = function( subject, property, type, range, canonicalValue, displayValue ) {
                var input = document.createElement('INPUT');
                $(input).addClass('IBooleanField');
                input.value = canonicalValue;
                return input;
            };
            this.getCanonicalValue = function( control ) {
                return control.value;
            };
        };
    

        function IPriceField( fieldAgent ) {
            this.fieldAgent = fieldAgent;
            this.component = '{radar://components/iform}pricefield';
            this.buildControl = function( subject, property, type, range, canonicalValue, displayValue ) {
                var input = document.createElement('INPUT');
                $(input).addClass('IPriceField');
                input.value = canonicalValue;
                $(input).keydown( function( event ) {
                    if (event.keyCode == 13) {
                        fieldAgent.doneEditing();
                    }
                });
                return input;
            };
        };
    
