/*
 * @include "D:\home\skyh\lib\jquery\jquery-1.4.2.js"
 */

// вообще, в 21 веке, давно должна быть функция makePizdato(all)

window.comment_mce_settings = {
	// General options 
	theme : "advanced",
	relative_urls : false,
	language: "ru",
	dialog_type: "modal",
	//plugins : "safari,spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,imagemanager,filemanager", 
	plugins : "safari,spellchecker,pagebreak,inlinepopups,media", 
	theme_advanced_buttons1 : "newdocument,|, undo, redo,|, ppimage,ppvideo,link,unlink", //save,,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect", 
	theme_advanced_buttons2 : "", //cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor", 
	theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen", 
	theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,spellchecker,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,blockquote,pagebreak,|,insertfile,insertimage", 
	theme_advanced_toolbar_align : "left", 
	theme_advanced_toolbar_location : "top", 
	//theme_advanced_statusbar_location : "bottom",
	theme_advanced_resizing : false,
	setup: function (ed) {
		var image_dlg_title = "Добавить картинку",
			video_dlg_title = "Добавить видео",
			L = location,
			url = L.protocol + "//" + L.hostname + L.port + "/js/tinymce/plugins/paparazzi";
		
		ed.addButton('ppimage',{
			title: image_dlg_title,
			"class": "mce_image",
			onclick: function () {
				ed.windowManager.open({
					file: url + "/imageupload.html",
					width: 400,
					height: 400,
					resizable: true,
					maximizable: false,
					inline: true,
					close_previous:true,
					scrollbars:false
				});
			}
		});
		
		ed.addButton('ppvideo',{
			title: video_dlg_title,
			"class": "mce_media",
			onclick: function () {
				ed.windowManager.open({
					file: url + "/videoupload.html",
					width: 400,
					height: 400,
					resizable: true,
					maximizable: false,
					inline: true,
					//popup_css:,
					//translate_i18n:,
					close_previous:true,
					scrollbars:false
				});
			}
		});
	}
}

/**
 * Генерация случайной строки
 * @param {Number} length
 */
function getRndStr(length) {
	var res = "",
		_res = [],
		start_index = "a".charCodeAt(0),
		rnd_width = 26,
		rnd = Math.random,
		make = String.fromCharCode;
	
	for (var i = 0; i < length; ++i) {
		_res[i] = make(start_index + parseInt(rnd() * rnd_width));
	}
	res = _res.join("");
	return res;
}

/**
 * @param {HTMLELement} obj
 */
