var ImageSelector = new Class({

    selectedItemIndex: null,

    initialize: function (thumbnails, contentElements) {
        this.thumbnails = thumbnails;
        this.contentElements = contentElements;
        var self = this;
        this.thumbnails.each(function(el, index) {
            el.addEvent('click', function () {
                self.select(index);
            });
        });
    },

    select: function(itemIndex) {
        var selectedItemIndex = this.selectedItemIndex;
        if (selectedItemIndex != null) {
            this.hide(selectedItemIndex);
        }

        this.selectedItemIndex = itemIndex;

        this.show(itemIndex);
    },

    show: function(itemIndex) {
        var imageEl = this.thumbnails[itemIndex].getElement('img');
        imageEl.removeClass('drk');
        var contentEl = this.contentElements[itemIndex];
        contentEl.removeClass('hidden');
        var relatedImage = imageEl.get('rel');
        if (relatedImage) {
            contentEl.getElement('img').set('src', relatedImage);
            imageEl.erase('rel');
        }
    },

    hide: function(itemIndex) {
        this.thumbnails[itemIndex].getElement('img').addClass('drk');
        this.contentElements[itemIndex].addClass('hidden');
    }

});

var initImagesOverlay = function (popupId, targetClass) {
    var popupEl = $(popupId);
    var containerEl = popupEl.getElement('.js_images_popup_items');
    var elementToClone = containerEl.getFirst().dispose();
    var popupImages = [];

    var updateImages = function(el) {
        var newEl = elementToClone.clone();
        popupImages.push(newEl);

        newEl = newEl.getElement('img');
        newEl.set('src', el.get('src'));
        newEl.set('rel', el.get('rel'));
        el.erase('rel');

        newEl.addClass('drk');
    };

    $$(targetClass || '.js_images_overlay').each(function(el) {
        // clone image items in popup and update images
        el.getElements('img').each(updateImages);
        containerEl.adopt(popupImages);

        var selector = new ImageSelector($$(popupImages).getElements('a'), popupEl.getElement('.js_images_popup_content').getChildren());
        var triggerEls = el.getElements('a');
        triggerEls.each(function(trigger, index) {
            trigger.addEvent('click', function() {
                selector.select(index);
            })
        });
    });
};

function initGalleryOverlay(triggerSelector) {
    var GALLERIES = {};

    $$(triggerSelector).each(function (trigger) {
        var popupId = trigger.get("rel");
        if (!popupId) {
            return;
        }

        if (!GALLERIES[popupId]) {
            var popup = $(popupId);
            popup.getElements('.js_images_popup_items img').addClass('drk');
            GALLERIES[popupId] = new ImageSelector(popup.getElements('.js_images_popup_items a'), popup.getElement('.js_images_popup_content').getChildren())
        }

        trigger.addEvent('click', function() {
            GALLERIES[popupId].select(0);
        });
    });
}


var AbstractDropdown = new Class({

    initialize: function (dd, popups) {
        var trigger = dd.getElement('.js_dd_trigger');
        var target = dd.getElement('.js_dd_target');

        var popup = new CHKCustomPopUp(trigger, target, {
            showEvent : ['click'],
            hideEvent : []
        });
        popups.push(popup);
        this.popup = popup;

        popup.addHideElement(target.getElement('.js_dd_header'), 'click');

        var links = target.getElements('a');
        popup.addEvent('onshow', function() {
            popups.each(function(p) {
                if (p.targetEl != popup.targetEl && p.isOpen) p.hide();
            });
            links[0].focus();
            dd.setStyle('z-index', 1);
        });

        popup.addEvent('onhide', function() {
            dd.setStyle('z-index', 0);
        });

        links[0].addEvent('keypress', function(event) {
            if (event.key == 'tab' && event.shift) {
                popup.hide();
                popup.triggerEl.focus();
            }
        });

        links.getLast().addEvent('keypress', function(event) {
            if (event.key == 'tab' && !event.shift) {
                popup.hide();
                popup.triggerEl.getElement("a").focus();
            }
        });
    }

});

