function BigCover(ID){
  document.getElementById('bookcover_'+ID).style.display = 'block';
}

function CloseCover(ID){
  document.getElementById('bookcover_'+ID).style.display = 'none';
}

currentExpanded=0;
collapsePrevious=0;

function ExpandNode(nodeId, dspl){
  dspl = dspl ? dspl : 'block';
  clickedElement=document.getElementById(nodeId).style;
  if (!clickedElement)
    clickedElement=document.all.nodeId.style
  if (!clickedElement)
    return 1
  if (clickedElement.display == dspl){
    clickedElement.display="none";
    if (document.getElementById('img_'+nodeId))
      document.getElementById('img_'+nodeId).src=document.getElementById('img_'+nodeId).src.replace('minus.gif',"plus.gif");
  } else {
    if ((currentExpanded) && (collapsePrevious))
      currentExpanded.display = "none";
    currentExpanded=clickedElement;
    currentExpanded.display = dspl;
    if (document.getElementById('img_'+nodeId))
    document.getElementById('img_'+nodeId).src=document.getElementById('img_'+nodeId).src.replace("plus.gif",'minus.gif');
  }
  ToggledAlready=1;
}

function chkgrp(itemname){
    SubItems=document.getElementById(itemname)
    for (i=0;i != SubItems.getElementsByTagName("input").length;i++){
      SubItems.getElementsByTagName("input").item(i).checked = document.getElementById('genre_'+itemname).checked
    }
}

function UnchPrnt(name){
  document.getElementById('genre_'+name).checked=0
}

function ShowHide(id)
{
  var itm = null;
  if (document.getElementById) {
    itm = document.getElementById(id);
  } else if (document.all){
    itm = document.all[id];
  } else if (document.layers){
    itm = document.layers[id];
  }

  if (!itm) {
    // do nothing
  } else {
    if (itm.style) {
      if (itm.style.display == "none") {
        itm.style.display = "";
      } else {
        itm.style.display = "none";
      }
    } else {
      itm.visibility = "show";
    }
  }
}

function ToggleDefaultText(el,txt,ins,elinit){
  if (el && txt){
    if (elinit){
      el.onfocus = function(){ ToggleDefaultText(el, txt, false); };
      el.onblur  = function(){ ToggleDefaultText(el, txt, true); };
      if (el.form){
        var tt = el.form.onsubmit;
        el.form.onsubmit = function(){
          if (el.value == txt) el.value = '';
          return tt ? tt.call() : true;
        }
      }
      ToggleDefaultText(el, txt, true);
    }else if (ins){
      if (el.value == '') el.value = txt;
      if (el.value == txt) el.className += ' def_txt';
    } else {
      if (el.value == txt) {
        el.value = '';
        el.className = el.className.replace(/\s*def_txt\b/g,'');
      }
    }
  }
}

function AddAuth()
{
  var el = document.subscribe_form.author_list;
  ToggleDefaultText(el, auth_list_def_txt, false);
  el.value += document.subscribe_form.author_choose.value + '\n';
}

function ExpandSubscribeForm(val)
{
  document.getElementById('subscribe_options').style.display=val>0?'block':'none';
  document.getElementById('genres').style.display=val==2?'block':'none';
  document.getElementById('genres_text').style.display=val==2?'block':'none';
  document.getElementById('pattern').style.display=val==2?'block':'none';
  document.getElementById('pattern_text').style.display=val==2?'block':'none';
  document.getElementById('authors').style.display=val==2?'block':'none';
  document.getElementById('authors_text').style.display=val==2?'block':'none';

  if (document.getElementById('email'))
  {
    document.getElementById('email').style.display=val>0?'block':'none';
  }
}


function ExpandSubscribeNewArts(elem) {
	var show_options = new Object();

	switch( elem.value )	{
		case '1':
			show_options.authors = elem.checked;
			break;
		case '2':
			show_options.genres = elem.checked;
			break;
		default:
	}

	if (show_options.authors != undefined) {
		document.getElementById('authors').style.display = show_options.authors ? 'block' : 'none';
		document.getElementById('authors_text').style.display = show_options.authors ? 'block' : 'none';

		document.getElementById('pattern').style.display = show_options.authors ? 'block' : 'none';
		document.getElementById('pattern_text').style.display = show_options.authors ? 'block' : 'none';
	}

	if (show_options.genres != undefined) {
		document.getElementById('genres').style.display = show_options.genres ? 'block' : 'none';
		document.getElementById('genres_text').style.display = show_options.genres ? 'block' : 'none';
	}

	return;
}

function AlertSubscr(elem, msg) {
	if ( elem.checked && msg.length > 0 ) alert( msg.replace(/\n|\t|\r/g, "") );
	SubscribeFormState();
	return true;
}

function SubscribeFormState() {
	var theForm = document.subscribe_form;
	var formState = theForm.subscr_email.checked || theForm.subscr_sms.checked; // at least one checkbox is checked
	jQuery("form[name=subscribe_form] :input[type!='submit'][type!='hidden'][name!='subscr_email'][name!='subscr_sms'][name!='subscribe_new_buys']").attr( 'disabled', !formState );
	return;
}

function reqMSISDNConfirm() {
	var Request = {
		url: '/pages/ajax_epmty/',
		OnData:function(Data) {
			if ( Data == 'ok' ) {
				jQuery("#span_request_confirm_msisdn").hide();
				jQuery("#span_confirm_msisdn").show();
				jQuery("#phone2subscr").val('');
				jQuery("#msisdn_confirm_code").val('');
				jQuery("#msisdn_confirm_code").focus();
			}
			else if ( /rereq_too_early/.test(Data[0])  ) {
				jQuery("#msisdn_confirm_code").val('');
				alert( 'Слишком частые запросы на подтверждение. Возьмите паузу на две-три минуты' );
			}
			else {
				alert( 'При подтверждении мобильного номера произошла ошибка' );
			}
		},
		params: { action:'req_msisdn_confirm', rand:Math.random() }
	};
	GUJ.PutRequest(Request);
	return false;
}


function storeMSISDNConfirm() {
	var code = jQuery('#msisdn_confirm_code').val();

	if (code.length > 4) {
		alert('Пожалуйста, введите код подтверждения');
		jQuery("#msisdn_confirm_code").focus();
		return false;
	}

	var Request = {
		url: '/pages/ajax_epmty/',
		OnData:function(Data) {
			if ( Data == 'ok' ) {
				jQuery("#span_request_confirm_msisdn").hide();
				jQuery("#span_confirm_msisdn").hide();
				jQuery("#msisdn_confirm_code").val('');
				jQuery("#phone2subscr").val('');
				alert( 'Ваш телефонный номер подтвержден, спасибо.' );
			}
			else if ( /code_not_match/.test(Data[0])  ) {
				jQuery("#msisdn_confirm_code").val('');
				alert( 'Неправильный код подтверждения' );
			}
			else {
				alert( 'При подтверждении телефонного номера произошла ошибка' );
			}
		},
		params: { action:'store_msisdn_confirm',	msisdn_confirm_code:code, rand:Math.random() }
	};
	GUJ.PutRequest(Request);
	return false;
}


function StoreAndConfirmMSISDN() {

	var phone = jQuery('#phone2subscr').val();

	if (phone.length < 10) {
		alert('Пожалуйста, введите мобильный номер');
		jQuery("#phone2subscr").focus();
		return false;
	}

	var valid_mobile = ValidatePhone( phone, 'mobile' );

	if (valid_mobile != 1) {
		alert(valid_mobile);
		return false;
	}

	var Request = {
		url: '/pages/ajax_epmty/',
		OnData:function(Data) {
			var ok;

			if ( Data == 'ok' ) {
				ok = 'ok';
			}
			else if ( /rereq_too_early/.test(Data[0])  ) {
				jQuery("#msisdn_confirm_code").val('');
				alert( 'Слишком частые запросы на подтверждение. Возьмите паузу на две-три минуты' );
			}
			else if ( /phone_exists/.test(Data[0])  ) {
				ok = 'ok';
				alert( 'Введенный вами телефон присутствует в профиле другого пользователя. Возможно, вам следует восстановить доступ к вашей старой учетной записи, а не регистрироваться заново. Попробуйте восстановить пароль на e-mail или купить книгу без регистрации отправкой SMS (при этом вы получите доступ к акаунту немедленно и сможете сменить пароль и заполнить профиль).' );
			}
			else {
				alert( 'При добавлении мобильного номера произошла ошибка' );
			}

			if ( ok == 'ok' ) {
				jQuery("#span_request_msisdn").hide();
				jQuery("#span_confirm_msisdn").show();
				jQuery("#subscr_sms").attr( 'disabled', false );
			}

		},
		params: { action:'store_n_confirm_msisdn', phone2subscr:phone, rand:Math.random() }
	};
	GUJ.PutRequest(Request);
	return false;
}

