var friendWindow = null;
var eventManager = {};
var errors = {
	internal : "Что-то пошло не так. Свяжитесь с администрацией."
};
(function($) {
	var url = "/api/updates/";
	var counter = 0;
	var options = {newmessages:"on",chatusers:"on", impulse:"on"};
	var timeout;
	var methods = {
		init : function(params){
			options = $.extend({}, defaults, options, params);
		},
		run : function (){
			if(timeout){
				clearTimeout(timeout);
			}
			methods.checkNew();
			timeout = setTimeout("$.updateChecker('run')", 20000);
		},
		option : function(opt){
			options = $.extend(options, opt );
		},
		checkNew : function(){
			$.ajax({
				url : url,
				data : options,
				dataType : "json",
				cache : false,
				success : function (response){
					if ("ok" == response.result){
						
						if(response.data.newmessages){
							$(eventManager).trigger("newmessages", [response.data.newmessages]);
						}
						if(response.data.chatusers){
							$(eventManager).trigger("chatusers", [response.data.chatusers]);
						}
						if(response.data.impulse){							
							$(eventManager).trigger("impulse", [response.data.impulse]);
						}
						if(response.data.messageinfo){
							$(eventManager).trigger("messageinfo", [response.data.messageinfo]);
						}
					}
				}
			});
		}
	};
	$.updateChecker = function(method){
		if ( methods[method] ) {
			return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
	    } else if ( typeof method === 'object' || ! method ) {
	    	return methods.init.apply( this, arguments );
	    } else {
	    	$.error( 'Method ' +  method + ' does not exist on jQuery.messageClient' );
	    } 
	};
})(jQuery);
(function($) {
	var defaults = { url : "/api/message/count"};
	var counter = 0;
	var options = {};
	var timeout = 0;
	var methods = {
		init : function(params){
			options = $.extend({}, defaults, options, params);
		},
		run : function (){
			if(0 != timeout){
				clearTimeout(timeout);
			}
			methods.checkNew();
			timeout = setTimeout("$.messageClient('run')", 20000);
		},
		checkNew : function(){
			var data = {};
			if(options.filter){
				data["filter"] = options.filter;
			}
			$.ajax({
				url : options.url,
				data : data,
				dataType : "json",
				cache : false,
				success : function (response){
					if ("ok" == response.result){
						$(eventManager).trigger("messageUpdated", [response.data]);
					}
				}
			});
		},
		loadMessages : function(userId, page, callback){
			$.ajax({
				url : "/api/message/" + userId,
				data : {page : page},
				dataType : "json",
				cache : false,
				success : function(response){
					if ("ok" == response.result){
						if(response.data){
							callback(response.data);
						}
					}
				}
			});
		},
		sendMessage : function(userId, message, callback){
			$.ajax({
				url : "api/message/" + userId,
		        dataType : "json",
		        type : "POST",
		        data : {text:message},
		        success : function(data){
		        	callback();
		        },
		        error : function(data){
		        	$.pnotify({
		        		pnotify_title: 'Упс...',
		        		pnotify_type : "error",
	                    pnotify_text: "Сожалеем, но произошла ошибка при отправлении сообщения. Пожалуйста повторите попытку попозже."
	                });
		        }
			});
		},
		option : function(opt){
			options = $.extend(options, opt );
		}
	};
	$.messageClient = function(method){
		if ( methods[method] ) {
			return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
	    } else if ( typeof method === 'object' || ! method ) {
	    	return methods.init.apply( this, arguments );
	    } else {
	    	$.error( 'Method ' +  method + ' does not exist on jQuery.messageClient' );
	    } 
	};
})(jQuery);

