/**
 * ajaxUpdate does an ajaxCall to update the target (UI) using the controller 
 * url by passing in the data to the controller.  To use it, for example, 
 * if you want to update the profile page
 * 
 * @param url the controller URL to be called
 * @param data the data to be sent to the server
 * @param target the target UI to update
 * @param progress_spinner the progress spinner to show while the request is in progress
 */
function ajaxCall(url, data, callback) {
    $.ajax({
        type: 'POST',
        url: url,
        data: data,
        success: callback,
        dataType: 'html'
    });
}

function ajaxUpdate(url, data, target, progress_spinner) {
    if (progress_spinner){
        show_spinner(target);
    }
    ajaxCall(url,data, updateTargetCallback(target));
}

function _ajaxChange(url, data, target, progress_spinner, action){
    if (progress_spinner){
        show_spinner(target);
    }
    ajaxCall(url,data, changeTargetCallback(target, action));
}

//
// Returns true or false depending on if the form is valid
//
// Ensures watermarks are off
//
function validate_form(form_param) {
    try{
        hide_child_watermarks(form_param);
    } catch( err){
    }
        var validated = form_param.validate({ });
        var valid = validated.form();
    try{
        show_child_watermarks(form_param);
    } catch( err2){
    }

    return valid;
}

function submit_if_valid(ui, disable_as_well) {
    var form = $(ui).closest('form');
    if (validate_form(form)){
        if (disable_as_well){
            disable_ui(ui);
        }
        hide_child_watermarks(form);
        form.submit();
        show_child_watermarks(form);
    }
}

function submit_and_disable_if_valid(ui) {
    submit_if_valid(ui, true);
}

//
// Ajax call to save a need
//
function locationLookup(loc, resultsDiv, targetDiv) {
    var url = '/silk/ajax_location';

    var data = {'location' : loc,
		'targetDiv': targetDiv
	    };

    function showLocations(data, textStatus, xmlHttpRequest) {
        $(resultsDiv).html(data);
    }


    $.ajax({
        type: 'POST',
        url: url,
        data: data,
        success: showLocations,
        dataType: 'html'
    });

    return false;
}

function showPopupWithContent(content) {
    var dialog = $('#ajaxDialog');
    dialog.html(content);
    dialog.dialog('open');
}

function showPopupFromElement(selector, params) {
    var dialog = $('#ajaxDialog');

    // Move the content from somewhere on the page to
    // the dialog
    var target = $(selector);
    var parent = target.parent();

    // Move the content back once the dialog is closed
    function on_close(event, ui){
        target.appendTo(parent);
    }
    if (params){
        dialog.dialog(params);
    }
    dialog.dialog({close:on_close});

    // clear the dialog and move the content into it
    dialog.html('');
    target.appendTo(dialog);
    dialog.dialog('open');
}
function showPopup(url, data) {
    var dialog = $('#ajaxDialog');
    //dialog.html('<img src="/res/img/loading_round.gif"/>');
    dialog.html('');

    function fill_dialog(data, textStatus, xmlHttpRequest){
        dialog.html(data);
    }

    $.ajax({
        type: 'POST',
        url: url,
        data: data,
        success: fill_dialog,
        dataType: 'html'
    });
 
    dialog.dialog('open');
}

function changeTargetCallback(target, action) {
    function fill_target(data, textStatus, xmlHttpRequest){
        $(target)[action](data);
        apply_ui_extensions(target);
    }
    return fill_target;
}
function updateTargetCallback(target) {
    function fill_target(data, textStatus, xmlHttpRequest){
        $(target).html(data);
        apply_ui_extensions(target);
    }
    return fill_target;
}
function replaceTargetCallback(target) {
    function fill_target(data, textStatus, xmlHttpRequest){
        data = $(data);
        //$(target).replaceWith(data);
        $(target).replaceWith(data);
        apply_ui_extensions(data);
    }
    return fill_target;
}

function updateTargetCallbackOnParent(target, thisdiv) {
    function fill_target(data, textStatus, xmlHttpRequest){
        // raise the updateTarget event on first parent - do this first since thisdiv is likely to be inside target
        update_target = $(thisdiv).parents("div.updateTarget");
        if (update_target.length > 0) {
            update_target.trigger('updateTarget');
        } else {
            $(target).html(data);
        }
    }
    return fill_target;
}

function ajaxAppend(url, data, target, progress_spinner) {
    _ajaxChange(url, data, target, progress_spinner, 'append');
}

