﻿var behaviours = function() {
    return {
        deleteItem: function(item) {
            var itemId = '#' + item.attr('rel');
            var ct = item.parent().parent().children().size();

            $.post(item.attr('href'), {}, function(data) {
                if (data.IsValid) {

                    $(itemId).fadeOut('fast');

                    if ((ct - 1) == 0)
                        document.location = document.location; // reload list :-)

                    ui.flashMsg(data);
                } else
                    ui.flashMsg(data);
            }, 'json');


        }
    }
} ();
var cookies = function() {
    return {
        get: function(check_name) {
			        	// first we'll split this cookie up into name/value pairs
				// note: document.cookie only returns name=value, not the other components
				var a_all_cookies = document.cookie.split( ';' );
				var a_temp_cookie = '';
				var cookie_name = '';
				var cookie_value = '';
				var b_cookie_found = false; // set boolean t/f default f
			
				for ( i = 0; i < a_all_cookies.length; i++ )
				{
					// now we'll split apart each name=value pair
					a_temp_cookie = a_all_cookies[i].split( '=' );
			
			
					// and trim left/right whitespace while we're at it
					cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');
			
					// if the extracted name matches passed check_name
					if ( cookie_name == check_name )
					{
						b_cookie_found = true;
						// we need to handle case where cookie has no value but exists (no = sign, that is):
						if ( a_temp_cookie.length > 1 )
						{
							cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') );
						}
						// note that in cases where cookie is initialized but no value, null is returned
						return cookie_value;
						break;
					}
					a_temp_cookie = null;
					cookie_name = '';
				}
				if ( !b_cookie_found )
				{
					return null;
				}

        }
    }
} ();
var polls = function() {
    return {
        bindUi: function(parent) {
        	if(cookies.get('poll') != null)
        	{
        		$(parent + ' .polls-results').load($(parent + ' .polls-form').attr('action'));
        	}
        
            $(parent + ' .polls-form').ajaxForm({
                // dataType identifies the expected content type of the server response 
                dataType: 'html',

 				beforeSubmit: function(data, form, options) {

                    $(parent).block({
                        message: 'Przetwarzanie ...',
                        css: {
                            border: 'none',
                            padding: '15px',
                            backgroundColor: '#000',
                            '-webkit-border-radius': '10px',
                            '-moz-border-radius': '10px',
                            opacity: '.5',
                            color: '#fff'
                        }

                    });
                 },
                // success identifies the function to invoke when the server response 
                // has been received
                success: function(data) {
                	$(parent).unblock();
					$(parent + ' .polls-results').html(data);
                }
            });        
        }
    }
} ();