var BasicDropdown = new Class({

    Extends: AbstractDropdown,

    initialize: function(dd, popups) {
        this.parent(dd, popups);

        var self = this;
        var items = this.popup.targetEl.getElements('a');
        items.each(function (item) {
            item.addEvent("click", function (e) {
                self.popup.hide();
                self.popup.triggerEl.getElement("a").focus();
            });
        });
    }

});

var SortDropdown = new Class({

    Extends: AbstractDropdown,

    initialize: function(dd, popups) {
        this.parent(dd, popups);

        //    NOTE: set first value
        var first_item = this.popup.targetEl.getElements('.dropdown_item')[0];
        var text = first_item.get('text');
        var input = dd.getElement('.js_dd_input');
        input.value = text;
        dd.getElements(".js_dd_input_value").each(function (e) {
            e.set("text", text);
        });

        var self = this;
        var items = this.popup.targetEl.getElements('.dropdown_item a');
        items.each(function (item) {
            item.addEvent("click", function (e) {
                e.stopPropagation();
                var text = item.get('text');
                input.value = text;
                dd.getElements(".js_dd_input_value").each(function (e) {
                    e.set("text", text);
                });

                self.popup.hide();
                self.popup.triggerEl.getElement("a").focus();
            });
        });
    }

});

function initDropDownSelects(dropdownSelector, dropdownClass) {
    dropdownSelector = dropdownSelector ? dropdownSelector : '.js_dd';
    dropdownClass = dropdownClass ? dropdownClass : BasicDropdown;

    var popups = [];

    $$(dropdownSelector).each(function (dd) {
        new dropdownClass(dd, popups);
    });

    $$(document.body).addEvent('click', function() {
        popups.each(function(p) {
            p.isOpen && p.hide();
        });
    });
}


var RequestCallWidget = new Class({

    initialize: function(requestCallTriggerClass, requestCallTargetClass) {
        var triggers = $$(requestCallTriggerClass || '.js_request_call_trigger');
        var target = $$(requestCallTargetClass || '.js_request_call_popup')[0];

        triggers.each(function(trigger) {
            trigger.addEvent('click', function(event) {
                event.stopPropagation();
				target.getElement('iframe').set('src', $('sales_contact_expert_url').value);
				target.getElement('iframe').addEvent('load',function(){
					target.setStyles({'visibility':'visible','left':'0'});
				});
            });
        });

		target.getElement('a').addEvent('click', function() {
        	target.setStyles({'visibility':'hidden','left':'-10000px'});
        });

        target.inject(document.body);
    }

});



var initRequestCallWidget = function (requestCallTriggerClass, requestCallTargetClass) {
    new RequestCallWidget(requestCallTriggerClass, requestCallTargetClass);
};


var DelayMixin = new Class({
    timer: null,

    delayFor: function (action, delay, context) {
        return function () {
            $clear(this.timer);
            return this.timer = action.delay(delay, context || this);
        }.bind(this);
    }
});

var ExpandableArea = new Class({

    Implements: [DelayMixin, Options],

    options: {
        duration: 500,
        expanderSelector: ".js_expander",
        expand: {
            color: '#666666',
            delay: 300
        },
        collapse: {
            color: '#313236',
            delay: 100
        }
    },

    initialize : function(triggerEl, options) {
        this.setOptions(options);

        this.trigger = triggerEl;
        this.expander = triggerEl.getElement(this.options.expanderSelector);
        if (!this.trigger || !this.expander) {
            return;
        }

        this.effectTween = new Fx.Tween(this.trigger, {duration : this.options.duration, link : 'cancel'});
        this.effectMorph = new Fx.Morph(this.expander, {duration : this.options.duration, link : 'cancel'});

        var expand = this.delayFor(this.expand, this.options.expand.delay);
        var collapse = this.delayFor(this.collapse, this.options.collapse.delay);

        this.expander.addClass('limits');
        collapse();

        this.trigger.addEvents({
            mouseenter : expand,
            mouseleave : collapse
        });

        this.trigger.getElements('a').addEvents({
            focus : expand,
            blur : collapse
        });
    },

    expand: function () {
        this.effectTween.start('backgroundColor', this.options.expand.color);
        this.effectMorph.start({height: this.expander.getScrollHeight()});
    },

    collapse: function () {
        this.effectTween.start('backgroundColor', this.options.collapse.color);
        this.effectMorph.start({height: '0px'});
    }
});

