$(document).ready(function() {

  $("div.previews a").click(function() {
    $("div.photo img").attr("src", $(this).attr("href"));
    $("div.previews a").removeClass("active");
    $(this).addClass("active");
    return false;
  });
  
  $("#buy input").click(function() {
    x_cart_set("cart", $(this).attr("sid"), 1);
    $("#cart").load("/shop/?state=1");
    anim_incart($("div.photo img"));
    $(this).attr({
      value: 'В корзине',
      disabled: 1
    });
    $(this).parent().addClass("incart");
    $(this).after("<span>Товар добавлен в <a href=\"/cart/\">корзину</a>, где вы можно изменить количество товаров</span>");
  });
  
  $("div.sbuy input").click(function() {
    x_cart_set("cart", $(this).attr("sid"), 1);
    $("#cart").load("/shop/?state=1");
    anim_incart($(this).parent().parent().find("img"));
    $(this).attr({
      value: 'В корзине',
      disabled: 1
    });
  });
  
  $("#order .chk_del").click(function() {
    if ($(this).hasClass("checked")) {
      $(this).removeClass("checked");
      var $tr = $(this).parent().parent();
      $tr.find("td").addClass("unchecked");
      $tr.find("input").attr("oldvalue", $tr.find("input").attr("value")).attr("value", 0);
      change_price($tr.find("input"));
    } else {
      $(this).addClass("checked");
      var $tr = $(this).parent().parent();
      $tr.find("td").removeClass("unchecked");
      var $oldvalue = $tr.find("input").attr("oldvalue");
      $tr.find("input").attr("value", ($oldvalue > 0 ? $oldvalue : 1));
      change_price($tr.find("input"));
    }
  });
  
  
  $("#order td.count input").bind("keyup", function() {
    change_price($(this));
  });
  
  $("#order input").attr("disabled", 0);
  $("#order form input.submit").attr("disabled", 1);
  
  $("#buy input, div.sbuy input").attr("disabled", 0);
  $("#buy input.incart, div.sbuy input.incart").attr("disabled", 1);
  
  $("#order form input[name='f_CitySel']").bind("click", function() {
    if ($(this).attr("value") > 2) {
      $("#order form .mini").slideDown(200);
      $("#order form .mega").slideUp(200);
      $("#order form label.text").addClass("required")
      $("#order form .mega label").removeClass("required")
      $("#order form label.text input[name='f_Houses']").parent().removeClass("required")
      $("#order form label.text input[name='f_Apartment']").parent().removeClass("required")
    } else {
      $("#order form .mini").slideUp(200);
      $("#order form .mega").slideDown(200);
      $("#order form label.text").removeClass("required")
      $("#order form label.text input[name='f_NameShort']").parent().addClass("required")
      $("#order form label.text input[name='f_Tel']").parent().addClass("required")
      $("#order form label.text input[name='f_Email']").parent().addClass("required")
    }
    validate_order();
  });
  
  $("#order form input").bind("keyup change", function() {
    validate_order();
  });
  
  validate_order();
  
});

function validate_order() {
  if (validate("#order form")) {
    $("#order form input.submit").attr("disabled", 0);
  } else {
    $("#order form input.submit").attr("disabled", 1);
  }
}

function validate($what) {
  var $error = false;
  $($what).find("label.required").each(function() {
    if ($(this).find("input").attr("value") != "") {
      $(this).addClass("completed");
    } else {
      $(this).removeClass("completed");
      $error = true;
    }
  });
  
  // Проверка email
  var $email = new RegExp("[0-9a-z_]+@[0-9a-z_^.]+\\.[a-z]{2,4}", 'i');
  $($what).find("label.email").each(function() {
    if ($(this).find("input").attr("value") != "") {
      if ($email.test($(this).find("input").attr("value"))) {
        $(this).removeClass("error");
      } else {
        $(this).addClass("error");
        $error = true;
      }
    } else {
      $(this).removeClass("error");
    }
  });
  
  // Проверка цифры
  var $digit = new RegExp("^[0-9]+$", 'i');
  $($what).find("label.digit").each(function() {
    if ($(this).find("input").attr("value") != "") {
      if ($digit.test($(this).find("input").attr("value"))) {
        $(this).removeClass("error");
      } else {
        $(this).addClass("error");
        $error = true;
      }
    } else {
      $(this).removeClass("error");
    }
  });  
  
  return !$error;
}

