/**
* @author Mohsen Taleb <mohsentaleb@gmail.com>
* @note Based on MooTools 1.2.4
* @requires Core, Fx.Reveal
*/


/**
*	TinyTab, a simple tab class
*
*	Takes a list of tabs and their corresponding content blocks and makes a simple tab
*
*	@param 	mixed tabs CSS selector for the tabs, must be provided with $$() function
*	@param 	mixed contents CSS selector for the contents, must be provided with $$() function
* 	@param 	object opt Optionl {selectedClass:string, selectedIndex:int}
*/
var adTimer = null;


TinyTab = new Class({
    Implements: Events,
    initialize: function (tabs, contents, opt) {
        this.tabs = tabs;
        this.contents = contents;
        if (!opt) {
            opt = {};
        }
        this.css = opt.selectedClass || 'selected';
        this.selectedIndex = opt.selectedIndex || 0;
        this.select(this.selectedIndex);
        tabs.addEvent('click', function (e) {
            this.select(this.tabs.indexOf(e.target));
            e.stop();
        } .bind(this));
        highlighttabs = this;
    },

    select: function (index) {
        if ($type(index) === 'string') {
            index = this.tabs.getProperty('href').indexOf(index);
        }
        this.tabs.removeClass(this.css);
        if (index == -1) {
            index = 0;
        }
        this.tabs[index].addClass(this.css);
        this.contents.setStyle('display', 'none');
        var content = this.contents[index];
        content.setStyle('display', 'block');
        this.fireEvent('change', [content, index]);
    }
});

/**
*	Custom 'outerClick' event for mootools
*/
(function () {
    var events;
    var check = function (e) {
        var target = document.id(e.target);
        var parents = target.getParents();
        events.each(function (item) {
            var element = item.element;
            if (element != target && !parents.contains(element))
                item.fn.call(element, e);
        });
    };
    Element.Events.outerClick = {
        onAdd: function (fn) {
            if (!events) {
                document.addEvent('click', check);
                events = [];
            }
            events.push({ element: this, fn: fn });
        },
        onRemove: function (fn) {
            events = events.filter(function (item) {
                return item.element != this || item.fn != fn;
            }, this);
            if (!events.length) {
                document.removeEvent('click', check);
                events = null;
            }
        }
    };
})();

/**
*	MultiSelectCombo
*
*	Takes an array of select options and builds a two level combo box
*
*	@param 	mixed parentCombo html id for parent combobox
*	@param 	mixed childCombo html id for child combobox
* 	@param 	array items list of items to be inserted into comboboxes
*  @param  object options optional parameter to select the defaults of the combo box {defaultParent:int, defaultChild:int}
*/
var MultiSelectCombo = new Class({
    Implements: [Options],
    options: {
        defaultParent: 0,
        defaultChild: 0
    },
    initialize: function (parentCombo, childCombo, items, options) {
        this.setOptions(options);

        this.parent = document.id(parentCombo);
        this.child = document.id(childCombo);
        this.items = items;
        this.parent.empty();

        items.each(function (el, i) {
            new Element('option', {
                'html': el[0][0],
                'value': el[0][1],
                'selected': (i === this.options.defaultParent) ? 'selected' : '',
                'id': i
            }).inject(this.parent);
        } .bind(this));

        this.parent.addEvent('change', function () {
            var selectedItem = this.parent.getSelected().get('id');
            this.child.empty();
            this.items[selectedItem][1].each(function (opt) {
                new Element('option', {
                    'html': opt[0],
                    'value': opt[1]
                }).inject(this.child);
            } .bind(this));
        } .bind(this));

        this.items[this.options.defaultParent][1].each(function (opt, j) {
            new Element('option', {
                'html': opt[0],
                'value': opt[1],
                'selected': (j === this.defaultChild) ? 'selected' : ''
            }).inject(this.child);
        } .bind(this));
    }
});