function initExpandableAreas(triggerSelector, options) {
    return $$(triggerSelector || '.js_expandable').map(function(triggerEl) {
        return new ExpandableArea(triggerEl, options);
    });
}


var PopUpHover = new Class({

    Extends : CHKCustomPopUp,

    options : {
        showEvent : [ 'mouseenter', 'focus' ],
        hideEvent : [ 'mouseleave', 'blur' ],
        useFx : true,
        fxOpenStyle : {
            opacity : 1,
            display : 'block'
        },
        fxOpenStylePre : {
            opacity : 0,
            display: 'block'
        },
        fxCloseStyle : {
            opacity : 0
        },
        fxCloseStylePost : {
            opacity : 1,
            display : 'none'
        },
        fxDuration : 300,
        fxTransition : Fx.Transitions.Sine.easeInOut,
        enableKeypress : true,
        containerEl: 'td'
    },

    initialize : function(triggerEl, targetEl) {
        triggerEl = $(triggerEl);
        targetEl = $(targetEl);

        if (!triggerEl || !targetEl) {
            return;
        }

        this.parent(triggerEl, targetEl, this.options);

        this.addKeyboardEvents();

        //NOTE: set container height as popup height
        this.setTargetHeight(this.options.containerEl);

    },

    addKeyboardEvents : function() {
        this.triggerEl.getElements('a').addEvent('click', function() {
            this.show();
        }.bind(this));
    },

    setTargetHeight : function(container){
        var triggerTd = this.triggerEl.getParent(container);
        if(!triggerTd)
            return;
        this.targetEl.setStyles({
            height: triggerTd.getSize().y - (30+24)
        });
    }

});

function _setCorrectSizeForPopupHoverGateway(popup, triggerPositionInRow) {
    popup.addEvent('onshow', function() {
        var table = this.triggerEl.getParent('table');

        this.targetEl.setStyles({
            'height': table.getSize().y - 60 + 'px',
            'width': table.getElements('td')[triggerPositionInRow].getSize().x - 36 + 'px'
        });
    });
}

function initSimpleColPopupHoverGateway(popupTriggerClass, popupTargetClass) {
    popupTriggerClass = popupTriggerClass || '.js_col_popup_trigger';
    popupTargetClass = popupTargetClass || '.js_col_popup_target';

    var popupTargets = $$(popupTargetClass);

    var popupManager = new PopupManager();

    $$(popupTriggerClass).each(function(trigger, index) {
        var popupTarget = popupTargets[index];
        popupTarget.setStyle('left', trigger.getParent('td').getCoordinates(trigger.getParent('table')).left);
        var popup = new PopUpHover(trigger, popupTarget);
        popupManager.add(popup);

        var triggerPositionInRow = trigger.getParent().getAllPrevious('td').length;

        var otherTriggers = getOtherTriggers(trigger, triggerPositionInRow);
        otherTriggers.each(function(otherTrigger) {
            popup.addShowElement(otherTrigger, popup.options.showEvent);
        });

        _setCorrectSizeForPopupHoverGateway(popup, triggerPositionInRow);
    });

    function getOtherTriggers(trigger, triggerPositionInRow) {
        var parentRow = trigger.getParent('tr');
        var siblingRows = parentRow.getParent().getChildren();
        var siblingsCount = siblingRows.length;
        var otherTriggers = [];

        for (var i = 0; i < siblingsCount; i++) {
            var row = siblingRows[i];
            if (row != parentRow) {
                otherTriggers.push(row.getChildren()[triggerPositionInRow]);
            }
        }

        return otherTriggers;
    }
}