var videology = function() {
    return {
        bindUi: function(parent) {
            /* confirmation with subdomains assumption */
            $(parent + ' .ac-ajaxConfirm').click(function() {

                var answer = confirm($(this).attr('title'));
                if (answer) {
                	document.location = $(this).attr('href');
//                	try {
//                    //if ($(this).attr('href').indexOf(document.domain)) {
//                        $.post($(this).attr('href'), {}, function(data) {
//                            ui.flashMsg(data);
//                            document.location = document.location; // reload document TODO: Load ContentPlaceHolder content without masterpage (update panel method :-))
//                        });
//                    //} else {
//                    }
//                    catch(err){
//                        document.location = $(this).attr('href');
//                    }

                }

                return false;
            }
              );

            (function(itemsToReorderSelector) { /*tab order */
                function setOrder(e) {
                    e.preventDefault();

                    if (!$(this).parent().hasClass('current')) {
                        $('.current', this.parentNode.parentNode).removeClass('current');
                        $(this).parent().addClass('current');

                        itemsToReorder = $(itemsToReorderSelector, this.parentNode.parentNode.parentNode);
                        for (i = 1; itemsToReorder[i]; i++) {
                            $(itemsToReorder[(i - 1)]).before(itemsToReorder[i]);
                        }
                    }
                }

                $('ul.order a').bind('click', setOrder);
            })('.episodes li');

            /* recomendations */
            $(parent + ' .ac-recommend').click(function() {
                ui.modal('#dlg-sendToFriends', '390px');
                return false;
            });

            $(parent + ' .ac-modal-cancel').click(function() {
                $.unblockUI();
                return false;
            });

            $(parent + ' form.ajax').ajaxForm({
                // dataType identifies the expected content type of the server response 
                dataType: 'json',

                // success identifies the function to invoke when the server response 
                // has been received
                success: function(data) {
                    if (data.IsValid) {
                        $.unblockUI();

                        if (data.RedirectUrl)
                            document.location = data.RedirectUrl;
                        else
                            ui.flashMsg(data);


                    } else {
                        alert(data.Message);
                    }
                }
            });


            $(parent + ' a.ajax').click(function() {

                $.get($(this).attr('href'), {}, function(data) {
                    ui.flashMsg(data);
                }, 'json');

                return false;

            });

            /** behaviour for lists from which elements could be removed */
            $(parent + ' .removable .ac-delete').click(function() {
                behaviours.deleteItem($(this));
                return false;
            }
    );


            /** behaviour for lists from which elements could be removed */
            $(parent + ' .removable .ac-delete-confirm').click(function() {

                var answer = confirm($(this).attr('title'));
                if (answer) {
                    behaviours.deleteItem($(this));
                }
                return false;
            }
    );

            $(parent + ' input.ac-select-all').click(function() {
                var handleSelector = $(this).attr('rel');
                $(handleSelector + ' input[type=checkbox]').attr('checked', $(this).attr('checked'));
            });
        }
    }
} ();

var user = function() {
    return {
        checkAvail: function(userName)
        {  
            if(userName.length == 0)
                ui.alert( { IsValid : false, Message : "Wpisz nazwę użytkownika"} );
            else {
                $.post('/Users/Account/CheckAvail', { q : userName }, function(result) {
                    ui.alert(result);
                }, 'json');
           }
        }
}
} ();

var slider = function() {
    return {
    	_pageIndex: 0,
		_prevLink: null,
    	_nextLink: null,
    	_url : null,
    	_dst : null,
    	
    	setLinks: function(url, dst, prevLink, nextLink)
    	{
    		slider._prevLink = prevLink;
    		slider._nextLink = nextLink;
    		slider._url = url;
    		slider._dst = dst;
    		
    		slider._prevLink.click(function() {
    			
    			if(slider._pageIndex >0) {
    			
    				slider._pageIndex --;
    				
    				$.get(slider._url + '?page=' + slider._pageIndex, function(data){
  						if(data != '')
  							slider._dst.html(data);
					});

    			}
    			return false;
    		});
    		
    		slider._nextLink.click(function() {
    			slider._pageIndex ++;
    			
    				$.get(slider._url  + '?page=' + slider._pageIndex, function(data){
						if(data != '')
						{
							slider._dst.html(data);
						}
						else
						{
							slider._pageIndex = 0;
							slider._dst.load(slider._url  + '?page=' + slider._pageIndex);
						}
					});  
					
					return false;
    		});    		
    	}
    }
}();

var page = function() {
    return {
    }
}();

var profile = function() {
    return {
        bindUi: function(parent) { /* bind ui functions for user profile page - if current user is admin add them edit links */
        }
    }
} ();


/** voting subsystem for objects */
var votes = function() {
    return {
        record: function (objectType, objectId, vote)
        {
            $.post('/utils/vote/' + parseInt(objectType) + '/' + parseInt(objectId), { vote: vote }, function(result) {
                ui.flashMsg(result);
            }, 'json');
        }, 
        bindUi : function (parent) {
        }
    }
} ();