/**
*	Ketabeavval Object
*
*  includes site-wide and page specific functions
*/
var KA = {

    start: function () {
        KA.initMenu();
        KA.initSearchbox();
        KA.initResultPage();
        KA.initBtns();
        KA.initMapMarkers();
        KA.initFilters();
        KA.initForms();
        KA.loginPopup();
        KA.initProfilePage();
        KA.initUserProfilePage();
        KA.initShop();
        if (document.id('highlights')) KA.initHome();
        if (document.id('map-container')) KA.initMap();
        if (document.id('map-printable')) KA.initPrintableMap();
        if ($$('a.boxed').getLast()) {
            SqueezeBox.assign($$('a.boxed'), {
                parse: 'rel'
            });
        }
        $$('#print-page').addEvent('click', function (e) {
            e.stop();
            window.print();
        });
        if ($$(".printable") != null)
            $$(".printable").addEvent("click", function () {
                window.print();
                return false;
            });
        if ($$('.moo-editable') != null) {
            $$('.moo-editable').each(function (textarea) {
                textarea.mooEditable({
                    actions: 'bold underline strikethrough | insertunorderedlist insertorderedlist | undo redo | createlink unlink',
                    baseCSS: 'html{ height: 100%; cursor: text }\
							    body{background:none}',
                    externalCSS: 'css/styles.css'
                });
            });
        }
    },

    initHome: function () {
        if (document.id('highlights')) {
            new TinyTab($$('#highlights-thumbnails img'), $$('#highlights .highlight-content'));
        }
        var FxOptions = { duration: 200, property: 'opacity', wait: false };
        $$('.home-box').each(function (box) {
            if (box.getElement('div.text')) {
                var content = box.getElement('div');
                content.setStyles({
                    position: 'absolute',
                    top: 0,
                    left: 0,
                    opacity: 0
                });
                var fx = new Fx.Tween(content, FxOptions);
                box.addEvents({
                    'mouseenter': function () { fx.start(1) },
                    'mouseleave': function () { fx.start(0) }
                });
            }
        });
        var selectedtab = 1;
        setInterval(function () {
            highlighttabs.select(selectedtab);
            selectedtab += 1;
            if (selectedtab > 3)
                selectedtab = 0;

        }, 5000);
    },

    initMenu: function () {
        var FxOptions = { duration: 200, property: 'background-position', wait: false };

        $$('ul#menu li a').each(function (el) {
            var fx = new Fx.Tween(el, FxOptions);

            if (Browser.Engine.trident) {
                var positionX = el.getStyle('background-position-x');
                var positionY = el.getStyle('background-position-y');
            } else {
                var bgPosition = el.getStyle('background-position').split(" ");
                var positionX = bgPosition[0];
                var positionY = bgPosition[1];
            }

            el.addEvents({
                'mouseover': function () {
                    fx.start(positionX + ' ' + '0', positionX + ' ' + '-20px');
                },
                'mouseleave': function () {
                    fx.start(positionX + ' ' + '-20px', positionX + ' ' + '0')
                }
            });
        });
    },

    initSearchbox: function () {
        $$('#search-box input[type=text]').each(function (textInput) {
            var defaultString = textInput.value;
            textInput.addEvent('focus', function () {
                if (!textInput.hasClass('focused')) {
                    this.addClass('focused');
                    this.value = (this.value == defaultString) ? (this.value = '') : this.value;
                }
            });
            //            textInput.addEvent('blur', function () {
            //                this.value = (this.value == '') ? (this.value = defaultString) : this.value;
            //                if (textInput.value == defaultString) {
            //                    this.removeClass('focused');
            //                }
            //            });
            document.id('search-box').getElement('form').addEvent('submit', function (e) {
                var searchTerm = document.id('what');
                searchTerm.value = searchTerm.hasClass('focused') ? searchTerm.value : '';
            });
        });
    },

    initResultPage: function () {
        $$('ol#results li').each(function (resultSet) {
            var extras = resultSet.getElement('div.result-extras');
            resultSet.addEvents({
                'mouseenter': function () {
                    extras.setStyle('visibility', 'visible');
                    this.addClass('hover')
                },
                'mouseleave': function () {
                    extras.setStyle('visibility', 'hidden');
                    this.removeClass('hover');
                }
            });
        });
    },

    initBtns: function () {
        $$('.dropdown').each(function (el) {
            var menu = el.getFirst('div');
            var btn = el.getFirst('a');
            btn.addEvent('click', function (e) { e.stop() });
            el.addEvents({
                'mouseenter': function () {
                    menu.setStyle('display', 'block');
                    btn.addClass('hover');
                },
                'mouseleave': function () {
                    menu.setStyle('display', 'none');
                    btn.removeClass('hover');
                }
            });
        });
    },

    initMapMarkers: function () {
        $$('.marker a').each(function (marker) {
            var desc = marker.getFirst();
            marker.addEvents({
                'mouseenter': function () {
                    desc.setStyle('display', 'block');
                },
                'mouseleave': function () {
                    desc.setStyle('display', 'none');
                }
            });
        });
    },

    initFilters: function () {
        if (document.id('results-filter')) {
            var filtersSlide = new Fx.Slide('results-filter').hide();
        }
        var filterBtn = document.id('filter');

        if (filterBtn) {
            filterBtn.addEvent('click', function (e) {
                e.stop();
                filtersSlide.toggle();
            });
        }

    },

    initForms: function () {
        $$(document.getElementsByTagName('textarea'), document.getElementsByTagName('select'), 'input:not([type="submit"])').each(function (input) {
            var inputParent = input.getParent('li');
            if (inputParent != null) {
                input.addEvents({
                    'focus': function () {
                        inputParent.addClass('focused');
                    },
                    'blur': function () {
                        inputParent.removeClass('focused');
                    }
                });
            }
        });
    },

    loginPopup: function () {
        var quickLogin = document.id('quick-login');
        if (!quickLogin) return;
        var loginPopup = quickLogin.getElement('div');
        $$('#login-popup input[type=text]').each(function (textInput) {
            var defaultString = textInput.value;
            textInput.addEvent('focus', function () {
                if (this.value == defaultString) {
                    this.addClass('focused').addClass('en');
                    this.value = '';
                }
                if (this.getProperty('id') == 'quick-password') {
                    this.setProperty('type', 'password');
                }
            });
            textInput.addEvent('blur', function () {
                if (this.value == '') {
                    this.remove('focused').removeClass('en');
                    this.value = defaultString;
                }
            });
        });

        quickLogin.addEvent('click', function (e) {
            e.stop();
            this.addClass('hover');
            loginPopup.setStyle('display', 'block');
        });
        quickLogin.addEvent('outerClick', function () {
            this.removeClass('hover');
            loginPopup.setStyle('display', 'none');
        });
    },

    initProfilePage: function () {

        var otherContacts = document.id('other-contacts-s');
        var otherContactsToggler = document.id('other-contacts-toggler');
        var writeReviewLink = document.id('write-review');

        if (otherContacts) {
            //            var otherContactsSlide = new Fx.Slide(otherContacts).hide();
            var otherContactsSlide = new Fx.Reveal(otherContacts, { duration: 400, transition: Fx.Transitions.Pow.easeOut, wait: false });
            if (otherContactsToggler) {
                otherContactsToggler.addEvent('click', function (e) {
                    e.stop();
                    otherContactsSlide.toggle();
                });
            }
            new TinyTab($$('#contacts-tab li a'), $$('#contacts-info li'));
            otherContacts.set('style','display:block;');
        }

        if (document.id('entity-extras')) {
            KA.entityExtras = new TinyTab($$('#entity-extras-tabs > li a'), $$('#entity-extras-contents > li'), { selectedIndex: '#map' });
            if (document.id('map-profile')) {
                var markers = [];
                var position = JSON.decode(document.id('map-info').get('title'));
                if (position.marker) {
                    markers.push(position.marker);
                }
                var map = new KetabeavvalMap('map-profile', { permalink: 'map-profile-printable' });
                map.kmZoomToExtent(position.bound);
                map.addMarkers(markers);

                var permalink = document.id('map-profile-printable');
                var url = permalink.get('href');
                var newLink = url.replace(/company\-profile\.html/i, "map-printable.html");

                permalink.addEvent('click', function (e) {
                    e.stop();
                    window.open(newLink, 'ketabeavval Pap', 'width=800, height=600');
                });
                mymap = map;
                mymap.map.zoomTo(5);
                $$('.mapmore').each(function (node) {
                    var position2 = JSON.decode(node.getProperty('title'));
                    //console.log(position2);
                    node.removeProperty('title');
                    node.addEvent('click', function (e) {
                        e.stop();
                        map.kmZoomToExtent(position2.bound);
                        mymap.map.zoomTo(6);
                    });
                    if (position2.marker) {
                        markers.push(position2.marker);
                    }
                });
                map.addMarkers(markers);
            }
            if (writeReviewLink) {
                writeReviewLink.addEvent('click', function (e) {
                    e.stop();
                    KA.entityExtras.select('#review');
                    var myFxScroll = new Fx.Scroll(window).toElement('comment-form');
                });
            }
        }
    },

    initUserProfilePage: function () {
        if (document.id('user-settings')) {
            KA.userSettings = new TinyTab($$('#user-settings-tabs > li a'), $$('#user-settings-contents > li'));
            KA.userSettings.select(1);
        }
    },

    initShop: function () {
        if (document.id('sales-agents')) {
            new TinyTab($$('#sales-agents-tabs > li a'), $$('#sales-agents-contents > li'));
        }
    },
    initMap: function () {
        var map = new KetabeavvalMap('map-area', { overlayMaps: ['evenodd', 'traffic', 'shahrdari'], permalink: 'permalink' });
        var printMap = document.id('map-print');
        var printSend = document.id('map-sendto-friend');
        var permalink = document.id('permalink');

        printMap.addEvent('click', function () {
            var url = permalink.get('href');
            var newLink = url.replace("map", "map-printable").replace(/what.+?&/, "").replace(/where.+?&/, "");
            window.open(newLink, 'ketabeavval Pap', 'width=800, height=600');
        })

        printSend.addEvent('click', function () {
            var url = permalink.get('href');
            var newLink = url.replace("map", "map-printable").replace(/what.+?&/, "").replace(/where.+?&/, "");
            printSend.setAttribute('href', "/sendmapviaemail?url=" + encode64(newLink), 'ketabeavval Pap', 'width=800, height=600');
            //            window.open("/sendmapviaemail?url=" + encode64(newLink), 'ketabeavval Pap', 'width=800, height=600');
            //            TINY.box.show({
            //                iframe: "/map/sendviaemail",
            //                width: 400,
            //                height: 350
            //            });
            //            return false;
        })
        if (document.id('map-results')) {
            mapAccordionOptions = { display: -1, alwaysHide: true };
            new Fx.Accordion($$('li.toggler'), $$('li.toggler>ul'), mapAccordionOptions);

            var markers = [];
            $$('li.toggler ul a').each(function (node) {
                var position = JSON.decode(node.getProperty('title'));
                //console.log(position);
                node.removeProperty('title');
                node.addEvent('click', function (e) {
                    e.stop();
                    map.kmZoomToExtent(position.bound);
                });
                if (position.marker) {
                    markers.push(position.marker);
                }
            });
            map.addMarkers(markers);

        }
    },
    initPrintableMap: function () {
        var map = new KetabeavvalMap('map-printable', { permalink: 'mohsen' });
    }
}
/**
* Mootools Part
*/
var highlighttabs;
window.addEvent('domready', function () {

    KA.start();

    adRotatingInit();
});