var Carousel = function (obj) {
	var isActive = true,
		params = {
			animPeriod: 30,
			defaultScrollSpeed: -1,
			speedEasing: function (x) {
				return -x / 40;
			},
			outTime : 400
		};
	
	var	container = $(obj),
		lines = $(".cs-line", container);
	
	if (container.hasClass("carousel-mode-static")) {
		isActive = false;
	}
	
	if (isActive) {
		lines.each(function () {
			this.innerHTML += this.innerHTML;
		});
	}
	
	var	pictClass = "cs-pict",
		scrollerClass = "cs-scroller",
		pictHoverClass = "cs-pict-hover",
		picts = $("." + pictClass, container),
		scroller = $("." + scrollerClass, container),
		scrollSpeed = isActive ? params.defaultScrollSpeed : 0,
		animateTimeout = null,
		moutTimer = null;
	
	
	function setScrollSpeed (x) {
		scrollSpeed = parseInt(x);
	}
	
	container.bind("mousemove mouseover", function (e) {
		clearTimeout(moutTimer);
		var el = e.target,
			offsetLeft = e.layerX,
			maxWidth = container.attr("offsetWidth");
		
		if (typeof offsetLeft == "undefined") {
			offsetLeft = e.offsetX || 0; 
		}
		
		while (el != this) {
			offsetLeft += el.offsetLeft;
			el = el.parentNode;
		}
		
		offsetLeft += el.offsetLeft;
		if (offsetLeft < 0) {
			offsetLeft = 0;
		}
		
		if (offsetLeft > maxWidth) {
			offsetLeft = maxWidth;
		}
		
		if (isActive) {
			setScrollSpeed(params.speedEasing(offsetLeft - maxWidth / 2));
		} else {
			setScrollSpeed(0);
		}
		
	}).bind("mouseout", function () {
		moutTimer = setTimeout(function () {
			if (scrollSpeed && isActive) {
				setScrollSpeed(Math.abs(scrollSpeed) / scrollSpeed * Math.abs(params.defaultScrollSpeed));
			} else {
				setScrollSpeed(0);
			}
		}, params.outTime);
	});
	
	picts.bind("mousemove mouseover", function (e) {
		var t = $(this);
		if (t.hasClass(pictClass)) {
			t.addClass(pictHoverClass);
		}
	})
	.bind("mouseout", function (e) {
		var t = $(this);
		if (t.hasClass(pictClass)) {
			t.removeClass(pictHoverClass);
		}
	});
	
	function stop() {
		clearTimeout(animateTimeout);
	}
	
	function step() {
		var left = scroller.attr("offsetLeft") + scrollSpeed,
			lineWidth = lines.attr("offsetWidth") / 2;
		if (left < -lineWidth) {
			left = 0;
		}
		
		if (left > 0) {
			left = -lineWidth;
		}
		scroller.css({left:left});
	}
	
	function timer() {
		animateTimeout = setTimeout(function(){
			step();
			timer();
		}, params.animPeriod);
	}
	
	timer();
}

var GopEditor = function (obj) {
	var container = $(obj),
		input = $(".editor", container),
		shadow = $(".editor-value-shadow", container),
		needCaps = input.hasClass("caps-caps-caps!"),
		makeGop = function () {
			var text = input.val();
			var html = text.replace(/\n|\r\n/g, "<br>") + "&nbsp;";
			shadow.html(html);
			if (window.opera && needCaps) {
				input.val(text.toUpperCase());
			}
		}
	
	input.bind("keydown keypress keyup change", makeGop);
	makeGop();
}

var PPUploader = function (container) {
	var c = $(container), 
		finput = c.find("input:file"),
		finput_el = finput[0] || null,
		fakeButton = c.find(".fakebutton"),
		form = $(container), 
		initval = finput.val(),
		id = getRndStr(10),
		transport_name = "name_" + id,
		transport = initTransport(transport_name),
		body = document.documentElement.getElementsByTagName("body")[0],
		result_el_selector = "",
		jqResult = null,
		load_started = false;
	
	if (form.attr("target") != "_self") {
		form.attr("target", transport_name);
	}
	
	var ready = function () {};
	
	if (result_el_selector = form[0] && form[0].getAttribute("for")) {
		jqResult = $(result_el_selector + "");
		if (jqResult.length > 0) {
			ready = function () {
				jqResult.html(transport.contentDocument.documentElement.innerHTML);
			}
		}
	}
	
	$(transport).load(function () {
		if (load_started) {
			enableSubmit();
			ready();
			load_started = false;
			try {
				form[0].reset();
			} catch (e) {
				
			}
		}
	});

	var change_handler = function () {
		load_started = true;
		finput_el.form.submit();
	}
	
	form.bind("submit", function () {
		load_started = true;
		disableSubmit();
	});

	function initTransport(transport_name) {
		var transport = document.createElement("iframe"),
			body = document.documentElement.getElementsByTagName("body")[0];
		
		transport.setAttribute("style", "display:none;top:0;left:0");
		transport.setAttribute("name", transport_name);
		body.appendChild(transport);
		return transport;
	}
	
	function disableSubmit() {
		finput.attr("disabled", "disabled");
		fakeButton.addClass("fakebutton-disabled");
		fakeButton.attr("disabled", "disabled");
	}
	
	function enableSubmit() {
		finput.removeAttr("disabled");
		fakeButton.removeAttr("disabled");
		fakeButton.removeClass("fakebutton-disabled");
	}
	
	
	if ($.browser.msie && $.browser.version < 8) {
		// обход бага ИЕ с глюком onchange
		setInterval(function () {
			if (finput.val() != initval) {
				change_handler();
			}
		}, 50);
	} else {
		finput.bind("change", change_handler);
	}
}