function reqEmailConfirm() {
	var Request = {
		url: '/pages/ajax_epmty/',
		OnData:function(Data) {
			if ( Data == 'ok' ) {
				jQuery("#span_request_confirm_email").hide();
				jQuery("#span_email_req_sent").show();
			}
			else {
				alert( 'При подтверждении email произошла ошибка' );
			}
		},
		params: { action:'confirm_resend', no_redirect:'1', rand:Math.random() }
	};
	GUJ.PutRequest(Request);
	return false;
}


function StoreAndConfirmEmail() {

	var email = jQuery('#email2subscr').val();

	if ( email.length < 7 || !MailOK(email) ) {
		alert('Электронную почту необходимо указывать в правильном формате, например: ivan.ivanovich@litres.ru\n\n');
		jQuery("#email2subscr").focus();
		return false;
	}

	var Request = {
		url: '/pages/ajax_epmty/',
		OnData:function(Data) {
			if ( Data == 'ok' ) {
				jQuery("#span_request_email").hide();
				jQuery("#span_email_req_sent").show();
				jQuery("#subscr_email").attr( 'disabled', false );
			}
			else if ( /email_exists/.test(Data[0])  ) {
				jQuery("#email2subscr").val('');
				alert('E-mail уже принадлежит другому пользователю. Возможно, вам следует восстановить пароль или объединить учетные записи.');
			}
			else {
				alert( 'При добавлении E-mail произошла ошибка' );
			}
		},
		params: { action:'store_n_confirm_email', email2subscr:email, rand:Math.random() }
	};
	GUJ.PutRequest(Request);
	return false;
}

function SubmitPopOffersForm() {

	AppendUtcOffsetInput2Form('frm_popup_offers');

	var theForm = document.popup_offers_form;
	if (theForm.mail == undefined) {
		theForm.submit();
		return;
	}
	var email = theForm.mail.value;
	if (MailOK(email) != 2) {
		alert("Электронную почту необходимо указывать в правильном формате, например: ivan.ivanovich@litres.ru\n\n");
		return false;
	}

	var curr_date = new Date();
	var utc_offset_min = -curr_date.getTimezoneOffset();

	var Request = {
		url: '/pages/ajax_epmty/',
		OnData:function(Data) {
			if ( Data == 'ok') {
				theForm.submit();
				return;
			}
			else if ( /email_exists/.test(Data[0]) ) {
				alert("E-mail уже принадлежит другому пользователю. Возможно, вам следует восстановить пароль, а не регистрировать E-mail заново?");
				return false;
			}
			else {
				alert("Произошла ошибка : " + Data[0]);
				return false;
			}
		},
		params: { action:'check_email_for_user', email2check:email, utc_offset_min:utc_offset_min, rand:Math.random() }
	};

	GUJ.PutRequest(Request);
	return false;
}

function SecretWord4HardCopy(art, page_num) {

	var last_word = jQuery('#last_word4copy').val();

	if ( /^\s*$/.test(last_word) ) {
		alert("Нужно указать слово");
		return false;
	}
	var Request = {
		url: '/pages/ajax_epmty/',
		OnData:function(Data) {
			if ( Data == 'ok') {
				top.location.href = '/pages/biblio_book/?art=' + art;
				return;
			}
			else if ( /wrong_word/.test(Data[0]) ) {
				alert("Неправильное слово.");
				return false;
			}
			else {
				alert("Произошла ошибка : " + Data[0]);
				return false;
			}
		},
		params: { action:'word4copy', art:art, last_word:last_word, page_num:page_num, rand:Math.random() }
	};

	GUJ.PutRequest(Request);
	return false;
}

function submitOffEnter(e) {
     var key;
     if(window.event)
          key = e.keyCode;    //MSIE
     else
          key = e.which;     //firefox, opera etc

     if(key == 13)
          return false;
     else
          return true;
}

function AppendUtcOffsetInput2Form(form_id) {
	if (!form_id) return;
	if( jQuery('#' + form_id + ' input[name=utc_offset_min]').length > 0 ) return;
	var curr_date = new Date()
	var utc_offset_min = -curr_date.getTimezoneOffset();
	jQuery('#' + form_id).append(jQuery('<input type="hidden" name="utc_offset_min" value="'+utc_offset_min+'" />'));

	if( jQuery('#' + form_id + ' input[name=timestamp]').length == 0 ) {
	  jQuery('#' + form_id).append(jQuery('<input type="hidden" name="timestamp" value="'+curr_date.getTime()+'" />'));
	}

	return;
}



function PollForDRM(art, atext) {
	if ( !/^\d+$/.test(art) || !atext.length ) return;
	var Request = {
		url: '/pages/ajax_check_drm/',
		OnData:function(Data) {
			if ( Data.status == 'url_delivered') {
				jQuery('#download_ok').html('' + atext + '');
				return;
			}
			else if ( Data.status == 'pending_url' ) {
				setTimeout("PollForDRM("+art+", '"+atext+"')", 5000);
				return;
			}
			else {
				alert("При доставке файла вашей книги произошла ошибка.");
				return;
			}
		},
		params: { art:art, rand:Math.random() }
	};
	GUJ.PutRequest(Request);
	return;
}


function BuyNowDiscount(FormID, Total, UserMoney) {
	var SumNeeded = Total - UserMoney;

	if (SumNeeded <= 0) {
			var CMess = 'После покупки с вашего счета будет списано ' + Math.ceil(Total) + ' р.';
			var CFunc = function () {	 execBuyDiscount(FormID, SumNeeded )	};

			alertBox.errorStickerButtons[0].value='OK';
			alertBox.alert( CMess, CFunc );

			return false;
	} else execBuyDiscount(FormID, SumNeeded );

	return false;
}

function execBuyDiscount(FormID, SumNeeded ) {
	jQuery('#' + FormID).append(jQuery('<input type="hidden" name="sum_needed" value="'+SumNeeded+'" />'));
	jQuery('form#' + FormID).submit();
	return;
}


function ChkLanguage(val)
{
  if (val == 2) {
		document.getElementById('langs').style.display = 'inline';
  } else {
		document.getElementById('langs').style.display = 'none';
  }
}

function switchVisibility (id) {
  el = document.getElementById (id).style;
	im = document.getElementById ('ei_' + id);

  if (el.display == "block") {
		el.display = "none";
		im.src = "/static/img/expand.gif";
	} else {
		el.display = "block";
		im.src = "/static/img/collapse.gif";
	}
}

function HideNavigation (e_pos,id) {
	e_pos.innerHTML = '<a href="DrawNavigation (this.parentNode,'+id+')">Папки</a>';
}

function DrawConfig (id,capt) {
	document.getElementById ("div_conf").style.display = "block";
	document.getElementById ("create_input").value = id;
	document.getElementById ("ren_input").value = id;
	document.getElementById ("ren_input_txt").value = capt;
	document.getElementById ("span_capt").innerHTML = capt;
	if (id == 0) {
		document.getElementById ("ren_input_txt").disabled = true;
	} else {
		document.getElementById ("ren_input_txt").disabled = false;
	}
}

function InsertOptInCombo (el,id) {
	el.innerHTML = '<option value="0" selected>Перенести в…</option>' + combo_text;
//  document.getElementById ("submit_move_" + id).style.display = "block";
}

function DrawSubmitButton (id,v) {
  document.getElementById ("submit_move_" + id).style.display = (v!=0)?"block":"none";
}

function CoolClk(id){
  document.getElementById(id).click();
}
function DButn(id){
  document.getElementById(id).disabled=true;
}

function ShowFrame (path, medium) {
  if (medium) {
    window.open (path, '', 'scrollbars=1,resizable=1,width=900,height=700');
  } else {
    window.open (path, '', 'scrollbars=1,resizable=1,width=500,height=300');
  }
}

