function check_length(field, max) {
    var current = field.value.length
 var message = ''
 
    if (current >= max) {
     current = max
     message = "(<a href='/posts/blog?title="+field.value+"'>Want more space?</a>)"
        field.value = field.value.substring(0, max);
    }
 $('field_length').innerHTML = message + ' ' + (max - current)
}

function showHideCheckboxSelector(element, targetClazzStr) {
    if (element.checked) { 
        $$(targetClazzStr).each(function(obj, index) { obj.show(); }); 
    } 
    else {
        $$(targetClazzStr).each(function(obj, index) { obj.hide(); });
    }
}

function MultiSelector( list_target, max ){

    // Where to write the list
    this.list_target = list_target;
    // How many elements?
    this.count = 0;
    // How many elements?
    this.id = 0;
    // Is there a maximum?
    if( max ){
     this.max = max;
    } else {
     this.max = -1;
    }

    this.addElement = function( element ) {
        // Make sure it's a file input element
        if( element.tagName == 'INPUT' && element.type == 'file' ) {
            // Element name -- what number am I?
            element.name = 'asset[' + this.id++ + '][uploaded_data]';

            // Add reference to this object
            element.multi_selector = this;

            // What to do when a file is selected
            element.onchange = function() {

                // New file input
                var new_element = document.createElement( 'input' );
                new_element.type = 'file';

                // Add new element
                this.parentNode.insertBefore( new_element, this );

                // Apply 'update' to element
                this.multi_selector.addElement( new_element );

                // Update list
                this.multi_selector.addListRow( this );

                // Hide this: we can't use display:none because Safari doesn't like it
                this.style.position = 'absolute';
                this.style.left = '-1000px';
            };
            // If we've reached maximum number, disable input element
            if( this.max != -1 && this.count >= this.max ){
                element.disabled = true;
                $('upload_field').hide();
                $('max_reached').show();
            };

            // File element counter
            this.count++;
            // Most recent element
            this.current_element = element;

        } else {
            // This can only be applied to file input elements!
            alert( 'Error: not a file input element' );
        };
    }

    this.addListRow = function( element ) {
        // Row div
        var new_row = document.createElement( 'p' );

        // Delete button
        var new_row_button = document.createElement( 'input' );
        new_row_button.className = 'submit_button'
        new_row_button.type = 'button';
        new_row_button.value = 'Delete';

        // References
        new_row.element = element;

        // Delete function
        new_row_button.onclick= function() {
            // Remove element from form
            this.parentNode.element.parentNode.removeChild( this.parentNode.element );

            // Remove this row from the list
            this.parentNode.parentNode.removeChild( this.parentNode );

            // Decrement counter
            this.parentNode.element.multi_selector.count--;

            // Re-enable input element (if it's disabled)
            this.parentNode.element.multi_selector.current_element.disabled = false;

            // Appease Safari
            //    without it Safari wants to reload the browser window
            //    which nixes your already queued uploads
            return false;
        };

        // Set row value
        var strAry = element.value.split('/');
        new_row.innerHTML = strAry[strAry.length - 1];

        // Add button
        new_row.appendChild( new_row_button );

        // Add it to the list
        this.list_target.appendChild( new_row );

    };
}

function validateNotEmpty() {
  if ($('post_title').value.strip().length == 0) {
    $('post_title_error_border').addClassName('fieldWithErrors');
    $('post_title_error_msg').show();
      return false;
  } else {
      return true;
  }
}

var Reminder = {
    dueSelected: function(e) {
        if(e.value == 'specific_time') {
            e.up("form").down("div.due_datetime").removeClassName('hide');
            e.up("form").down("div.remind span.reminder_time").removeClassName('hide');  
        } else {
            e.up("form").down("div.due_datetime").addClassName('hide');
            e.up("form").down("div.remind span.reminder_time").addClassName('hide');
        }
    },
    
    remindToggled: function(e) {
        e.next('span').down('select').disabled = !e.checked;

    }
}

