var zIndex = 10000;
var linkzIndex = 10;
var previousOffset;
var link = 2;
var blocked = false;
var seconds = 0;
var timer_enabled = false;
var timed = 0;
var linked = false;
var finalcheck = true;
var dragged = null;
var idx = 0;

$(document).ready(function(){
  /*
  $(":file").each(function(i){
    this.onchange = HandleChanges;
    this.onmouseover = MakeActive;
    this.onmouseout = UnMakeActive;
  })*/

  if($(".im_star").html() != null) {
    $(".im_star").tooltip({effect: 'slide', tip:'#tip', position: "top right"})
  }
  if($(".im_star_bottom").html() != null) {
    $(".im_star_bottom").tooltip({effect: 'slide', tip:'#bottom_tip', position: "top right"})
  }
  if($(".im_tooltip").html() != null) {
    $(".im_tooltip").tooltip({effect: 'slide', tip:'#tooltip', position: "top right"})
  }
})

/*
function HandleChanges() {
  file = $(this).val();
  reWin = /.*\\(.*)/;
  var fileTitle = file.replace(reWin, "$1"); //выдираем название файла
  reUnix = /.*\/(.*)/;
  fileTitle = fileTitle.replace(reUnix, "$1"); //выдираем название файла
  $("#FileName_"+$(this).attr("part")).html(fileTitle).css("display","block").css("background","url(/images/icons.png) no-repeat 0 -176px");
};

function MakeActive() {
  $("#activeBrowseButton_"+$(this).attr("part")).css("display","block");
};

function UnMakeActive() {
  $("#activeBrowseButton_"+$(this).attr("part")).css("display","none");
};
*/

function unlinkHideBlock() {
  $(".hideblock").remove();
}

function makeHideBlock(id) {
  hideLayer = $("<div class='hideblock' style='z-index:99999999999;left:0px; top:0px; width:100%; height:100%;'></div>");
  hideLayer.append("<table width='100%' height='100%'><tr><td align='center' style='vertical-align:center'><img src='/images/ajax-loader.gif'/></td></tr></table>");
  $('#'+id).append(hideLayer);
}

function startDrag(element) {
  zIndex = zIndex + 1;

  if(isNaN(parseInt($(element).attr("link")))) {

    $(element).css("z-index",zIndex);
    $("#pic_"+$(element).attr("y")+"_"+$(element).attr("x")).css("z-index", (zIndex-1))

  } else {
    $("element[link='"+$(element).attr("link")+"']").each(function(){

      $(this).css("z-index", zIndex);
      $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x")).css("z-index", (zIndex-1))

    })
  }

  previousOffset = $(element).offset();
}

