


function setupSlider(root, images, size) {

    var scrollHolder = createDom('div', { className: 'scrollHolder clearfix' });
    var pauseIcon = createDom('div', { className: 'slider-pause-icon' });
    var scrollArea = createDom('div', { className: 'slider-scene', style: 'overflow: hidden;', children: [scrollHolder] });
    var placeholder = createDom('div', {
        className: 'slider-placeholder',
        style: 'line-height: ' + size.h + 'px; height: ' + size.h + 'px; width: ' + size.w + 'px;',
        innerHTML: 'Загрузка&hellip;'
    });

    var scrollPause = 16000;
    var preloadForward = 2;

    var count = images.length;
    var imageObjects = new Array(count);
    var imagesLoaded = new Array(count);
    var imageSources = [];
    var imageNodes = new Array(count);
    var imageW = size.w;
    var imageH = size.h;
    var spacing = 0;

    var totalWidth = count * imageW + spacing * (count - 1);
    var current = 0;
    var next = 0;
    var queueTimeout = null;
    var playing = true;


    for (var i = 0; i < count; i++) {
        var p = placeholder.cloneNode(true);
        imageNodes[i] = p;
        imageSources[i] = images[i];
        scrollHolder.appendChild(p);
    }

    // Create thumb area
    var thumbArea = setupSlider.thumbArea(count, current);
    thumbArea.onClick(onThumbClick);

    scrollArea.style.visibility = 'hidden';
    pauseIcon.style.display = 'none';
    scrollHolder.style.width = totalWidth + 'px';
    var pos = (current + spacing) * imageW;
    var animation = animateCss(scrollArea, scrollWindow, pos);
    root.appendChild(scrollArea);
    root.appendChild(thumbArea.createDom());
    root.appendChild(pauseIcon);

    addEvent(root, 'mouseover', onMouseOver);
    addEvent(root, 'mouseout', onMouseOut);

    // Set scrollLeft
    switchToImage(current);

    // Show
    scrollArea.style.visibility = '';

    queueScrolling();

    return;

    function log(txt) {
        window.console && window.console.log(txt);
    }

    function logState(txt) {
        log(txt + ": cur=" + current + ", next=" + next + ", playing=" + (playing ? 1 : 0) + ", timeout=" + (queueTimeout ? 1 : 0));
    }

    //      Functions code
    // ----------------------------
    function onThumbClick(number) {
        scrollToImage(number);
        pause();
    }

    function pause() {
        cancelScrolling();
        playing = false;
        pauseIcon.style.display = '';
    }

    function play() {
        if (!playing) {
            playing = true;
            queueScrolling();
            pauseIcon.style.display = 'none';
        }
    }

    function scrollToImage(number) {
        switchToImage(number);
        var pos = number * (imageW + spacing);
        animation.go(pos);
    }

    function switchToImage(number) {
        thumbArea.switchTo(number);
        loadImageToScene(number);
        next = current = number;
    }

    function scrollWindow(node, value) {
        node.scrollLeft = Math.round(value);
    }

    function queueScrolling() {
        if (!playing) {
            return;
        }

        clearTimeout(queueTimeout);
        queueTimeout = setTimeout(onTimeout, scrollPause);
    }

    function cancelScrolling() {
        clearTimeout(queueTimeout);
        queueTimeout = null;
    }

    function onTimeout() {
        if (!playing) {
            return;
        }

        next = (current < (count - 1)) ? current + 1 : 0;

        if (imagesLoaded[next]) {
            scrollToImage(next);
            queueScrolling();
        } /* else if (!imageObjects[next]) {
            createImgObject(next);
        } */
    }

    function onImageLoaded(number) {

        if (!imagesLoaded[number]) {
            // replace a placeholder
            var newNode = createDom('img', { width: imageW, height: imageH, src: imageSources[number] });
            var n = imageNodes[number];
            n.parentNode.replaceChild(newNode, n);
            imageNodes[number] = newNode;
        }

        // We were waiting for you
        imagesLoaded[number] = true;

        if (number == next && number != current && playing) {
            scrollToImage(next);
            queueScrolling();
        }
    }

    function onImageError(number) {

        imagesLoaded[number] = true;
        onImageLoaded(number);
        return true;
    }

    function onMouseOver(ev) {

        if (!playing) {
            return;
        }

        var e = ev || window.event;
        var from = e.relatedTarget || e.fromElement;
        var to = e.target || e.toElement;

        if (!from || !isInside(from, root)) {
            pause();
        }
    }

    function onMouseOut(ev) {

        if (playing) {
            return;
        }

        var e = ev || window.event;
        var from = e.target || e.fromElement;
        var to = e.relatedTarget || e.toElement;

        if (!to || !isInside(to, root)) {
            play();
        }
    }

    function isInside(node, parent) {
        if (parent.compareDocumentPosition) {
            return parent.compareDocumentPosition(node) & (0x10) /* CONTAINED_BY */ ;
        } else {
            return parent.contains(node);
        }
    }

    function createImgObject(i) {

        var img = new Image();
        img.number = i;
        img.onload = function() { onImageLoaded(this.number); };
        img.onerror = function() { onImageError(this.number); };
        imageObjects[i] = img;
        img.src = imageSources[i];
    }

    function loadImageToScene(number) {
        var from = number;
        var to = Math.min(count - 1, number + preloadForward);
        for (var i = from; i <= to; i++) {
            if (!imageObjects[i]) {
                createImgObject(i);
            }
        }

        if (i > 0) {
            if (!imageObjects[i - 1]) {
                createImgObject(i - 1);
            }
        }
    }
}