var tracker = function() {
    return {
        event: function(eventCode, objectType, objectId) {
            $.post('/Stats/Tracker/TrackEvent', { eventCode: eventCode, objectType: objectType, objectId: objectId, context: videology.context }, function() { }, 'json');
        },

        bindUi: function() {
        }
    }
} ();

var comments = function() {
    return {
        load: function(url) {
            ui.blockBox($('.comments > #commentsList'), 'Trwa ładowanie komentarzy');
            $('.comments > #commentsList').eq(0).load(url, function() {
                ui.unblockBox($('.comments > #commentsList'));
            }
           );

        },

        bindUi: function(parent) {
        },

        beforePost: function(handleSelector) {
            ui.blockBox($(handleSelector), 'Trwa zapisywanie komentarza');
        },

        afterPost: function(handleSelector) {
            ui.unblockBox($(handleSelector));
        }
    }
} ();

var moderation = function() {
    return {

        /** load moderation tab */
        box: function(partition, page, pageSize, objectId, visited, fromDate, toDate) {

            ui.blockBox($('#moderation-tab-' + partition), 'Trwa ładowanie elementów ...');
            $('#moderation-handle-' + partition).load('/Admin/ModerationsAdmin/AbusesBox', { partitionName: partition, page: page, pageSize: pageSize, context: videology.context, fromDate: fromDate, toDate: toDate, visited: visited, objectId: objectId }, function() {
                ui.unblockBox($('#moderation-tab-' + partition));
            }
            );
        },

        tabRefresh: function(boxIndex) {
        
        	var visited = $('.select-visited').val();
        	var fromDate = $('.input-fromDate').val();
        	var toDate = $('.input-toDate').val();
        	var objectId = $('.input-objectId').val();
        	
        	var currentTabId = $('#moderation #tabs ul li:eq(' + boxIndex+ ') a').attr('href').replace('#moderation-tab-','');

            moderation.box(currentTabId, 0, 100, objectId, visited, fromDate, toDate);

        },

        bindUi: function(parent, partitionName) {
        
            $(parent).ajaxForm({
                // dataType identifies the expected content type of the server response 
                dataType: 'json',

                // success identifies the function to invoke when the server response 
                // has been received
                success: function(data) {
                    if (data.IsValid) {
                        ui.alert(data);
                        
                        var visited = $('.select-visited').val();
        				var fromDate = $('.input-fromDate').val();
        				var toDate = $('.input-toDate').val();
        				var objectId = $('.input-objectId').val();
                        moderation.box(partitionName, 0, 100, objectId, visited, fromDate, toDate);
                        
                    } else {
                        alert(data.Message);
                    }
                }
            });

        }
    }
} ();