function ajaxReplace(url, data, target, progress_spinner) {
    if (progress_spinner){
        show_spinner(target);
    }
    ajaxCall(url,data, replaceTargetCallback(target));
}

/**
 * 
 */
function serialize_items(form) {
    var wrapped_form = $(form);

    hide_child_watermarks(wrapped_form);
    var data = form.find(':input').serialize();
    show_child_watermarks(wrapped_form);

    return data;
}

/**
 * 
 */
function serialize_form(form) {
    var wrapped_form = $(form);

    hide_child_watermarks(wrapped_form);
    var data = wrapped_form.serialize();
    show_child_watermarks(wrapped_form);

    return data;
}

function ajaxSave(form, url, callback, extras){
    wrapped_form = $(form);

    if (!validate_form(wrapped_form)){
        return false;
    }
	
    // Hide watermarks and fetch form data (avoids the watermarks appearing in the search results)
    var data = serialize_form(wrapped_form);

    if ( extras ){
        data += '&' + extras;
    }

    $.ajax({
        type: 'POST',
        url: url,
        data: data,
        success: callback,
        dataType: 'html'
    });

    return true;
}

function closePopup() {
    $("#ajaxDialog").dialog('close');
}

function toggling_comment(id) {
	var cid = "#comments_" + id;
	$(cid).toggle('blind');
}

// 
// Callback after a message has been saved
// 
function messageSent() {
    closePopup();
}

function ajax_tabify(selector, refresh_method) {
    var targets = $(selector);
    targets.click( function(){
           $(selector).removeClass('active');
           $(this).addClass("active");

           refresh_method(this);
        }
    );
}


// *******************************************************************************
// Block Methods
// ****************************************************************************

function load_block(button,in_data,in_action){
    var data = {};
    if (in_data){
        data = in_data;
    }
    var action = '/deal/ajax_load_block';
    if (in_action){
        action = in_action;
    } else {
        var controller = data.controller;
        if (controller){
            action = '/' + controller +'/ajax_load_block';
        }
    }

    var container = $(button).parents('.block_container');
    var deal_id = container.attr('deal_id');
    if (!deal_id){
        deal_id = $(button).attr('deal_id');
    }
    data.render = container.attr('render');
    data.profile_id = container.attr('profile_id');
    data.target_id = container.attr('target_id');
    data.deal_id = deal_id;

    ajaxUpdate(action, data, container);
}

function edit_block(button, in_data, action){
    var data = {};
    if (in_data){
        data = in_data;
    }
    data.edit_mode = true;
    load_block(button, data, action);

    var container = $(button).parents('.block_container');
    apply_ui_extensions(container);
}


function save_block(button, action, args){
    var form = $(button).parents('form');
    var key;

    if (!validate_form(form)){
        return;
    }

    hide_child_watermarks(form);
    var data = form.serialize();
    show_child_watermarks(form);

    var container = form.parents('.block_container');

    var extra = {};
    if (args){
        extra = args;
        //jQuery.extend(data, args);
    }

    var template = container.attr('template');
    if (template){
	extra.template = container.attr('template');
    }
    var render = container.attr('render');
    if (render){
	extra.render = container.attr('render');
    }

    extra.profile_id = container.attr('profile_id');
    extra.target_id = container.attr('target_id');

    for (key in extra) {
	data += '&' + key + '=' + extra[key];
    }
 

    /**
     * Update the target and then populate the profile_id if necessary
     */
    function fill_target(data, textStatus, xmlHttpRequest) {
        container.html(data);
        apply_ui_extensions(container);

        // Check to see if we already have a profile id
        if (!container.attr('profile_id') ){
            container.attr('profile_id',container.find('form').attr('profile_id'));
        }
    }
    //ajaxUpdate(action, data, container)
    ajaxCall(action,data, fill_target);
}

function new_deal_block(button, in_data, in_action) {
    var action = '/deal/ajax_new_deal';
    var data = {};
    if (in_data){
        data = in_data;
    }
    if (in_action){
        action = in_action;
    }
    //ajaxUpdate('/profile/business_tab',{'filter':filter,'edit_mode':edit_mode},$('#business_tab')) 
    var container = $(button).parents('.block_container');
    data.render = container.attr('render');
    data.parent_profile = container.attr('profile_id');
    data.edit_mode = true;
    //data = {'render':container.attr('render'),
    //        'edit_mode':true,
    //        'profile_id':container.attr('profile_id'),
    //        'deal_component':deal_component,
    //        'deal_type':deal_type,
    //        'event_id':event_id
    //        };

    ajaxUpdate(action, data, container);
}