var Todo = {
    showActions: function(e) {
        e.down('span.editDelete').removeClassName('hide');
    },
    
    hideActions: function(e) {
        e.down('span.editDelete').addClassName('hide');
    },
    
    toggleAgendaTodo: function(e) {
        if(e.checked) {
            e.up('h4').addClassName('completed');
        } else {
            e.up('h4').removeClassName('completed');
        }
    },
    
    toggleTodo: function(e) {
        if(e.checked) {
            e.next('span').addClassName('completed');
        } else {
            e.next('span').removeClassName('completed');
        }
    }
}

var DiaryEvent = {
    toggleAddPhoto: function(e) {
        e.up('div.add_media_links').next('div.add_photo').toggleClassName('hide');
    },
    
    toggleAddVideo: function(e) {
        e.up('div.add_media_links').next('div.add_video').toggleClassName('hide');
    },
    
    toggleAddLink: function(e) {
        e.up('div.add_media_links').next('div.add_link').toggleClassName('hide');
    },
    
    inviteLozengeToggle: function(e) {
        e.down('input').checked = !e.down('input').checked;
    },
    
    inviteLozengeToggleHack: function(e) {
        e.checked = !e.checked;
    },
    
    selectAllInvites:function(e) {
        $$('div.invite_friend_item input').each(function(input) {
           input.checked = true; 
        });
    },
    
    deselectAllInvites:function(e) {
        $$('div.invite_friend_item input').each(function(input) {
           input.checked = false; 
        });
    },
    
    switchEventType:function(e) {
        h1Tags = new Array();
        h1Tags['single_event'] = 'New Event';
        h1Tags['birthday'] = 'Add a Birthday';
        h1Tags['anniversary'] = 'Add an Anniversary';
        ['single_event', 'birthday', 'anniversary'].each(function(form) {
            if(e.value != form) {
                $$('form.js_add_' + form)[0].addClassName('hide');
            }
        });
        
        $$('form.js_add_' + e.value)[0].removeClassName('hide');
        $('newForms').down('h1').innerHTML = h1Tags[e.value];
               
        ['single_event', 'birthday', 'anniversary'].each(function(cn) {
            $('newForms').removeClassName(cn);
        });
        $('newForms').addClassName(e.value);
        
        if(e.value == 'single_event' && $('event_title').value.blank())
            $('event_title').focus();
    },
    
    progressivelyToggleEndsDateTime:function() {
        ele = $('ends_option');
        if(ele) {
            ele.observe('change', function(e) {
                if(e.element().checked) {
                    $$('div.event_time_ends')[0].appear({ duration: 0.5 });
                } else if(!e.element().checked) {
                    $$('div.event_time_ends')[0].fade({ duration: 0.5 });
                }
            });
        }
    },

    progressivelyToggleAllday:function() {
        ele = $('allday_option');
        if(ele) {
            ele.observe('change', function(e) {
                DiaryEvent.toggleAllday();
            });
        }
    },
    
    toggleAllday:function() {
        e = $('allday_option');
        if(e) {
            if(e.checked) {
                $$('.event_time_of_day').each(function(e2) {
                    e2.hide();
                });
            } else if(!e.checked) {
                $$('.event_time_of_day').each(function(e3) {
                    e3.show();
                });
            }
        }
    },
    
    switchOnAdditional:function(str) {
        ele = 'attach_' + str
        if($(ele)) {
            $(ele).observe('click', function(e) {
                ele = $$('div.' + str)[0];
                ele.appear({ duration: 0.5 });
            });
        }
    },
    
    toggleReminderForm:function(e, tag) {
        if(e.checked) {
            $$('span.' + tag)[0].removeClassName('hide');
        } else if(!e.checked) {
            $$('span.' + tag)[0].addClassName('hide');
        }
    },
    
    toggleReminderFormOnShow:function(e) {
        $('reminder_form').toggleClassName('hide');
    },

    validateDateTime:function(eleId) {
        var maps = new Array(); maps['day'] = 'dd'; maps['month'] = 'mm'; maps['year'] = 'yyyy';
        ['day', 'month', 'year'].each(function(field) {
            ele = $(eleId + '_' + field);
            if(ele) {
                ele.observe('focus', function(e) {
                    if(this.value == maps[field]) {
                        this.value = '';
                    }
                });
                ele.observe('blur', function(e) {
                    if(this.value == '') {
                        this.value = maps[field];
                    }
                    // DiaryEvent.toggleAllday();
                });
            }
        });
    },
    
    progressivelyShowAttach:function() {
        ele = $$('input#event_title')[0]
        if(ele) {
            if(ele.value.strip().length > 0)
                ele.next('div.attach').show();
            ele.observe('focus', function(e) {
                if(this.value.length > 0) {
                    attach = this.next('div.attach');
                    attach.appear({ duration: 0.5 });
                }
            });
            ele.observe('keyup', function(e) {
                if(this.value.length > 0) {
                    attach = this.next('div.attach');
                    attach.appear({ duration: 0.5 });
                }
            });
            ele.observe('blur', function(e) {
                this.value = this.value.strip();
            });
        }
    },
    
    formFocusAreaHightlight:function() {
        focusAreas = $$('.focusPointArea');
        focusAreas.each(function(ele) {
            ele.select('input, select, a, textarea').each(function(e1) {
                e1.observe('focus', function(e2) {
                    e2.element().up('.focusPointArea').addClassName('formFocus');
                });
                e1.observe('blur', function(e2) {
                    e2.element().up('.focusPointArea').removeClassName('formFocus');
                });
            });
        });
    },
    
    updateSeparateDateFields:function(eleId) {
        date = new Date(Date.parse($(eleId).value));
        target_prefix = eleId.match(/.+\[(.+)\]/)[1] + '_';
        $(target_prefix + 'day').value = date.getDate();
        $(target_prefix + 'month').value = date.getMonth() + 1;
        $(target_prefix + 'year').value = date.getFullYear();
        DiaryEvent.toggleAllday();
        DiaryEvent.populateEndDateWithStartDate();
    },
    
    populateEndDateWithStartDate:function() {
        starts_day_field = 'event_starts_day'; starts_month_field = 'event_starts_month';
        ends_day_field = 'event_ends_day'; ends_month_field = 'event_ends_month';
        if($(ends_day_field) && $(ends_month_field) && $(ends_day_field).value == 'dd' && $(ends_month_field).value == 'mm') {
            $(ends_day_field).value = $(starts_day_field).value;
            $(ends_month_field).value = $(starts_month_field).value;
        }
            
    },
    
    togglePrivacyLbl:function() {
        if($('event_privacy')) {
            $('event_privacy').observe('change',function(event) {
                ele = event.element();
                if(ele.checked == true) {
                    ele.up('.focusPointArea').addClassName('privateEvent');
                    ele.up('.focusPointArea').removeClassName('publicEvent');
                } else {
                    ele.up('.focusPointArea').removeClassName('privateEvent');
                    ele.up('.focusPointArea').addClassName('publicEvent');
                }
            });
        }
    }
}