var pms = function() {
    return {

        /** load mailbox */
        box: function(partition, page, count) {

            ui.waiter($('#pms-handle-' + partition), 'Trwa ładowanie wiadomości ...');
            $('#pms-handle-' + partition).load('/Pms/Pms/Box', { partitionName: partition, page: page, count: count }, function() {
            }
            );
        },

        mailboxRefresh: function(boxIndex) {
            if (boxIndex == 0)
                pms.box('inbox', 0, 100);
            if (boxIndex == 1)
                pms.box('outbox', 0, 100);

            if (boxIndex == 2)
                friends.blackList('#pms-handle-blacklist', 0, 100);
        },

        bindWriteForm: function(parent) {
            $(parent + ' form').ajaxForm({
                // dataType identifies the expected content type of the server response 
                dataType: 'json',

                beforeSubmit: function(data, form, options) {

                    $(parent + ' form span.error').remove();
                    $(parent + ' form .error').removeClass('error');


                    $(parent).block({
                        message: 'Przetwarzanie ...',
                        css: {
                            border: 'none',
                            padding: '15px',
                            backgroundColor: '#000',
                            '-webkit-border-radius': '10px',
                            '-moz-border-radius': '10px',
                            opacity: '.5',
                            color: '#fff'
                        }

                    });
                },
                // success identifies the function to invoke when the server response 
                // has been received
                success: function(data) {
                    if (data.IsValid) {
                        ui.flashMsg(data);
                        $(parent + ' form').clearForm();

                    } else {
                        alert(data.Message);
                        //ui.flashMsg(data);

                        if (data.Errors.Texts_Title) {
                            ui.errorField($(parent + ' input[name=title]'), data.Errors.Texts_Title.Message);
                        } else
                            if (data.Errors.Texts_Content) {
                            ui.errorField($(parent + ' input[name=content]'), data.Errors.Texts_Content.Message);
                        } else
                            ui.errorField($(parent + ' input[name=receipments]'), data.Message);
                    }

                    $(parent).unblock();

                }
            });
        },

        bindUi: function(parent) {


            /* private messaging system */
            $(parent + ' .pms-box .ac-refresh').click(function() {
                pms.box($(this).attr('rel'), 0, 100);
                return false;
            });

            $(parent + ' .pms-box .ac-show').click(function() {
                $('#' + $(this).attr('rel') + ' td.title').removeClass('unread').addClass('read');

                $.get($(this).attr('href'), {}, function(message) {
                    $('#message-subject').text(message.Title);
                    $('#message-to').text(message.To_Name);
                    $('#message-to').attr('href', '/ludzie/' + message.To_Name);
                    $('#message-from').text(message.From_Name);
                    $('#message-from').attr('href', '/ludzie/' + message.From_Name);
                    $('#message-body').text(message.Content);
                    $('#response-title').val('Re: ' + message.Title);
                    $('#response-receipments').val(message.From_Name);

                    $('#response-content').val('');

                    $('#pms-message-dialog form span.error').remove();
                    $('#pms-message-dialog form .error').removeClass('error');


                    if (message.From_Name != user.name) {
                        
                        $('#message-close').css('display', 'none');
                        $('#response-form').css('display', 'inline');

                    } else {
                        $('#response-form').css('display', 'none');
                        $('#message-close').css('display', 'inline');
                    }

                    ui.modal('#pms-message-dialog');
                }, 'json');

                return false;
            });



        }
    }
} ();

var friends = function() {
    return {
        /** load blacklist */
        toBlackList: function(userId, relation) {
            $.post('/Friends/UserToUsers/AddToBlackList', {}, function(result) {
                ui.flashMsg(result);
            }, 'json');
        },

        removeFromBlackList: function(userId, relation) {
            $.post('/Friends/UserToUsers/RemoveFromBlackList', {}, function(result) {
                ui.flashMsg(result);
            }, 'json');
        },

        blackList: function(handleSelector, page, count) {
            ui.waiter($(handleSelector), 'Trwa ładowanie listy ignorowanych');
            $(handleSelector).load('/ignorowani', { page: page, count: count }, function() {
            }
            );
        }
    }
} ();


