/*
 * @Author Mennanov Renat
 * @Email mennanov@gmail.com
 * 2009
 *
 */
var items=[];
var cats=[];
$(document).ready(function(){
	$("#reset").click(function(){
		document.getElementById("calc").reset();
		items=[];
		getSumm(true);
		recheck=false;
		return false;
	});
	
	$("a[rel='submit']").click(function(){
		if(items.length>0)
		{
			$("#calc_field").val(serialize(items));
			document.getElementById('contact_form').submit();
		}
		else
		alert("Вы не выбрали ни одного пункта!");
	});
});

	function calc_check(elem, isSelect)
	{
		if(!isSelect)
		{
			if($(elem).is(":checked"))
			{
				// item отмечен, добавляем его в массив, а также нередактируемые поля
				$(elem).parents("ul").find("input:disabled").each(function(i){
					$(this).attr("checked", true);
					addItem(this);
				});
				addItem(elem);
			}
			else
			{
				// удаляем из массива
				delItem(elem);
			}
		}
		else
		{
			if($(elem).val()!=0)
			{
				addItem(elem);
			}
			else
			{
				delItem(elem);
			}
		}
		// подсчитываем сумму, выводим все описания опций только в том случае если элемент НЕ является потомком другого
		var reprint=($(elem).attr("parent")==0);
		getSumm(reprint);
	}
	
	function calc_checkbox(elem)
	{
		if($(elem).is(":checked"))
		{
			$(elem).parent("p").next("ul:fist").find("input:first,input:disabled").attr("checked", true);
			$(elem).parent("p").next("ul:fist").find("input:first,input:disabled").each(function(i){
				addItem(this);
			});
		}
		else
		{
			// получаем список опций категории и удаляем их из массива
			$(elem).parent("p").next("ul:fist").find("input:checked").each(function (i){
				delItem(this);
			});
			$(elem).parent("p").next("ul:fist").find("input").attr("checked", false);
		}
		getSumm(true);
	}


function getSumm(reprint)
{
	var summ=0;
	for ( key in items)
	{
		summ+=items[key]['price'];
	}
	// выводим сумму в калькулятор
	$(".summ").text(summ);
	$(".prepay").text(summ/2);
	$(".nds").text(Math.round(summ-summ/1.18));
	if(reprint)
	{
		// выводим описания и прочее в шаблон
		var output='';
		// пробегаем массив с категориями и смотрим выбраны ли там опции
		for(cat_key in cats)
		{
			cat_id=cats[cat_key]['id'];
			catitems_keys=getItemsByAttr("cat", cat_id);
			catitems=[];
			// опции категории нашли, передаем все данные в шаблон
			if(catitems_keys.length>0)
			{
				var i=0;
				for(key in catitems_keys)
				{
					catitems[i]=items[catitems_keys[key]];
					i++;
				}
				cat_key=getCatByAttr("id", cat_id);
				output+=TrimPath.processDOMTemplate("rightTPL", {cat : cats[cat_key], items: catitems });
			}
		}
		$("#result").html(output);
		// получаем все НЕкорневые элементы и отмечаем выбранные значения
		var child_keys=getItemsByAttrGT("parent", 0);
		for (key in child_keys)
		{
			ikey=child_keys[key];
			// помечаем выбранные чекбоксы и радио кнопки
			$("#result input[id="+items[ikey]['id']+"]").attr("checked", true);
			// выбираем выбранные значения селектов
			$("#result select[id="+items[ikey]['id']+"] option[value='"+items[ikey]['price']+"']").attr("selected","selected")
		}
		if(recheck)
		{
					// получаем все корневые элементы и отмечаем выбранные значения
					var child_keys=getItemsByAttr("parent", 0);
					for (key in child_keys)
					{
						ikey=child_keys[key];
						// помечаем выбранные чекбоксы и радио кнопки
						$("input[id="+items[ikey]['id']+"]").attr("checked", true);
						// выбираем выбранные значения селектов
						$("select[id="+items[ikey]['id']+"] option[value='"+items[ikey]['price']+"']").attr("selected","selected");
						// помечаем чекбокс с категорией элемента
						$("*[id="+items[ikey]['id']+"]").parent("li").parent("ul").prev("p").find(".cat_checkbox").attr("checked", true);
					}
                    recheck=false;
		}
	}	
}