setupSlider.thumbArea = function(count, active) {

    var onClickCbk = null;
    var ul = null;
    var wrap = null;
    var mapping = {};   // Maps data-id to number
    var items = [];
    var activeItem = null;

    var thumbs =  {
        onClick: function(fn) {
            onClickCbk = fn;
        },

        createDom: function() {
            items = [];
            for (var i = 0; i < count; i++) {
                items[i] = createDom('li', { dataId: i });
                if (i == active) {
                    items[i].className = 'active';
                    activeItem = items[i];
                }
                mapping[i] = i;
            }

            ul = createDom('ul', { className: 'thumb-list clearfix', children: items });
            centered = createDom('div', { className: 'thumb-center', innerHTML: '<ins class="thumb-l"></ins><ins class="thumb-r"></ins>', children: [ul] });
            wrap = createDom('div', { className: 'thumb-wrap', children: [centered] });
            addEvent(ul, 'mousedown', thumbClick);

            return wrap;
        },

        switchTo: function (number) {
            if (number != active) {
                if (activeItem) {
                    activeItem.className = '';
                }

                activeItem = items[number];
                activeItem.className = 'active';
                active = number;
            }
        },

        removeItem: function(number) {
            var removed = items[number];
            var removedId = removed.dataId;

            if (active == number) {
                activeItem = null;
                active = null;
            }

            // Remove thumb item
            removed.parentNode.removeChild(removed);

            // Remove from array
            items.splice(number, 1);

            // update mapping
            for (var i in mapping) {
                if (mapping[i] == number) {
                    delete mapping[i];
                } else if (mapping[i] >= number) {
                    mapping[i] --;
                }
            }
        }
    };

    return thumbs;

    // Internal functions
    function thumbClick(ev) {
        var e = ev || window.event;
        var t = e.target || e.srcElement;

        var li = closestTag(t, 'li');
        if (li) {
            var number = mapping[li.dataId];
            if (onClickCbk) {
                onClickCbk(number);
            }
        }

        prevent(e);
        clearSelection();
    }
}


