// ModuleMgr.declare('homepage.typeahead')
// ModuleMgr.require('homepage.util')

Homepage.DropDownAble = {
	apply : function(element, opts){
		element.setAttribute('autocomplete', 'off')
		var xy = Homepage.Util.findPosition(element)
		xy.y += element.offsetHeight
		
		var dd = element.dd = document.body.appendChild(document.createElement('div'))
		dd.className = 'places-new_typeahead-popup'
		dd.style.top = xy.y + 'px'
		dd.style.left = xy.x + 'px'
		
		var ddTitle = dd.appendChild(document.createElement('div'))
		
		
		element.setDefaultTitle = function(){
			element.setPopupTitle(opts.defaultTitle)
		}
		element.setPopupTitle = function(title){
			Homepage.Util.dropSubNodes(ddTitle)
			ddTitle.className = "typeahead-title";
			ddTitle.appendChild(document.createTextNode(title))
		}
		element.showPopup = function(){
			clearTimeout(element.fadeTimeout)
			var xy = Homepage.Util.findPosition(element)
			dd.style.top = (xy.y + parseInt(element.offsetHeight)) + 'px'
			dd.style.left = xy.x + 'px'
			dd.style.display = 'block'
		}
		element.hidePopup = function(){
			dd.style.display = 'none'
		}
		element.fadePopup = function(ms){
			element.fadeTimeout = setTimeout(function(){
				element.hidePopup()
			}, ms)
		}
	}
}

Homepage.variantsTable = {
	apply : function(element, opts){
		element.className = 'places-new_typeahead-scroller'
		var table = element.appendChild(document.createElement('table'))
		table.className = 'places-new_typeahead-table'
		
		var nowSelected = 0
		
		element.addVariant = function(variant){
			var iPos = table.rows.length
			
			var row = table.insertRow(-1)
			row.info = variant
			var cell = row.insertCell(-1)
			cell.className = 'typeahead-cell'
			
			var title = cell.appendChild(document.createElement('div'))
			title.className = 'title'
			
			var descr = cell.appendChild(document.createElement('div'))
			descr.className = 'descr'
			
			title.appendChild(document.createTextNode(variant.title))
			descr.appendChild(document.createTextNode(variant.descr))
			
			cell.onclick = function(){
				element.goto(iPos)
				opts.onClick(element)
			}
			
		}
		element.redraw = function(){
			var total = 0
			var need = 0
			for (var i = 0; i < table.rows.length; i++) {
				var rowHeight = parseInt(table.rows[i].cells[0].offsetHeight)
				
				if (i < nowSelected)
					need += rowHeight
				total += rowHeight
				table.rows[i].className = (i == nowSelected) ? 'row-chosen' : ''
			}
			
			var to =  parseInt(need - 370 / 2)
			if (to < 0)
				to = 0
			//document.title = to
			
			
			// Мая нихуйа не понимать, какого хуйа тут творится... =(
			element.scrollTop = to
			
		}
		element.goto = function(n){
			if (n > table.rows.length - 1)
				n = table.rows.length - 1
			if (n < 0)
				n = 0
			
			nowSelected = n
			element.redraw()
		}
		element.up = function(){
			element.goto(nowSelected - 1)
		}
		element.down = function(){
			element.goto(nowSelected + 1)
		}
		element.getSelectedValue = function(){
			var row = table.rows[nowSelected]
			if (!row)
				return {}
			return row.info
		}
		
		element.clear = function(){
			for (var i = table.rows.length - 1; i >= 0; i--){
				table.deleteRow(i)
			}
		}
	}
}