function SelAvatar (id,img) {
  window.opener.document.getElementById ('avatar_img').src = '/static/users/' + img;
  window.opener.document.getElementById ('avatar_id').value = img;
  window.opener.document.getElementById ('id_avatar').value = id;
  self.close ();
}

function AddRecArt (id,capt) {
	var art_id_input = window.opener.document.getElementById ('art_id');

	if (art_id_input.value.search (id) >= 0) {
		return;
	}

	window.opener.document.getElementById ('art_name_div').innerHTML += '<h2>«' + capt + '»</h2>';
	art_id_input.value += id + ';';
	self.close ();
}

function switchDisplay (el_capt,link_capt,vis_txt,unvis_txt) {
  var el = document.getElementById (el_capt);
  var link = document.getElementById (link_capt);
  if (el.style.display == 'none') {
    el.style.display = 'block';
    link.innerHTML = vis_txt;
  } else {
    el.style.display = 'none';
    link.innerHTML = unvis_txt;
  }
}

function TextAreaMaxLength(Object, MaxLen) {
  Object.value = Object.value.substring(0,MaxLen);
}


function SearchResultsHL(hlstrings){
  var HLStrings=hlstrings.split(' ');
	var Changed = 0;
	var Hcode = document.getElementById('searchresults').innerHTML
  for (i=0;i < HLStrings.length;i++){
		if (HLStrings[i].length > 2 && HLStrings[i] != 'quot'){
			HLStrings[i]=HLStrings[i].replace('.','\.');
			HLStrings[i]=HLStrings[i].replace(/[&<>]/,'.');
			HLStrings[i]='(>[^<>]*)('+HLStrings[i]+')';
			var SearchToReplace=new RegExp(HLStrings[i],'gi');
			Hcode =	Hcode.replace(SearchToReplace,'$1<span class="searchresults">$2</span>');
			Changed = 1;
		}
  }
	if (Changed) {
		document.getElementById('searchresults').innerHTML = Hcode;
	}
}

/*------------------------------------------------------*/
function ExecSortFunc(){
  this.arr = new Array;
  this.obj = new Object;

  this.push = function(p){
    for (var i in p){
      this.arr.push(i);
      this.obj[i] = p[i];
    }
  };

  this.call = function(){
    this.arr.sort();
    for (var i = 0; i < this.arr.length; i++){
      this.obj[this.arr[i]].call();
    }
  };
};

var BodyLoadFunc = new ExecSortFunc();
var WinResizeFunc = new ExecSortFunc();

window.onresize=function() {
	WinResizeFunc.call();
}

BodyLoadFunc.push({'SlidesInit': function(){SlidesInit();}});

function init() {
  BodyLoadFunc.call();
}

var BodyEndFunc = new ExecSortFunc();
function InitBodyEnd() {
  BodyEndFunc.call();
}

// ================== SLIDEIMAGES ====================
var Slides = {};

function SlidesAppend (id,big_src,noAutoSlide) {
  Slides[id] = {};

  Slides[id]['imgsize'] = {sw: 0, sh: 0, bw: 0, bh: 0};
  Slides[id]['pos'] = 0;
  Slides[id]['timer'] = null;
  Slides[id]['img'] = null;
  Slides[id]['div'] = null;
  Slides[id]['big_img'] = null;
  Slides[id]['big_src'] = big_src;
  Slides[id]['sml_src'] = '';
  Slides[id]['noAutoSlide'] = noAutoSlide && (noAutoSlide == 2 || noAutoSlide == 'noauto');
}

function SlidesInit () {
  for (var id in Slides) {
    var img = __el(id);
    var img_st = getCurrentStyle(img);

    Slides[id]['img'] = img;
    Slides[id]['sml_src'] = img.src;
    Slides[id]['imgsize'].sw = img.attributes['width'] ? parseInt(img.attributes['width'].value) : img.width;
    Slides[id]['imgsize'].sh = img.attributes['height'] ? parseInt(img.attributes['height'].value) : img.height;

    Slides[id]['big_img'] = document.createElement ('img');
    Slides[id]['big_img'].src = Slides[id]['big_src'];

    var div = document.createElement('div');
    div.style.width = (Slides[id]['imgsize'].sw + parseInt(img_st.borderLeftWidth) + parseInt(img_st.borderRightWidth)) + 'px';
    div.style.height = (Slides[id]['imgsize'].sh + parseInt(img_st.borderTopWidth) + parseInt(img_st.borderBottomWidth)) + 'px';
    div.style.textAlign = 'left';
    div.className = 'cover_div';
    var imgparent = img.parentNode;
    var imgitem = img;
    if (imgparent.nodeName == 'A') {
      imgitem = imgparent;
      imgparent = imgparent.parentNode;
    }
    imgparent.insertBefore (div,imgitem);
    div.appendChild (imgitem);

    Slides[id]['div'] = div;

    if (Slides[id]['noAutoSlide']){
      img.onclick = SlideImageIn;
      img.style.cursor = 'url(/static/new/i/zoomin.cur), pointer';
    } else {
      img.onmouseover = SlideImageIn;
    }
    img.onmouseout = SlideImageOut;
    img.style.zIndex = 1000;

    setTimeout('SlideImage (-100,"'+id+'")',1);
  }
  setTimeout ('_slides_wait_preload()',100);
}

var wait_cycles = 0;
function _slides_wait_preload () {
  var completed = 1;
  for (var id in Slides) {
    if (Slides[id]['big_img'].width > 36.6) {
      Slides[id]['imgsize'].bw = Slides[id]['big_img'].width;
      Slides[id]['imgsize'].bh = Slides[id]['big_img'].height;
    } else {
      completed = 0;
    }
  }

  if (!completed) {
    wait_cycles++;
    setTimeout ('_slides_wait_preload()',(wait_cycles>30)?3000:100);
  }
}

function SlideImageIn () {
  SlideImage (+14,this.id);
  if (Slides[this.id]['noAutoSlide']){
    this.style.cursor = 'url(/static/new/i/zoomout.cur), pointer';
    this.onclick = SlideImageOut;
  }
}

function SlideImageOut () {
  SlideImage (-20,this.id);
  if (Slides[this.id]['noAutoSlide']){
    this.style.cursor = 'url(/static/new/i/zoomin.cur), pointer';
    this.onclick = SlideImageIn;
  }
}

function SlideImage (step,id) {
  if (Slides[id]['timer']) clearTimeout (Slides[id]['timer']);
  if (!Slides[id]['imgsize'].bw) {
    if ((''+Slides[id]['img'].src).match('loading')) {}
    else {
      Slides[id]['img'].src = '/static/img/loading.gif';
    }
  } else {

  Slides[id]['pos'] += step;
  if (Slides[id]['pos'] > 100) Slides[id]['pos'] = 100;
  if (Slides[id]['pos'] < 0) Slides[id]['pos'] = 0;

  if (Slides[id]['img'].style.position != 'absolute') {
    Slides[id]['img'].src = Slides[id]['big_src'];
    Slides[id]['divOffset'] = _getOffset(Slides[id]['div']);
    Slides[id]['img'].style.position = 'absolute';
  }

  var dx = Slides[id]['pos']*(Slides[id]['imgsize'].bw-Slides[id]['imgsize'].sw)/100;
  var dy = Slides[id]['pos']*(Slides[id]['imgsize'].bh-Slides[id]['imgsize'].sh)/100;

  var cwidth = Math.floor(Slides[id]['imgsize'].sw + dx);
  var cheight = Math.floor(Slides[id]['imgsize'].sh + dy);
  var cleft = Math.floor(Slides[id]['divOffset'].X - dx/2);
  var ctop = Math.floor(Slides[id]['divOffset'].Y - dy/2);

  var bodySize = getBodySize();
  var minx = bodySize.left - Slides[id]['divOffset'].fullX + Slides[id]['divOffset'].X;
  var miny = bodySize.top  - Slides[id]['divOffset'].fullY + Slides[id]['divOffset'].Y;
  var maxx = minx + parseInt(bodySize.width) - cwidth;
  var maxy = miny + parseInt(bodySize.height) - cheight;

  if (cleft < minx) cleft = minx;
  if (cleft > maxx) cleft = maxx;
  if (ctop < miny) ctop = miny;
  if (ctop > maxy) ctop = maxy;

  Slides[id]['img'].width = cwidth;
  Slides[id]['img'].height = cheight;
  Slides[id]['img'].style.left = cleft + 'px';
  Slides[id]['img'].style.top = ctop + 'px';
  }

  if (Slides[id]['pos'] < 100 && step > 0 || Slides[id]['pos'] > 0 && step < 0) {
    Slides[id]['timer'] = setTimeout ('SlideImage('+step+',"'+id+'")',20);
  }
  if (step < 0 && Slides[id]['pos'] == 0) {
    Slides[id]['img'].style.position = 'static';
    Slides[id]['img'].style.top = 'auto';
    Slides[id]['img'].style.left = 'auto';
    Slides[id]['img'].src = Slides[id]['sml_src'];
  }
}