function change_price($what) {
  x_cart_set("cart", $what.attr("sid"), $what.attr("value"));
  $("input[name='f_Cart']").attr("value", serialize(x_cart("cart")));
  $("#cart").load("/shop/?state=1");
  
  var $price = $what.attr("price") * ($what.attr("value") > 0 ? $what.attr("value") : 0);
  $what.parent().parent().find("span.sum").html($price);
  
  if (!$price > 0) {
    $what.parent().parent().find("td").addClass("unchecked");
    $what.parent().parent().find(".chk_del").removeClass("checked");
    $what.parent().parent().find("td.image img").css("opacity", 0.2);
  } else {
    $what.parent().parent().find("td").removeClass("unchecked");
    $what.parent().parent().find(".chk_del").addClass("checked");
    $what.parent().parent().find("td.image img").css("opacity", 1);
  }
  var $sum = 0;
  $("#order table.list_form input").each(function() {
    $sum = $sum + $(this).attr("price") * ($(this).attr("value") > 0 ? $(this).attr("value") : 0);
  });
  
  $("#itogo").html($sum);
}

function anim_incart($image) {
  var $position = $image.position();
  $image.clone().appendTo("body").css({
    position: "absolute",
    opacity: 0.9,
    left: $position.left,
    top: $position.top
  }).animate({
    opacity: 0.7,
    width: $image.width() * 1.3,
    height: $image.height() * 1.3,
    left: $position.left - ($image.width() * 1.3 / 9),
    top: $position.top - ($image.height() * 1.3 / 9)
  }, 300, function() {
    $(this).animate({
      opacity: 0,
      width: $image.width() * 0.3,
      height: $image.height() * 0.3,
      left: $("#cart").position().left + 60,
      top: $("#cart").position().top - 10
    }, 300, function() {
      $(this).remove();
    });
  });
}


function x_cart_set($name, $id, $count) {
  $id = parseInt($id);
  $count = parseInt($count);
  $cart = new Array();
  if (getcookie($name) != null) {
    $cart = unserialize(getcookie($name));
  }
  $cart[$id] = $count;
  if (!($count > 0)) {
    delete $cart[$id];
  }
  setcookie($name, serialize($cart), time() + 60 * 60 * 24 * 14, "/");
}

function x_cart($name) {
  if (getcookie($name) != null) return unserialize(getcookie($name));
}

function time() {
  // Return current UNIX timestamp  
  // 
  // version: 910.813
  // discuss at: http://phpjs.org/functions/time
  // +   original by: GeekFG (http://geekfg.blogspot.com)
  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +   improved by: metjay
  // +   improved by: HKM
  // *     example 1: timeStamp = time();
  // *     results 1: timeStamp > 1000000000 && timeStamp < 2000000000
  
  return Math.floor(new Date().getTime() / 1000);
}

function getcookie(name) {
  var start = document.cookie.indexOf(name + "=");
  var len = start + name.length + 1;
  if ((!start) && (name != document.cookie.substring(0, name.length))) {
    return null;
  }
  if (start == -1) return null;
  var end = document.cookie.indexOf(';', len);
  if (end == -1) end = document.cookie.length;
  return unescape(document.cookie.substring(len, end));
}

function setrawcookie(name, value, expires, path, domain, secure) {
  // Send a cookie with no url encoding of the value
  // 
  // version: 909.322
  // discuss at: http://phpjs.org/functions/setrawcookie
  // + original by: Brett Zamir (http://brett-zamir.me)
  // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // + derived from: setcookie
  // * example 1: setcookie('author_name', 'Kevin van Zonneveld');
  // * returns 1: true
  if (expires instanceof Date) {
    expires = expires.toGMTString();
  } else 
    if (typeof(expires) == 'number') {
      expires = (new Date(+(new Date()) + expires * 1e3)).toGMTString();
    }
  
  var r = [name + "=" + value], s = {}, i = '';
  s = {
    expires: expires,
    path: path,
    domain: domain
  };
  for (i in s) {
    s[i] && r.push(i + "=" + s[i]);
  }
  
  return secure && r.push("secure"), this.window.document.cookie = r.join(";"), true;
}

function setcookie(name, value, expires, path, domain, secure) {
  // Send a cookie
  // 
  // version: 909.322
  // discuss at: http://phpjs.org/functions/setcookie
  // + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
  // + bugfixed by: Andreas
  // + bugfixed by: Onno Marsman
  // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // - depends on: setrawcookie
  // * example 1: setcookie('author_name', 'Kevin van Zonneveld');
  // * returns 1: true
  return this.setrawcookie(name, encodeURIComponent(value), expires, path, domain, secure);
}