(function($) {
	
	var methods = {
		init : function(params){
			options = $.extend({}, defaults, options, params);
		},
		accept : function(id){
			$.ajax({
				url:"/api/invite/accept",
				dataType : "json",
				data:{invite:id},
				type : "POST",
		        success : function (data){
		        	$(".invite[inviteid='"+id+"']").remove();
		        	if(!$(".invite:visible").exists()){
		        		$(".invite:hidden:first").show();
		        	}
					$(eventManager).trigger("inviteAccepted", [id]);
		        }
			});
			return false; 
		},
		decline : function(id){
			$.ajax({
				url:"/api/invite/decline",
				dataType : "json",
				data:{invite:id},
				type : "POST",
		        success : function (data){
		        	$(".invite[inviteid='"+id+"']").remove();
					$(".invite:hidden:first").show();
					$(eventManager).trigger("inviteDeclined", [id]);
		        }
			});
			return false;
		},
		confirm : function(id){
			$.ajax({
				url:"/api/invite/confirm",
				dataType : "json",
				data:{message:id},
				type : "POST",
		        success : function (data){
		        	$(".invite:visible[inviteid='"+id+"']").remove();
					$(".invite:hidden:first").show();
		        }
			});
			return false; 
		}	
	};
	$.inviteManager = function(method){
		if ( methods[method] ) {
			return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
	    } else if ( typeof method === 'object' || ! method ) {
	    	return methods.init.apply( this, arguments );
	    } else {
	    	$.error( 'Method ' +  method + ' does not exist on jQuery.messageClient' );
	    }
	};
})(jQuery);

var editorStyle = {
    	width:        "100%",  height:  250,
        controls:     // controls to add to the toolbar
                      "font size bold italic underline " +
                      "| color highlight removeformat icon2",                      
        bodyStyle:    // style to assign to document body contained within the editor
                      "margin:4px; font:10pt Arial,Verdana; cursor:text; color:#6e6e6e; background:#000000"
    };

function createComposeWindow(user_id, item){
    var editorWindow = $("<div id='composer_wrapper'><textarea></textarea>"+
            "<div><img src='/static/img/design/buttons/send.jpg' class='clickable send_button' id='float_composer_send' alt='Отправить' /></div>"+
        "</div>");
    $("body").append(editorWindow);
    editorWindow.dialog({height:400, width:440,modal: true});
    
    var ed = $('textarea', editorWindow).ckeditor();
    var editor = ed.ckeditorGet();
    editor.on("key", function (ev){
    	if(1114125 == ev.data.keyCode){saveMessage();}
    }, null, null, 1 );
    editorWindow.dialog('close');
    $(item).click(function(){
        editorWindow.dialog('open');
        editor.focus();
    });
   
    function saveMessage(){
    	$.ajax({
            url : "/api/message/" + user_id,
            dataType : "json",
            type : "POST",
            data : {text:editor.getData()},
            success : function(dat){
                editor.setData("");
                editorWindow.dialog('close');
                sendMessage("Сообщение отправлено.");
            }
        });
    }
    
    $('#float_composer_send').click(saveMessage);
}

function showComposeWindow(user_id){
	var editorWindow;
	if (!$("#composer_wrapper").exists()){
		editorWindow = $("<div id='composer_wrapper'><textarea></textarea>"+
            "<div><img src='/static/img/design/buttons/send.jpg' class='clickable send_button' id='float_composer_send' alt='Отправить' /></div>"+
        "</div>");
		$("body").append(editorWindow);
	} else {
		editorWindow = $("#composer_wrapper");
	}
    editorWindow.dialog({height:400, width:440,modal: true});
    
    var ed = $('textarea', editorWindow).ckeditor();
    var editor = ed.ckeditorGet();
    editor.on("key", function (ev){
    	if(1114125 == ev.data.keyCode){saveMessage();}
    }, null, null, 1 );
    editorWindow.dialog('open');
   
    function saveMessage(){
    	$.ajax({
            url : "/api/message/" + user_id,
            dataType : "json",
            type : "POST",
            data : {text:editor.getData()},
            success : function(dat){
                editor.setData("");
                editorWindow.dialog('close');
                sendMessage("Сообщение отправлено.");
            }
        });
    }
    
    $('#float_composer_send').click(saveMessage);
}