function animateCss(data, cbk, initialValue) {

    var interval = null;
    var timeStep = 16;
    var duration = 500;
    var value = initialValue, startValue = 0, endValue = 0;
    var startTime = 0, endTime = 0;

    cbk(data, initialValue, 0);

    var me = {
        go: function (target) {

            if (target == value) {
                stop();
                return;
            }

            // Set start/end pos
            startValue = value;
            endValue = target;
            startTime = (new Date()).getTime();
            endTime = startTime + duration;

            if (!interval) {
                interval = setInterval(tick, timeStep);
            }
        },

        stop: function () {
            clearInterval(interval);
            interval = null;
        },

        end: function () {
            if (interval) {
                value = endValue;
                me.stop();
                cbk(data, value, 1);
            }
        }
    };

    function tick() {
        var pos = ((new Date()).getTime() - startTime) / (endTime - startTime);
        pos = Math.min(1, Math.max(0, pos));
        // add sin^2(x)
        var shiftedPos = Math.sin(pos * Math.PI / 2) * Math.sin(pos * Math.PI / 2);

        value = startValue + (endValue - startValue) * shiftedPos;

        if (pos >= 1) {
            // Reached end
            me.stop();
        }

        cbk(data, value, pos);
    }

    return me;
}

function jsPlaceholder(node) {
    var isOn = (node.value === '');
    var ph = findlabel(node, node.id);
    if (!ph) { return; }

    showPlaceholder(ph, isOn);

    addEvent(node, 'focus', function() {
        if (isOn) {
            showPlaceholder(ph, false);
        }

        isOn = false;
    });

    addEvent(node, 'blur', function() {
        isOn = (node.value === '');
        showPlaceholder(ph, isOn);
    });

    addEvent(ph, 'click', function (ev) {
        onClick(ev);
    });

    addEvent(ph, 'mouseup', function (ev) {
        onClick(ev);
    });

    function onClick(ev) {
        var e = ev || window.event;
        prevent(e);
        node.focus();
        isOn = false;
        showPlaceholder(ph, false);
    }
};

function findlabel(node) {
    var form = node.form;
    var nodeId = node.id;
    var re = /(^|\s)placeholder(\s|$)/;

    if (!nodeId) {
        return null;
    }

    var labels = form.getElementsByTagName('label');
    for (var i = labels.length - 1; i >= 0; i--) {
        if (labels[i].htmlFor == nodeId && re.test(labels[i].className)) {
            return labels[i];
        }
    }

    return null;
}

function showPlaceholder(ph, isOn) {
    if (isOn) {
        ph.style.display = 'block';
    } else {
        ph.style.display = '';  // default is hide
    }
}


// Common DOM utils
function createDom(name, props) {
    var p = props || {};
    var e = document.createElement(name);
    var style = p.style;
    var children = p.children;
    delete p.style;
    delete p.children;

    for (var i in p) {
        e[i] = p[i];
    }

    (style) && (e.style.cssText = style);

    if (children) {
        for (var i = 0; i < children.length; i++) {
            e.appendChild(children[i]);
        }
    }

    return e;
}


function addEvent(elm, type, fn) {
    elm.addEventListener ?
        elm.addEventListener(type, fn, false) :
        elm.attachEvent('on' + type, fn);
}

function prevent(event) {
    event.returnValue = false;
    event.preventDefault && event.preventDefault();
}

function trim(str) {
    return str.replace(/^\s+|\s+$/g, '');
}

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

function findFirst(root, className, tagHint) {
    if (root.getElementsByClassName) {
        var elms = root.getElementsByClassName(className);
        return elms ? elms[0] : null;
    } else {
        var tags = root.getElementsByTagName(tagHint || '*');
        var l = tags.length;
        var re = new RegExp('(^|\\s)' + className + '(\\s|$)');

        for (var i = 0; i < l; i++) {
            if (re.test(tags[i].className)) {
                return tags[i];
            }
        }

        return null;
    }
}

function clearSelection() {
    if(document.selection && document.selection.empty) {
        document.selection.empty() ;
    } else if(window.getSelection) {
        var sel=window.getSelection();
        if(sel && sel.removeAllRanges) {
            sel.removeAllRanges();
        }
    }
}