var Profile = {
    toggleSection: function(section) {
        if($(section + '_link')) {
            $(section + '_link').observe('click', function(event) {
                $$('div.secondary_navigation_tabs li a').each(function(ele) {
                   ele.removeClassName('selectedSetting'); 
                });
                event.element().addClassName('selectedSetting');

                $$('div.settings_box').each(function(ele) {
                    ele.addClassName('hide');
                });
                $(event.element().readAttribute('id').match(/(.*)_link/)[1] + '_section').removeClassName('hide');
            });
        }
    }
}

var Calendar = {
    calendarCellClicked:function(event, link) {
        if (event.target.nodeName == 'A') {
            return;
        } else {
            window.location = link;
        }
    },
    
    calendarCellEntryClicked:function(event, eventId) {
        $('cal_summary_popup_event_' + eventId).show();
    },
    
    closePopup:function(eventId) {
        $('cal_summary_popup_event_' + eventId).hide();
    },
    
    calendarCellHover:function(event, cell) {
        if (event.target.nodeName == 'A') {
            cell.title = 'View event';
        } else {
            cell.title = 'Click to create new event';
        }
    }
}

var Home = {
    flipToSignupForm: function() {
        container = $$('div.login')[0];
        container.removeClassName('login');
        container.addClassName('signup');
        $('user_email').focus();
    },
    
    flipToLoginForm: function() {
        container = $$('div.signup')[0];
        container.removeClassName('signup');
        container.addClassName('login');
        $('login').focus();
    },
    
    preventSignupMultiDoubleSubmit: function() {
        ele = $('new_user');
        if(ele) {
            ele.observe('submit', function(event) {
                button = event.element().down('.signup_btn');
                button.value = 'Signing up...';
                button.disabled = true;
            });
        }
    }
}