document.write('<style type="text/css" media="screen">.marker a span {display:none}</style>');

var keyStr = "ABCDEFGHIJKLMNOP" +
			"QRSTUVWXYZabcdef" +
			"ghijklmnopqrstuv" +
			"wxyz0123456789+/" +
			"=";

function encode64(input) {
    input = escape(input);
    var output = "";
    var chr1, chr2, chr3 = "";
    var enc1, enc2, enc3, enc4 = "";
    var i = 0;

    do {
        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);

        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;

        if (isNaN(chr2)) {
            enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
            enc4 = 64;
        }

        output = output +
		keyStr.charAt(enc1) +
		keyStr.charAt(enc2) +
		keyStr.charAt(enc3) +
		keyStr.charAt(enc4);
        chr1 = chr2 = chr3 = "";
        enc1 = enc2 = enc3 = enc4 = "";
    } while (i < input.length);

    return output;
}

function decode64(input) {
    var output = "";
    var chr1, chr2, chr3 = "";
    var enc1, enc2, enc3, enc4 = "";
    var i = 0;

    // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
    var base64test = /[^A-Za-z0-9\+\/\=]/g;
    if (base64test.exec(input)) {
        alert("There were invalid base64 characters in the input text.\n" +
			"Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
			"Expect errors in decoding.");
    }
    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

    do {
        enc1 = keyStr.indexOf(input.charAt(i++));
        enc2 = keyStr.indexOf(input.charAt(i++));
        enc3 = keyStr.indexOf(input.charAt(i++));
        enc4 = keyStr.indexOf(input.charAt(i++));

        chr1 = (enc1 << 2) | (enc2 >> 4);
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
        chr3 = ((enc3 & 3) << 6) | enc4;

        output = output + String.fromCharCode(chr1);

        if (enc3 != 64) {
            output = output + String.fromCharCode(chr2);
        }
        if (enc4 != 64) {
            output = output + String.fromCharCode(chr3);
        }

        chr1 = chr2 = chr3 = "";
        enc1 = enc2 = enc3 = enc4 = "";

    } while (i < input.length);

    return unescape(output);
}