function closestTag(node, nameLC) {
    while (node) {
        if (node.nodeName.toLowerCase() == nameLC) {
            return node;
        }

        node = node.parentNode;
    }

    return null;
}


function setupPlaceholders() {
    var forms = document.getElementsByTagName('form');
    for (var i = forms.length - 1; i >= 0; i--) {
        var form = forms[i];
        var inputs = form.getElementsByTagName('input');
        var tas = form.getElementsByTagName('textarea');

        for (var j = inputs.length - 1; j >= 0; j--) {
            jsPlaceholder(inputs[j]);
        }

        for (var j = tas.length - 1; j >= 0; j--) {
            jsPlaceholder(tas[j]);
        }
    }
}

function setupValidators(form, config) {
    var numberOnly = config.numberOnly || {};
    var required = config.required || {};
    var errorField = findFirst(form, 'form-errors', 'div');

    setErrors('');
    addEvent(form, 'submit', onSubmit);

    function onSubmit(ev) {
        var e = ev || window.event;
        var errors = [];
        var text = '';
        var focusNode = null;

        for (var name in required) {
            var node = form.elements[name];
            if (trim(node.value) === '') {
                errors.push(required[name]);
                !focusNode && (focusNode = node);
            }
        }

        if (errors.length) {
            text += 'Пожалуйста, укажите ' + concatMessages(errors) + '.';
        }

        var re = /^\d+$/;
        errors = [];

        for (var name in numberOnly) {
            var node = form.elements[name];
            var val = trim(node.value);
            if (val !== '' && !re.test(val)) {
                errors.push(numberOnly[name]);
                !focusNode && (focusNode = node);
            }
        }

        if (errors.length) {
            if (text != '') {
                text += '   А ' + concatMessages(errors) + ' состоит только из цифр.'
            } else {
                var fields = concatMessages(errors);
                // fields = fields[0].toUpperCase() + fields.substr(1);
                text += 'Ошибка - ' + fields + ' состоит только из цифр.';
            }
        }

        setErrors(text);

        if (text !== '') {
            prevent(e);
            focusNode.focus();
        }
    }

    function setErrors(txt) {
        errorField.innerHTML = txt;
        errorField.style.display = (txt == '') ? '' : 'block';
    }

    function concatMessages(arr) {
        if (arr.length < 1) {
            return '';
        }

        var last = '' + arr.pop() + '';
        hasFirst = arr.length > 0;
        var first = '' + arr.join(', ') + '';
        return hasFirst ? first + ' и ' + last : last;
    }
}

function setDefaultMonth() {
    var form = byId('reserve-form');
    if (!form) {
        return;
    }
    var now = new Date();
    var month = now.getDate() > 29 ? now.getMonth() + 2 : now.getMonth() + 1;

    if (getSelectValue(form.elements['arrival-month']) == 0) {
        setSelectValue(form.elements['arrival-month'], month);
    }

    if (getSelectValue(form.elements['depart-month']) == 0) {
        setSelectValue(form.elements['depart-month'], month);
    }
}

function getSelectValue(sel) {
    var selected = sel.options[sel.selectedIndex];
    return selected.value;
}

function setSelectValue(sel, value) {
    var o = sel.options;
    for (var i = o.length - 1; i>= 0; i--) {
        if (o[i].value == value) {
            sel.selectedIndex = i;
            return true;
        }
    }

    return false;
}




setupPlaceholders();
setDefaultMonth();

var reserveForm = byId('reserve-form');
reserveForm && setupValidators(reserveForm, {
    required: {
        name: 'ваше <em>имя</em>',
        'arrival-day': '<em>день прибытия</em>',
        'depart-day': '<em>дату выезда</em> (можно примерно)',
        adults: '<em>количество</em> человек'
    },

    numberOnly: {
        'arrival-day': '<em>день прибытия</em>',
        'depart-day': '<em>день выезда</em>',
        adults: 'число <em>человек</em>',
        children: 'число <em>детей</em>',
        kids: 'число <em>маленьких детей</em>',
        babies: 'число <em>детей</em> до 3-х лет'
    }
});