function addToFriend(userId, item){
	if (null == friendWindow){
		friendWindow = $("<div id='invite_window'>Добавить в друзья?</div>");
		$("body").append();
	}
	friendWindow.dialog({height:320, width:440,modal: true, autoOpen: false,
		buttons: {
		"Да": function() {
			$.ajax({
				url:"/api/invite",
				dataType : "json",
	            type : "POST",
	            data : {recipient: userId},
	            success : function (data){
	            	sendMessage ("Запрос отправлен. Когда пользователь поддтвердит его вы станете друзьями.");
	            }
			});
			friendWindow.dialog('close');
		},
		"Нет": function() {
			$( this ).dialog( "close" );
		}
	}
 });
	$(item).click(function(){
		friendWindow.dialog('open');
    });
}

function removeFriend(userId, item){
	$(item).click(function(){
		$.ajax({
			url:"/api/friend/remove",
			dataType : "json",
            type : "POST",
            data : {id: userId},
            success : function (data){
            	window.location.reload();
            }
		});
	});
}

function showInvites(item){
	var invites = [];
	var invite = $("<div style='margin:10px'></div>");
	var user = $("<div class='icon-row'></div>");
	var sexIco = $("<img src='/static/img/z.gif' style='background-image: url(\"/static/img/design/icons.png\"); height: 30px; width: 30px; vertical-align: middle;'/>");
	var username = $("<span></span>");
	user.append(sexIco).append(username);
	var avatar = $("<div class='userpic' style='margin-left:50px'></div>");
	var buttons = $("<div></div>");
	buttons.append($("<span class='clickable'>Принять</span>")
		.click(function(){
			$.ajax({
				url:"/api/invite/accept",
				dataType : "json",
				data:{invite:invites[0]["id"]},
				type : "POST",
		        success : function (data){
		        	invites.splice(0,1);
		        	showInvite();
		        }
			});
			
		})
	);
	buttons.append($("<span>&nbsp;&nbsp;&nbsp;&nbsp;</span>"));
	buttons.append($("<span class='clickable'>Отклонить</span>")
			.click(function(){
				$.ajax({
					url:"/api/invite/decline",
					dataType : "json",
					data:{invite:invites[0]["id"]},
					type : "POST",
			        success : function (data){
			        	invites.splice(0,1);
			        	showInvite();
			        }
				});
				
			})
		);
	
	invite.append(user);
	invite.append(avatar);
	invite.append($("<div style='clear:both; margin: 10px 5px'>Предлагает вам дружить</div>"));
	invite.append(buttons);
	function showInvite(){
		if (0 == invites.length){
			$(item).empty();
			$(item).addClass('invisible');
			return;
		}
		username.text(invites[0]["username"]);
		sexIco.addClass("icon-" + invites[0]["sex"]);
		avatar.css("background-image", "url(" + invites[0]["avatar"] + ")");
		$(item).append(invite);
		
	}
	$.ajax({
		url:"/api/invite",
		dataType : "json",
		type : "GET",
        success : function (data){
        	if (data.data){
	        	invites = data.data;
	        	showInvite();
        	}
        }
	});
}

function sendMessage(msg){
	//$("#msg_body").text(msg);
	//$("#message").dialog("open");
	$.pnotify({
	    pnotify_text: msg
    });
    
}
/*
(function($) {
	var defaults = { url : "/api/message/count"};
	var options;
	
	
//	$.fn.messageClient = function(params){
//		options = $.extend({}, defaults, options, params);
//		var counter = 1;
//		function tick(){
//			alert("tick " + counter);
//			counter ++;
//			setTimeout ("$.messageClient.tick()", 5000);
//		}
//		return this;
//	};
})(jQuery)
*/
/*
(function($){
	var defaults = { url : "/api/message/count"};
	var options;
	var counter = 1;
	$.fn.messageClient = function(params){
		options = $.extend({}, defaults, options, params);
		counter = 0;
		function tick(){
			alert("tick " + counter);
		}
		return this;
	}
})(jQuery);
*/