function delete_deal(button){
    function on_ok(){
        var deal_id = $(button).attr('deal_id');

        var data = {'deal_id': deal_id};

        var container = $(button).parents('.block_container');
        ajaxUpdate('/profile/ajax_delete_deal', data, container);
    }

    confirm('remove this deal', on_ok);
}

function base_ready(){
    try{
        var prog = $("#profile_progressbar").attr('comp');
        $("#profile_progressbar").progressbar();
        $("#profile_progressbar").progressbar("value", +prog);
    } catch(err){
        alert(err);
    }
    try{
        $("li.account_nav").click(function() { //When trigger is clicked...

            //Following events are applied to the account itself (moving account up and down)
            $(this).parent().find("ul.account").slideDown('fast').show(); //Drop down the account on click

            $(this).parent().hover(function() {
            }, function(){
                $(this).parent().find("ul.account").slideUp('fast'); //When the mouse hovers out of the account, move it back up
            });

            //Following events are applied to the trigger (Hover events for the trigger)
            }).hover(function() {
                $(this).addClass("subhover"); //On hover over, add class "subhover"
            }, function(){	//On Hover Out
                $(this).removeClass("subhover"); //On hover out, remove class "subhover"
        });
        
        // Hide intro box onclick
        $("#intro").click(function() {
            $("#intro").hide('scale', 'fast');
        });

        // Is the above still used???


    // Configure jQuery

        jQuery.validator.addMethod('multiemail',
            function(value, element) {
		var i;
                if (this.optional(element)) {// return true on optional element 
                    return true;
		}
                var emails = value.split( new RegExp( "\\s*,\\s*", "gi" ) ); 
                var valid = true; 
                for(i in emails) { 
                    value = emails[i]; 
                    valid = valid && jQuery.validator.methods.email.call(this, value, element); 
                } 
                return valid; 
            },
            'Valid emails required'
            );

        jQuery.validator.addMethod('past_date_or_year', function (value) { 
            if (! value ){
                // not always required
                return true;
            }
            try{
		var d;
                var parts = value.split('/');
                if (parts.length === 1){
                    d = new Date(+(parts[0]),0,1,0,0,0);
                } else {
                    d = new Date(+(parts[0]),+(parts[1])-1,+(parts[2]),0,0,0);
                }
                var now = new Date();
                return d < now;
            } catch( err){
            }
            return (/^[A-Za-z0-9]*$/).test(value); 
        }, 'Date must be in the past. Formatted as either a 4 digit year or YYYY/MM/DD');


        jQuery.validator.addMethod('future_date', function (value) { 
            try{
                var parts = value.split('/');
                var d = new Date(+(parts[0]),+(parts[1])-1,+(parts[2]),0,0,0);
                var  now = new Date();
                return d > now;
            } catch( err){
            }
            return (/^[A-Za-z0-9]*$/).test(value); 
        }, 'Date must be in the future.');

        jQuery.validator.addMethod('lettersAndNumbers', function (value) { 
            return (/^[A-Za-z0-9]*$/).test(value); 
        }, 'Letters and numbers only please.');

    } catch(err2){
        alert(err2);
    }

    jQuery.validator.addClassRules({
        user_id_available: {
            remote: {url:'/auth/user_id_available'}
        },
        must_be_checked: {
            must_be_checked: 'must_be_checked'
        },
        network_name_available: {
            remote: {url:'/network/network_name_available'}
        }
    });
    jQuery.extend(jQuery.validator.messages, {
        //user_id_available: 'Userid has already been taken',
        remote: 'This id has already been taken.'
    });

    $('form.needs_validation').validate();
}

function show_spinner(target) {
    $(target).html('<img src="/res/img/loader.gif"/>');
}


function show_permission_dialog(target, dialog, reason, after_login) {
    var position = $(target).position;

    var redirect = '';
    if (after_login){
        redirect = after_login;
    }

    $(dialog).find('.reason').html(reason);
    $(dialog).find('.login, .signup').attr('after_login',redirect);
    //$(dialog).find('.signup').attr('after_login', 'top.location.href="/auth/signup' + redirect +'"')
    //$(dialog).find('.signup').onclick = 'top.location.href="/auth/signup' + redirect +'"'
    //$(dialog).find('.signup').attr('blah','top.location.href="/auth/signup' + redirect +'"')

    $(dialog).dialog({'position':position}); 
    $(dialog).dialog('open');
}
function require_membership(target, reason){
    show_permission_dialog(target, $('#require_membership'), reason);

    return true;
}
function require_login(target, user, reason, after_login){
    if (user){
        return false;
    }

    show_permission_dialog(target, $('#require_login'), reason, after_login);

    return true;
}