//var MetatagGenerator = function () {
//    var keywords = '';
//    var description = '';
//    var abstract = '';
//    var topic = '';
//    var category = '';
//    var title = document.getElementsByTagName('title')[0].innerHTML; 
//    var url = window.location;

//    var keywordsElements = $$('.metatag-keywords');
//    var descriptionElements = $$('.metatag-description');
//    var abstractElements = $$('.metatag-abstract');
//    var topicElements = $$('.metatag-topic');
//    var categoryElements = $$('.metatag-category');
//    var titleElements = $$('.metatag-title');

//    var metatags = document.getElementsByTagName('meta');

//    for (var i = 0; i < keywordsElements.length; i++) {
//        if (keywords != '')
//            keywords += ',';
//        keywords += keywordsElements[i].innerHTML;
//    };

//    for (var i = 0; i < descriptionElements.length; i++) {
//        if (description != '')
//            description += ',';
//        description += descriptionElements[i].innerHTML;
//    };

//    for (var i = 0; i < abstractElements.length; i++) {
//        if (abstract != '')
//            abstract += ',';
//        abstract += abstractElements[i].innerHTML;
//    };


//    for (var i = 0; i < topicElements.length; i++) {
//        if (topic != '')
//            topic += ',';
//        topic += topicElements[i].innerHTML;
//    };