Homepage.Typeahead = {
	apply : function(element, opts){
		opts.onChoose = opts.onChoose || function(){}
		opts.onBlur = opts.onBlur || function(){}
		opts.onFocus = opts.onFocus || function(){}
		var placeholders = opts.placeholders || []
		
		Homepage.DropDownAble.apply(element, opts)
		element.setDefaultTitle()
		var variants = element.dd.appendChild(document.createElement('div'))
		Homepage.variantsTable.apply(variants, {
			onClick : function(table){
				var val = table.getSelectedValue()
				
				lastValue = element.value = val.title
				element.selectedId = val.id
				opts.onChoose(val)
			}
		})
		
		var lastValue = element.value
		var beforeRequest = null
		
		element.onkeydown = function(evt){
			var keyCode = // Recipie
				document.layers ? evt.which :
				document.all ? event.keyCode :
				document.getElementById ? evt.keyCode : 0;
				// end Recipie
			if (keyCode == 38)  { // up arrow
				variants.up()
				return false
			}
			else if (keyCode == 40)  { // down arrow
				variants.down()
				return false
			}
			else if (keyCode == 13){ // enter pressed
				if (element.form)
					element.form.onsubmit = function(){
						element.form.onsubmit = function(){ return true }
						return false
					}
				
				var val = variants.getSelectedValue()
				
				if (!val || !val.title)
					return false
				
				opts.onChoose(val)
				lastValue = element.value = val.title
				element.selectedId = val.id
				
				variants.clear()
				element.hidePopup()
				return false
			}
			else if (keyCode == 27) { // esc
				variants.clear()
				element.hidePopup()
			}
		}
		element.onblur = function(){
			element.fadePopup(400)
			opts.onBlur()
		}
		element.onfocus = function(){
			opts.onFocus()
		}
		element.onkeyup = function(){
			element.setDefaultTitle()
			if (element.value == lastValue || element.value.length < opts.minChars) {
				// nothing important
			}
			else {
				lastValue = element.value
				clearTimeout(beforeRequest)
				
				try {
					var url = opts.dataUrl
					placeholders.each(function(ph){
						url = url.replace(ph[0], ph[1]())
					})
					url = url.replace('<key>', element.getValue())
					
					beforeRequest = Homepage.UrlCache.get(url,
						{
							method : 'get',
							onComplete : function(transport){
								var data = eval('(' + transport.responseText + ')')
								opts.repopulate(data, variants, element)
							}
						}, opts.wait)
				}
				catch (msg) {
					element.showPopup()
					element.setPopupTitle(msg)
					variants.clear()
				}
			}
		}
		element.getValue = function(){
			return element.value
		}
	}
}

Homepage.Multitypeahead = {
	apply : function(element, opts) {
		Homepage.DropDownAble.apply(element, opts)
		element.setDefaultTitle()
		var variants = element.dd.appendChild(document.createElement('div'))
		Homepage.variantsTable.apply(variants, {
			onClick : function(table){
				var val = table.getSelectedValue()
				
				element.choose(val.title)
				table.clear()
				element.hidePopup()
				
			}
		})
		
		
		
		element.cursorTo = function(selStart, selEnd){
			selEnd = selEnd || selStart
			if (this.setSelectionRange) {
				this.focus()
				this.setSelectionRange(selStart, selEnd)
			} else if (this.createTextRange) {
				var range = this.createTextRange()
				range.collapse(true)
				range.moveEnd('character', selEnd)
				range.moveStart('character', selStart)
				range.select()
			}
		}
		element.cursorAt = function(){
			if (this.setSelectionRange)
				return {
					from : this.selectionStart,
					to : this.selectionEnd,
					at : this.selectionEnd,
					method : 'moz'
				}
			else if (this.createTextRange) {
				throw 'Sorry, we currently cannot get selection range in IE'
			}
		}
		
		element.getState = function(){
			var at = element.cursorAt().at
			var value = element.value
			
			var left = at
			var right = at
			while (left > 0 && value.charAt(left - 1) != ';'){
				left--
			}
			while (right < value.length && value.charAt(right) != ';') {
				right++
			}
			
			return {
				at : at,
				current : value.substring(left, right),
				key : value.substring(left, at).ltrim(),
				left : left,
				right : right
			}
		}
		
		element.choose = function(word) {
			var state = element.getState()
			var before = element.value.substring(0, state.left)
			var after = element.value.substr(state.right)
			var newValue = before + ' ' + word + after
			lastValue = element.value = newValue
			element.hidePopup()
		}
		element.onblur = function(){
			element.fadePopup(400)
		}
		element.onkeydown = function(evt){
			var keyCode = // Recipie
				document.layers ? evt.which :
				document.all ? event.keyCode :
				document.getElementById ? evt.keyCode : 0;
				// end Recipie
			if (keyCode == 27)  { // up arrow
				element.hidePopup()
				return false
			}
			if (keyCode == 13) { // enter
				element.form.onsubmit = function(){
					element.form.onsubmit = function(){}
					return false
				}
				element.choose(variants.getSelectedValue().title)
				
				return false
			}
			if (keyCode == 40) {
				variants.down()
				return false
			}
			if (keyCode == 38) {
				variants.up()
				return false
			}
		}
		var beforeRequest = null
		var lastValue = element.value
		element.onkeyup = function(){
			if (element.value == lastValue){
				// nothing interesting...
				return
			}
			clearTimeout(beforeRequest)
			state = element.getState()
			if (state.key.length < opts.minChars)
				return
			url = opts.dataUrl.replace('<key>', state.key)
			beforeRequest = Homepage.UrlCache.get(url, {
				method : 'get',
				onComplete : function(transport){
					var data = eval('(' + transport.responseText + ')')
					window.title += "|_"
					opts.repopulate(data, variants, element)
				}
			}, opts.wait)
		}
	}
}