var feedbackForm = byId('feedback-form');
feedbackForm && setupValidators(feedbackForm, {
    required: {
        contact: 'ваш <em>телефон</em> или <em>e-mail</em>',
        text: '<em>текст</em> вашего сообщения'
    }
});


var slider = document.getElementById('slider-area-1');
if (slider) {
    setupSlider(
        slider,
        ['_mod_files/content/small/one.jpg', '_mod_files/content/small/two.jpg', '_mod_files/content/small/three.jpg',
            '_mod_files/content/small/four.jpg', '_mod_files/content/small/five.jpg', '_mod_files/content/small/six.jpg'],
        { w: 924, h: 418 }
    );
}



// menu.js

function load(location){
    if(document.images){
        var image = new Image();
        image.src = location;
        return image;
    }
}

function getElementPosition(oElement, oMenu){
    var res = new Array(0, 0);
    // Detect absolute or relative parent offset
    pStopObj = null;
    pObj = oMenu.parentNode;
    while(pObj != null && typeof(pObj.style) != "undefined"){
        if(pObj.style.position == "absolute" || pObj.style.position == "relative"){
            pStopObj = pObj;
            break;
        }
        pObj = pObj.parentNode;
    }
    // Get coordinates
    do{
        if(pStopObj == oElement)
            break;
        res[0] += oElement.offsetLeft;
        res[1] += oElement.offsetTop;
    }while((oElement = oElement.offsetParent) != null);
    return res;
}

function positioningMenu(smNum, relateToParentX, relateToParentY, deltaX, deltaY){
    var menuId = "sub_menu_" + smNum;
    var menuObj = document.getElementById(menuId);
    var parentId = "j" + smNum;
    var parentObj = document.getElementById(parentId);
    
    var parentPosition = getElementPosition(parentObj, menuObj);

    if(typeof(deltaX) == "undefined")
        deltaX = 0;
    if(relateToParentX == "right" || relateToParentX == "center"){
        parentWidth = parentObj.offsetWidth;
        if(relateToParentX == "center")
            parentWidth = parentWidth/2;
        deltaX += parentWidth;
    }
    
    if(typeof(deltaY) == "undefined")
        deltaY = 0;
    if(relateToParentY == "bottom" || relateToParentY == "center"){
        parentHeight = parentObj.offsetHeight;
        if(relateToParentY == "center")
            parentHeight = parentHeight/2;
        deltaY += parentHeight;
    }
    
    menuObj.style.position = 'absolute';
    menuObj.style.left = parentPosition[0] + deltaX + 'px';
    menuObj.style.top = parentPosition[1] + deltaY + 'px';
}

var hTmMenuHide = null;
var hTmSubMenuHide = {"init":0};
var prevImgSrc = Array();
var openedMenusStack = Array();

function showMenu(smNum, parentNum, relateToParentX, relateToParentY, deltaX, deltaY, imgOver){
    var menuObj = document.getElementById("sub_menu_" + smNum);
    if(menuObj != null){
        clearTimeout(hTmMenuHide);
        clearTimeout(hTmSubMenuHide[smNum]);
        
        hideMenuById(parentNum, true, true);
        positioningMenu(smNum, relateToParentX, relateToParentY, deltaX, deltaY);
      
        if(document.images['main_menu_img_'+smNum]){
            prevImgSrc[smNum] = document.images['main_menu_img_'+smNum].src;
            document.images['main_menu_img_'+smNum].src = imgOver;
        }
        
        document.getElementById("sub_menu_" + smNum).style.display = 'block';
        openedMenusStack.push(smNum);
    }
}