function serialize(mixed_value) {
  // version: 910.813
  // discuss at: http://phpjs.org/functions/serialize
  // + original by: Arpad Ray (mailto:arpad@php.net)
  // + improved by: Dino
  // + bugfixed by: Andrej Pavlovic
  // + bugfixed by: Garagoth
  // + input by: DtTvB (http://dt.in.th/2008-09-16.string-length-in-bytes.html)
  // + bugfixed by: Russell Walker (http://www.nbill.co.uk/)
  // + bugfixed by: Jamie Beck (http://www.terabit.ca/)
  // + input by: Martin (http://www.erlenwiese.de/)
  // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // - depends on: utf8_encode
  // % note: We feel the main purpose of this function should be to ease the
  // transport of data between php & js
  // % note: Aiming for PHP-compatibility, we have to translate objects to
  // arrays
  // * example 1: serialize(['Kevin', 'van', 'Zonneveld']);
  // * returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'
  // * example 2: serialize({firstName: 'Kevin', midName: 'van', surName:
  // 'Zonneveld'});
  // * returns 2:
  // 'a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}'
  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();
      match = cons.match(/(\w+)\(/);
      if (match) {
        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 "boolean":
      val = "b:" + (mixed_value ? "1" : "0");
      break;
    case "number":
      val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" +
      mixed_value;
      break;
    case "string":
      mixed_value = this.utf8_encode(mixed_value);
      val = "s:" + encodeURIComponent(mixed_value).replace(/%../g, 'x').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] = this.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, 10) : key);
        vals += this.serialize(okey) + this.serialize(mixed_value[key]);
        count++;
      }
      val += ":" + count + ":{" + vals + "}";
      break;
    case "undefined": // Fall-through
    default: // if the JS object has a property which contains a null value, the
      // string cannot be unserialized by PHP
      val = "N";
      break;
  }
  if (type != "object" && type != "array") {
    val += ";";
  }
  return val;
}

function unserialize(data) {
  // Takes a string representation of variable and recreates it
  // 
  // version: 911.815
  // discuss at: http://phpjs.org/functions/unserialize
  // + original by: Arpad Ray (mailto:arpad@php.net)
  // + improved by: Pedro Tainha (http://www.pedrotainha.com)
  // + bugfixed by: dptr1988
  // + revised by: d3x
  // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // + input by: Brett Zamir (http://brett-zamir.me)
  // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // + improved by: Chris
  // + improved by: James
  // + input by: Martin (http://www.erlenwiese.de/)
  // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // + improved by: Le Torbi
  // + input by: kilops
  // + bugfixed by: Brett Zamir (http://brett-zamir.me)
  // - depends on: utf8_decode
  // % note: We feel the main purpose of this function should be to ease the
  // transport of data between php & js
  // % note: Aiming for PHP-compatibility, we have to translate objects to
  // arrays
  // * example 1:
  // unserialize('a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}');
  // * returns 1: ['Kevin', 'van', 'Zonneveld']
  // * example 2:
  // unserialize('a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}');
  // * returns 2: {firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'}
  var that = this;
  var utf8Overhead = function(chr) {
    // http://phpjs.org/functions/unserialize:571#comment_95906
    var code = chr.charCodeAt(0);
    if (code < 0x0080) {
      return 0;
    }
    if (code < 0x0800) {
      return 1;
    }
    return 2;
  };
  
  var error = function(type, msg, filename, line) {
    throw new that.window[type](msg, filename, line);
  };
  var read_until = function(data, offset, stopchr) {
    var buf = [];
    var chr = data.slice(offset, offset + 1);
    var i = 2;
    while (chr != stopchr) {
      if ((i + offset) > data.length) {
        error('Error', 'Invalid');
      }
      buf.push(chr);
      chr = data.slice(offset + (i - 1), offset + i);
      i += 1;
    }
    return [buf.length, buf.join('')];
  };
  var read_chrs = function(data, offset, length) {
    var buf;
    
    buf = [];
    for (var i = 0; i < length; i++) {
      var chr = data.slice(offset + (i - 1), offset + i);
      buf.push(chr);
      length -= utf8Overhead(chr);
    }
    return [buf.length, buf.join('')];
  };
  var _unserialize = function(data, offset) {
    var readdata;
    var readData;
    var chrs = 0;
    var ccount;
    var stringlength;
    var keyandchrs;
    var keys;
    
    if (!offset) {
      offset = 0;
    }
    var dtype = (data.slice(offset, offset + 1)).toLowerCase();
    
    var dataoffset = offset + 2;
    var typeconvert = function(x) {
      return x;
    };
    
    switch (dtype) {
      case 'i':
        typeconvert = function(x) {
          return parseInt(x, 10);
        };
        readData = read_until(data, dataoffset, ';');
        chrs = readData[0];
        readdata = readData[1];
        dataoffset += chrs + 1;
        break;
      case 'b':
        typeconvert = function(x) {
          return parseInt(x, 10) !== 0;
        };
        readData = read_until(data, dataoffset, ';');
        chrs = readData[0];
        readdata = readData[1];
        dataoffset += chrs + 1;
        break;
      case 'd':
        typeconvert = function(x) {
          return parseFloat(x);
        };
        readData = read_until(data, dataoffset, ';');
        chrs = readData[0];
        readdata = readData[1];
        dataoffset += chrs + 1;
        break;
      case 'n':
        readdata = null;
        break;
      case 's':
        ccount = read_until(data, dataoffset, ':');
        chrs = ccount[0];
        stringlength = ccount[1];
        dataoffset += chrs + 2;
        
        readData = read_chrs(data, dataoffset + 1, parseInt(stringlength, 10));
        chrs = readData[0];
        readdata = readData[1];
        dataoffset += chrs + 2;
        if (chrs != parseInt(stringlength, 10) && chrs != readdata.length) {
          error('SyntaxError', 'String length mismatch');
        }
        
        // Length was calculated on an utf-8 encoded string
        // so wait with decoding
        readdata = that.utf8_decode(readdata);
        break;
      case 'a':
        readdata = {};
        
        keyandchrs = read_until(data, dataoffset, ':');
        chrs = keyandchrs[0];
        keys = keyandchrs[1];
        dataoffset += chrs + 2;
        
        for (var i = 0; i < parseInt(keys, 10); i++) {
          var kprops = _unserialize(data, dataoffset);
          var kchrs = kprops[1];
          var key = kprops[2];
          dataoffset += kchrs;
          
          var vprops = _unserialize(data, dataoffset);
          var vchrs = vprops[1];
          var value = vprops[2];
          dataoffset += vchrs;
          
          readdata[key] = value;
        }
        
        dataoffset += 1;
        break;
      default:
        error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
        break;
    }
    return [dtype, dataoffset - offset, typeconvert(readdata)];
  };
  
  return _unserialize((data + ''), 0)[2];
}