function initSimpleRowPopupHoverGateway(popupTriggerClass, popupTargetClass) {
    popupTriggerClass = popupTriggerClass || '.js_row_popup_trigger';
    popupTargetClass = popupTargetClass || '.js_row_popup_target';

    var popupTargets = $$(popupTargetClass);

    var popupManager = new PopupManager();

    $$(popupTriggerClass).each(function(trigger, index) {
        var popupTarget = popupTargets[index];
        popupTarget.setStyle('left', trigger.getCoordinates(trigger.getParent()).left);
        var popup = new PopUpHover(trigger, popupTarget);
        popupManager.add(popup);

        var triggerPositionInRow = trigger.getParent().getAllPrevious('td').length;

		_setCorrectSizeForPopupHoverGateway(popup, triggerPositionInRow);
    });

}

function createHalfHoverPopup(trigger, target) {
    return popup = new PopUpHover(trigger, target);
}

function initSimpleDivPopupHoverGateway(initFunction, popupTriggerSelector, popupTargetSelector) {
    popupTriggerSelector = popupTriggerSelector || '.js_div_popup_trigger';
    popupTargetSelector = popupTargetSelector || '.js_div_popup_target';

    var popupManager = new PopupManager();

    $$(popupTriggerSelector).each(function(trigger) {
        initFunction(trigger, trigger.getElement(popupTargetSelector), popupManager);
    });
}

function initM640Hover (trigger, target, popupManager) {
    popupManager.add(createHalfHoverPopup(trigger, target));
}

function initM600Hover (trigger, target, popupManager) {
    var links = target.getElements(".m600list a");
    if (links.length == 0) {
        // TODO What should we do in case we haven't links in popup
    } else if (links.length == 1) {
        var headerLink = trigger.getElement(".m640a_header a");
        headerLink.set("href", links[0].get("href"));

        trigger.addEvents({
            click: function () { headerLink.click(); },
            mouseenter: function () { headerLink.addClass("m640a_header_hover"); },
            mouseleave: function () { headerLink.removeClass("m640a_header_hover"); }
        });
    } else {
        initM640Hover(trigger, target, popupManager);
    }
}