function hideMenu(smNum){
    var menuObj = document.getElementById("sub_menu_" + smNum);
    if(menuObj != null){
        menuObj.style.display = 'none';
        images = document.getElementsByTagName("IMG");
        if(document.images && document.images['main_menu_img_'+smNum] && prevImgSrc[smNum] != null){
            document.images['main_menu_img_'+smNum].src = prevImgSrc[smNum];
        }
    }
}

function hideMenuById(smNum, isIdParent, hideAllIfNotFound){
    if(smNum == 0){
        hideMenuAll();
    }else{
        var removeFromPos = -1;
        for(i = 0; i < openedMenusStack.length; i++){
            if(openedMenusStack[i] == 0)
                break;
            if(removeFromPos == -1 && openedMenusStack[i] == smNum){
                removeFromPos = i;
                if(isIdParent){
                    removeFromPos += 1;
                    continue;
                }
            }
            if(removeFromPos > -1){
                hideMenu(openedMenusStack[i]);
            }
        }
        if(hideAllIfNotFound && removeFromPos == -1){
            hideMenuAll();
        }else if(removeFromPos > -1 && removeFromPos < openedMenusStack.length){
            openedMenusStack.splice(removeFromPos, openedMenusStack.length-removeFromPos);
        }
    }
} 

function hideMenuAll(){
    for(i = openedMenusStack.length-1; i >= 0; i--){
        hideMenu(openedMenusStack[i]);
    }
    openedMenusStack = new Array();
    
    // Switch to next block if you have some problems with div hiding caused special custom processing
    /*oDivs = document.getElementsByTagName("DIV");
    for(i = 0; i < oDivs.length; i++){
        if(oDivs[i].id.substr(0, 9) == "sub_menu_"){
            hideMenu(oDivs[i].id.substr(9));
        }
    }*/
} 

function hideMenuAllByTimeout(){
    hTmMenuHide = setTimeout('hideMenuAll()', 500);
}
function hideMenuIdByTimeout(smNum){
    hTmSubMenuHide[smNum] = setTimeout('hideMenuById('+smNum+', false, false)', 250);
}

/* HTML handlers */
function mon(smNum, smParentId){
    clearTimeout(hTmMenuHide);
    if(typeof(smNum) != "undefined" && smNum > 0){
        clearTimeout(hTmSubMenuHide[smNum]);
    }
    if(typeof(smParentId) != "undefined" && smParentId > 0){
        clearTimeout(hTmSubMenuHide[smParentId]);
    }
}
function moff(smNum, evt){
    hideMenuAllByTimeout();
    if(typeof(smNum) != "undefined"){
        hideMenuIdByTimeout(smNum);
    }
    if(typeof(evt) != "undefined"){
        if(typeof(evt.cancelBubble) != "undefined"){
            evt.cancelBubble = true;
            if(typeof(evt.stopPropagation) == "function")
                evt.stopPropagation();
        }
    }
}
function submoff(menuId){
    hideMenuIdByTimeout(menuId);
}
function ck(num,state){
}
function smclick(){
    hideMenuAll();
}

// preload.js



function none(){
  return false;
}

function newImage(arg) {
  if (document.images) {
    rslt = new Image();
    rslt.src = arg;
    return rslt;
  }
}

function changeImages() {
  if (document.images && (preloadFlag == true)) {
    for (var i=0; i<changeImages.arguments.length; i+=2) {
      document[changeImages.arguments[i]].src = changeImages.arguments[i+1];
    }
  }
}

var preloadFlag = false;

function preloadImages() { 
  if(document.images) { 
     if(!preloadFlag) var pImages =new Array();
     var i,j=pImages.length,args=preloadImages.arguments; 
     if (args[0].length)
       args = args[0];
     for(i=0; i<args.length; i++)
     if(args[i].indexOf("#")!=0) { 
        pImages[j]=new Image; 
        pImages[j++].src=args[i];
     }
  preloadFlag = true;
  }
}

if (typeof(arrPreload)!="undefined")
  preloadImages(arrPreload);

function DoPreload(){
}
       


AMI.UI.overloadAlert(true);