var Utils = {
    toggleDefaultLabel: function(cssSelector, label) {
        ary = $$(cssSelector);
        if(ary.size() > 0) {
            ele = ary[0];
            if(ele.value.blank()) {
                ele.up().addClassName('defaultValue');
                ele.value = label;
            }
            ele.observe('focus', function(event) {
                if(event.element().value == label) {
                    event.element().up().removeClassName('defaultValue');
                    event.element().value = '';
                }
            });
            ele.observe('blur', function(event) {
                if(event.element().value.blank()) {
                    event.element().up().addClassName('defaultValue');
                    event.element().value = label;
                }
            });
        }
    },
    
    focusFormElement: function(cssSelector) {
        ary = $$(cssSelector);
        if(ary.size() > 0) {
            ele = ary[0];
            ele.focus();
        }
    },
    
    isIE6:function() {
        return typeof(document.body.style.maxHeight) != "undefined";
    }
}

var DiaryFacebook = {
    determineConnectState:function() {
        ensure_init(function() {
            if($('facebookConnectRHC')) {
                if($('facebookConnectRHC').hasClassName('hasServerSession')) {
                    FB.Connect.get_status().waitUntilReady(function(status) {
                        switch(status) {
                        case FB.ConnectState.connected:
                            // alert('FBConnect: Connected');
                            DiaryFacebook.showConnectedState();
                            break;
                        case FB.ConnectState.appNotAuthorized:
                            // alert('FBConnect: App not authorized');
                            break;
                        case FB.ConnectState.userNotLoggedIn:
                            // alert('FBConnect: User not logged in');
                            break;
                        }
                    });
                }
            }
        });
    },
    
    showConnectedState:function() {
        $$('#facebookConnectRHC .facebookNotConnected').each(function(ele) {
            ele.hide();
        });
        $$('#facebookConnectRHC .facebookConnected').each(function(ele) {
            ele.show();
        });
        // For loading the facebook avatar
        //FB.Facebook.apiClient.users_getInfo(FB.Connect.get_loggedInUser(), ['pic_square_with_logo'], function(obj, e) {
            //DiaryFacebook.showConnectedAvatar(obj[0]['pic_square_with_logo']);
        //});
    },
    
    showConnectedAvatar:function(picUrl) {
        if($('connectedFirst')) {
            $('connectedFirst').insert({
                top: new Element('img', { src: picUrl }) 
            });
        }
    },
    
    first_time_wizard:function() {
        if($('firstTimeWizard')) {
            if($('firstTimeWizard').hasClassName('loadFirstTime')) {
                $('firstTimeWizard').show();
                new Ajax.Request('/events/facebook_first_time_wizard');
            }
        }
    },
    
    beforeLoadEvents:function() {
        if($('wizardFacebookEvents'))
            $('wizardFacebookEvents').show();
        if($('wizardFacebookBirthdays'))
            $('wizardFacebookBirthdays').hide();
        $('fbImportLoader').show();
        $('loadEventsLk').addClassName('activeEventImport');
        $('loadBirthdaysLk').removeClassName('activeEventImport');
        $$('.fbSelectBirthdays').each(function(ele) { ele.hide() } );
        $$('.fbSelectEvents').each(function(ele) { ele.show() } );
    },
    
    beforeLoadBirthdays:function() {
        if($('wizardFacebookEvents'))
            $('wizardFacebookEvents').hide();
        if($('wizardFacebookBirthdays'))
            $('wizardFacebookBirthdays').show();
        $('fbImportLoader').show();
        $('loadEventsLk').removeClassName('activeEventImport');
        $('loadBirthdaysLk').addClassName('activeEventImport');
        $$('.fbSelectBirthdays').each(function(ele) { ele.show() } );
        $$('.fbSelectEvents').each(function(ele) { ele.hide() } );
    },
    
    successfulLoad:function() {
        $('fbImportLoader').hide();
    },
    
    conditionLoadEvents:function() {     
        DiaryFacebook.beforeLoadEvents();
        if($('wizardFacebookEvents'))
            return false;
        return true;
    },
    
    conditionLoadBirthdaysRHC:function() {
        if($('wizardFacebookBirthdays'))
            return false;
        $('firstTimeWizard').show();
        return true;
    },
    
    conditionLoadEventsRHC:function() {     
        if($('wizardFacebookEvents'))
            return false;
        $('firstTimeWizard').show();
        return true;
    },
    
    conditionLoadBirthdays:function() {
        DiaryFacebook.beforeLoadBirthdays();
        if($('wizardFacebookBirthdays'))
            return false;
        return true;
    },
    
    closeWidget:function() {
        $('firstTimeWizard').hide();
        $('firstTimeWizard').innerHTML = '';
    },
    
    multiSelect:function(sel, type) {
        $$('#wizardFacebook' + type + ' input').each(function(ele) {
            if(ele.type == 'checkbox' && ele.hasClassName('multiSelectCheckable')) {
                if(sel == 'all') {
                    ele.checked = true;
                } else {
                    ele.checked = false;
                }
            }
        });
    },
    
    proceedToRequestFurtherPerms:function(section) {
        $('wizardFacebook' + section).hide();
        $('fbSuccessPrompt').show();
        $('fbImpWizNav').hide();
    },
    
    requestFurtherPerms:function(allowedPerms, goTo) {
        if(goTo == null)
            goTo = '';
        ensure_init(function() {
            session = FB.Facebook.apiClient.get_session();
            if(allowedPerms.blank()) {
                url = '/facebook/connect/' + session.uid + '?session_key=' + session.session_key + '&expires=' + session.expires + '&to_action=' + 'request_further_perms' + '&goto=' + goTo
                new Ajax.Request(url);
            } else {
                FB.Connect.showPermissionDialog(allowedPerms, function(perms) {
                    url = '/facebook/connect/' + session.uid + '?session_key=' + session.session_key + '&expires=' + session.expires + '&to_action=' + 'request_further_perms' + '&perms=' + perms + '&goto=' + goTo
                    new Ajax.Request(url);
                });
            }
        });
    },
    
    requestFurtherPermsCompleted:function() {
        $('firstTimeWizard').hide();
    }, 
    
    toggleImportForm:function() {
        if($('fbEventFormTab')) {
            $('fbEventFormTab').observe('click', function(event) {
                $('fbEventForm').show();
                $('fbBirthdayForm').hide();
                Event.stop(event);
            });
        }
        if($('fbBirthdayFormTab')) {
            $('fbBirthdayFormTab').observe('click', function(event) {
                $('fbBirthdayForm').show();
                $('fbEventForm').hide();
                Event.stop(event);
            });
        }
    },
    
    multiSelectUpcomingAgenda:function(sel, type) {
        $$('#fb' + type + 'Form input').each(function(ele) {
            if(ele.type == 'checkbox' && ele.hasClassName('multiSelectCheckable')) {
                if(sel == 'all') {
                    ele.checked = true;
                } else {
                    ele.checked = false;
                }
            }
        });
    }
}