function facebook_connected(redirect) {
    window.location = '/facebook/facebook_connect?redirect_target=' + redirect;
}

function facebook_logged_in() {
    window.location = '/facebook/facebook_login?token=' + $('#token').val();
}

function facebook_create_account() {
    window.location = '/facebook/facebook_signup';
}

function hide_bubble(ui) {
    $(ui).parents('.account_status').hide();
}


function hide_expiry(ui) {
    $(ui).parents('.account_status').hide();

    function nothin(){
	var wtf = "I do nothing?????";
    }

    ajaxCall('/user/hide_expiry_banner', {}, nothin);
}

function remove(id, class_, target) {
    change_state(id, class_, 'delete', target);
}

function confirm(action, on_ok) {
    var dialog = $('#confirm_dialog');
    dialog.find('.reason').html(action);

    function ok(){
        on_ok();
        dialog.dialog('close');
    }
    function cancel(){
        dialog.dialog('close');
    }
    dialog.dialog({buttons:{
	'No Thanks':cancel,
	'OK':ok
	}});
    dialog.dialog('open');
}

function change_state(id, class_, state, target) {
    var dialog = $('#confirm_dialog');
    dialog.find('.reason').html('remove this item');
    function ok(){
        function hideTarget(){
            target.hide('slow');
        }
        if (state === 'disabled'){
            onResult = hideTarget;
        } else {
            onResult = updateTargetCallback(target);
        }
        ajaxCall('/admin/change_state', {'id':id,'class_':class_,'state':state},onResult);
        dialog.dialog('close');
    }
    function cancel(){
        dialog.dialog('close');
    }
    dialog.dialog({buttons:{'Ok':ok,'Cancel':cancel}});
    dialog.dialog('open');
}

function get_center_x(width,size) {
    var left_x_coordinate = (width - size) / 2;
    return left_x_coordinate; 
}

function get_center_y(height,size) {
    var top_y_coordinate =(height - size) / 2;
    return top_y_coordinate;
}


/*move this to deals.js after working*/
function saveAfterEdit(button) {

    var form = $(button).parents('form');

    if (!validate_form(form)){
	return;
    }

    var data = form.serialize();
    form.submit();
}

/**
 *
 */
function apply_auto_completes( parent_container ) {
    var auto = $('.topic_autocomplete');
    auto.empty();
    topic_autocomplete(auto);
}

/**
 * apply watermarks to all elements that require watermarks
 */
function apply_watermarks(parent_container) {
    var selector = ':input';
    var items;
    if (parent_container){
        items = $(parent_container).find(selector);
    }else{
        items = $(selector);
    }

    items.each(function(index){
        var watermark = $(this).attr('watermark');
        if (watermark) {
            $(this).watermark(watermark, {'className':'watermark'});
        }
    });
}
function apply_all_watermarks(){
    return apply_watermarks();
}
$(apply_all_watermarks);
// What's the correct way to ensure that all datepickers are actually datepickers?
function apply_date_pickers(){
    $('.datepicker').datepicker({'dateFormat':'yy/mm/dd'});

}
$(apply_date_pickers);

/**
 * javascript isn't necessarily run upon return from ajax.
 * This will enable the standard SilkStart fancy components that
 * need some initialization
 */
function apply_ui_extensions(target) {
    apply_date_pickers();
    apply_watermarks(target);
    apply_all_paging(target);

    apply_auto_completes(target);
    enable_tabs();
}

/**
 * Unified way to disable a submitting item to stop double submits
 */
function disable_ui(ui){
    $(ui).attr('disabled', 'disabled');
    disable_button(ui);
}

function disable_button(ui){
    var button = $(ui);

    // for links and some buttons
    button.attr('onclick','');
    
    if (button.tagName === 'button' || button.attr('type') === 'button'){
        button.attr('disabled', true);
    }
}

function refresh_nav_links(){
    ajaxUpdate('/silk/nav_links',{},'#top_wrapper .top_nav');
}

function toggle_version(ui, version){
    var refresh_page = function(){
        window.location.reload();
    }
    ajaxCall('/test/toggle_version', {version:version}, refresh_page);
}
function toggle_advanced(ui, advanced){
    var refresh_page = function(){
        window.location.reload();
    }
    ajaxCall('/test/toggle_advanced', {value:advanced}, refresh_page);
}

