document.addEvent('domready', function () {
    /* this mapping is for the form:
     * $$(selector).each(function (ele) { new Object(ele, [params, ...]); } */
    var object_mapping = [
        /* agree buttons */
        { selector: 'a.agree', type: AgreeButton },

        /* follow buttons */
        //{ selector: '.follow_button', type: FollowButton },
        { selector: '.show_on_hover', type: ShowOnHover },

        /* collapsible menus */
        { selector: '.listmenu', type: ListMenu },
        { selector: '.accordionmenu', type: AccordionMenu },

        /* modal links */
        { selector: '.modal_reg', type: RegisterButton },
        { selector: '.signin_button', type: SigninButton },
        { selector: '.conversation_modal', type: ConversationButton },
        { selector: '.reply_modal', type: ReplyModal },
        { selector: '.edit_modal', type: EditModal },
        { selector: '.register_modal', type: RegisterModal },
        { selector: '.new_modal', type: NewModal },
        { selector: '.info_modal', type: InfoModal },
        { selector: '.share_modal', type: ShareModal },
        { selector: '.email_modal', type: EmailModal },
        { selector: '.video_modal', type: VideoModal },

        /* external links */
        { selector: '.external_link', type: ExternalOpener },

        { selector: '.newsfeed', type: NewsFeed },
        { selector: '.help', type: Help },
        { selector: '.event_keyword_input', type: KeywordSelect },
        { selector: '.calendar', type: Calendar },
        { selector: '.politician_selector', type: PoliticianSelector },
        { selector: '.poll_add_option', type: PollOptionForm },
        { selector: '.office_selecto', type: OfficeSelector },
        /*{ selector: '.lazy_load', type: LazyLoad },*/
        { selector: '.ajax_request', type: AjaxRequest },
        { selector: '.show_hide', type: ShowHide },
        { selector: '.inline_toggle', type: InlineToggle },
        { selector: '.toc',type: TOC },
        { selector: '.message_toggle', type: MessageToggle },
        { selector: '.bill_form', type: BillForm },
        { selector: '.remove_from_client', type: Remove },
        { selector: '.poll_submit', type: PollSubmit },
        { selector: '.open_gotv', type: GotvWindow },
        { selector: '.public_record_filter', type: PublicRecordFilter },
        { selector: '.generic_filter', type: GenericFilter },
        { selector: '.connection_filter', type: ConnectionFilter },
        { selector: '.menu_filter', type: MenuFilter },
        { selector: '.canvas_map', type: ClusterGoogleMap },
        { selector: '.message_selector', type: MessageSelector },
        { selector: '.conversation_selected', type: Selected },
        { selector: '.state_selector', type: StateSelector },
        { selector: '.issue_selector', type: IssueSelector },
        { selector: '.politician_list_group_select', type: PoliticianGroupSelector },
        { selector: '.feed_filter', type: GroupFilter },
        { selector: '.ajax_checkbox', type: AjaxCheckbox },
        { selector: '.privacy_checkbox', type: PrivacyCheckbox },
        { selector: '.feed_close_js', type: FeedClose },
        { selector: '.debate_js', type: Debate },
        
        // enables all fields of a form before submitting
        { selector: '.enable_form', type: EnableForm },

        /* Issue tabs */
        { selector: '#nav_links', type: Tabs },
        { selector: '.nav_links', type: Tabs },

        { selector: '#vertical_nav_links', type: VerticalTabs },

        { selector: '.static_random', type: OptionRandomizer },

        /* canvas charts */
        { selector: 'table.canvas_chart', type: ChartTableWrapper },

        /* feedback tab */
        { selector: '#feedback', type: FeedbackForm },

        /* random poll submit */
        { selector: 'form.random_poll', type: RandomPoll },

        /* generic ajax form */
        { selector: 'form.ajax_form', type: AjaxForm },
        { selector: '.decline_link', type: DeclineLink },
        { selector: '.city_sms_form', type: CitySmsForm },
        { selector: '.use_facebook', type: FacebookComment },
        
        { selector: '.phone_verify_link', type: PhoneVerifyModal },
        { selector: '.settings_menu', type: SettingsMenu },

        { selector: '#nav_links.update_ahash', type: AHashUpdate },
        { selector: '#gov_plus', type: PlusLink },
        { selector: '#groups_plus', type: PlusLink }
    ]
    Map.ResolveObjects(object_mapping);

    /* special case tabs that need a callback set */
    
    
    
    /* pager */
    $$('.pagedTable').each(function (p) { new Pager(p.getProperty('id')) });
    /* slant controls */
    $$('.slant_rating').each(function (ele) { new Slant(ele, ele.getChildren()[1].value) });
    /* quality config */
    $$('.star_rating').each(function (ele) { new StarRater(ele, false) });

    /* filters */
    $$('.filteroption').each(function (ele) {
	// yuck yuck stupid ie , the checkboxes don't recognize the
        // onchange event so we have to tie in the onclick just for them
        var action = function () {
            var hash = location.hash ? location.hash : window.location.hash;
            if (!hash) // default if no hash listed
                hash = 'summary';
            hash = hash.replace('#', '');
            var myRequest = new Request({
                url: this.getParents('form').getProperty('action')
            });
            myRequest.onSuccess = function(a,b){
               window.location = a + "#" + hash;
            };
            var val;
            if (this.get('type') == "checkbox"){
                val = this.get('checked');
            }
            else {
                val = this.get('value');
            }
            myRequest.send(this.get('name') + "=" + val);
        }

        if (ele.get('type') == "checkbox")
            ele.addEvent('click', action.bind(ele));
        else
           ele.addEvent('change', action.bind(ele));
    });

    $$('form.refer').each(function (f) { new ReferContactForm('input.contact_entry', 'email_list', 'a.check_all', 'a.uncheck_all'); });

    $$('.plus_4_link').each(function (a) {
        a.addEvent('click', function () {
            window.location = a.get('rel');
        });
    });

    if ($('openid_identifier')) {
        new OpenIdSelector('openid_identifier');
    }

    $$('form.poll').each(function (a) {
        new PollForm(a, 'poll_display');
    });

    /* set up form validators */
    $$('form.validate_inline').each(function (f) {
        new Form.Validator.Inline(f, {
            warningPrefix: '',
            errorPrefix: '',
            scrollToErrorsOnSubmit: false
        });
    });
    $$('form.validate_poll').each(function (f) {
        new Form.Validator(f, {
            warningPrefix: '',
            errorPrefix: '',
            onElementFail: function () {
                if ($('poll_validation_error')) {
                    $('poll_validation_error').set('text', 'You must select a response');
                }
            },
            onElementPass: function () {
                if ($('poll_validation_error')) {
                    $('poll_validation_error').set('text', '');
                }
            }
        });
    });
    
    /* text label input */
    $$('input.textlabel').each(function (i) {
    	new OverText(i, {
    		positionOptions: {
    			relativeTo: i,
    			position: {
    				x: 'left',
    				y: 'top'
    			},
    			offset: {
    				x: 5,
    				y: 5
    			},
    			wrap: true
    		}
    	});
    });

    $$('.countdown').each(function(c){
        var ele = $(c);
        var start = ele.getProperty('start');
        
        var fx = function(){
            start--;
            if(parseInt(start)>0){
               var min = parseInt(start/60);
               var sec = '' + start%60;
               sec = sec.length >1 ? sec : "0"+sec;
               ele.setProperty('html','('+ min+ ':'+ sec+ ' remaining)');
               window.setTimeout(fx,1000); 
            }   
            else{
                var rel = ele.getProperty('rel');
                if(rel)
                    $(rel).setStyle('display','none');
                ele.setStyle('display','none');
            }
        };
        window.setTimeout(fx,1000);
    });
    
    if (window.mobile_app) {
        var user = new User();
        if (user.isAuthenticated()) {
            window.mobile_app.saveUserId(user.getId());
        }
    }
});

window.onload = function(){
    var object_mapping = [
        /* agree buttons */
        { selector: '.lazy_load', type: LazyLoad }
    ];
    Map.ResolveObjects(object_mapping);
    
}
    

/*
if (document.attachEvent) {
   document.attachEvent('onreadystatechange', function () {
        $$('.pie_graph').each(function (i) {new CanvasPieChart(i)});
    });
}
else {
    document.addEvent('domready', function () {
        $$('.pie_graph').each(function (i) {new CanvasPieChart(i)});
    });
}
*/