function addItem(elem)
{
		description=$("#t_"+$(elem).attr("id")).val();
		sub=$(elem).siblings(".sub:first").html();
		if(sub) 
		items[$(elem).attr("name")]={ price: parseInt($(elem).val()), id: $(elem).attr("id"), desc: $(elem).attr("desc"),  name: $(elem).attr("name"), parent: $(elem).attr("parent"), cat: $(elem).attr("cat"), description: description, sub: sub };
		else
		items[$(elem).attr("name")]={ price: parseInt($(elem).val()), id: $(elem).attr("id"), desc: $(elem).attr("desc"),  name: $(elem).attr("name"), parent: $(elem).attr("parent"), cat: $(elem).attr("cat"), description: description};
		// помечаем чекбокс с его категорией
		$(elem).parent("li").parent("ul").prev("p").find(".cat_checkbox").attr("checked", true);
}

function delItem(elem)
{
	recursiveDel($(elem).attr("name"), $(elem).attr("id"));
	// проверяем был ли это последний элемент в категории,если да, убираем чекбокс с категории
	if($(elem).parent("li").parent("ul").find(":checked").length<1)
	{
		$(elem).parent("li").parent("ul").prev("p").find(".cat_checkbox").attr("checked", false);
	}

}

function recursiveDel(name, id)
{
	item_id=(id)? id : 0;
	// удаляем его потомков
	var keys=getItemsByAttr("parent", item_id);
	for (key in keys)
	{
		if(items[keys[key]])
		{
			recursiveDel(items[keys[key]]['name'], items[keys[key]]['id']);
		}
	}
	delete items[name];
}

function getItemsByAttr(attr, val)
{
	var ret=[];
	var i=0;
	for (key in items)
	{
		if(items[key][attr]==val)
		{
			ret[i]=key;
		}
		i++;
	}
	return ret;
}

function getCatByAttr(attr, val)
{
	for (key in cats)
	{
		if(cats[key][attr]==val)
		{
			return key;
		}
	}
	return false;
}

function getItemsByAttrGT(attr, val)
{
	var ret=[];
	var i=0;
	for (key in items)
	{
		if(items[key][attr]>val)
		{
			ret[i]=key;
		}
		i++;
	}
	return ret;
}

function itd()
{
	var out='';
	for(key in items)
	{
		out+='['+key+']='+items[key]['desc']+'\n';
	}
	return out;
}

function restoreItems(list)
{
    for(var index in list)
        {
            var item=list[index];
            // если это селект, выставим ему его значение (в нашем случае это price у элемента)
            if($("#"+item['id']+" > option").size()>0)
            {
                $("#"+item['id']).val(item['price']);
            }
            addItem($("#"+item['id']));
        }
}

function serialize( mixed_value ) {
    // http://kevin.vanzo
    // nneveld.net
    var _getType = function( inp ) {
        var type = typeof inp, match;
        var key;
        if (type == 'object' && !inp) {
            return 'null';
        }
        if (type == "object") {
            if (!inp.constructor) {
                return 'object';
            }
            var cons = inp.constructor.toString();
            if (match = cons.match(/(\w+)\(/)) {
                cons = match[1].toLowerCase();
            }
            var types = ["boolean", "number", "string", "array"];
            for (key in types) {
                if (cons == types[key]) {
                    type = types[key];
                    break;
                }
            }
        }
        return type;
    };
    var type = _getType(mixed_value);
    var val, ktype = '';
    
    switch (type) {
        case "function": 
            val = ""; 
            break;
        case "undefined":
            val = "N";
            break;
        case "boolean":
            val = "b:" + (mixed_value ? "1" : "0");
            break;
        case "number":
            val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
            break;
        case "string":
            val = "s:" + mixed_value.length + ":\"" + mixed_value + "\"";
            break;
        case "array":
        case "object":
            val = "a";
            /*
            if (type == "object") {
                var objname = mixed_value.constructor.toString().match(/(\w+)\(\)/);
                if (objname == undefined) {
                    return;
                }
                objname[1] = serialize(objname[1]);
                val = "O" + objname[1].substring(1, objname[1].length - 1);
            }
            */
            var count = 0;
            var vals = "";
            var okey;
            var key;
            for (key in mixed_value) {
                ktype = _getType(mixed_value[key]);
                if (ktype == "function") { 
                    continue; 
                }
                
                okey = (key.match(/^[0-9]+$/) ? parseInt(key) : key);
                vals += serialize(okey) +
                        serialize(mixed_value[key]);
                count++;
            }
            val += ":" + count + ":{" + vals + "}";
            break;
    }
    if (type != "object" && type != "array") val += ";";
    return val;
}