(function($){
	$.fn.label = function(s){
		var text = "";
		if (s != 'undefined') {
			text = s;
		}
		function init(){
			var $this = $(this);
			//$this.attr("position", "relative");
			$label = $("<div></div>").text(text);
			$this.after($label);
		}
		return this.each(init);
	};
	$.datepicker.regional['ru'] = {
	        closeText: 'Закрыть',
	        prevText: '&#x3c;Пред',
	        nextText: 'След&#x3e;',
	        currentText: 'Сегодня',
	        monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
	        'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
	        monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
	        'Июл','Авг','Сен','Окт','Ноя','Дек'],
	        dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
	        dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
	        dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
	        weekHeader: 'Нед',
	        dateFormat: 'dd.mm.yy',
	        firstDay: 1,
	        isRTL: false,
	        showMonthAfterYear: false,
	        yearSuffix: ''};
	    $.datepicker.setDefaults($.datepicker.regional['ru']);
})(jQuery);
Array.prototype.findIndex = function(value){
	var ctr = "";
	for (var i=0; i < this.length; i++) {
		// use === to check for Matches. ie., identical (===), ;
		if (this[i] == value) {
			return i;
		}
	}
	return ctr;
};

(function( $ ){
	
	$.fn.toggler = function(options) {
		
		
		function close(icon, content){
			icon.removeClass('icon-opened');
			icon.addClass('icon-closed');
			content.hide();
			settings.onClose();
		}
		function open(icon, content){
			icon.removeClass('icon-closed');
			icon.addClass('icon-opened');
			content.show();
			settings.onOpen();
		}
		
		var settings={
			closed:true,
			onOpen:function(){},
			onClose:function(){}
		};
		
		return this.each(function() {
			var $this = $(this);
			var $icon = $(".icon", this);
			var $content = $this.next();
			if ( options ) {
				$.extend( settings, options );
			}
			if(settings.closed){
				close($icon, $content);
			} else {
				open($icon, $content);
			}			
			
			$this.click(function(){
				if($content.is(":visible")){
					close($icon, $content);
					
				} else {
					open($icon, $content);
				}
			});
		});	
	};
})( jQuery );

(function ($) {
    $.extend({
        rest: {
            get : function(url, data){return this.perform("GET",url, data);},
            create : function(url, data){return this.perform("POST",url, data);},
            update : function(url, data){return this.perform("PUT",url, data);},
            remove : function(url, data){return this.perform("DELETE",url, data);},
            perform : function(method, url, data){
            	var resp = $.ajax({
               		headers: { 'X-HTTP-Method-Override': method },
               		dataType: "json",
                    url: url,
                    data: data,
                    type: method,
                    cache: false,
                    async: false
                });
               	
               	if(200 <= resp.status && (300 > resp.status)){
            	   return eval("(" + resp.responseText + ")");
            	}  else {
            		return {result:"error", description:errors.internal};
            	}
            	return null;
            }
        }
    });
})(jQuery);

function buildUserpic(avatar, user, sex){
    var a = $("<div></div>").height(120).width(120).css('display', 'inline-block');
    a.append($("<div class='userpic'></div>")
            .css({"background-image":"url("+avatar.url+")", float:"none"})
            .height(avatar.height).width(avatar.width));
    a.append("<div class='icon-row'><a href='" + user
            + "/profile'><div class='icon icon-"+ sex +"'></div>"
            + user + "</a></div>");

    return a;
}