function utf8_decode(str_data) {
  // Converts a UTF-8 encoded string to ISO-8859-1  
  // 
  // version: 909.322
  // discuss at: http://phpjs.org/functions/utf8_decode
  // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
  // +      input by: Aman Gupta
  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +   improved by: Norman "zEh" Fuchs
  // +   bugfixed by: hitwork
  // +   bugfixed by: Onno Marsman
  // +      input by: Brett Zamir (http://brett-zamir.me)
  // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // *     example 1: utf8_decode('Kevin van Zonneveld');
  // *     returns 1: 'Kevin van Zonneveld'
  var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;
  
  str_data += '';
  
  while (i < str_data.length) {
    c1 = str_data.charCodeAt(i);
    if (c1 < 128) {
      tmp_arr[ac++] = String.fromCharCode(c1);
      i++;
    } else 
      if ((c1 > 191) && (c1 < 224)) {
        c2 = str_data.charCodeAt(i + 1);
        tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
        i += 2;
      } else {
        c2 = str_data.charCodeAt(i + 1);
        c3 = str_data.charCodeAt(i + 2);
        tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
        i += 3;
      }
  }
  
  return tmp_arr.join('');
}

function utf8_encode(argString) {
  // Encodes an ISO-8859-1 string to UTF-8  
  // 
  // version: 909.322
  // discuss at: http://phpjs.org/functions/utf8_encode
  // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +   improved by: sowberry
  // +    tweaked by: Jack
  // +   bugfixed by: Onno Marsman
  // +   improved by: Yves Sucaet
  // +   bugfixed by: Onno Marsman
  // +   bugfixed by: Ulrich
  // *     example 1: utf8_encode('Kevin van Zonneveld');
  // *     returns 1: 'Kevin van Zonneveld'
  var string = (argString + ''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");
  var utftext = "";
  var start, end;
  var stringl = 0;
  
  start = end = 0;
  stringl = string.length;
  for (var n = 0; n < stringl; n++) {
    var c1 = string.charCodeAt(n);
    var enc = null;
    
    if (c1 < 128) {
      end++;
    } else 
      if (c1 > 127 && c1 < 2048) {
        enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
      } else {
        enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
      }
    if (enc !== null) {
      if (end > start) {
        utftext += string.substring(start, end);
      }
      utftext += enc;
      start = end = n + 1;
    }
  }
  
  if (end > start) {
    utftext += string.substring(start, string.length);
  }
  
  return utftext;
}