Homepage.ListOfQualities = {
	apply : function(element, opts){
		opts.onchange = opts.onchange || function(){}
		var values = []
		
		element.className = opts.tableClass || 'list-of-qualities'
		
		element.add = function(cat) {
			if (values.indexOf(cat) == -1)
				values.push(cat)
			element.redraw()
			opts.onchange(values)
		}
		element.setValues = function(newValues) {
			values.clear()
			newValues.each(function(v){
				values.push(v)
			})
			element.redraw()
			opts.onchange(values)
		}
		element.redraw = function(){
			element.clear()
			
			if (!opts.nonewline)
				values.each(function(item, rowNum){
					var row = element.insertRow(-1)
					var cell = row.insertCell(-1)
					cell.appendChild(document.createTextNode(item))
					var removerCell = row.insertCell(-1)
					var unlinkImg = removerCell.appendChild(document.createElement('img'))
					unlinkImg.src = '/images/unlink.png'
					unlinkImg.className = 'clickable'
					
					
					removerCell.onclick = function(){
						var newValues = []
						values.each(function(oldItem){
							if (oldItem != item)
							newValues.push(oldItem)
						})
						element.setValues(newValues)
					}
				})
			else {
				var row = element.insertRow(-1)
				var cell = row.insertCell(-1)
				
				values.each(function(item, number){
					var isLast = (number == values.length - 1)
					var variantSpan = cell.appendChild(document.createElement('span'))
					variantSpan.className = 'list-of-qualities--nonewline-variant'
					variantSpan.appendChild(document.createTextNode(item + ' '))
					var unlinkImg = variantSpan.appendChild(document.createElement('img'))
					unlinkImg.src = '/images/unlink.png'
					unlinkImg.className = 'clickable'
					if (!isLast)
						variantSpan.appendChild(document.createTextNode(', '))
					
					unlinkImg.onclick = function(){
						var newValues = []
						values.each(function(oldItem){
							if (oldItem != item)
								newValues.push(oldItem)
						})
						element.setValues(newValues)
					}
				})
				
			}
		}
		element.clear = function(){
			for (var i = element.rows.length - 1; i >= 0; i--) {
				element.deleteRow(i)
			}
		}
		element.contains = function(val){
			return (values.indexOf(val) != -1)
		}
		if (opts.initialValue)
			element.setValues(opts.initialValue.split(';'))
	}
}

function showMySublist(category_option) {
    var child_list = $(category_option).next().childElements();
    if (category_option.value) {
        if (child_list.length == 0) {
            storeSelectedIdInHidden(category_option);
        }
        if (!category_option.options[0].value) {
            category_option.remove(0);
        }
    } else {
        storeSelectedIdInHidden(category_option);
    }
    child_list.each(function(item) {
        if (item.id == 'sub_category_list_for_'+category_option.value) {
            item.style.display = "";
            storeSelectedIdInHidden(item);
        } else {
            item.style.display ="none";
        }
    });
}