/*
(function($){
	$.fn.meetingWindow = function(options){
		var div = $("<div />");
	}
})(jQuery)
*/
(function($){
	var DATA_KEY = 'scrollpane-object';
	var ScrollPane = function(elt, options){
		if (options === null){
			  options = {};
		}
		options = $.extend(true, {}, $.fn.scrollpane.defaults, options);
		
		var $this = $(elt);
		var $pane = $("<div style='position:relative' />").width(10);
        var $left = $("<div class='arrow left_arrow disabled  invisible' />");
        var $right = $("<div class='arrow right_arrow disabled invisible' />");
        var $cropper = $("<div style='overflow:hidden; float:left; position:relative' class='crp'/>").append($pane);
        var width = 0;
        var itemWidth = 0;
		
        $this.append($left);
        $this.append($cropper);
        $this.append($right);
        
        $cropper.width($this.width() - $left.width() - $right.width()).height($this.height());
        
        var add = function(obj){
        	var numb, p;
            obj.css({margin:"0 " + options.margin + "px "});
            $pane.append(obj);
            if(0 == width){
            	w = obj.width();
                itemWidth = (obj.width() + 2*options.margin);
                numb = Math.floor($cropper.width()/itemWidth);
                width = numb * itemWidth;
                p = ($cropper.width() - width)/2;
                $cropper.width(numb * itemWidth).css({margin:"0 " + p + "px"});
            }
            $pane.width(Math.max($cropper.width(), itemWidth*$pane.children().length));
            checkPos();
		};
		
		var scrollLeft = function(){
            $pane.animate({left:'-=' + $cropper.width()},100, checkPos);            
        };
        
        var scrollRight = function(){
            $pane.animate({left:'+='  + $cropper.width()},100, checkPos);
        };
        
        var unbindAll = function(){
        	$left.unbind("click").addClass("disabled");
        	$right.unbind("click").addClass("disabled");
        };
        
		
		var checkPos = function(){
            unbindAll();
            if($pane.width() >= $cropper.width()){
            	$right.show();
            	$left.show();
            }
            if($pane.width() + $pane.position().left > $cropper.width()){
                $right.click(scrollLeft).removeClass("disabled");
            }
            if($pane.position().left < 0){
                $left.click(scrollRight).removeClass("disabled");
            }  
        };
		
		$.extend(this, {
			add: add
		});
		$this.data(DATA_KEY, this);
	};
	
	$.fn.scrollpane = function(options){
		
		var cmd = null;
		var follow = function(){
			  var scrollpane = $.data(this, DATA_KEY);
			  return scrollpane[cmd].call(scrollpane, options);
		};
		
		if ( typeof options === 'string') {
			cmd = options;
			options = arguments[1] || {};
			var retValue = this;
			this.each(function(){
				retValue = follow.call(this);
			});
			return this;
			
        } else if ( typeof options === 'object' || ! options ) {
        	return this.each(function(){
        		if('undefined' === typeof $.data(this, DATA_KEY)){
        			new ScrollPane(this, options);
        		} else {
        			$.data(this, DATA_KEY);
        		}
        	});
            
        } else {
          $.error( 'Method ' +  method + ' does not exist on scrollpane' );
        }
	};
	$.fn.scrollpane.defaults = {
			margin: 5
	};
})(jQuery);

jQuery.fn.exists = function(){return jQuery(this).length>0;};

(function($){
	var msgBox = $("<div style='text-align:center; padding:20px'/>");
	var dlg = null;
	function getDialog(){
		if (null == dlg){
			dlg = msgBox.dialog({width:250, height:200, modal:true});
		}
		return dlg;
	}
	$.extend({
		ensure : function(text, callback){
			var dd = getDialog();
			msgBox.text(text);
			dd.dialog("option", {buttons:{
				"Да" : function(){callback();$(this).dialog( "close" );},
				"Нет" : function(){$(this).dialog( "close" );}				
				}
			}).dialog("open");
			
		}
	});
})(jQuery);

JSON.stringify = JSON.stringify || function (obj) {
    var t = typeof (obj);
    if (t != "object" || obj === null) {
        // simple data type
        if (t == "string") obj = '"'+obj+'"';
        return String(obj);
    }
    else {
        // recurse array or object
        var n, v, json = [], arr = (obj && obj.constructor == Array);
        for (n in obj) {
            v = obj[n]; t = typeof(v);
            if (t == "string") v = '"'+v+'"';
            else if (t == "object" && v !== null) v = JSON.stringify(v);
            json.push((arr ? "" : '"' + n + '":') + String(v));
        }
        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    }
};