//    for (var i = 0; i < categoryElements.length; i++) {
//        if (category != '')
//            category += ',';
//        category += categoryElements[i].innerHTML;
//    };


//    for (var i = 0; i < titleElements.length; i++) {
//        if (category != '')
//            category += ',';
//        category += categoryElements[i].innerHTML;
//    };


//    for (var i = 0; i < metatags.length; i++) {
//        metatags[i]
//        switch (metatags[i].getAttribute('name')) {
//            case 'keywords':
//                {
//                    if (keywords != '') {
//                        document.getElementsByTagName('head')[0].removeChild(metatags[i]);
//                    }
//                    break;  
//                }
//            case 'topic':
//                {
//                    if (topic != '') {
//                        document.getElementsByTagName('head')[0].removeChild(metatags[i]);
//                    }
//                    break;
//                }
//            case 'description':
//                {
//                    if (description != '') {
//                        document.getElementsByTagName('head')[0].removeChild(metatags[i]);
//                    }
//                    break;
//                }
//            case 'abstract':
//                {
//                    if (abstract != '') {
//                        document.getElementsByTagName('head')[0].removeChild(metatags[i]);
//                    }
//                    break;
//                }
//            case 'category':
//                {
//                    if (category != '') {
//                        document.getElementsByTagName('head')[0].removeChild(metatags[i]);
//                    }
//                    break;
//                }
//            case 'title':
//                {
//                    if (title!= '') {
//                        document.getElementsByTagName('head')[0].removeChild(metatags[i]);
//                    }
//                    break;
//                }
//            case 'url':
//                {
//                    if (title != '') {
//                        document.getElementsByTagName('head')[0].removeChild(metatags[i]);
//                    }
//                    break;
//                }
//            default:

//        }
//    }

//    if (keywords != '') {
//        var keywordsMeta = document.createElement('meta');
//        keywordsMeta.setAttribute("name", "keywords");
//        keywordsMeta.content = keywords;
//        document.getElementsByTagName('head')[0].appendChild(keywordsMeta);
//    }


//    if (description != '') {
//        var descriptionMeta = document.createElement('meta');
//        descriptionMeta.setAttribute("name", "description");
//        descriptionMeta.content = description;
//        document.getElementsByTagName('head')[0].appendChild(descriptionMeta);
//    }

//    if (abstract != '') {
//        var abstractMeta = document.createElement('meta');
//        abstractMeta.setAttribute("name", "abstract");
//        abstractMeta.content = abstract;
//        document.getElementsByTagName('head')[0].appendChild(abstractMeta);
//    }

//    if (topic != '') {
//        var topicMeta = document.createElement('meta');
//        topicMeta.setAttribute("name", "topic");
//        topicMeta.content = topic;
//        document.getElementsByTagName('head')[0].appendChild(topicMeta);
//    }

//    if (category != '') {
//        var categoryMeta = document.createElement('meta');
//        categoryMeta.setAttribute("name", "category");
//        categoryMeta.content = category;
//        document.getElementsByTagName('head')[0].appendChild(categoryMeta);
//    }

//    if (title != '') {
//        var titleMeta = document.createElement('meta');
//        titleMeta.setAttribute("name", "title");
//        titleMeta.content = title;
//        document.getElementsByTagName('head')[0].appendChild(titleMeta);
//    }

//    if (url != '') {
//        var urlMeta = document.createElement('meta');
//        urlMeta.setAttribute("name", "url");
//        urlMeta.content = url;
//        document.getElementsByTagName('head')[0].appendChild(urlMeta);
//    }
//}

var adRotatingInit = function () {
    if ($$('.RotatingAdv').length > 0) {
        setAdRotatingImage();
        adTimer = setInterval(setAdRotatingImage, 3000);

    }
}
var setAdRotatingImage = function () {
    //    alert(":-)");
    var ads = $$('.RotatingAdv');
    for (var i = 0; i < ads.length; i++) {

        ads[i].fade('out');

        var images = ads[i].getAttribute('images').split('|');
        var urls = ads[i].getAttribute('urls').split('|');
        var alts = ads[i].getAttribute('alts').split('|');

        var a = ads[i].children[0];
        var img = a.children[0];

        var currentIndex = ads[i].getAttribute('currentImgIndex') == null ? 0 : parseInt(ads[i].getAttribute('currentImgIndex')) + 1;
        if (currentIndex == images.length)
            currentIndex = 0;
        var directory = ads[i].getAttribute('directory');
        var nextSrc = (directory.charAt(directory.length - 1) == '/' ? directory : directory + '/') + images[currentIndex];

        ads[i].setAttribute("currentImgIndex", currentIndex);
        img.setAttribute("src", nextSrc);
        img.setAttribute("alt", alts[currentIndex]);
        a.setAttribute("href", urls[currentIndex]);

        ads[i].fade('in');

    }
}
