function serialize( mixed_val ) {
    switch (typeof(mixed_val)){
        case "number":
            if (isNaN(mixed_val) || !isFinite(mixed_val)){
                return false;
            } else {
                return (Math.floor(mixed_val) == mixed_val ? "i" : "d") + ":" + mixed_val + ";";
            }
        case "string":
            return "s:" + mixed_val.length + ":\"" + mixed_val + "\";";
        case "boolean":
            return "b:" + (mixed_val ? "1" : "0") + ";";
        case "object":
            if (mixed_val == null) {
                return "N;";
            } else if (mixed_val instanceof Array) {
                var idxobj = { idx: -1 };
        var map = []
        for(var i=0; i<mixed_val.length;i++) {
            idxobj.idx++;
                        var ser = serialize(mixed_val[i]);
            if (ser) {
                            map.push(serialize(idxobj.idx) + ser)
            }
        }                                      
                return "a:" + mixed_val.length + ":{" + map.join("") + "}"
            }
            else {
                var class_name = get_class(mixed_val);
                if (class_name == undefined) {
                    return false;
                }
                var props = new Array();
                for (var prop in mixed_val) {
                    var ser = serialize(mixed_val[prop]);
                    if (ser) {
                        props.push(serialize(prop) + ser);
                    }
                }
                return "O:" + class_name.length + ":\"" + class_name + "\":" + props.length + ":{" + props.join("") + "}";
            }
        case "undefined":
            return "N;";
    }
    return false;
}


function addToBasket(productId, list) {
	try {
	  $('btnAdd' + (list ? '-' + productId : '')).style.display = 'none';
	  $('btnAddGray' + (list ? '-' + productId : '')).style.display = '';
		$('divProductOptions').style.display = 'none';
	
		var seloptions = [];
		for (var i = 0; i < $('ProductOptions').elements.length; i++) {
			if ($('ProductOptions').elements[i].type == "hidden") {
				var id = $('ProductOptions').elements[i].value;
				var rgroup = $('ProductOptions').getInputs("radio", id);
				var sel = "";
				for (key in rgroup) {
					if (rgroup[key].checked) {
						sel = rgroup[key].value;
					}
				}
				seloptions.push(id + "=" + sel);
			}
		}
		seloptions = serialize(seloptions);
		
	  new Ajax.Request('/ajax/addToBasket.html', {method: 'post',
										 														parameters: {product: productId, selvalues: seloptions},
																								onSuccess: function(transport) {
																														 try {
																							    					   var response = transport.responseText || "Упс. Что-то не так...";
																															 $('divRightBasket').innerHTML = response;
																															 $('btnAddGray' + (list ? '-' + productId : '')).style.display = 'none';
																															 $('btnAdd' + (list ? '-' + productId : '')).style.display = '';
																															 $('divProductOptions').innerHTML = '<div style="width: 100%; height: 75px; text-align: center; padding: 25px 0;"><img src="http://static.reanimedia.ru/busy_big.gif" alt="" /></div><form id="ProductOptions"></form>';
																														 } catch (err) {
																															 alert(err.name);
																														 }
																													 }});
	} catch (err) {
		alert('err.name');
	}
}

function showProductOptions(productId, list) {
	$('divProductOptions').style.display = '';
	
	var rvalue = Math.floor(Math.random() * 100001);
	
	new Ajax.Request('/ajax/showProductOptions.html',
  {
    method: 'post',
    parameters: {product: productId, rnd: rvalue},
    onSuccess: function(transport){
      var inner = transport.responseText;
			$('divProductOptions').innerHTML = inner;
    }
  });
}

var cachedImages = new Array();
    
function preloadImages() {
  for(var i = 0; i < imgs.length; i++) {
    cachedImages[i] = new Image();
    cachedImages[i].src = imgs[i];
  }
}

function showPhoto(url, w, h) {
  w += 30;
  h += 50;
  var wnd = window.open(url, null, 'width='+w+', height='+h+', toolbar=0');
  wnd.resizeTo(w, h);
  wnd.focus();
  return false;
}

function parseUri (str) {
	var	o   = parseUri.options,
		m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
		uri = {},
		i   = 14;

	while (i--) uri[o.key[i]] = m[i] || "";

	uri[o.q.name] = {};
	uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
		if ($1) uri[o.q.name][$1] = $2;
	});

	return uri;
};

parseUri.options = {
	strictMode: false,
	key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
	q:   {
		name:   "queryKey",
		parser: /(?:^|&)([^&=]*)=?([^&]*)/g
	},
	parser: {
		strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
		loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
	}
};