var SortableTable = new Class({

    getOptions: function() {
        return {
            overCls: false,
            onClick: false,
            sortOn: 0,
            sortOrder: 'ASC',
            filterHide: true,
            filterHideCls: 'hide',
            filterSelectedCls: 'selected'
        };
    },

    /**
     * @param {HTMLElement} table
     * @param {Hash} options
     * */
    initialize: function(table, options) {
        this.setOptions(this.getOptions(), options);
        this.table = table;
        this.tHead = this.table.getElement('thead');
        this.tBody = this.table.getElement('tbody');
        this.tFoot = this.table.getElement('tfoot');
        this.elements = this.tBody.getElements('tr');
        this.filtered = false;

        this.elements.each(function(el) {
            if (this.options.overCls) {
                el.addEvent('mouseover', function() {
                    el.addClass(options.overCls);
                }, this);
                el.addEvent('mouseout', function() {
                    el.removeClass(options.overCls);
                });
            }
            if (this.options.onClick) {
                el.addEvent('click', options.onClick);
            }
        }, this);

        //setup header
        this.tHead.getElements('th').each(function(el, i) {
            if (!el.hasClass('js_sort_col')) {
                return;
            }

            el.addEvent('click', this.sort.bind(this, i));
            el.addEvent('mouseover', function() {
                el.addClass('tableHeaderOver');
            });
            el.addEvent('mouseout', function() {
                el.removeClass('tableHeaderOver');
            });

            var axis = el["data-axis"];
            if (!axis || !SortableTable.DATA_COMPARATORS[axis]) {
                axis = "string"
            }

            el.compare = function(row1, row2) {
                function findData(elem) {
                    var child = elem.getFirst();
                    if (child) {
                        return findData(child);
                    } else {
                        return elem.innerHTML.trim();
                    }
                }

                var var1 = findData(row1.getChildren()[i]);
                var var2 = findData(row2.getChildren()[i]);

                return SortableTable.DATA_COMPARATORS[axis](el.sortOrder, var1, var2);
            };

            if (i == this.options.sortOn) {
                el.fireEvent('click');
            }
        }, this);
    },

    sort: function(index) {
        if (this.options.onStart) {
            this.fireEvent('onStart');
        }

        //
        this.options.sortOn = index;
        var header = this.tHead.getElements('th');
        var el = header[index];

        header.each(function(e, i) {
            if (i != index) {
                e.removeClass('sortedASC');
                e.removeClass('sortedDESC');
            }
        });

        if (el.hasClass('sortedASC')) {
            el.removeClass('sortedASC');
            el.addClass('sortedDESC');
            el.sortOrder = 'DESC';
        } else if (el.hasClass('sortedDESC')) {
            el.removeClass('sortedDESC');
            el.addClass('sortedASC');
            el.sortOrder = 'ASC';
        } else {
            if (this.options.sortOrder == 'ASC') {
                el.addClass('sortedASC');
                el.sortOrder = 'ASC';
            } else if (this.options.sortOrder == 'DESC') {
                el.addClass('sortedDESC');
                el.sortOrder = 'DESC';
            }
        }

        //
        this.elements.sort(el.compare);
        this.elements.injectInside(this.tBody);

        //
        if (this.filtered) {
            this.filteredAltRow();
        } else {
            this.altRow();
        }

        //
        if (this.options.onComplete) {
            this.fireEvent('onComplete');
        }
    },

    altRow: function() {
        this.elements.each(function(el, i) {
            if (i % 2) {
                el.removeClass('altRow');
            } else {
                el.addClass('altRow');
            }
        });
    },

    filteredAltRow: function() {
        this.table.getElements('.' + this.options.filterSelectedCls).each(function(el, i) {
            if (i % 2) {
                el.removeClass('altRow');
            } else {
                el.addClass('altRow');
            }
        });
    },

    filter: function(form) {
        var form = $(form);
        var col = 0;
        var key = '';

        form.getChildren().each(function(el) {
            if (el.id == 'column') {
                col = Number(el.value);
            }
            if (el.id == 'keyword') {
                key = el.value.toLowerCase();
            }
            if (el.type == 'reset') {
                el.addEvent('click', this.clearFilter.bind(this));
            }
        }, this);

        if (key) {
            this.elements.each(function(el) {
                if (this.options.filterHide) {
                    el.removeClass('altRow');
                }
                if (el.getChildren()[col].firstChild.data.toLowerCase().indexOf(key) > -1) {
                    el.addClass(this.options.filterSelectedCls);
                    if (this.options.filterHide) {
                        el.removeClass(this.options.filterHideCls);
                    }
                } else {
                    el.removeClass(this.options.filterSelectedCls);
                    if (this.options.filterHide) {
                        el.addClass(this.options.filterHideCls);
                    }
                }
            }, this);
            if (this.options.filterHide) {
                this.filteredAltRow();
                this.filtered = true;
            }
        }
    },

    clearFilter: function() {
        this.elements.each(function(el) {
            el.removeClass(this.options.filterSelectedCls);
            if (this.options.filterHide) {
                el.removeClass(this.options.filterHideCls);
            }
        }, this);
        if (this.options.filterHide) {
            this.altRow();
            this.filtered = false;
        }
    }

});