var DiaryHomepage = {
    
    authLabels:function(parentId, emailDefaultLbl) {
        if(typeof(emailDefaultLbl) == 'undefined') {
            var emailDefaultLbl = 'Email';
        }
        if($(parentId)) {
            $(parentId).down('.emailField').observe('focus', function(e) {
                if(e.element().value == emailDefaultLbl) {
                    e.element().value = '';
                }
            });
            $(parentId).down('.emailField').observe('blur', function(e) {
                if(e.element().value.blank()) {
                    e.element().value = emailDefaultLbl;
                }
            });
            
            $(parentId).down('.passwordPlaceholderField').observe('focus', function(e) {
                e.element().hide();
                $(parentId).down('.passwordField').show();
                $(parentId).down('.passwordField').focus();
            });
            $(parentId).down('.passwordField').observe('blur', function(e) {
                if(e.element().value.blank()) { 
                    e.element().hide();
                    $(parentId).down('.passwordPlaceholderField').show();
                }
            });
        }
    },
    
    screenCast:function() {
        if($('screenCastVideoPlaceholder')) {
            $('screenCastVideoPlaceholder').observe('click', function(event) {
                if($('screenCastVideo')) {
                    $('screenCastVideoPlaceholder').hide();
                    $('screenCastVideo').show();
                }
            });
        }
    }
}