// Elements. Sobakka.framework.1.0 (c) russel

function __el (id) {
  return document.getElementById (id);
}

function __el_of (el,tag) {
  return el.getElementsByTagName (tag);
}

/*
function _getX (el,toBody) {
  if (el.style && parseInt (getCurrentStyle(el).left) && getCurrentStyle(el).position == 'absolute') return parseInt (el.style.left);
  var x = 0;
  //while (el) {
  while (el && (getCurrentStyle(el).position != 'relative' || toBody)) {
    x += parseInt (el.offsetLeft);// + parseInt (el.clientLeft);
    el = el.offsetParent;
  }
  return x;
}

function _getY (el,toBody) {
  if (el.style && parseInt (getCurrentStyle(el).top) && getCurrentStyle(el).position == 'absolute') return parseInt (el.style.top);
  var y = 0;
  //while (el) {
  while (el && (getCurrentStyle(el).position != 'relative' || toBody)) {
    y += parseInt (el.offsetTop);// + parseInt (el.clientTop);
    el = el.offsetParent;
  }
  return y;
}
//*/

function _getOffset (el) {
  var elStyle = getCurrentStyle(el);
  if (elStyle && parseInt (elStyle.left) && elStyle.position == 'absolute')
    return {X: parseInt(elStyle.left),
            Y: parseInt(elStyle.top),
            fullX: parseInt(elStyle.left),
            fullY: parseInt(elStyle.top)};

  var out = {X: 0, Y: 0, fullX: 0, fullY: 0};
  var b=true;
  var b_getFull=true;
  if (el.getBoundingClientRect){
    var tmp = getOffsetRect(el);
    out.fullX = parseInt(tmp.left);
    out.fullY = parseInt(tmp.top);
    b_getFull = false;
  }
  while (el && (b || b_getFull)) {
    if(b && getCurrentStyle(el).position == 'relative'){
      if(b_getFull){
        out.fullX = out.X;
        out.fullY = out.Y;
        b=false;
      } else {
        break;
      }
    }
    if(b){
      out.X += parseInt (el.offsetLeft);
      out.Y += parseInt (el.offsetTop);
    } else {
      out.fullX += parseInt (el.offsetLeft);
      out.fullY += parseInt (el.offsetTop);
    }
    el = el.offsetParent;
  }
  if(b && b_getFull){
    out.fullX = out.X;
    out.fullY = out.Y;
  }
  return out;
}

function _width (obj) {
  if (obj.style && parseInt (obj.style.width)) return parseInt (obj.style.width);
  return obj.offsetWidth;
}

function _height (obj) {
  if (obj.style && parseInt (obj.style.height)) return parseInt (obj.style.height);
  return obj.offsetHeight;
}

function debug (el) {
  var str = '';
  for (k in el) {
    str += k + ' = ' + el[k] + '<br/>';
  }
  __el ('debug_div').innerHTML = str;
}

var OneClickBasketBuyRegister = "Для оплаты отложенных книг необходимо\nвойти в систему или зарегистрироваться.";
var OneClickBasketBuyMoreMoney = "Для покупки не хватает денег.\nХотите пополнить счет сейчас?";
var OneClickBasketBuyConfirm = "и все отложенные книги будут куплены. ";
var ConfirmPay1 = 'Сейчас с вашего счета в книжном магазине будет списана сумма ';
var ConfirmPay2 = 'р.\n';
var ConfirmPay3 = 'Продолжить?';

function WarnQuickBuy(Summ,PreOrder,Art,User,Price){
	var Descr = 'Cразу после этого вы сможете скачивать эту книгу. ';
	if (PreOrder == 2){
		Descr = 'Сразу после этого вы сможете продолжить чтение. ';
	} else if (PreOrder){
		Descr = 'Сразу после этого ваш предзаказ будет принят и помещен в «Мои книги». ';
	}
	if (confirm(ConfirmPay1 +RubPrice(Summ)+ConfirmPay2+Descr+ConfirmPay3)){
		return true;
	} else {
		return false;
	}
}

//#########################################################
function getCurrentStyle(el){
  if(!el) return null;
  var s=el.currentStyle;
  if(!s) s=document.defaultView.getComputedStyle(el,null); // Для FireFox
  return s;
}

/*
function getOffset(elem) {
    if (elem.getBoundingClientRect) {
        // "правильный" вариант
        return getOffsetRect(elem)
    } else {
        // пусть работает хоть как-то
        return getOffsetSum(elem)
    }
}

function getOffsetSum(elem) {
    var top=0, left=0
    while(elem) {
        top = top + parseInt(elem.offsetTop)
        left = left + parseInt(elem.offsetLeft)
        elem = elem.offsetParent
    }

    return {top: top, left: left}
}
//*/
function getOffsetRect(elem) {
    // (1)
    var box = elem.getBoundingClientRect()

    // (2)
    var body = document.body
    var docElem = document.documentElement

    // (3)
    var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop
    var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft

    // (4)
    var clientTop = docElem.clientTop || body.clientTop || 0
    var clientLeft = docElem.clientLeft || body.clientLeft || 0

    // (5)
    var top  = box.top +  scrollTop - clientTop
    var left = box.left + scrollLeft - clientLeft

    return { top: Math.round(top), left: Math.round(left) }
}
//*/
function getBodySize(){
  var docElem = document.documentElement;
  var docBody = document.body;
  return { top:    self.pageYOffset || (docElem && docElem.scrollTop) || (docBody && docBody.scrollTop),
           left:   self.pageXOffset || (docElem && docElem.scrollLeft) || (docBody && docBody.scrollLeft),
           height: (document.compatMode=='CSS1Compat' && !window.opera && docElem && docElem.clientHeight) ||
                   (docBody && docBody.clientHeight),
           width:  (document.compatMode=='CSS1Compat' && !window.opera && docElem && docElem.clientWidth) ||
                   (docBody && docBody.clientWidth)
  }
}

/*---------------------- bookmarks --------------------------------------*/
function getBrowserInfo() {
 var t,v = undefined;
 if (window.opera) t = 'Opera';
 else if (document.all) {
  t = 'IE';
  var nv = navigator.appVersion;
  var s = nv.indexOf('MSIE')+5;
  v = nv.substring(s,s+1);
 }
 else if (navigator.appName) t = 'Netscape';
 return {type:t,version:v};
}

function bookmark(a){
 var url = window.document.location;
 var title = window.document.title;
 var b = getBrowserInfo();
 if (b.type == 'IE' && 7 > b.version && b.version >= 4) window.external.AddFavorite(url,title);
 else if (b.type == 'Opera') {
  a.href = url;
  a.rel = "sidebar";
  a.title = url+','+title;
  return true;
 }
 else if (b.type == "Netscape") window.sidebar.addPanel(title,url,"");
 else alert("Нажмите CTRL-D, чтобы добавить страницу в закладки.");
 return false;
}
/*-----------------------------------------------------------------------*/
/*-------------------------- элемент по центру окна ---------------------*/
var CenterELs = new Array;