function checkPuzzle(element) {

  var element = element;

  var mainX = $(element).attr("x");
  var mainY = $(element).attr("y");
  var clammy = false;
  var clammyOffset;
  var clammyLink;
  var elementLink;
  var deltaX = 0;
  var deltaY = 0;
  var dx = 0;
  var dy = 0;
  var l = 2;
  var elementOffset = $(element).offset();
  var topOf = 50;
  var leftOf = 50;
  var clammyId = null;
  var clammyRawId = null;

  elementOffset.top=elementOffset.top+0;
  elementOffset.left=elementOffset.left+0;

  /* Обнуляем z-Index картинке */
  $("#pic_"+mainY+"_"+mainX).css("z-index","0");
  
  /* LEFT CLAMMY SIDE */
 
  switch(parseInt($("#element_"+mainY+"_"+mainX).attr("angle"))) {
    case 0: {
      clammyId = "#element_"+mainY+"_"+(parseInt(mainX)-1);
      clammyRawId = "element_"+mainY+"_"+(parseInt(mainX)-1);
      break;
    }
    case 90: {
      clammyId = "#element_"+(parseInt(mainY)-1)+"_"+mainX;
      clammyRawId = "element_"+(parseInt(mainY)-1)+"_"+mainX;
      break;
    }
    case 180: {
      clammyId = "#element_"+mainY+"_"+(parseInt(mainX)+1);
      clammyRawId = "element_"+mainY+"_"+(parseInt(mainX)+1);
      break;
    }
    case 270: {
      clammyId = "#element_"+(parseInt(mainY)+1)+"_"+mainX;
      clammyRawId = "element_"+(parseInt(mainY)+1)+"_"+mainX;
      break;
    }
  }
  
  /* console.log("ClammyId LEFT:"+clammyId); */

  if(clammy == false && document.getElementById(clammyRawId)) {
    clammyOffset = $(clammyId).offset();

    clammyLink = parseInt($(clammyId).attr("link"));
    elementLink = parseInt($("#element_"+mainY+"_"+mainX).attr("link"));

    if( elementOffset.top > clammyOffset.top-5 && elementOffset.top < clammyOffset.top+5 &&
        elementOffset.left-50 > clammyOffset.left-5 && elementOffset.left-50 < clammyOffset.left+5
        && ((isNaN(clammyLink) && isNaN(elementLink)) || (clammyLink!=elementLink))
        && $(element).attr("angle") == $(clammyId).attr("angle")) {

      clammy = true;
      elementOffset.top=clammyOffset.top-25;
      elementOffset.left=clammyOffset.left+50-25;

      deltaY = parseInt($("#element_"+mainY+"_"+mainX).css("top")) - elementOffset.top;
      deltaX = parseInt($("#element_"+mainY+"_"+mainX).css("left")) - elementOffset.left;

      $("#element_"+mainY+"_"+mainX).css("top",elementOffset.top).css("left",elementOffset.left);
      $("#pic_"+mainY+"_"+mainX).css("top",elementOffset.top).css("left",elementOffset.left);

      /* Linking for further movement by blocks */
      /* Если мы прилипаем к группе */
      if($(clammyId).attr("link")) {
        /* Если прилипаем группой к группе */
        if($("#element_"+mainY+"_"+mainX).attr("link")>0){
          var nlink = $(clammyId).attr("link");
          var id = "element_"+mainY+"_"+mainX;
          linked = true;

           $("div[link='"+$("#element_"+mainY+"_"+mainX).attr("link")+"']").each(function(){

             $(this).attr("link",nlink);
             $(this).css("z-index",nlink);

             /* Назначаем z-index для картинок прилипающей группы. Такой же, как у той, к которой прилипают */
             $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
               .css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
             $("#main_field").prepend($("#pic_"+$(this).attr("y")+"_"+$(this).attr("x")));

             if($(this).attr("id")!=id){

               $(this)
                  .css("top",parseInt($(this).css("top"))-deltaY).css("left",parseInt($(this).css("left"))-deltaX);
               $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
                  .css("top",parseInt($(this).css("top"))).css("left",parseInt($(this).css("left")));
             }
           });

        /* Если прилипаем кусочком к группе */
        } else {

          l = $(clammyId).attr("link");
          $("#element_"+mainY+"_"+mainX).attr({"link":l,"z-index":l});

          /* Назначаем прилипнувшей картинке z-index картинок в группе. В идеале он всегда должен быть нулевой. */
          $("#pic_"+mainY+"_"+mainX).css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
          $("#main_field").prepend($("#pic_"+mainY+"_"+mainX));
        }

      /* Слиплись 2 кусочка, каждый из которых - без группы */
      } else {

        if($("#element_"+mainY+"_"+mainX).attr("link")) {
          var nlink = $("#element_"+mainY+"_"+mainX).attr("link");
          var id = "element_"+mainY+"_"+mainX;
          linked = true;

           $("div[link='"+$("#element_"+mainY+"_"+mainX).attr("link")+"']").each(function(){

             $(this).attr("link",nlink);
             $(this).css("z-index",nlink);

             /* Назначаем z-index для картинок прилипающей группы. Такой же, как у той, к которой прилипают */
             $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
               .css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
             $("#main_field").prepend($("#pic_"+$(this).attr("y")+"_"+$(this).attr("x")));

             if($(this).attr("id")!=id){
               $(this)
                  .css("top",parseInt($(this).css("top"))-deltaY).css("left",parseInt($(this).css("left"))-deltaX);
               $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
                  .css("top",parseInt($(this).css("top"))).css("left",parseInt($(this).css("left")));
             }
           });

          $(clammyId).attr("link", nlink);
          $(clammyId).css("z-index", nlink);

        } else {
          $("#element_"+mainY+"_"+mainX).attr("link", link);
          $(clammyId).attr("link", link);
          $("#element_"+mainY+"_"+mainX).css("z-index", link);
          $(clammyId).css("z-index", link);

          /* Обнуляем z-index */
          $("#pic_"+mainY+"_"+mainX).css("z-index","0");
          $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index","0");
          $("#main_field").prepend($("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")));
          $("#main_field").prepend($("#pic_"+mainY+"_"+mainX));
          link++;
        }
      }
    }
  }

  /*TOP CLAMMY SIDE */

  switch(parseInt($("#element_"+mainY+"_"+mainX).attr("angle"))) {
    case 0: {
      clammyId = "#element_"+(parseInt(mainY)-1)+"_"+mainX;
      clammyRawId = "element_"+(parseInt(mainY)-1)+"_"+mainX;
      break;
    }
    case 90: {
      clammyId = "#element_"+mainY+"_"+(parseInt(mainX)+1);
      clammyRawId = "element_"+mainY+"_"+(parseInt(mainX)+1);
      break;
    }
    case 180: {
      clammyId = "#element_"+(parseInt(mainY)+1)+"_"+mainX;
      clammyRawId = "element_"+(parseInt(mainY)+1)+"_"+mainX;
      break;
    }
    case 270: {
      clammyId = "#element_"+mainY+"_"+(parseInt(mainX)-1);
      clammyRawId = "element_"+mainY+"_"+(parseInt(mainX)-1);
      break;
    }
  }
  /* console.log("ClammyId TOP:"+clammyId); */

  if(clammy == false && document.getElementById(clammyRawId)) {
    clammyOffset = $(clammyId).offset();
    clammyOffset.top=clammyOffset.top+0;
    clammyOffset.left=clammyOffset.left+0;

    clammyLink = parseInt($(clammyId).attr("link"));
    elementLink = parseInt($("#element_"+mainY+"_"+mainX).attr("link"));

    if( elementOffset.top-50 > clammyOffset.top-5 && elementOffset.top-50 < clammyOffset.top+5 &&
        elementOffset.left > clammyOffset.left-5 && elementOffset.left < clammyOffset.left+5
        && ((isNaN(clammyLink) && isNaN(elementLink)) || (clammyLink!=elementLink))
        && $(element).attr("angle") == $(clammyId).attr("angle")) {
      clammy = true;

      elementOffset.top=clammyOffset.top+50-25;

      elementOffset.left=clammyOffset.left-25;


      deltaY = parseInt($("#element_"+mainY+"_"+mainX).css("top")) - elementOffset.top;
      deltaX = parseInt($("#element_"+mainY+"_"+mainX).css("left")) - elementOffset.left;

      $("#element_"+mainY+"_"+mainX).css("top",elementOffset.top).css("left",elementOffset.left);
      $("#pic_"+mainY+"_"+mainX).css("top",elementOffset.top).css("left",elementOffset.left);

      /* Linking for further movement by blocks */

      if($(clammyId).attr("link")) {
        if($("#element_"+mainY+"_"+mainX).attr("link")>0){
          var nlink = $(clammyId).attr("link");
          var id = "element_"+mainY+"_"+mainX;
          linked = true;

           $("div[link='"+$("#element_"+mainY+"_"+mainX).attr("link")+"']").each(function(){
             $(this).attr("link",nlink);
             $(this).css("z-index",nlink);

             /* Назначаем z-index для картинок прилипающей группы. Такой же, как у той, к которой прилипают */
             $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
               .css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
             $("#main_field").prepend($("#pic_"+$(this).attr("y")+"_"+$(this).attr("x")));

             if($(this).attr("id")!=id) {
               $(this).css("top",parseInt($(this).css("top"))-deltaY)
                 .css("left",parseInt($(this).css("left"))-deltaX);
               $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
                  .css("top",parseInt($(this).css("top")))
                 .css("left",parseInt($(this).css("left")));
             }
           });
        } else {
          l = $(clammyId).attr("link");
          $("#element_"+mainY+"_"+mainX).attr("link", l).css("z-index", l);

          /* Назначаем прилипнувшей картинке z-index картинок в группе. В идеале он всегда должен быть нулевой. */
          $("#pic_"+mainY+"_"+mainX).css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
          $("#main_field").prepend($("#pic_"+mainY+"_"+mainX));
        }
      } else {
        if($("#element_"+mainY+"_"+mainX).attr("link")>0) {
          var nlink = $("#element_"+mainY+"_"+mainX).attr("link");
          var id = "element_"+mainY+"_"+mainX;
          linked = true;

           $("div[link='"+$("#element_"+mainY+"_"+mainX).attr("link")+"']").each(function(){
             $(this).attr("link",nlink);
             $(this).css("z-index",nlink);

             /* Назначаем z-index для картинок прилипающей группы. Такой же, как у той, к которой прилипают */
             $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
               .css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
             $("#main_field").prepend($("#pic_"+$(this).attr("y")+"_"+$(this).attr("x")));

             if($(this).attr("id")!=id) {
               $(this).css("top",parseInt($(this).css("top"))-deltaY)
                 .css("left",parseInt($(this).css("left"))-deltaX);
               $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
                  .css("top",parseInt($(this).css("top")))
                 .css("left",parseInt($(this).css("left")));
             }
           });

          $(clammyId).attr("link", nlink);
          $(clammyId).css("z-index", nlink);

        } else {
          $("#element_"+mainY+"_"+mainX).attr("link", link);
          $(clammyId).attr("link", link);
          $("#element_"+mainY+"_"+mainX).css("z-index", link);
          $(clammyId).css("z-index", link);

          /* Обнуляем z-index */
          $("#pic_"+mainY+"_"+mainX).css("z-index","0");
          $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index","0");
          $("#main_field").prepend($("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")));
          $("#main_field").prepend($("#pic_"+mainY+"_"+mainX));
        }
        link++;
      }
    }
  }

  /* RIGHT CLAMMY SIDE */

  switch(parseInt($("#element_"+mainY+"_"+mainX).attr("angle"))) {
    case 0: {
      clammyId = "#element_"+mainY+"_"+(parseInt(mainX)+1);
      clammyRawId = "element_"+mainY+"_"+(parseInt(mainX)+1);
      break;
    }
    case 90: {
      clammyId = "#element_"+(parseInt(mainY)+1)+"_"+mainX;
      clammyRawId = "element_"+(parseInt(mainY)+1)+"_"+mainX;
      break;
    }
    case 180: {
      clammyId = "#element_"+mainY+"_"+(parseInt(mainX)-1);
      clammyRawId = "element_"+mainY+"_"+(parseInt(mainX)-1);
      break;
    }
    case 270: {
      clammyId = "#element_"+(parseInt(mainY)-1)+"_"+mainX;
      clammyRawId = "element_"+(parseInt(mainY)-1)+"_"+mainX;
      break;
    }
  }
  /* console.log("ClammyId RIGHT:"+clammyId); */

  if(clammy == false && document.getElementById(clammyRawId)) {
    clammyOffset = $(clammyId).offset();
    clammyOffset.top=clammyOffset.top+0;
    clammyOffset.left=clammyOffset.left+0;

    clammyLink = parseInt($(clammyId).attr("link"));
    elementLink = parseInt($("#element_"+mainY+"_"+mainX).attr("link"));

    if( elementOffset.top > clammyOffset.top-5 && elementOffset.top < clammyOffset.top+5 &&
        elementOffset.left+50 > clammyOffset.left-5 && elementOffset.left+50 < clammyOffset.left+5
        && ((isNaN(clammyLink) && isNaN(elementLink)) || (clammyLink!=elementLink))
        && $(element).attr("angle") == $(clammyId).attr("angle")) {
      clammy = true;

        elementOffset.top=clammyOffset.top-25;
        elementOffset.left=clammyOffset.left-50-25;

      deltaY = parseInt($("#element_"+mainY+"_"+mainX).css("top")) - elementOffset.top;
      deltaX = parseInt($("#element_"+mainY+"_"+mainX).css("left")) - elementOffset.left;

      $("#element_"+mainY+"_"+mainX).css("top",elementOffset.top).css("left",elementOffset.left);
      $("#pic_"+mainY+"_"+mainX).css("top",elementOffset.top).css("left",elementOffset.left);

      /* Linking for further movement by blocks */

      if($(clammyId).attr("link")) {
        if($("#element_"+mainY+"_"+mainX).attr("link")>0){
          var nlink = $("#element_"+mainY+"_"+(parseInt(mainX)+1)).attr("link");
          var id = "element_"+mainY+"_"+mainX;
          linked = true;

           $("div[link='"+$("#element_"+mainY+"_"+mainX).attr("link")+"']").each(function(){
             $(this).attr("link",nlink);
             $(this).css("z-index",nlink);

             /* Назначаем z-index для картинок прилипающей группы. Такой же, как у той, к которой прилипают */
             $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
               .css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
             $("#main_field").prepend($("#pic_"+$(this).attr("y")+"_"+$(this).attr("x")));

             if($(this).attr("id")!=id){

               $(this).css("top",parseInt($(this).css("top"))-deltaY)
                 .css("left",parseInt($(this).css("left"))-deltaX);

               $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
      	         .css("top",parseInt($(this).css("top")))
                 .css("left",parseInt($(this).css("left")));
             }
           });
        } else {
          l = $(clammyId).attr("link");
          $("#element_"+mainY+"_"+mainX).attr("link", l).css("z-index", l);
          
          /* Назначаем прилипнувшей картинке z-index картинок в группе. В идеале он всегда должен быть нулевой. */
          $("#pic_"+mainY+"_"+mainX).css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
          $("#main_field").prepend($("#pic_"+mainY+"_"+mainX));
        }
      } else {
        if($("#element_"+mainY+"_"+mainX).attr("link")>0){
          var nlink = $("#element_"+mainY+"_"+mainX).attr("link");
          var id = "element_"+mainY+"_"+mainX;
          linked = true;

           $("div[link='"+$("#element_"+mainY+"_"+mainX).attr("link")+"']").each(function(){
             $(this).attr("link",nlink);
             $(this).css("z-index",nlink);

             /* Назначаем z-index для картинок прилипающей группы. Такой же, как у той, к которой прилипают */
             $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
               .css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
             $("#main_field").prepend($("#pic_"+$(this).attr("y")+"_"+$(this).attr("x")));

             if($(this).attr("id")!=id){

               $(this).css("top",parseInt($(this).css("top"))-deltaY)
                 .css("left",parseInt($(this).css("left"))-deltaX);

               $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
      	         .css("top",parseInt($(this).css("top")))
                 .css("left",parseInt($(this).css("left")));
             }
           });

          $(clammyId).attr("link", nlink);
          $(clammyId).css("z-index", nlink);
          
        } else {
          $("#element_"+mainY+"_"+mainX).attr("link", link);
          $(clammyId).attr("link", link);
          $("#element_"+mainY+"_"+mainX).css("z-index", link);
          $(clammyId).css("z-index", link);

          /* Обнуляем z-index */
          $("#pic_"+mainY+"_"+mainX).css("z-index","0");
          $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index","0");
          $("#main_field").prepend($("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")));
          $("#main_field").prepend($("#pic_"+mainY+"_"+mainX));
          link++;
        }
      }
    }
  }

  /* BOTTOM CLAMMY SIDE */

  switch(parseInt($("#element_"+mainY+"_"+mainX).attr("angle"))) {
    case 0: {
      clammyId = "#element_"+(parseInt(mainY)+1)+"_"+mainX;
      clammyRawId = "element_"+(parseInt(mainY)+1)+"_"+mainX;
      break;
    }
    case 90: {
      clammyId = "#element_"+mainY+"_"+(parseInt(mainX)-1);
      clammyRawId = "element_"+mainY+"_"+(parseInt(mainX)-1);
      break;
    }
    case 180: {
      clammyId = "#element_"+(parseInt(mainY)-1)+"_"+mainX;
      clammyRawId = "element_"+(parseInt(mainY)-1)+"_"+mainX;
      break;
    }
    case 270: {
      clammyId = "#element_"+mainY+"_"+(parseInt(mainX)+1);
      clammyRawId = "element_"+mainY+"_"+(parseInt(mainX)+1);
      break;
    }
  }
  /* console.log("ClammyId BOTTOM:"+clammyId); */


  if(clammy == false && document.getElementById(clammyRawId)) {
    clammyOffset = $(clammyId).offset();
    clammyOffset.top=clammyOffset.top+0;
    clammyOffset.left=clammyOffset.left+0;


    clammyLink = parseInt($(clammyId).attr("link"));
    elementLink = parseInt($("#element_"+mainY+"_"+mainX).attr("link"));

    if( elementOffset.top+50 > clammyOffset.top-5 && elementOffset.top+50 < clammyOffset.top+5 &&
        elementOffset.left > clammyOffset.left-5 && elementOffset.left < clammyOffset.left+5
        && ((isNaN(clammyLink) && isNaN(elementLink)) || (clammyLink!=elementLink))
        && $(element).attr("angle") == $(clammyId).attr("angle")) {
      clammy = true;

      elementOffset.top=clammyOffset.top-50-25;
      elementOffset.left=clammyOffset.left-25;

      deltaY = parseInt($("#element_"+mainY+"_"+mainX).css("top")) - elementOffset.top;
      deltaX = parseInt($("#element_"+mainY+"_"+mainX).css("left")) - elementOffset.left;

      $("#element_"+mainY+"_"+mainX).css("top",elementOffset.top).css("left",elementOffset.left);
      $("#pic_"+mainY+"_"+mainX).css("top",elementOffset.top).css("left",elementOffset.left);

      /* Linking for further movement by blocks */


      if($(clammyId).attr("link")) {
        if($("#element_"+mainY+"_"+mainX).attr("link")>0){
          var nlink = $("#element_"+(parseInt(mainY)+1)+"_"+mainX).attr("link");
          var id = "element_"+mainY+"_"+mainX;
          linked = true;
           $("div[link='"+$("#element_"+mainY+"_"+mainX).attr("link")+"']").each(function(){
             $(this).attr("link",nlink);
             $(this).css("z-index",nlink);

             /* Назначаем z-index для картинок прилипающей группы. Такой же, как у той, к которой прилипают */
             $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
               .css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
             $("#main_field").prepend($("#pic_"+$(this).attr("y")+"_"+$(this).attr("x")));

             if($(this).attr("id")!=id) {
               $(this).css("top",parseInt($(this).css("top"))-deltaY)
                 .css("left",parseInt($(this).css("left"))-deltaX);
               $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
      	         .css("top",parseInt($(this).css("top")))
                 .css("left",parseInt($(this).css("left")));
             }
           });
        } else {
          l = $(clammyId).attr("link");
          $("#element_"+mainY+"_"+mainX).attr("link", l).css("z-index", l);
          
          /* Назначаем прилипнувшей картинке z-index картинок в группе. В идеале он всегда должен быть нулевой. */
          $("#pic_"+mainY+"_"+mainX).css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
          $("#main_field").prepend($("#pic_"+mainY+"_"+mainX));
        }
      } else {
        if($("#element_"+mainY+"_"+mainX).attr("link")>0){
          var nlink = $("#element_"+mainY+"_"+mainX).attr("link");
          var id = "element_"+mainY+"_"+mainX;
          linked = true;
           $("div[link='"+$("#element_"+mainY+"_"+mainX).attr("link")+"']").each(function(){
             $(this).attr("link",nlink);
             $(this).css("z-index",nlink);

             /* Назначаем z-index для картинок прилипающей группы. Такой же, как у той, к которой прилипают */
             $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
               .css("z-index", $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index"));
             $("#main_field").prepend($("#pic_"+$(this).attr("y")+"_"+$(this).attr("x")));

             if($(this).attr("id")!=id) {
               $(this).css("top",parseInt($(this).css("top"))-deltaY)
                 .css("left",parseInt($(this).css("left"))-deltaX);
               $("#pic_"+$(this).attr("y")+"_"+$(this).attr("x"))
      	         .css("top",parseInt($(this).css("top")))
                 .css("left",parseInt($(this).css("left")));
             }
           });
           
          $(clammyId).attr("link", nlink);
          $(clammyId).css("z-index", nlink);

        } else {
          $("#element_"+mainY+"_"+mainX).attr("link", link);
          $(clammyId).attr("link", link);
          $("#element_"+mainY+"_"+mainX).css("z-index", link);
          $(clammyId).css("z-index", link);

          /* Обнуляем z-index */
          $("#pic_"+mainY+"_"+mainX).css("z-index","0");
          $("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")).css("z-index","0");
          $("#main_field").prepend($("#pic_"+$(clammyId).attr("y")+"_"+$(clammyId).attr("x")));
          $("#main_field").prepend($("#pic_"+mainY+"_"+mainX));
          link++;
        }
      }
    }
  }

  /* Если перемещение - обычное перемещение, без прилипания - возвращаем кусочку картинки ее предыдущие значения */
  if(isNaN($(element).attr("link")) && clammy == false) {
    $("#main_field").append($("#pic_"+mainY+"_"+mainX));
  }
  
  if(parseInt($(element).attr("link")) > 0 && clammy == false && finalcheck == true) {
   finalcheck = false;
   $("div[link='"+$(element).attr("link")+"']").each(function(){
    if(linked == false) {
      checkPuzzle(this);
    }
   });
   finalcheck = true;
  }

  linked = false;
  if(finalcheck == true) {
    if(typeof(IDENT) != "undefined") {
      if($("#element_"+mainY+"_"+mainX).attr("link") != undefined) {
        var idnr = 0;
        ev = Array();
        $("div[link='"+$("#element_"+mainY+"_"+mainX).attr("link")+"']").each(function(){
          ev[idnr] = {
            event:"move",
            x:$(this).attr("x"),
            y:$(this).attr("y"),
            angle:$(this).attr("angle"),
            pos_x:parseInt($(this).css("left")),
            pos_y:parseInt($(this).css("top")),
            link:$(this).attr("link"),
            identifier: IDENT
          };
          idnr++;
        });
      } else {
        ev = {
          event:"move",
          x:mainX,
          y:mainY,
          angle:$("#element_"+mainY+"_"+mainX).attr("angle"),
          pos_x:parseInt($("#element_"+mainY+"_"+mainX).css("left")),
          pos_y:parseInt($("#element_"+mainY+"_"+mainX).css("top")),
          link:$("#element_"+mainY+"_"+mainX).attr("link"),
          identifier: IDENT
        };
      }
      multiplexed.event(ev);
    }
    finalCheckPuzzle();
  }
}



  function finalCheckPuzzle() {

    var fieldOffset = $("#puzzle_field").offset();

    $("#element_0_0").offset();

    var error = false;
    var count = 0;
    var nulLink = document.getElementById("element_0_0").getAttribute("link");
    for(y=0; y<Y; y++) {
      for(x=0; x<X; x++) {
        lnk = parseInt(document.getElementById("element_"+y+"_"+x).getAttribute("link"));

        if(lnk > 0){
          if(lnk != nulLink) {
            error = true;
            break;
          } else {
            count++;
          }
        } else {
          error = true;
          break;
        }
      }

      if(error == true) {
        break;
      }
    }
    if(error == false) {
      if(typeof(IDENT) != "undefined") {
        $.post("/ajax/final/", {id:$("#main_field").attr("uid"),time:start_realtime, ident:IDENT},
        function(data){
          $("#main_field").css("padding","10px");
          $("#main_field").html(data);
          $("#top_menu").remove();
          $("#bottom_menu").remove();
        });
      } else {
        $.post("/ajax/final/", {id:$("#main_field").attr("uid"),time:start_realtime},
        function(data){
          $("#main_field").css("padding","10px");
          $("#main_field").html(data);
          $("#top_menu").remove();
          $("#bottom_menu").remove();
        });
      }
    }
  }
    
    function SetBG(bgcolor,tablecolor,bordercolor) {
      $("body").css("background-color",bgcolor);
      $("#puzzle_field_table").css("background-color",tablecolor).css("border","1px solid "+bordercolor);
    }

    function startTimer() {
      timer_enabled = true;
      timed++
      $("#timer_button").html("<input type='button' value='Выключить таймер' style='width:180px;' onclick='stopTimer()' class='button'/>");
      time(timed);
    }

    function time(t) {
      if(timer_enabled == true && timed == t) {
        setTimeout("time("+t+")",1000);
        seconds++;
        var op_sec = seconds;
        var res_hours = parseInt(op_sec/3600);
        op_sec = op_sec - res_hours * 3600;
        var res_minutes = parseInt(op_sec/60);
        op_sec = op_sec - res_minutes * 60;
        if(res_hours < 10) {res_hours = "0"+res_hours;};
        if(res_minutes < 10) {res_minutes = "0"+res_minutes;};
        if(op_sec < 10) {op_sec = "0"+op_sec;};
        $("#timer").html(res_hours+":"+res_minutes+":"+op_sec);
      }
    }

    function stopTimer() {
      timer_enabled = false;
      timed++;
      $("#timer_button").html("<input type='button' value='Включить таймер' style='width:180px;' onclick='startTimer()' class='button'/>");
    }


    function savePuzzle(timer) {
      var idx = 0;
      var st = new Array();
      if(parseInt($("#main_field").attr("uid")) > 0) {
        $("div[id^='element']").each(function(){
	  if(this != undefined) {
            st[idx] = {
              top:$(this).css("top"),
              left:$(this).css("left"),
              x:$(this).attr("x"),
              y:$(this).attr("y"),
              link:$(this).attr("link"),
              angle:parseInt($(this).attr("angle")),
              zIndex:parseInt($(this).css("z-index"))
            };
            idx++
	  }
        });
        $.post("/ajax/save/",{ id:$("#main_field").attr("uid"), data:$.toJSON(st), time:seconds, cookie: $.cookie('saved_'+$("#main_field").attr("uid"))},

        function(data){
          if(isNaN(parseInt(data))) {
            ErrorBlock("Не удалось сохранить ваш пазл.");
          } else {
            var date = new Date();
            date.setTime(date.getTime() + (30 * 24 * 60 * 60 * 1000));
            $.cookie('saved_'+$("#main_field").attr("uid"), parseInt(data), {domain: HTTP_HOST, path: '/', expires: date});
            MessageBlock("Ваш пазл сохранен.")
            $("#load").html("<input type='button' value='Загрузить сохранение' style='width:260px;' onclick='loadSaved()' class='button'/>");
          }
       });
      };
      if(timer == 1) {
        setTimeout("savePuzzle(1)", 600000);
      }
    }

    function ErrorBlock(error) {
      $("body").append("<div id='error' class='error'>"+error+"</div>");
      setTimeout("$('#error').remove()",4000);
    }

    function MessageBlock(message) {
      $("body").append("<div id='message' class='message'>"+message+"</div>");
      setTimeout("$('#message').remove()",4000);
    }

    function loadSaved() {
      $.post("/ajax/load/",{ id:$("#main_field").attr("uid"), cookie: $.cookie('saved_'+$("#main_field").attr("uid"))},
      function(data){
        var data = $.evalJSON(data);
        zIndex = data.zIndex;
        link = data.linkzIndex;
        if(data.time > 0) {
          seconds = data.time;
          timed++;
          stopTimer();
          var op_sec = seconds;
          $("#timer_button").html("<input type='button' value='Выключить таймер' style='width:180px' onclick='stopTimer()' class='button'/>");
          var res_hours = parseInt(op_sec/3600);
          op_sec = op_sec - res_hours * 3600;
          var res_minutes = parseInt(op_sec/60);
          op_sec = op_sec - res_minutes * 60;
          if(res_hours < 10) {res_hours = "0"+res_hours;};
          if(res_minutes < 10) {res_minutes = "0"+res_minutes;};
          if(op_sec < 10) {op_sec = "0"+op_sec;};
          $("#timer").html(res_hours+":"+res_minutes+":"+op_sec);
          setTimeout("startTimer("+timed+")",1000);
        }
        $(data.data).each(function(){
          $("#element_"+this.data_y+"_"+this.data_x).css("top",this.data_top).css("left",this.data_left).css("z-index",this.data_zIndex).attr("angle", this.data_angle);
          $("#pic_"+this.data_y+"_"+this.data_x)
            .css("top",this.data_top)
            .css("left",this.data_left) // .css("z-index",this.data_zIndex) 
            .css('background','url(/content/images/mupload/'+Math.floor($("#main_field").attr("uid")/1000)+"/"+$("#main_field").attr("uid")+"/"+this.data_y+"_"+this.data_x+"_"+this.data_angle+".png)")
          if(this.data_link > 0) {
            $("#element_"+this.data_y+"_"+this.data_x).attr("link",this.data_link);
            $("#main_field").prepend($("#pic_"+this.data_y+"_"+this.data_x));
          }
        })
        progress(0);
      });
      $("#load_button").blur();
      MessageBlock("Пазл успешно загружен.");
    }

    function rotateBox(e) {
      if(e.keyCode==38 || e.keyCode==40 || e.keyCode==32){
        if(e.keyCode==38) {
          rotateClockWise(dragged);
        } else if(e.keyCode==32) {
          rotateClockWise(dragged);
        } else {
          rotateCounterClockWise(dragged);
        }
        return false;
      } else {
        return true;
      }
      return false;
    }

    function rotateClockWise(elem) {
      if(elem != null) {
        var angle = elem.getAttribute("angle");
        (angle == 270) ? angle = 0 : angle = parseInt(angle) + 90;
        var inX = elem.getAttribute("x");
        var inY = elem.getAttribute("y");
        var in_linkX = null;
        var in_linkY = null;
        var dX = null;
        var dY = null;

        // Changing source of rotated image under mouse poiner
        src = "/images/mupload/"+Math.floor($("#main_field").attr("uid")/1000)+"/"+$("#main_field").attr("uid")
              +"/"+inY+"_"+inX
              +"_"+angle+".png";
        $("#pic_"+inY+"_"+inX)
          .css('backgroundImage','url(' + src +')');

        // Changing source of rotated image in linked images;
        if($("#element_"+inY+"_"+inX).attr("link")) {
          $("div[link='"+$("#element_"+inY+"_"+inX).attr("link")+"']").each(function(){
            if(this.id != elem.id) {

              in_linkX = $(this).attr("x");
              in_linkY = $(this).attr("y");
              dX = inX - in_linkX;
              dY = inY - in_linkY;
              
              switch(angle){
                case 0: {
                  $("#pic_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))-dY*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))-dX*50) +"px");
                  $("#element_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))-dY*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))-dX*50) +"px");
                  break;
                }
                case 90: {
                  $("#pic_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))+dX*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))-dY*50) +"px");
                  $("#element_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))+dX*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))-dY*50) +"px");
                  break;
                }
                case 180: {
                  $("#pic_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))+dY*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))+dX*50) +"px");
                  $("#element_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))+dY*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))+dX*50) +"px");
                  break;
                }
                case 270: {
                  $("#pic_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))-dX*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))+dY*50) +"px");
                  $("#element_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))-dX*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))+dY*50) +"px");
                  break;
                }
              }

              src = "/images/mupload/"+Math.floor($("#main_field").attr("uid")/1000)+"/"+$("#main_field").attr("uid")
                    +"/"+in_linkY+"_"+in_linkX
                    +"_"+angle+".png";
              $("#pic_"+in_linkY+"_"+in_linkX)
                .css('backgroundImage','url(' + src +')');

              $(this).attr("angle", angle);

            }
          })
        }
        $(elem).attr("angle", angle);
      }
    }

    function rotateCounterClockWise(elem) {
      if(elem != null) {
        var angle = elem.getAttribute("angle");
        (angle == 0) ? angle = 270 : angle = parseInt(angle) - 90;
        var inX = elem.getAttribute("x");
        var inY = elem.getAttribute("y");
        var in_linkX = null;
        var in_linkY = null;
        var dX = null;
        var dY = null;

        // Changing source of rotated image under mouse poiner
        src = "/images/mupload/"+Math.floor($("#main_field").attr("uid")/1000)+"/"+$("#main_field").attr("uid")
              +"/"+inY+"_"+inX
              +"_"+angle+".png";
        $("#pic_"+inY+"_"+inX)
          .css('backgroundImage','url(' + src +')');

        // Changing source of rotated image in linked images;
        if($("#element_"+inY+"_"+inX).attr("link")) {
          $("div[link='"+$("#element_"+inY+"_"+inX).attr("link")+"']").each(function(){
            if(this.id != elem.id) {

              in_linkX = $(this).attr("x");
              in_linkY = $(this).attr("y");
              dX = inX - in_linkX;
              dY = inY - in_linkY;
              
              switch(angle){
                case 0: {
                  $("#pic_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))-dY*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))-dX*50) +"px");
                  $("#element_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))-dY*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))-dX*50) +"px");
                  break;
                }
                case 90: {
                  $("#pic_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))+dX*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))-dY*50) +"px");
                  $("#element_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))+dX*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))-dY*50) +"px");
                  break;
                }
                case 180: {
                  $("#pic_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))+dY*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))+dX*50) +"px");
                  $("#element_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))+dY*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))+dX*50) +"px");
                  break;
                }
                case 270: {
                  $("#pic_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))-dX*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))+dY*50) +"px");
                  $("#element_"+in_linkY+"_"+in_linkX)
                    .css('top', (parseInt($("#pic_"+inY+"_"+inX).css("top"))-dX*50) +"px")
                    .css('left',(parseInt($("#pic_"+inY+"_"+inX).css("left"))+dY*50) +"px");
                  break;
                }
              }

              src = "/images/mupload/"+Math.floor($("#main_field").attr("uid")/1000)+"/"+$("#main_field").attr("uid")
                    +"/"+in_linkY+"_"+in_linkX
                    +"_"+angle+".png";
              $("#pic_"+in_linkY+"_"+in_linkX)
                .css('backgroundImage','url(' + src +')');

              $(this).attr("angle", angle);

            }
          })
        }
        $(elem).attr("angle", angle);
      }
    }

      function changeCompl(obj) {
        if($(obj).attr('compl') == "low") {
          $(obj).attr('compl', 'hi');
          $(".im_back_"+$(obj).attr('image_id')).each(function(){$(this).animate({backgroundPosition:"300px 0"}, {Duration:10000});});
          $(".im_link_"+$(obj).attr('image_id')).each(function(){$(this).attr("href","/"+$(".im_link_"+$(obj).attr('image_id')).attr('imsrc')+"/hard/");});
          $(".im_tlink_"+$(obj).attr('image_id')).each(function(){$(this).attr("href","/"+$(".im_tlink_"+$(obj).attr('image_id')).attr('imsrc')+"/hard/");});
          $(obj).attr({'src': '/content/images/icons/arrow_left_green.png'}).data("title","<strong>Сложность пазла.</strong><br/><span style='font-size:10px;'>Текущая сложность: тяжелая.<br/> Переворачивание элементов включено.</span>");
	  $("#bottom_tip").html("<strong>Сложность пазла.</strong><br/><span style='font-size:10px;'>Текущая сложность: тяжелая.<br/> Переворачивание элементов включено.</span>");
        } else {
          $(obj).attr('compl', 'low');
          $(".im_back_"+$(obj).attr('image_id')).each(function(){$(this).animate({backgroundPosition:'150px 0'},{Duration:10000})});
          $(".im_link_"+$(obj).attr('image_id')).each(function(){$(this).attr("href","/"+$(".im_link_"+$(obj).attr('image_id')).attr('imsrc')+"/");});
          $(".im_tlink_"+$(obj).attr('image_id')).each(function(){$(this).attr("href","/"+$(".im_tlink_"+$(obj).attr('image_id')).attr('imsrc')+"/");});
          $(obj).attr({'src': '/content/images/icons/arrow_left_red.png'}).data("title", "<strong>Сложность пазла.</strong><br/><span style='font-size:10px;'>Текущая сложность: легкая.<br/> Переворачивание элементов отключено.</span>");
	  $("#bottom_tip").html("<strong>Сложность пазла.</strong><br/><span style='font-size:10px;'>Текущая сложность: легкая.<br/> Переворачивание элементов отключено.</span>");
	}
      }


function progress(timer) {
  var done = 0;
  if(parseInt($("#main_field").attr("uid")) > 0) {
    $("div[id^='element']").each(function(){

      if(parseInt($(this).attr("link"))>0) {
        k = parseInt($(this).attr("link"));
        v = parseInt($("#element_"+$(this).attr("y")+"_"+(parseInt($(this).attr("x"))-1)).attr("link"));
        if(v == k) {
            done++;
          }
        v = parseInt($("#element_"+$(this).attr("y")+"_"+(parseInt($(this).attr("x"))+1)).attr("link"));
        if(v == k) {
            done++;
          }
        v = parseInt($("#element_"+(parseInt($(this).attr("y"))+1)+"_"+$(this).attr("x")).attr("link"));
        if(v == k) {
            done++;
          }
        v = parseInt($("#element_"+(parseInt($(this).attr("y"))-1)+"_"+$(this).attr("x")).attr("link"));
        if(v == k) {
            done++;
          }
      };
      idx++
    });

    total = (X*Y*4)-(X*2+Y*2);
    perc = Math.round(100/total*done);
    $("#progressbar").progressBar(perc);
  }

  
  if(timer == 1) {
    setTimeout("progress(1)", 60000);
  }
}

setTimeout("savePuzzle(1)", 600000);
setTimeout("progress(1)", 60000);