document.observe("dom:loaded", function() {
    // Default labels config
    default_labels = {};
    default_labels['event_invite'] = "Separate multiple addresses with a comma";
    default_labels['platform_invite'] = "Separate multiple addresses with a comma";
    
    // Homepage
    DiaryHomepage.authLabels('miniLogin');
    DiaryHomepage.authLabels('signupForm', 'Enter email');
    DiaryHomepage.screenCast();
    
    Home.preventSignupMultiDoubleSubmit();
    
    // Invite friends
    Utils.toggleDefaultLabel('input#invitation_email', default_labels['platform_invite']);
    
    // Profile / edit profile
    ['general', 'picture', 'customize', 'delete_account', 'timezone', 'change_email', 'change_password'].each(function(section) {
        Profile.toggleSection(section);
    });
    
    // Event create form
    Utils.toggleDefaultLabel('input#birthday_title', "e.g. John");
    Utils.toggleDefaultLabel('input#anniversary_title', "e.g. Wedding");
    Utils.toggleDefaultLabel('input#friends_to', "Type the name of a diary friend or an email address");
    DiaryEvent.switchOnAdditional('note');
    DiaryEvent.switchOnAdditional('link');
    DiaryEvent.switchOnAdditional('photo');
    DiaryEvent.progressivelyShowAttach();
    DiaryEvent.formFocusAreaHightlight();
    DiaryEvent.validateDateTime('event_starts');
    DiaryEvent.validateDateTime('event_ends');
    DiaryEvent.validateDateTime('anniversary_date');
    DiaryEvent.validateDateTime('birthday_date');
    DiaryEvent.progressivelyToggleEndsDateTime();
    DiaryEvent.progressivelyToggleAllday();
    Utils.focusFormElement('input#event_title');
    
    // Event invite form
    Utils.toggleDefaultLabel('textarea#invitation_emails', default_labels['event_invite']);
    DiaryFacebook.determineConnectState();
    DiaryFacebook.first_time_wizard();
    DiaryFacebook.toggleImportForm();
    DiaryEvent.togglePrivacyLbl();
});