function CenterElement(id,force){
  var el = document.getElementById(id);
  var st = getCurrentStyle(el);
  if (st.display == 'none' || st.display == '') {
    el.style.display = 'block';
    st = {height: st.height, width: st.width};
    el.style.display = 'none';
  }
  var p = el.offsetParent?_getOffset(el.offsetParent):{X: 0, Y: 0, fullX: 0, fullY: 0};
  var bodySize = getBodySize();
  var tmp = st.height.match(/\d+/);
  var ctop = tmp?tmp[0]:0;
  tmp = st.width.match(/\d+/);
  var cleft = tmp?tmp[0]:0;
  ctop = (bodySize.height > ctop || force)?(bodySize.height - ctop)/2:0;
  ctop = Math.floor(bodySize.top - p.fullY + p.Y + ctop);
  cleft = (bodySize.width > cleft || force)?(bodySize.width - cleft)/2:0;
  cleft = Math.floor(bodySize.left - p.fullX + p.X + cleft);
  el.style.position = 'absolute';
  el.style.top = ctop + 'px';
  el.style.left = cleft + 'px';
}//*/

/*-----------------------------------------------------------------------*/

var bookmarks_xml;
var bookmarks_page_title = 'Без названия';
function ReloadBookmarks (xml) {
  if (xml) {
    bookmarks_xml = xml;
    return;
  }

  sendQRequest ('fetch_bookmark',{},function (result) {
    if (result) {
      (''+result).replace (/<bookmarks>(.*?)<\/bookmarks>/i,function ($1,$2) { bookmarks_xml = $2; });
      ShowBookmarks (1);
    }
  });
}

function ShowBookmarks (internal) {
  if (__el('bookmarks_div').style.display == 'none' || internal) {
    var html = '';
    var ok = 1;
    (''+bookmarks_xml).replace (/<bookmark ([^>]+?)>/ig,function ($1,$2) {
      var bi = ''+$2;
      var id,pt,pu;
      bi.replace (/id="(\d+)"/i,function ($1,$2) { id = $2; });
      bi.replace (/page_title="([^"]+)"/i,function ($1,$2) { pt = $2; });
      bi.replace (/page_url="([^"]+)"/i,function ($1,$2) { pu = $2; });

      if (document.location.href == pu) {
        ok = 0;
      }
      html += '<nobr><a href="'+pu+'">'+pt+'</a><a class="delbm" href="javascript:DelBookmark('+id+')" title="Удалить">[х]</a></nobr>';
    });
    if (ok) {
      html = '<nobr><a href="javascript:AddBookmark()"><b>+ Добавить страницу в закладки</b></a></nobr>' + html;
    }

    __el('bookmarks_div').innerHTML = html;
    if (internal) {} else { __el('bookmarks_div').style.display = 'block'; }
  } else {
    __el('bookmarks_div').style.display = 'none';
  }
}

function AddBookmark () {
  sendQRequest ('add_bookmark',{title: bookmarks_page_title, url: document.location.href},function () {
    ReloadBookmarks ();
  });
}

function DelBookmark (id) {
  sendQRequest ('del_bookmark',{id: id},function () {
    ReloadBookmarks ();
  });
}

function SetOneClickCheck(orderid) {
  var data=getCookie("check_my_oneclick");
  if(data) {
    if(data.indexOf(orderid)>=0) return;
    data+=","+orderid;
  }
  else data=orderid;
  setCookie("check_my_oneclick",data,6,"/");
}

function TrackPartnerBuy( order, price, delivered, myragon_key ) {
  if ( GoogleAccount != 'UA-15543008-1' ) return;

  var images  = new Array();
  var iframes = new Object();
  var admitad_uid = getCookie("ADMITADUID");

  if ( delivered == 0 ) {
    switch ( UserPartnerID ) {
      case "5349765": images.push( 'http://tracking2.cpa1.ru/?id=418&raid=' + order + '&summ=' + price ); break;
      case "4787605": images.push( 'http://n.actionpay.ru/ok/1078.png?apid=' + order ); break;
      case "5351055": images.push( 'http://a51.myragon.ru/track/id/' + order + '/key/' + myragon_key + '/target/t1' ); break;
      case "4718025": images.push( 'http://mixmarket.biz/uni/tev.php?id=1294930149&r=' + escape(document.referrer) + '&t=' + (new Date()).getTime() + '&a2=' + price ); break;
      case "5484365": iframes['cpanetwork_tracker'] = 'https://www.cpanetwork.ru/trackf.asp?o=344&ref=' + order + '&amt=' + price; break;
      case "5439345": case "5439355": case "5439365": case "5439375": images.push( 'http://www.googleadservices.com/pagead/conversion/950471818/?value=' + price + '&label=iXHVCKagvwMQipmcxQM&guid=ON&script=0' ); break;
    }

    if ( UserPartnerID == 4607515 && admitad_uid )
      images.push( 'http://ad.admitad.com/register/3baa9723ff/script_type/img/payment_type/sale/product/1/cart/'+price+'/order_id/'+order+'/uid/'+admitad_uid+'/' );

  } else if ( delivered == 1 ) {
    if ( UserPartnerID == 4607515 && admitad_uid )
      images.push( "http://ad.admitad.com/register/3baa9723ff/script_type/img/payment_type/sale/product/2/cart/"+price+"/order_id/"+order+"/uid/"+admitad_uid+"/" );
  } else if ( delivered == -1 ) {
    if ( UserPartnerID == 4607515 && admitad_uid )
      images.push( "http://ad.admitad.com/register/3baa9723ff/script_type/img/payment_type/sale/product/4/cart/"+price+"/order_id/"+order+"/uid/"+admitad_uid+"/" );
  }

  for ( var i = 0; i < images.length; i++ ) {
    var Tracker = new Image( 1, 1 );
    Tracker.src = images[i];
  }

  for ( var key in iframes ) {
    BodyLoadFunc.push( { key: function(){ if (GUJ) GUJ.PutRequest( { url: iframes[key] } ); } } );
  }
}

var gaPusher = function() {
  this.cmds=new Array();
  var stored=getCookie("_gaparserdata");

  if(!stored) return;
  if(typeof _gaq == 'undefined') return;
  var stored_cmds=stored.match(/\[([^\]]+)\]/g);

  for (var key in stored_cmds) {
    var cmd=stored_cmds[key].substr(1,stored_cmds[key].length-2).split(',');
    for (var ikey in cmd)
      cmd[ikey]=this.unescape(cmd[ikey].trim());

    // Если человек завершил транзакцию и/или зарегистрировался, дергаем "гугло-конверсию"
    var ConvCode = '';
    var ConvPrice = 0;
    if(cmd[0]=="_trackTrans"){
      ConvCode = 'nMGgCNrznwMQ5oaNywM';
      ConvPrice = 500;
    } else if (cmd[0]=="_trackEvent" && cmd[1]=="Register"){
      ConvPrice = 50
      ConvCode = 'GiC-CKqIoAMQ5oaNywM';
    } else if ( cmd[0] == "_trackOther" ) {
      TrackPartnerBuy( cmd[1], cmd[2], cmd[3], cmd[4] );
    }

    if (ConvPrice){
      var AdWordsTracker = new Image(1,1);
      AdWordsTracker.src='http://www.googleadservices.com/pagead/conversion/962806630/?value='+ConvPrice+'&label='+ConvCode+'&guid=ON&script=0';
    }
    if ( cmd[0] != "_trackOther" ) _gaq.push(cmd);
  }
  setCookie("_gaparserdata","",-1,"/");
}