function addCategoriesList() {
    var box = $("new__category");
    var obj = box.appendChild(box.firstDescendant().cloneNode(true));
    resetCategory(obj);
}

function resetCategory(line) {
    var sel = $(line).firstDescendant();
    sel.selectedIndex = 0;
    if (sel.value) {
        var empty = document.createElement("OPTION");
        empty.value = "";
        empty.innerHTML = " — ";
        sel.add(empty, sel.options[0]);
        sel.selectedIndex = 0;
    }
    showMySublist(sel);
}

function deleteCategory(line) {
    var box = $(line.parentNode); 
    if (box.childElements().length > 1){
        box.removeChild(line);
		// aggregateSelections();
    } else {
        resetCategory(line);
    }
    resetCustomFields();
}

function storeSelectedIdInHidden(select) {
    var obj = select.parentNode;
    if (obj.tagName == "SPAN") obj = obj.parentNode;
    obj.getElementsByTagName("INPUT")[0].value = select.value;
	// aggregateSelections();
	if (subcategoriesParents) showSubcategoriesParents();
}

function aggregateSelections() {
    var result = [], result2 = [];
    var items =  $("new__category").getElementsByTagName("INPUT");
    $A(items).each(function(item){
        result.push(item.value);
        result2.push($(item).up().firstDescendant().value);
    });
    $('cat_summary').value = result.join(" ");
	$('pcat_summary').value = result.join(" ");
	var el = $("new-category-relevant");
	if (el) {
		var items = el.getElementsByTagName("INPUT");
		var selected = [];
		for (var i = items.length; i--;) {
			if (items[i].checked) selected.push(items[i].value);
		}
	    $('rcat_summary').value = selected.join(" ");
	}
}

var subcategoriesParents = null;
var parentTitles = {};
function getSubcategoriesParents(row) {
	var subcategories = {};
	var parents = $(row).firstDescendant().options;
	for (var i = parents.length; i--;) {
		var pid = parents[i].value;
		if (pid) parentTitles[pid] = parents[i].text;
	}
	var selects = $(row).firstDescendant().next().getElementsByTagName("SELECT");
	for (var i = 0, lim = selects.length; i < lim; i++) {
		var sid = $(selects[i]).readAttribute("id").split("_")[4];
		var options = selects[i].options;
		for (var n = options.length; n--;) {
			var id = options[n].value;
			var item = subcategories[id];
			if (!item) {
				subcategories[id] = [];
				item = subcategories[id];
			}
			item.push(sid);
		}
	}
	subcategoriesParents = subcategories;
}
var unselectedParents = {};
function showSubcategoriesParents() {
	var usedParents = {}, parentsCode = [];
	var el = $("new-category-relevant");
	var unselected = {};
	var items = el.getElementsByTagName("INPUT");
	for (var i = items.length; i--;) {
		var item = items[i];
		unselectedParents[item.value] = !item.checked;
	}
	var items = $("new__category").getElementsByTagName("INPUT");
	var selectedParents = {};
	for (var i = items.length; i--;) {
		var select = $(items[i].parentNode).firstDescendant();
		if (select.value) selectedParents[select.value] = true;
	}
	for (var i = 0, lim = items.length; i < lim; i++) {
		var item = items[i];
		var parents = subcategoriesParents[item.value];
		if (!parents) continue;
		for (var p = 0, pm = parents.length; p < pm; p++) {
			var pid = parents[p];
			if (!usedParents[pid] && !selectedParents[pid]) {
				var checked = unselectedParents[pid] ? "" : ' checked="checked"';
				var chbox = '<input type="checkbox" value="' + pid + '" id="ncr' + pid + '"' + checked + '>';
				var label = '<label for="ncr' + pid + '">' + parentTitles[pid] + '</label>';
				parentsCode.push("<li>" + chbox + ' ' + label + "</li>");
				usedParents[pid] = true;
			}
		}
	}
	el.innerHTML = parentsCode.length? ("<ul>" + parentsCode.join("") + "</ul>") : "";
}