/**
 * For item lists this will add another item to the list loaded via ajax 
 */
function add_item(ui, new_row_url){
    function on_loaded(data, textStatus, xmlHttpRequest){
        var items = $(ui).parents('.item_list').find('.items');
        items.append('<li>'+data+'</li>');
        apply_ui_extensions(items);
    }

    ajaxCall(new_row_url,{}, on_loaded);
}

function disable(target){
    target.attr('disabled',true);
}
function enable(target){
    target.attr('disabled',false);
}

function enable_tabs(){
    $("#tabs").tabs({ });

    $('#tabs').bind('tabsload', function(event, ui) {
        // ui contains tab, panel, index
        apply_all_paging(ui.panel);
        apply_watermarks(ui.panel);
    });
}
$(enable_tabs);

   



function initialize_paging(ui){
    // update the paging for the 'this' object
    var paging_form = $(ui).find('.paging_params');
    var pagination_top = $(ui).find('.pagination_top');
    var pagination_bottom = $(ui).find('.pagination_bottom');
    var pagination_content = $(ui).find('.paging_content');

    //pagination_content.html('alsdfjasdlfkj');
    //return;

    var items_per_page = paging_form.find('input[name="page_size"]').val();
    //items_per_page = 25;

    function fetch_paging_info(callback){
        var url = paging_form.attr('url');
        var data = serialize_form(paging_form);

        //alert('fetching paging info' + url + ' ' + data);

        $.ajax({
            type: 'POST',
            url: url,
            data: data,
            success: callback,
            dataType: 'json'
        });
    }
    function render_data(data, textStatus, xmlHttpRequest){
        // Setup the pagination
        var content = data.content;
        pagination_content.html(content);

        pagination_bottom.show();
    }

    var initial_results = null;
    // a bit of a hack to avoid a second call for paging data
    // First - define all the methods
    // Second call the paging method for the first time to fetch the number of items
    //   then initialize the paging which will call the handlePaginationClick method
    //   since we already have the first page of results just use that instead of
    //   doing a second call right away


    function handlePaginationClick(new_page_index, pagination_container) {
        $(paging_form).find('input[name=page_index]').val(new_page_index);

        if (initial_results){
            render_data( initial_results );
            initial_results = null;
        } else{
            fetch_paging_info(render_data);
        }

        // Hack to allow two pagination scrollers
        // http://stackoverflow.com/questions/2605053/two-jquery-pagination-plugin-in-the-same-page-doesnt-seem-to-work

        if (pagination_bottom.length){
            var paginationClone = $(ui).find(".pagination_top > *").clone(true);
            pagination_bottom.empty();
            paginationClone.appendTo(pagination_bottom);
        }
    }

    function render_table(data, textStatus, xmlHttpRequest){
        // Setup the pagination
        var item_count = data.number_of_items;
        //alert('Found ' + item_count + ' items');

        initial_results = data;

        pagination_top.pagination(item_count, {
                items_per_page: items_per_page,
                callback: handlePaginationClick,
                link_to: 'javascript:void(0)'
        });

        pagination_bottom.hide();
        
        // Render the data
        // skip this step for now...calling the above pagination method
        // will actually call the handlePaginationClick right away
        // render_data(data, textStatus, xmlHttpRequest)
    }

    fetch_paging_info(render_table);
}

function apply_all_paging(target){
    $(target).find('.paging_wrapper').each( function(){
        initialize_paging(this);
    });
}




function show_loader(ui){
    var target;
    if (ui){
        target = $(ui);
    }else{
        target = $('.new_activity');
    }
    target.html('<div style="height:260px;float:left;padding-bottom:5px;padding-top:15px;"><img style="float:left;margin-top:100px;margin-left:285px;" src="/res/img/loader2.gif"/></div>');
}

function show_upload_wait(ui){
    if (ui){
           $(ui).parents('#upload_form').find('span#warning').hide();
           $(ui).parents('#upload_form').find('img').show();
    }
}

function enable_file_upload_button(){
    $('button#doc_uploader.share_link').attr('disabled',false);
}

function make_show_hide(params){
    function show_hide(ui){
        var parent = $(ui).closest(params.parent);
        if ( params.hide ) {
            parent.find(params.hide).attr('disabled',true).hide();
        }
        if ( params.show ) {
            parent.find(params.show).attr('disabled',false).show();
        }
    }

    return show_hide;
}


function ajax_start() { 
    $(this).html('<div class="ajax_running"></div>'); 
}
function ajax_stop() { 
    $(this).html('<div></div>'); 
}