SortableTable.implement(new Events);
SortableTable.implement(new Options);

SortableTable.DATA_COMPARATORS = {
    number: function (sortOrder, var1, var2) {
        var1 = parseFloat(var1);
        var2 = parseFloat(var2);

        if (sortOrder == 'ASC') {
            return var1 - var2;
        } else {
            return var2 - var1;
        }
    },

    string: function (sortOrder, var1, var2) {
        var1 = var1.toUpperCase();
        var2 = var2.toUpperCase();

        if (var1 == var2) {
            return 0
        }

        if (sortOrder == 'ASC') {
            if (var1 < var2) {
                return -1
            }

        } else {
            if (var1 > var2) {
                return -1
            }

        }
        return 1;
    },

    data: function (sortOrder, var1, var2) {
        function getDate(str) {
            // inner util function to convert 2-digit years to 4
            function fixYear(yr) {
                yr = +yr;
                if (yr < 50) {
                    yr += 2000;
                }
                else if (yr < 100) {
                    yr += 1900;
                }
                return yr;
            }

            var strTime;
            if (str.length > 12) {
                strTime = str.substring(str.lastIndexOf(' ') + 1);
                strTime = strTime.substring(0, 2) + strTime.substr(-2)
            } else {
                strTime = '0000';
            }

            var ret;
            // YYYY-MM-DD
            if (ret = str.match(/(\d{2,4})-(\d{1,2})-(\d{1,2})/)) {
                return (fixYear(ret[1]) * 10000) + (ret[2] * 100) + (+ret[3]) + strTime;
            }
            // DD/MM/YY[YY] or DD-MM-YY[YY]
            if (ret = str.match(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})/)) {
                return (fixYear(ret[3]) * 10000) + (ret[2] * 100) + (+ret[1]) + strTime;
            }
            return 999999990000; // So non-parsed dates will be last, not first
        }

        var1 = parseFloat(getDate(var1));
        var2 = parseFloat(getDate(var2));

        if (sortOrder == 'ASC') {
            return var1 - var2;
        } else {
            return var2 - var1;
        }
    },

    currency: function (sortOrder, var1, var2) {
        var1 = parseFloat(var1.substr(1).replace(',', ''));
        var2 = parseFloat(var2.substr(1).replace(',', ''));

        if (sortOrder == 'ASC') {
            return var1 - var2;
        } else {
            return var2 - var1;
        }
    }
};

function initSortableTables() {
    $$('.js_sortable_table').each(function (el) {
        new SortableTable(el);
    });
}

var initLayoutT1 = function (selector, checkContainer) {
	var alignLayoutHeight = function (targetEl) {
		var targetEls = targetEl ? targetEl.getElements(selector || '.js_layout_t1 td') : $$(selector || '.js_layout_t1 td');
		targetEls.each(function (el){
			var element = el.getFirst();
			if (element) {
				var h = el.getSize().y - parseInt(element.getStyle('padding-top'),10) - parseInt(element.getStyle('padding-bottom'),10);
				if (checkContainer && element.getFirst()) {
					element = element.getFirst();
					h = h - parseInt(element.getStyle('padding-top'),10) - parseInt(element.getStyle('padding-bottom'),10);
				}
				if (h>0 && (element.getProperty('class').indexOf('module') != -1 || element.getProperty('class').indexOf('gradient') !=-1))	element.setStyle('height',h);
				
			}
			
			
		});
	}
	
	alignLayoutHeight();
	
	$$('.tab_content').each(function(el){
		if (el.getStyle('display')=='none') {
			el.setStyles({visibility:'hidden',display:'block'});
			alignLayoutHeight(el);
			el.setStyles({visibility:'',display:'none'});
		}
	});
};

/* UnCompressed - Reason: DISABLED_TARGET-LIVECWADEPLOYER# */

/*
Date: 12/15/2011 9:53:52 PM
All images published
*/