var PollController = function (pollObj) {
	var poll_answer = $(".jsx-answer", pollObj),
		poll_form = $("form", pollObj),
		transport = $("<iframe>"),
		flag = $("<input type=\"hidden\">"),
		transport_name = "poll_transport_" + getRndStr(10);
	
	transport.attr("style", "display:none;top:0;left:0");
	transport.attr("name", transport_name);
	flag.attr({
		"name": "transport",
		"value": "iframe"
	});
	
	transport.appendTo($("body"));
	flag.appendTo(poll_form);
	
	poll_form.attr("target", transport_name);
	
	poll_form.bind("submit", function(){
		transport.bind("load", function () {
			var content = $(transport[0].contentWindow.document.documentElement);
			poll_answer.html(content.html());
			initPage(poll_answer[0]);
			transport.unbind("load");
		});

		return validate();
	});
	
	
	var validate = function() {
		return true;
	}
}

var PollCreator = function (obj) {
	var t = $(obj),
		list = $("ol", t);
	
	$(".remove", t).live("click", function (evt) {
		$(evt.target).parents("li:first").fadeOut(150, function() {$(this).remove()});
		return false;
	});
	
	$(".add", t).bind("click", function (evt) {
		var newLi = $('<li><input type="text" class="text" name="poll_variant_' + getRndStr(5)+ '"> <button class="red-button remove">убрать</button></li>');
		newLi.css("display", "none").appendTo(list);
		newLi.fadeIn(150);
		initPage(obj);
		return false;
	});
}

var UserSelector = function (obj) {
	var t = $(obj),
		tx = $("input.editor", t),
		sug = $(".user-select-dropdown", t),
		sug_list = $("ul", sug),
		user_list = $(".user-list", t),
		anitime = 150,
		drop_timeout = null;
	
	t.click(function(evt) {
		processRemove(evt, evt.target);
	});
	
	sug_list.mousedown(function (evt) {
		//begin change
        var $x = $(evt.target),
			template = '<li class="user-entry"><span class="user-name"><input type="hidden" name="user_id[]" value="{id}">{name}</span><a href="#remove-user" class="user-entry-remove">×</a></li>',
			s = $(template.replace("{name}", $x.text()).replace("{id}", $x.find("input").val()));
		//end change	
			
		s.appendTo(user_list);
		tx.val("").trigger("change");
	});

	tx.bind("focus keyup change", function () {
		if (this.value == this.prev_value) {
			return
		}
		
		this.prev_value = this.value;
		clearTimeout(drop_timeout);
		var filterResult = filterUsers(this.value);
		if (filterResult.length) {
			buildSuggestions(filterResult, this.value);
			showSuggestion();
		} else {
			hideSuggestion();
		}
	});

	tx.bind("blur", function () {
		drop_timeout = setTimeout(hideSuggestion, 10000);
	});
	
	/**
	 * @param {String} query
	 * @return Object[]
	 */
	var filterUsers = function (query) {
		if (!query) {return []}
		var friends = Paparazzi.User.Friends,
			result = [],
			result_index = 0,
			matched = false;
			
		for (var friend, i = 0, l = friends.length; i < l; ++i) {
			friend = friends[i];
			if (match(friend.name, query)) {
				matched = true;
				result[result_index++] = friend;
			}
		}
		
		return result;
	}
	
	var match = function (a, b) {
		a = a.toLowerCase().split(/\s+/);
		b = b.toLowerCase().replace(/\s+/g, "");
		
		for (var i = 0, l = a.length; i < l; ++i) {
			if (a[i].indexOf(b) == 0) {
				return true;
			}
		}
		
		return false;
	}
	
	var buildSuggestions = function (queryResult, h_part) {
		var template = '<li class="user-entry-add"><a href="#add-user"><input type="hidden" name="user_id[]" value="{id}">{name}</a></li>',
			html = "";
		
		sug_list.html(html);
		for (var q, i = 0, l = queryResult.length; i < l; ++i) {
			q = queryResult[i];
			html += template.replace("{id}", q.id).replace("{name}", highlight(q.name, h_part, '<span class="user-entry-highlight">|</span>'));
		}
		
		sug_list.html(html);
	}
	
	var highlight = function (str, fragment, template) {
		var rx = new RegExp("^(" + fragment + ")", "ig"),
			names = str.split(" ");
		for (var i = 0, l = names.length; i < l; ++i) {
			names[i] = names[i].replace(rx, template.replace("|", "$1"));
		}

		return names.join(" ");
	}
	
	var showSuggestion = function () {
		sug.fadeIn(anitime);
	}

	var hideSuggestion = function () {
		sug.fadeOut(anitime);
	}
	
	var processRemove = function (evt, x) {
		if (!x || x === obj) { tx.focus(); return false; }
		var classes = x.classList || x.className.split(" ");
		
		for (var i = 0, l = classes.length; i < l; ++i) {
			var className = classes[i];
			switch (className) {
				case "user-entry-remove": {
					$(x).parents(".user-entry:first").fadeOut(100, function() {
						$(this).remove();
					})
					break;
				}
			}
		}
		return arguments.callee(evt, x.parentNode);
	}
}