var ui = function() {
    return {

        blockBox: function(handle, message) {
            handle.block({ message: '<div id="pmsBusy"><p><img src="/Content/gfx/ajax-loader.gif"><br/>' + message + '</p></div>', css: {
                border: 'none',
                padding: '15px',
                backgroundColor: '#000',
                '-webkit-border-radius': '10px',
                '-moz-border-radius': '10px',
                opacity: '.7',
                color: '#fff'
            }
            });
        },

        waiter: function(handle, message) {
	            handle.html( '<div id="pmsBusy"><p><img src="/Content/gfx/ajax-loader-white.gif"><br/>' + message + '</p></div>');
        },
        
        unblockBox: function(handle) {
            handle.unblock();
        },
        
        flashMsg: function(result) {
            $('#flashMsg').html(result.Message);
			$('#flashMsg').fadeOut(10000);

            $('#flashMsg').removeClass('info');
            $('#flashMsg').removeClass('error');
            $('.growlUI').removeClass('growlUI-info');
            $('.growlUI').removeClass('growlUI-error');

            if (result.IsValid) {
                $('#flashMsg').addClass('info');
                $('.growlUI').addClass('growlUI-info');
            } else {
                $('#flashMsg').addClass('error');
                $('.growlUI').addClass('growlUI-error');
            }

            $.growlUI('Informacja', result.Message);
        },

        alert: function(result) {

            $.blockUI({ message: result.Message, css: {
                border: 'none',
                padding: '15px',
                backgroundColor: '#000',
                '-webkit-border-radius': '10px',
                '-moz-border-radius': '10px',
                opacity: '.7',
                color: '#fff'
            }
            });

            setTimeout($.unblockUI, 3000);
        },
        clearErrors: function(form) {
            form.children().removeClass('error');
        },

        errorField: function(field, message) {
            field.addClass('error');
            field.after('<span class="error">' + message + '</span>');
        },

        /** display html div on modal */
        modal: function(id) {
            $.blockUI({ message: $(id), css: {
                border: 'none',
                padding: '15px',
                backgroundColor: '#000',
                '-webkit-border-radius': '10px',
                '-moz-border-radius': '10px',
                opacity: '.8',
                color: '#fff',
                top: '20%'
            }      
            });
        },
        
        /** display html div on modal */
        modal: function(id, dialogWidth) {
            $.blockUI({ message: $(id), css: {
                border: 'none',
                padding: '15px',
                backgroundColor: '#000',
                '-webkit-border-radius': '10px',
                '-moz-border-radius': '10px',
                opacity: '.8',
                color: '#fff',
                width: dialogWidth,
                top: '20%'
            }      
            });
        },        


        /* open popup window */
        pop: function(plik, w, h) {
            okno = null;
            if (window.screen) {
                aw = screen.availWidth;
                ah = screen.availHeight;
            }
            else {
                aw = 640;
                ah = 480;
            }
            dane = "width=" + w + ",height=" + h + ",left="
        + (aw - w) / 2 + ",top="
        + (ah - h) / 2
        + ",toolbar=no,location=no,directories=no,"
        + "status=no,menubar=no,"
        + "scrollbars=yes,resizable=no";
            okno = window.open(plik, 'pop', dane);
        }
    }

} ();

/** add common behaviours */
$(document).ready(function() {
    /**growl */
    $("body").append('<div class="growlUI" style="display: none;"><h1>Growl Notification</h1><h2>Have a nice day!</h2></div>');

    /** ajax loader */
    $("body").append('<div id="ajaxBusy" class="vui-ajax-loader"><p><img src="/Content/gfx/ajax-loader.gif"></p></div>');
    $('#ajaxBusy').css({
        display: "none",
        margin: "0px",
        paddingLeft: "0px",
        paddingRight: "0px",
        paddingTop: "0px",
        paddingBottom: "0px",
        position: "absolute",
        right: "3px",
        top: "3px",
        width: "auto"
    });

    // Ajax activity indicator bound 
    // to ajax start/stop document events
    $(document).ajaxStart(function() {
        $('#ajaxBusy').show();
    }).ajaxStop(function() {
        $('#ajaxBusy').hide();
    });

    $.ajaxSetup({
        timeout: 90000,
        error: function(event, request, settings) {
            if (request == 'parsererror') {
                top.location.href = '/zaloguj?returnUrl=' + document.location.href; // TODO: Perform better checking of ajax redirects- for example in Account.LogOn set specified header and check it here
            } else {
                ui.flashMsg({ Message: 'Wystąpił błąd podczas przetwarzania żądania', IsValid: false });
//                document.location = document.location; // reload ui to avoid blocks
           }
        }
    });


    videology.bindUi('body'); // bind common methods
    pms.bindUi('body'); // bind pms methods
    pms.bindWriteForm('#pms-handle-write');
    pms.bindWriteForm('#pms-message-dialog');

});