gaPusher.prototype.unescape = function (str) {
  if(str.length==0 || str=='undefined') return undefined;
  if(/('|")(.*)\1/.test(str)) return unescape(str.substr(1,str.length-2));
  if(/(\.)/.test(str)) return parseFloat(str);
  else return parseInt(str);
}

gaPusher.prototype.push = function (data,force) {
  if(typeof(force) != 'undefined' && force) {
    return _gaq.push(data);
  }
  for (var key in data)
    if(typeof(data[key])=="string")
      data[key]='"'+escape(data[key])+'"';
  this.cmds.push("["+data.toString()+"]");
  setCookie("_gaparserdata",this.cmds.toString(),1,"/");
}

String.prototype.trim = function () {
  return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

function setCookie(c_name,value,expiredays,path,expirehours)
{
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
if(typeof(expirehours)!=undefined) {
	exdate.setHours(exdate.getHours()+expirehours);
}
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toUTCString())+
((path==null) ? "" : ";path="+path);
}

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 RubPrice(Price){
	Price = Math.round(Price * 100)/100;
	var RubPrice = Price.toFixed(2) + '';
	RubPrice = RubPrice.replace('.',',');
	return RubPrice;
}

/*ajax*/

/*

GUAjax - GribUser lightweight AJAX class
Fast, multi-connection data exchange over HTTP
using HTML-pages as a main transfer unit allows
use of gzip and browser-powered user feedback while
data exchange takes place.


Released under GPL license.
Copyright 2010, LitRes ltd, www.litres.ru
Author: Dmitry Gribov, grib@gribuser.ru

*/

function GUAjax(Params){
	this.die = function(code,text){
		window.alert('Error #'+code+'. '+text)
	}
	if (!window.GUAjaxs){
		window.GUAjaxs = new Array();
	}
	this.N = window.GUAjaxs.length;
	window.GUAjaxs[this.N] = this;

	// Нету параметров - и не надо
	if (!Params){
		Params = {};
	}

	// Сколько параллельных запросов к серверу мы допускаем
	var ParallelConnections = Params.Connections || 2;

	// В какой элемент вставляем наши iframe
	var HostElement = Params.HostElement || document.body;
	if (!HostElement){
		this.die(1, 'You must create GUAjax object after <body> tag was parsed');
	}

	// Массив готовых к обмену данными iframe-ов
	this.Loaders = new Array();

	// Сюда складываем запросы перед выполнением
	this.WorkQueue = new Array();

	// Здесь бум хранить отправленные запросы для защиты от повторных попыток
	// работает, только если передан параметр noRepeat
	this.SendedReq = new Object;

	// Пропихиваем запросы из очереди задач на исполнение
	this.ProcessQueue = function(){
		// Если есть таймаут - сбросим, ведь мы уже здесь.
		if (this.TimeoutID){
			clearTimeout(this.TimeoutID);
			this.TimeoutID = undefined;
		}

		// Никаких запросов в очереди, закрываем лавочку
		if (this.WorkQueue.length == 0){
			return;
		}

		while (this.WorkQueue.length > 0){
			// Запросы есть, перебираем наши лоадеры, нету ли свободных
			var LoaderToUse = undefined;
			for (var i=0;i<this.Loaders.length;i++){
				if (this.Loaders[i].State === 'idle'){
					LoaderToUse = this.Loaders[i];
					break;
				}
			}

			// Все лоадеры заняты, попробуем позже
			if (!LoaderToUse){
				this.TimeoutID = setTimeout('window.GUAjaxs['+this.N+'].ProcessQueue()',30);
				return;
			}

			// Ok, лоадер для этого запроса есть, поехали
			this.SubmitData(this.WorkQueue.shift(),LoaderToUse);
		}
	};

	// Процедура поставновки задачи в очередь
	this.PutRequest = function(GuAjaxRequest){
		this.WorkQueue.push(GuAjaxRequest);
		this.ProcessQueue();
	};

	// Отправляем сукществующую форму
	// Скипает submit|reset|button|image  и неотмеченные checkbox|radio
	this.SendForm = function(form,eRequest){
		var Request = {
			url: form.action,
			Method: form.method,
			params: {}
		};
		for (var i=0; i<form.length; i++){
			if (!form[i].name ||
					(/checkbox|radio/i.test(form[i].type) && !form[i].checked) ||
					/submit|reset|button|image/i.test(form[i].type))
				continue;
			if (/checkbox/i.test(form[i].type)){
				if (Request.params[form[i].name]){
					Request.params[form[i].name].push({type: form[i].type, name: form[i].name, checked: form[i].checked, value: form[i].value});
				} else {
					Request.params[form[i].name] = [{type: form[i].type, name: form[i].name, checked: form[i].checked, value: form[i].value}];
				}
			} else {
				Request.params[form[i].name] =  form[i].value;
			}
		}
		for (var param in eRequest){
			Request[param] = eRequest[param];
		}
		this.WorkQueue.push(Request);
		this.ProcessQueue();
	};

	// Непосредственная отправка запроса
	this.SubmitData = function(Request,Loader){
		Loader.State = 'waiting';
		var URL = Request.url || '.';
		if (typeof Request.noRepeat != 'undefined'){
			if (this.SendedReq[URL+(Request.noRepeatKey || '')]){
				Loader.State = 'idle';
				if (typeof Request.noRepeat == 'function') Request.noRepeat.call();
				return;
			} else {
				this.SendedReq[URL+(Request.noRepeatKey || '')] = true;
				if (Request.noRepeatTime){
					var T = this;
					setTimeout(function(){ T.SendedReq[URL+(Request.noRepeatKey || '')] = false; }, Request.noRepeatTime);
				}
			}
		}
		if (Request.HttpRType){
			Loader.Request = Request;
			this.CreateHttpRequest(Loader);
		} else if (Request.Method && Request.Method.toLowerCase() == 'post'){
			var NewForm = Loader.Frame.document.createElement('form');
			NewForm.method = 'POST';
			NewForm.action=URL;
			for (var ParamName in Request.params) {
				var NewField;
				if (typeof Request.params[ParamName] == 'object') {
					ParamName = Request.params[ParamName];
					for (var j=0; j<ParamName.length; j++){
						NewField = Loader.Frame.document.createElement('input');
						for (var attr in ParamName[j]){
							NewField[attr] = ParamName[j][attr];
						}
						NewForm.appendChild(NewField);
					}
				} else {
					NewField = Loader.Frame.document.createElement('input');
					NewField.type = 'hidden';
					NewField.name = ParamName;
					NewField.value = Request.params[ParamName];
					NewForm.appendChild(NewField);
				}
			}
			Loader.Frame.document.body.appendChild(NewForm);
			NewForm.submit();
		} else {
			// Типа пишите метод, какой хотите, но либо post, либо GET, вот так-то
			URL += URL.match(/\?/)?'&':'?';
			for (var ParamName in Request.params) {
				URL += escape(ParamName) + '=' + escape(Request.params[ParamName]) + '&';
			}
			Loader.Frame.document.location.replace(URL);
		}
		Loader.Request = Request;
	}


	// Обработчик завершенных транзакций - запускается onload фрейма
	// и пинает залинкованную на запрос функцию
	this.FinishedLoading = function(N){
		var Loader = this.Loaders[N];
		if (Loader && Loader.State === 'waiting'){
			if (Loader.Request.OnData){
				if (Loader.Frame.GUAjaxData !== undefined){
					Loader.Request.OnData(Loader.Frame.GUAjaxData);
				} else if (Loader.Request.OnDataFail) {
					Loader.Request.OnDataFail(Loader.Token,Loader.Frame);
				} else {
					this.die(100, 'JS-Data load "'+Loader.Token+'" failed, URL:'+Loader.URL);
				}
			}
			var GotHTML;
			try {
				if (Loader.Frame.document && Loader.Frame.document.body &&
						!Loader.Frame.Errors && Loader.Frame.document.getElementById('GUAjaxData')){
					GotHTML = Loader.Frame.document.getElementById('GUAjaxData').innerHTML;
				}
			} catch(e) {}
			if (Loader.Request.OnHTML){
				if (GotHTML){
					Loader.Request.OnHTML(GotHTML)
				} else if (Loader.Request.OnHTMLFail){
					Loader.Request.OnHTMLFail(Loader.Token,Loader.Frame);
				} else {
					this.die(101, 'HTML-Data load "'+Loader.Token+'" failed, URL:'+Loader.URL);
				}
			}
			if (Loader.Request.TargetForHTML){
				if (GotHTML){
					Loader.Request.TargetForHTML.innerHTML = GotHTML;
				} else {
					this.die(102, 'HTML-Data load+insert "'+Loader.Token+'" failed, URL:'+Loader.URL);
				}
			}
			Loader.Frame.location='about:blank';
		} else {
			// Сюда мы не должны попадать, только один раз после инициализации
		}
		if (Loader) Loader.State = 'idle';
		setTimeout('window.GUAjaxs['+this.N+'].ProcessQueue()',500);
	};

	this.CreateHttpRequest = function (Loader){
		var HExists = false;
		if (typeof Loader.HttpR == 'undefined'){
			var HttpRequest = null;
			if (window.XMLHttpRequest) {
				HttpRequest = new XMLHttpRequest();
			} else if (window.ActiveXObject) {
				try {
					HttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (CatchException) {
					HttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
				}
			}
			if (!HttpRequest) {
				this.die(120, 'Cannot create XMLHttpRequest');
			}
			Loader.HttpR = HttpRequest;
		} else HExists = true;

		var param_str = new Array;
		for (var nm in Loader.Request.params) {
			param_str.push(nm + "=" + encodeURIComponent(Loader.Request.params[nm]));
		}
		param_str = param_str.join('&');
		if (Loader.Request.Method && Loader.Request.Method == 'post'){
			Loader.HttpR.open('POST',Loader.Request.url,true);
			Loader.HttpR.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			//param_str = 'empty_param_for_request=junk&' + param_str;
			Loader.HttpR.setRequestHeader("Content-Length", param_str.length);
		} else {
			var URL = Loader.Request.url;
			if (/\?(.+&)?$/.test(URL)) URL += param_str;
			else URL += (/\?/.test(URL) ? '&' : '?') + param_str;
			Loader.HttpR.open('GET',URL,true);
			Loader.HttpR.setRequestHeader("Content-Type", 'application/xml');
			param_str = '';
		}

		if (!HExists || /MSIE\s*[67]\./i.test(navigator.userAgent)) {
			Loader.HttpR.onreadystatechange = function(){
				if (Loader.HttpR.readyState == 4) {
					if (Loader.Request.OnData){
						if(Loader.Request.HttpRType == 'json'){
							var Data = Loader.HttpR.responseText;
							if (Data !== undefined){
								if (typeof JSON !== "undefined") Data = JSON.parse(Data); // Native
								else Data = eval( "("+Data.replace(/[\r\n]+/g,'')+")" );
								Loader.Request.OnData(Data);
							} else if (Loader.Request.OnDataFail){
								Loader.Request.OnDataFail(Loader.Token,Loader.Frame);
							}
						} else {
							Loader.Request.OnData(Loader.HttpR.responseXML);
						}
					}
					Loader.State = 'idle';
				}
			}//*/
		}
		Loader.HttpR.send(param_str);
	}

	// Init - создаем рабочие фреймы и прочие полезности
	for (var i=0;i<ParallelConnections;i++){
		var iFrameDiv = document.createElement('div');
		iFrameDiv.style.display = 'none';
		iFrameDiv.id = 'guajax_loader_div_'+i;
		var InitURL = 'about:blank';
		var FrameID = 'guajax_loader_'+this.N+'_'+i;
		iFrameDiv.innerHTML = '<iframe id="'+FrameID+'" name="'+FrameID+'" src="'+InitURL+
				'" onload="window.GUAjaxs['+this.N+'].FinishedLoading('+i+
				')" witdh="0" height="0"></iframe>';
		HostElement.appendChild(iFrameDiv);
		this.Loaders[i] = {
												Frame: window.frames[FrameID],
												State: 'idle',
												URL: InitURL,
												Token: 'startup'
											};
	}
}

/*validators*/
var curmail ='';
BodyEndFunc.push({ 'setCurMail': function(){ if (document.getElementById('mail')) curmail = document.getElementById('mail').value; }});
function ValidateRegForm (user_reg_type) {
	var the_form;
  var form_id;

	if (user_reg_type == 'new') {
    form_id = 'frmNewUserRegdata';
	} else if (user_reg_type == 'update') {
    form_id = 'frmUpdateUserRegdata';
	} else if (user_reg_type == 'corn') {
    form_id = 'corn_regform';
	} else if (user_reg_type == 'quick') {
    form_id = 'quick_regform';
	}
  the_form = document.getElementById(form_id);
 	AppendUtcOffsetInput2Form(form_id);

	var err_msg = '';

	if (the_form.iaccept && user_reg_type == 'new' && !(the_form.iaccept.checked || (the_form.iaccept.type=='hidden' && the_form.iaccept.value > 0))) {
    MarkRegField(the_form.iaccept);
    err_msg += "- Вы не выразили согласия с публичной офертой (\"Я соглашаюсь с условиями обслуживания\")\n";
	} else if(user_reg_type == 'new') {
    UnMarkRegField(the_form.iaccept);
	}
	if ( /^\s*$/.test(the_form.new_login.value) ) {
    MarkRegField(the_form.new_login);
    the_form.new_login.value = '';
    err_msg += "- Пожалуйста, укажите логин\n";
	} else {
    UnMarkRegField(the_form.new_login);
	}

	if ( user_reg_type == 'new' || user_reg_type == 'quick' || user_reg_type == 'corn' || user_reg_type == 'update' && the_form.new_pwd_open.value.length > 0 ) {
    if (the_form.showpwd.checked && the_form.new_pwd_open.value.length < 2) {
			MarkRegField(the_form.new_pwd_open);
			err_msg += "- Ну очень короткий пароль (нужно хотя бы 2 символа)\n";
    } else {
    	UnMarkRegField(the_form.new_pwd_open);
    }
	}

	if ( user_reg_type == 'new' || user_reg_type == 'update' && the_form.new_pwd1.value.length > 0 ) {
    if (!the_form.showpwd.checked && the_form.new_pwd1.value.length < 2) {
			MarkRegField(the_form.new_pwd1);
			err_msg += "- Ну очень короткий пароль (нужно хотя бы 2 символа)\n";
    } else {
    	UnMarkRegField(the_form.new_pwd1);
    }
    if (!the_form.showpwd.checked && the_form.new_pwd1.value != the_form.new_pwd2.value) {
			MarkRegField(the_form.new_pwd1);
			err_msg += "- Пароль не совпадает с повтором пароля\n";
    } else {
    	UnMarkRegField(the_form.new_pwd1);
    }
	}

	err_msg += ValidateMailField((user_reg_type!='corn' && user_reg_type!='quick')?the_form.mail:the_form.new_login);

	if(user_reg_type == 'corn' && __el('card-num-1')) {
		var cardnum=__el('card-num-1').value+__el('card-num-2').value+__el('card-num-3').value;
		if(!/[0-9]{13}/.test(cardnum)) {
			MarkRegField(the_form.corn_code1);
			MarkRegField(the_form.corn_code2);
			MarkRegField(the_form.corn_code3);
			err_msg +="- Не введен штрих-код карты\n";
		} else {
			UnMarkRegField(the_form.corn_code1);
			UnMarkRegField(the_form.corn_code2);
			UnMarkRegField(the_form.corn_code3);
		}
	}

	if ( !/^\s*$/.test(the_form.phone.value ) ) { // see 3622 for details

    var return_validate = ValidatePhone( the_form.phone.value );

    if (return_validate == 1) { // okay
    	UnMarkRegField(the_form.phone);
    } else {
			MarkRegField(the_form.phone); // smth's wrong
			err_msg += return_validate + "\n";
    }
	} else {
    UnMarkRegField(the_form.phone);
	}

	if (the_form.www){
    if ( !/^\s*$/.test(the_form.www.value ) ) {
			var return_validate = ValidateURL( the_form.www.value );

			if (return_validate == '') { // okay
				UnMarkRegField(the_form.www);
			} else {
				MarkRegField(the_form.www); // smth's wrong
				err_msg += return_validate + "\n";
			}
    } else {
   		UnMarkRegField(the_form.www);
    }
	}

	if (user_reg_type == 'update') {

		if (the_form.curpass){
			if ( the_form.curpass.value.length<2 && ((the_form.showpwd.checked ? the_form.new_pwd_open.value.length : the_form.new_pwd1.value.length) > 0 || the_form.mail.value != curmail)) {
				MarkRegField(the_form.curpass);
				err_msg += "- Чтобы сменить e-mail или пароль необходимо указать текущий пароль.\n";
			} else {
				UnMarkRegField(the_form.curpass);
			}
		}

    var inps = document.getElementById('format_choose_cell').getElementsByTagName("input");
    var formatNum=0;
    for (var i=0;i<inps.length;i++) {
    	if(inps[i].checked) formatNum++;
    }
    if(formatNum==0) {
			err_msg += "- Вы не выбрали ни один из доступных форматов. По-умолчанию был установлен формат fb2.\n";
			document.getElementById('fmt_fb2.zip').checked=true;
    }
	}

	if(err_msg.length > 0) alert(err_msg);
	if (err_msg.length == 0 && user_reg_type == 'quick') _gap.push(['_trackEvent', 'arktis_vk', 'quickreg']);

	return err_msg.length > 0 ? false : true;
}

function ValidateURL (url) {
  return /^((https?|s?ftp)\:\/\/)?[\wА-я][\wА-я\-\.]*\.[\wА-я\-]+$/.test(url) ? '' : "- Неправильный URL. Введите правильный или оставьте поле пустым.";
}

function ValidatePhone (phone, mobile_only) { // returns 1 if okay, errmsg otherwise

	if ( !/^[+\s()0-9.-]+$/.test(phone) ) { // not phone-like
		return "- Видимо, в номере телефона есть буквы или спецсимволы. Им там быть не полагается.";
	}

  var min_length = mobile_only ? 10 : 7;

	if ( phone.replace(/\D/g, "").length < min_length ) { // way too short
		return "- Ну очень короткий номер телефона. Разве такие бывают?";
	}
	if ( !/^\s*(8|\+*7).+/.test(phone) ) { // RF vs. the rest of the world
		return mobile_only ? "- Похоже, в мобильном номере есть ошибка" : 1;
	}

	var d_ru_phone = phone.replace( /^\s*(8|\+*7)(.+)/, "$2" ).replace( /\D/g, "" );

	// check for mobile defs
	if ( !( /^9[0-35689][0-9]/.test(d_ru_phone) && !/^(907|935|939|95[4-9]|966|969|986|99[0-6])/.test(d_ru_phone) ) ) {
		return mobile_only ? "- Похоже, в мобильном номере есть ошибка" : 1;
	}
	if ( d_ru_phone.replace( /^\d{3}(\d+)/, "$1" ).length == 7 ) {
		return 1;
	} else {
		return "- Похоже, в номере телефона есть ошибка";
	}
}


function ValidateMailField (mail,noEmpty) {
	if (!/^\s*$/.test(mail.value)) {
		if (MailOK(mail.value)) {
			UnMarkRegField(mail);
			return '';
		}
	} else if (!noEmpty){
		UnMarkRegField(mail);
		return '';
	}
	MarkRegField(mail);
	return "- Электронную почту необходимо указывать в правильном формате, например: ivan.ivanovich@litres.ru\n\n";
}

function MailOK(mail){
	if (/^[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/.test(mail)){
		return 2;
	} else if (/^\s*$/.test(mail)){
		return 1;
	}else {
		return 0;
	}
}

function ValidatesSmsStickerForm() {
	var err_msg = ValidateMailField(document.getElementById('frm_popup_offers').mail);
	if(err_msg.length > 0) alert(err_msg);
	return err_msg.length > 0 ? false : true;
}

function MarkRegField(el) {
	el.style.borderColor = '#FF0000';
	el.style.backgroundColor = '#FFCFCF';
	return;
}
function UnMarkRegField(el) {
	el.style.borderColor = '';
	el.style.backgroundColor = '';
}


function SMSCountLeft(textObj, CounterId) {

  max1 = 70;
  max2 = 160;

  var theLength = textObj.value.length;
  var theCounter = document.getElementById(CounterId);

  if (theLength > max1) {
    theCounter.innerHTML = "<font color=\"#ff000\"><b>" + theLength + "</b></font>";
  }
  else {
    theCounter.innerHTML = theLength;
  }

//      field.value = field.value.substring(0, max);

  return;
}

if (!Number.toFixed) {
Number.prototype.toFixed=function(x) {
	var temp=this;
	temp=Math.round(temp*Math.pow(10,x))/Math.pow(10,x);
	return temp;
}}
/*menu scroll*/

var SimpleScroller = function(p){
	p = p || {};
	var mal = p.mal || document.getElementById('menuArrowLeft');
	var mar = p.mar || document.getElementById('menuArrowRight');
	var box = p.box || document.getElementById('menuScrollCell');
	var wrap = p.wrap || document.getElementById('menuWrapTable');
	if (!mal || !mar || !box || !wrap) return;

	this.o = {
		step: p.step || 20,
		time: p.time || 40,
		vertical: p.vertical || 0
	};

	var T = this;
	var scrolltimer;
	var box_L = parseInt(this.o.vertical ? box.clientHeight : box.clientWidth);
	var wrap_L = parseInt(this.o.vertical ? wrap.clientHeight : wrap.clientWidth);
	var pos = 0;

	this.stop = function(){
		if(scrolltimer) clearInterval(scrolltimer);
	};

	this.move = function(value, force){
		force = (typeof(force) != 'undefined');

		//box_L = parseInt(T.o.vertical ? box.clientHeight : box.clientWidth);
		var mscw=wrap_L-box_L;

		pos+=value;
		if(pos<=0) {
			pos=0;
			T.stop();
		} else if(pos>=mscw) {
			pos=mscw;
			T.stop();
		}

		if(pos==0)
			mal.style.display='none';
		else
			mal.style.display='block';

		if(pos==mscw)
			mar.style.display='none';
		else
			mar.style.display='block';

		wrap.style[T.o.vertical ? 'marginTop' : 'marginLeft']=-pos+'px';
	};

	this.resize = function(){
		box_L = parseInt(T.o.vertical ? box.clientHeight : box.clientWidth);
		wrap_L = parseInt(T.o.vertical ? wrap.clientHeight : wrap.clientWidth);
		if(wrap_L<=box_L) {
			mal.style.display='none';
			mar.style.display='none';
			if (T.o.vertical)
				wrap.style.marginTop='0px';
			else
				wrap.style.marginLeft='0px';
			pos=0;
		} else {
			mal.style.display='block';
			mar.style.display='block';
			T.move(0,true);
		}
	};

	this.Init = function(){
		this.resize();

		mal.onmouseover = function(e) {
				scrolltimer = setInterval(function() {
						T.move(-T.o.step);
				}, T.o.time)};
		mal.onmouseout = function(e) {
				T.stop();
			};

		mar.onmouseover = function(e) {
				scrolltimer = setInterval(function() {
						T.move(T.o.step);
				}, T.o.time)};
		mar.onmouseout = function(e) {
				T.stop();
			};
		WinResizeFunc.push({'SimpleScroller': function(){T.resize.call();}});
	};

	this.Init();
};

function ID2Tree(fid){
	for (fid = fid.toString(); fid.length<8; fid = '0' + fid);
	var a = fid.match(/^(\d\d)(\d\d)(\d\d)\d\d$/);
	a = a[1] +'/'+ a[2] +'/'+ a[3];
	return [fid, a];
}

var clickHeatTime;
var ClicksTracker = new Image(1,1);
function CatchClick(e){
	try {
		if (!e.pageX) return true;
		var clickTime = new Date();
		if (clickTime.getTime() - clickHeatTime < 1000) {
			return true;// люди тычут чаще, чем раз в секунду, скипаем
		}
		clickHeatTime = clickTime.getTime();
		var Loc = document.location + '';
		Loc = Loc.replace(/http:\/\/[\w\.\-]+\//,'');
		Loc = Loc.replace(/#.*$/,'');
		Loc = Loc.replace(/ /,'+');
		var XPath = ElDesc(e.target);
		var FormAction;
		$(e.target).parents().each(function(index) {
			if (this.tagName.toLowerCase() == 'body') {
				XPath = '/' + XPath;
				return false;
			}
			if (this.tagName.toLowerCase() == 'form'){
				FormAction = $(this).attr('action');
			}
			XPath = ElDesc(this)+'/'+XPath;
			if ($(this).hasClass('clicktag')) return false;
			return true;
		});
		var Params = { p:e.pageX+'.'+e.pageY, w:$('body').width(), u:Loc,	x:XPath};
		var HRef = $(e.target).attr('href');
		if (!HRef){
			HRef = $(e.target).parents('a').attr('href')
		}
		if (!HRef){
			HRef = FormAction;
		}
		if (HRef){
			Params.h = HRef;
		}
		var URL = '/clctrack/?';
		var FirstTime = 1;
		for (var ParamName in Params) {
			if (!FirstTime) URL += '&';
			URL += escape(ParamName) + '=' + escape(Params[ParamName]);
			FirstTime = 0;
		}
		ClicksTracker.src=URL;
	} catch (err){}
	return true;
}

function ElDesc(el){
	var Name = el.tagName.toLowerCase();
	el = $(el);
	var ID = el.attr('id');
	if (!ID) {
		ID = el.index()+1;
		if (ID == 1){ID = ''}
	}
	if (ID) Name += '.'+ID;
	return  Name;
}