var initPage = function (node) {
	if (!node) {
		node = document.documentElement;
	}
	
	var inputs = document.getElementsByTagName("input");
	for (var i = 0, input; input = inputs[i]; ++i) {
		if (input.type == "text") {
			inputPlaceholder(input);
		}
	}

	var tx = document.getElementsByTagName("textarea");
	for (var i = 0, input; input = tx[i]; ++i) {
		inputPlaceholder(input);
	}
	
	$(".carousel", node).each(function () {
		new Carousel(this);
	});
	
	$(".gop-editor", node).each(function () {
		new GopEditor(this);
	});
	
	$(".x-toggle-loginbox", node).click(function () {
		$("#loginbox", node).toggle().find("input:first").focus();
		$("#regbox").hide();
	});

	$(".x-toggle-regbox", node).click(function () {
		$("#regbox", node).toggle().find("input:first").focus();
		$("#loginbox").hide();
	});
	
	$("#loginbox", node).find("input").bind("keyup", function (e) {
		if (e.keyCode == 27) {
			if (this.value.replace(/\s/g, "") == "") {
				$("#loginbox").hide();
			} else {
				//this.value = "";
			}
		}
	});
	
	if ($.browser.mozilla) {
		$(".red-button", node).addClass("red-button-mozilla");
	}
	$(".pp-uploader", node).map(function () {
		new PPUploader(this);
	});
	
	$(".jsx-poll", node).map(function () {
		new PollController(this);
	});
	
	$(".-x-user-selector", node).map(function () {
		new UserSelector(this);
	});
	
	$(".poll-variations", node).map(function () {
		new PollCreator(this);
	});
	
	$(".init-editor", node).map(function () {
		if (!this.id) {
			this.id = getRndStr(16);
		}
		
		var editor = new tinymce.Editor(this.id, window.comment_mce_settings);
		
		editor.render();
	});
	
	$("#friends_list").change(function(){
		var user_list = $(".user-list");
		//alert("!2");
		$("#friends_list option:selected").each(function () {
			var id = $(this).attr("value");
			var name = $(this).html();
			var template = '<li class="user-entry"><span class="user-name"><input type="hidden" name="user_id[]" value="{id}">{name}</span><a href="#remove-user" class="user-entry-remove">×</a></li>';
			var s = $(template.replace("{name}", name).replace("{id}", id));				
			s.appendTo(user_list);			
		});
	});
}	

$(function() {
	initPage();
});












































