
var L = {
		
	cropData: {},	
		
	init: function() {
		L.initRegistration();
		L.initListPosts();
		L.initPostArea();
		L.initSettings();
		L.initRecoverPassword();
		
		$(".open-signin-panel").click(function() {
			L.openSignInPanel();
			return false;
		});
	},
	initRegistration: function() {
		var area = $(".page.registration");
		var form = area.find("form");
		area.find(".button.registration").click( function() {
			form.submit();
		});
		
		form.find("input[name=login]").keyup( function() {
			var input = $(this);
    		$(document).stopTime("check-login");
    		$(document).oneTime(400, "check-login", function() {
    			Util.post({action: "check-login", login: input.val()});
    		});
		}).end().find("input[name=email]").keyup( function() {
			var input = $(this);
			$(document).stopTime("check-email");
    		$(document).oneTime(400, "check-email", function() {
    			Util.post({action: "check-email", email: input.val()});
    		});
		}).end().find("input[name=password]").keyup( function() {
			var input = $(this);
			$(document).stopTime("check-pass");
    		$(document).oneTime(400, "check-pass", function() {
    			Util.post({action: "check-pass", password: input.val()});
    		});
		}).end().find("input[name=passwordRep]").keyup( function() {
			var input = $(this);
			var password = form.find("input[name=password]");
			$(document).stopTime("check-pass-rep");
    		$(document).oneTime(400, "check-pass-rep", function() {
    			Util.post({action: "check-pass-rep", password: password.val(), passwordRep: input.val()});
    		});
		});
	},
	initListPosts: function() {
		var area = $(".lists-post-area");
		
		var posts = area.find(".post");
		posts.each( function() {
			var post = $(this);
			post.find(".remove").live("click", function() {
				var post = $(this).parents(".post");
				L.openConfirmPanel("Вы уверены что хотите удалить данную публикацию?", "remove post", function() {
					Util._post("/api/post/remove", {postId: post.attr("pid")}, function() {
						post.remove();
					});
				});
			}).end().find(".edit").live("click", function() {
				var post = $(this).parents(".post");
				L.editPost(post);
			}).end().find(".our-choice").live("click", function() {
				var post = $(this).parents(".post");
				L.setOurChoicePost(post);
			});
			
			L.initPost(post);
		});
		
		L.initFormPost();
	},
	initFormPost: function() {
		var form = $(".post-form form");
		
		var heightTextarea = 100;
		var textarea = form.find("textarea");
		textarea.TextAreaExpander(heightTextarea);
		
		var processPlayerCode = function() {
			var playerField = form.find("input[name=player]");
			var codePlayer = playerField.val();
        	
        	var getYoutubeCode = function(nameVideo) {
				/*var code = '<object width="668" height="407">' + 
					'<param name="movie" value="http://www.youtube.com/v/' + nameVideo + '?version=3&amp;hl=ru_RU&amp;rel=0"></param>' +
					'<param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param>' + 
					'<param name="wmode" value="opaque"></param>' +
					'<embed src="http://www.youtube.com/v/' + nameVideo + '?version=3&amp;hl=ru_RU&amp;rel=0" type="application/x-shockwave-flash" width="668" height="407" allowscriptaccess="always" allowfullscreen="true" wmode="opaque"></embed>' + 
					'</object>';*/
        		var code = '<iframe width="668" height="407" src="http://www.youtube.com/embed/' + nameVideo + '?rel=0&wmode=opaque" frameborder="0" allowfullscreen></iframe>';
				return code;
			};
        	var processExistCode = function(player) {
        		var code = player;
            	if(player) {
            		player = $(player);
            		var setSize = function(player){
        				var playerWidth = player.attr("width");
            			var playerHeight = player.attr("height");
            			var maxWidth = 668;
            			player.attr("width", maxWidth);
            			
            			var height; 
            			if(code.match(/youtube\.com/)) {
            				height = 407;
            			} else {
            				height = Math.round(playerHeight / playerWidth * maxWidth);
            			}
            			player.attr("height", height);
        	        }
    	        	if( player[0].tagName.toLowerCase() == "object" || player[0].tagName.toLowerCase() == "embed" ) {
    	        		setSize(player);
    	        		if(player.find("embed").length > 0) {
    	        			setSize(player.find("embed"));
        	        	}
    	        		
    	        		var setWmodeObject = function(object) {
	    	        		if(object.length > 0){
	    	        			var wmode = object.find("param[name=wmode]");
	    	        			if(wmode.length > 0) {
	    	        				wmode.attr("value", "opaque");
	    	        			} else {
	    	        				object.prepend("<param name='wmode' value='opaque'/>")
	    	        			}
	    	        		}
    	        		};
    	        		var setWmodeEmbed = function(embed) {
	    	        		if(embed.length > 0) {
	    	        			var flashvars = embed.attr("flashvars");
	    	        			if(flashvars) {
		    	        			var match = flashvars.match(/&wmode=([^&]*)/);
		    	        			if(match) {
		    	        				flashvars.replaceAll(/&wmode=([^&]*)/, "&wmode=opaque" );
		    	        			} else {
		    	        				flashvars += "&wmode=opaque";
		    	        			}
		    	        			embed.attr("flashvars", flashvars);
	    	        			}
	    	        			embed.attr("wmode", "opaque");
	        	        	}
	    	        	};
    	        		if(player[0].tagName.toLowerCase() == "object") {
    	        			setWmodeObject(player);
    	        		} else {
    	        			setWmodeEmbed(player);
    	        		}
    	        		if(player.find("embed").length > 0) {
    	        			setWmodeEmbed(player.find("embed"));
    	        		}
    	        	} else if(player[0].tagName.toLowerCase() == "iframe") {
    	        		setSize(player);
    	        		var wmode = (player.attr("src").indexOf("?") >= 0 ? "" : "?") + "&wmode=opaque";
    	        		player.attr("src", player.attr("src") + wmode);
    	        	}
    	
    	        	return player.wrap("<div></div>").parent().html();
    	        }
            	return "";
        	};
        	
        	if(codePlayer.match(/youtube\.com\/watch/)) {
    			var nameVideo = codePlayer.match(/watch\?v=([^&]*)/);
    			codePlayer = getYoutubeCode(nameVideo[1]);
    		} else if(codePlayer.match(/youtu\.be/)) {
    			var nameVideo = codePlayer.match(/youtu\.be\/([^&]*)/);
    			codePlayer = getYoutubeCode(nameVideo[1]);
    		} else {
    			codePlayer = processExistCode(codePlayer);
    		}
        	playerField.val(codePlayer);
		};
		
		form.find(".button.send").click( function() {
			processPlayerCode();
			
			var hasError = false;
			var title = form.find("input[name=title]");
			if(title.val() == "") {
				title.parents(".field").find(".error").show();
				hasError = true;
			}
			var text = form.find("textarea[name=text]");
			var playerField = form.find("input[name=player]");
			if(text.val() == "" && playerField.val() == "") {
				text.parents(".field").find(".error").show();
				hasError = true;
			}
			
			if(!hasError) {
				var params = form.serialize();
				Util._post("/api/post/add", params, function(xml) {
					var postId = $(xml).find("postId").text();
					Util.setLocation("/post/" + postId);
				});
			}
			return false;
		});
		
		var tagsField = form.find("input[name=tags]");
		tagsField.autocomplete("/autocompleter", {
    		formatItem: function(row) {
	    		return row[1];
	    	},
	        formatResult: function(row) {
	            return row[1];
	        },
	        scroll: true,
	        extraParams: { action: "tags" },
	        width: tagsField.width() + 2,
	        multiple: true
	    });
	},
	scrollTop: function() {
		destination = $(".header .top").offset().top;
        jQuery("html:not(:animated),body:not(:animated)").animate({scrollTop: destination}, 200);
        return false;
	},
	initViewMore: function(form, list, itemSelector, addParams) {
    	var viewMorePanel = form.find(".view-more"); 
    	var sendRequest = false;
    	viewMorePanel.die().live("click", function() {
    		if(sendRequest) return false;
    		sendRequest = true;
    		
    		var count = list.find(itemSelector).length;
    		var params = form.serialize();
    		Util.post(params + "&action=view-more&countItems=" + count + (addParams ? "&" + addParams : ""), function(xml) {
    			viewMorePanel = form.find(".view-more"); 
    			var component = $(xml).find("component");
    			var results = $(component.text());
    			viewMorePanel.before(results.find(itemSelector));
    			if(results.find(".view-more").length == 0) {
    				viewMorePanel.remove();
    			}
    			sendRequest = false;
    		}, true);
    	});
    }, 
    openModal: function(window) {
    	var glass = Util.showGlass(window);
		glass.find(".wnd-close").click( function() {
			Util.closeGlass();
		})
		return glass;
    },
    openSignInPanel: function() {
    	var panel = $("#wnd-signin-panel");
    	var glass = L.openModal(panel);
    	
    	var enter = glass.find(".button.enter");
    	enter.click( function() {
    		var form = glass.find("form");
    		form.find("input[name=lb_redirect]").val(location.href);
    		Util._post("/login", form.serialize(), function(xml) {
    			var status = $(xml).text();
    			if(status != "ok") {
    				glass.find(".error-password").show();
    			} else {
    				Util.reloadCurrentPage();
    			}
    		});
    		//form.submit();
    	});
    	
    	glass.keyup(function(e) {
    		if(e.keyCode == 13) {
    			enter.click();
    		}
    	});
    },
    initPost: function(post) {
    	var postRating = post.find(".post-rating");
    	postRating.find(".plus:not(.disable, .open-signin-panel), .minus:not(.disable, .open-signin-panel)").click( function() {
    		Util._post("/api/post/addratingpost", {postId: post.attr("pid"), positive: $(this).hasClass("plus")}, function(xml) {
    			var rating = postRating.find(".rating");
    			var ratingVal = parseInt($(xml).find("rating").text());
    			rating.text(ratingVal);
    			if(ratingVal > 0 && !rating.hasClass("positive")) {
    				rating.addClass("positive");
    			} else if(ratingVal < 0 && !rating.hasClass("negative")) {
    				rating.addClass("negative");
    			} else if(ratingVal == 0) {
    				rating.removeClass("positive");
    				rating.removeClass("negative");
    			}
    			postRating.find(".plus, .minus").addClass("disable");
    		});
    		return false;
		});
    },
    initPostArea: function() {
    	var area = $(".page.post-page");
    	
    	var initPost = function() {
	    	area.find(".remove").live("click", function() {
				var post = $(this).parents(".post");
				L.openConfirmPanel("Вы уверены что хотите удалить данную публикацию?", "remove post", function() {
					Util._post("/api/post/remove", {postId: post.attr("pid")}, function() {
						var user = L.getCurrentUser();
						Util.setLocation("/user/" + user);
					});
				});
			}).end().find(".edit").live("click", function() {
				var post = $(this).parents(".post");
				L.editPost(post);
			}).end().find(".our-choice").live("click", function() {
				var post = $(this).parents(".post");
				L.setOurChoicePost(post);
			});
	    	
	    	L.initPost(area.find(".post"));
	    };
    	initPost();
    	
    	var initComment = function() {
    		area.find(".comment").find(".remove-comment").live("click", function() {
        		var comment = $(this).parents(".comment");
        		var post = $(this).parents(".post");
        		L.openConfirmPanel("Вы уверены что хотите удалить данный комментарий?", "remove post", function() {
        			Util._post("/api/post/removecomment", {commentId: comment.attr("cid"), postId: post.attr("pid")}, function() {
        				comment.remove();
            		});
        		});
        	}).end().find(".detail").click( function() {
        		var comment = $(this).parents(".comment");
        		Util._post("/api/post/showfullcomment", {commentId: comment.attr("cid")}, function(xml) {
    				comment.find(".text").html($(xml).find("comment").text());
    			});
        	})
        	
        	var vote = area.find(".comment .comment-rating");
    		vote.find(".plus:not(.disable, .open-signin-panel), .minus:not(.disable, .open-signin-panel)").click( function() {
    			var commentRating = $(this).parents(".comment-rating");
    			var comment = $(this).parents(".comment");
        		Util._post("/api/post/addratingcomment", {commentId: comment.attr("cid"), positive: $(this).hasClass("plus")}, function(xml) {
        			var rating = commentRating.find(".rating");
        			var ratingVal = parseInt($(xml).find("rating").text());
        			rating.text(ratingVal);
        			if(ratingVal > 0 && !rating.hasClass("positive")) {
        				rating.addClass("positive");
        			} else if(ratingVal < 0 && !rating.hasClass("negative")) {
        				rating.addClass("negative");
        			} else if(ratingVal == 0) {
        				rating.removeClass("positive");
        				rating.removeClass("negative");
        			}
        			commentRating.find(".plus, .minus").addClass("disable");
        		});
        		return false;
        	});
        	
        	var commentForm = area.find(".form-comment form");
        	var heightField = 80;
        	var textarea = commentForm.find("textarea");
        	textarea.TextAreaExpander(heightField);
        	commentForm.find(".button.send").click( function() {
        		var params = commentForm.serialize();
        		Util.post(params + "&action=add-comment", function() {
        			commentForm.find("input, textarea").val("")
        			textarea.css("height", heightField + "px");
        		});
        	});
    	};
    	initComment();
    },
    setOurChoicePost: function(post) {
    	Util._post("/api/post/ourchoice", {postId: post.attr("pid")});
    },
    editPost: function(post) {
    	Util.setLocation("/edit/" + post.attr("pid"));
    },
    getCurrentUser: function() {
    	var user = $(".header .top .person.current-user").text();
    	return user;
    },
    initSettings: function() {
    	var area = $(".page.settings");
    	
    	var initAvatarArea = function() {
			var panel = area.find(".edit-avatar");
			var events = L.initEditAvatar(panel);
			panel.find("input[name=avatar]").change(function() {
				var uploadId = Util.randomID(32);
			    $(this).attr("id", uploadId);
			    Util.showLoadPanel();
			    $.ajaxFileUpload({
			        url:'/editavatar',
			        secureuri:false,
			        fileElementId: uploadId,
			        sourceForm: panel,
			        dataType: 'xml',
			        success: function(xml) {
			           var src = $(xml).find("file").attr("path");
			        	var newImg = new Image();
			            $(newImg).load(function() {
			            	var scale_image = panel.find(".large");
			            	scale_image.html("<img src='" + this.src + "'/>");
			            	var img = scale_image.find("img");
			            	img.hide();
			            	events.setImage(img, this.width, this.height);
			            }).attr('src', src);
			            Util.closeLoadPanel();
			        },
			        error: function (data, status, e) {
			    }});
			    return true;
			});
			
			panel.find(".button.save").click( function() {
				events.onSave();
			});
			panel.find(".remove").click(function () {
				var linkRemove = $(this);
				Util._post("/editavatar", {mode: "remove-avatar"}, function(xml) {
					panel.find(".large img").attr("src", $(xml).find("big").attr("path"));
					panel.find(".small img").attr("src", $(xml).find("small").attr("path"));
					linkRemove.remove();
				});
			});
    	};
    	initAvatarArea();
    	
    	var showSaveMessage = function() {
    		var message = area.find(".save-message");
    		message.show();
    	};
    	
    	area.find(".group.password .button.save").click( function() {
    		var form = $(this).parents("form");
    		var params = form.serialize();
    		Util.post(params + "&action=save-password", function() {
    			showSaveMessage();
    		});
    	}).end().find(".group.email .button.save").click( function() {
    		var form = $(this).parents("form");
    		var params = form.serialize();
    		Util.post(params + "&action=save-email", function() {
    			showSaveMessage();
    		});
    	});
    	
    	area.find("input[name=email]").keyup( function() {
			var input = $(this);
			$(document).stopTime("check-email");
    		$(document).oneTime(400, "check-email", function() {
    			Util.post({action: "check-email", email: input.val()});
    		});
		}).end().find("input[name=password]").keyup( function() {
			var input = $(this);
			$(document).stopTime("check-pass");
    		$(document).oneTime(400, "check-pass", function() {
    			Util.post({action: "check-pass", password: input.val()});
    		});
		}).end().find("input[name=passwordRep]").keyup( function() {
			var input = $(this);
			var password = area.find("input[name=password]");
			$(document).stopTime("check-pass-rep");
    		$(document).oneTime(400, "check-pass-rep", function() {
    			Util.post({action: "check-pass-rep", password: password.val(), passwordRep: input.val()});
    		});
		});
    },
    initEditAvatar: function(panel) {
		cropData = {};
		var onSave = function( callback, area, urlImage ) {
			if(area) {
				panel = area;
			}
			var scaleX = cropData.scaleX;
            var scaleY = cropData.scaleY;
            var url = urlImage ? urlImage : scale_image.find("img").attr("src");
            var idx = url.indexOf("=");
            var name = url.substring(idx + 1);
            //var name = scale_image.find("img").attr("src");
            var id = panel.find("input[name=objectId]").val();
            var dirAvatar = panel.find("input[name=dirAvatar]").val(); 
            Util.showLoadPanel();
            Util._post("/editavatar/", {mode:"set-avatar", "name": name,
                "x": ((cropData.coords.x * scaleX) | 0),
                "y": ((cropData.coords.y * scaleY) | 0),
                "width": ((cropData.coords.w * scaleX) | 0),
                "height": ((cropData.coords.h * scaleY) | 0), id: id, dirAvatar: dirAvatar }, function(xml) {
                Util.reloadCurrentPage();
            });
            return false;
		};
		var onChange = function(url) {
			var img = scale_image.find("img");
			img.css({width: "auto", height: "auto"});
        	$(img).attr("src", url).bind("load", function() {
        		setImage(img);
            });
        };
       
        var scale_image = panel.find(".large");
        var small_avatar = panel.find(".small img");
        var big_avatar = panel.find(".middle img");
        var showPreview = function(coords) {
            var rx = 40 / coords.w;
            var ry = 40 / coords.h;
            var img = scale_image.find("img");
            var width = img.width();
            var height = img.height();
            small_avatar.css({
                width: Math.round(rx * width) + 'px',
                height: Math.round(ry * height) + 'px',
                marginLeft: '-' + Math.round(rx * coords.x) + 'px',
                marginTop: '-' + Math.round(ry * coords.y) + 'px'
            });
            rx = 80 / coords.w;
            ry = 80 / coords.h;
            big_avatar.css({
                width: Math.round(rx * width) + 'px',
                height: Math.round(ry * height) + 'px',
                marginLeft: '-' + Math.round(rx * coords.x) + 'px',
                marginTop: '-' + Math.round(ry * coords.y) + 'px'
            });
            cropData.coords = coords;
        };
        var setImage = function(img, width, height) {
            var maxWidth = 200;
        	scale_image.css("width", "200px");
            scale_image.css("height", "299px");
            //panel.find(".note:eq(1)").hide();
            if (!width) {
                width = img.width();
            }
            if (!height) {
                height = img.height();
            }
            var oldHeight = height;
            var oldWidth = width;
            if (height > 299 || width > maxWidth) {
                if (height > width) {
                    width = (299 / height * width);
                    height = 299;
                    if (width > maxWidth) {
                        height = (maxWidth / width * height);
                        width = maxWidth;
                    }
                } else {
                    height = (maxWidth / width * height);
                    width = maxWidth;
                    if (height > 299) {
                        width = (299 / height * width);
                        height = 299;
                    }
                }
                img.css("width", width + 'px')
                        .css("height", height + 'px');
            }
            var scaleX = oldWidth / width;
            var scaleY = oldHeight / height;
            cropData.scaleX = scaleX;
            cropData.scaleY = scaleY;
            img.show();
            small_avatar.attr('src', img.attr("src"));
            big_avatar.attr('src', img.attr("src"));
            if(cropData.api) {
            	cropData.api.destroy();
            }
            cropData.api = $.Jcrop(img, {
                onChange: showPreview,
                onSelect: showPreview,
                setSelect: [ 0, 0, 80, 80],
                aspectRatio: 1
            });
        };
        
        return {onSave: onSave, onChange: onChange, setImage: setImage};
    },
    initRecoverPassword: function() {
    	var area = $(".page.recover-password");
    	area.find(".button").click( function() {
    		var form = $(this).parents("form");
    		form.submit();
    	});
    },
    openConfirmPanel: function(text, cssClass, onOk, onCancel) {
    	var panel = $("#wnd-confirm-panel");
    	panel.attr("class", "");
    	panel.addClass(cssClass);
    	
    	var glass = L.openModal(panel);
    	glass.find(".message").html(text);
    	glass.find(".button.ok").click( function() {
    		if(onOk) {
    			onOk();
    		}
    		Util.closeGlass();
    	}).end().find(".button.cancel").click( function() {
    		if(onCancel) {
    			onCancel();
    		}
    		Util.closeGlass();
        });
    }
};
$(L.init)
