/*
 * Searchbox handler
 */

var chGlobalSearch = {

    /*
     * Cache for element collections used in script.
     */
    switches : [],
    forms : [],
    inputs : [],
    defaultSearchTexts: [],
    selectedIndex: -1,
    defaultSelectionIndex: -1,

    /*
     * Initialization of search switching functionality. Finds all relevant elements,
     * cache them and attaches events to them.
     */
    init : function ( elmId ) {
        var elm = document.getElementById( elmId );

        // find all links for switching between forms (tabs)
        chGlobalSearch.switches = elm.getElementsByTagName( 'ul' )[0].getElementsByTagName( 'a' );

        // attach activate() method to all switch links
        for ( var i = 0, l = chGlobalSearch.switches.length; i < l; i++ ) {
            chGlobalSearch.addEvent( chGlobalSearch.switches[i], 'click', chGlobalSearch.activate );
        }

        // find all search forms
        chGlobalSearch.forms = elm.getElementsByTagName( 'form' );

        // find all first fields in forms (main search fields)
        // watch if their content is changed so that you can distribute it to other fields.
        // Adds default text for input labels into text cache.
        // Register event handlers for showing and hiding default search texts.
        for ( var i = 0, l = chGlobalSearch.forms.length; i < l; i++ ) {
        	if(chGlobalSearch.forms[i].id!='fullTxtForm'){
            var inputElm = chGlobalSearch.forms[i].getElementsByTagName( 'input' )[0];
            chGlobalSearch.inputs[ chGlobalSearch.inputs.length ] = inputElm;
            chGlobalSearch.addEvent( inputElm, 'change', chGlobalSearch.replicateInputContent );
            chGlobalSearch.addEvent( inputElm, 'focus', chGlobalSearch.hideDefaultSearchText );
            chGlobalSearch.addEvent( inputElm, 'blur', chGlobalSearch.showDefaultSearchText );

            var label = chGlobalSearch.forms[i].getElementsByTagName('label')[0];
            if (label) {
                var text = label.innerHTML;
                text = text.split(':')[0];
                chGlobalSearch.defaultSearchTexts.push(text);
            }

            // detect if form is selected by default (has class active)
            if (chGlobalSearch.hasClassName( chGlobalSearch.forms[i], 'active' )) {
                chGlobalSearch.defaultSelectionIndex = i;
            }
            chGlobalSearch.initSubmitButtons(i);
        	}
        }

        // fill default text in default search form
        chGlobalSearch.fillDefaultSearchText(
            chGlobalSearch.inputs[ chGlobalSearch.defaultSelectionIndex ],
            chGlobalSearch.defaultSearchTexts[ chGlobalSearch.defaultSelectionIndex ]
        );
        chGlobalSearch.selectedIndex = chGlobalSearch.defaultSelectionIndex;
    },

    initSubmitButtons: function( i ) {
        // replace default search when submit button is clicked
        var elements = chGlobalSearch.forms[i].getElementsByTagName('input');
        var button = null;
        for (var i = 0, len = elements.length; i < len; i++) {
            button = elements[i];
            if ( chGlobalSearch.hasClassName( button, 'submit' ) ) {
                chGlobalSearch.addEvent( button, 'click', chGlobalSearch.checkSubmit );
            }
        }
    },

    /*
     * When user switches between forms, cycle through all tabs and forms,
     * activate the new one and deactivate all the rest.
     */
    activate : function ( evt ) {
        var evt = chGlobalSearch.fixEvent( evt );
        evt.preventDefault();
        var switchElm = evt.target;

        for ( var i = 0, l = chGlobalSearch.switches.length; i < l; i++ ) {
            if ( chGlobalSearch.switches[i] == switchElm ) {
                if ( !chGlobalSearch.hasClassName(chGlobalSearch.forms[i], 'active') ) {
                    chGlobalSearch.addClassName( chGlobalSearch.switches[i], 'active' );
                    chGlobalSearch.addClassName( chGlobalSearch.forms[i], 'active' );
                }
                chGlobalSearch.fillDefaultSearchText(
                    chGlobalSearch.inputs[i],
                    chGlobalSearch.defaultSearchTexts[i]
                );
                chGlobalSearch.selectedIndex = i;
            } else {
                chGlobalSearch.removeClassName( chGlobalSearch.switches[i], 'active' );
                chGlobalSearch.removeClassName( chGlobalSearch.forms[i], 'active' );
                chGlobalSearch.grayElement( chGlobalSearch.inputs[i], 'UNgray' );
            }
        }

    },

    fillDefaultSearchText: function( searchInput, defaultText ) {
        if (searchInput.value == defaultText || searchInput.value == '') {
            searchInput.value = defaultText;
            chGlobalSearch.grayElement(searchInput, 'gray');
        }
    },

    /**
     * Hides default search text in <input> element if present.
     */
    hideDefaultSearchText: function( evt ) {
        var evt = chGlobalSearch.fixEvent( evt );
        var searchInput = evt.target;
        var i = chGlobalSearch.selectedIndex;
        if ( searchInput.value == chGlobalSearch.defaultSearchTexts[i] ) {
            searchInput.value = '';
            chGlobalSearch.grayElement(searchInput, 'UNgray');
        }
    },

    /**
     * Shows default search text in <input> element if there is no custom
     * search text already typed.
     */
    showDefaultSearchText: function( evt ) {
        var evt = chGlobalSearch.fixEvent( evt );
        var searchInput = evt.target;
        var i = chGlobalSearch.selectedIndex;
        chGlobalSearch.debug_event = evt;
        if ( searchInput.value == '' ) {
            searchInput.value = chGlobalSearch.defaultSearchTexts[i];
            chGlobalSearch.grayElement(searchInput, 'gray');
        }
    },

    /**
     * Checks whether form is being sent with default search text or not.
     * Default text is replaced with empty string.
     */
    checkSubmit: function( evt ) {
        var i = chGlobalSearch.selectedIndex;
        var searchInput = chGlobalSearch.inputs[i];
        var defaultText = chGlobalSearch.defaultSearchTexts[i];
        if (searchInput.value == defaultText) {
            searchInput.value = '';
        }
    },

    grayElement: function ( element, toggle ) {
        if (toggle == 'gray') {
            if ( !chGlobalSearch.hasClassName( element, 'gray-color' ) ) {
                chGlobalSearch.addClassName( element, 'gray-color' );
            }
            return;
        }
        chGlobalSearch.removeClassName( element, 'gray-color' );
    },

    /*
     * When content of current input field is changed, distribute it into all other input fields
     * so that when user switches between forms, the search phrase persists.
     */
    replicateInputContent : function ( evt ) {
        var evt = chGlobalSearch.fixEvent( evt );
        var inputElm = evt.target;

        for ( var i = 0, l = chGlobalSearch.inputs.length; i < l; i++ ) {
            if ( chGlobalSearch.inputs[i] != inputElm ) {
                chGlobalSearch.inputs[i].value = inputElm.value;
            }
        }

    },

    // Utilities

    addClassName : function ( elm, className ) {
        elm.className += ' ' + className;
    },

    hasClassName : function ( element, className ) {
        if ( !element.className ) {
            return false;
        }
        var classes = element.className.split(' ');
        var len = classes.length;
        for (var i = 0; i < len; i++) {
            if ( classes[i] == className ) return true;
        }
        return false;
    },

    removeClassName : function ( elm, className ) {
        elm.className = elm.className.replace( new RegExp( "(^|\\s+)" + className + "(\\s+|$)" ), ' ' );
    },

    addEvent : function( obj, evType, fn, useCapture ) {
        if ( window.opera && ( obj == window ) ) { obj = document; }

        if ( obj.addEventListener ) {
            obj.addEventListener( evType, fn, useCapture );
            return true;
        } else if ( obj.attachEvent ){
            var r = obj.attachEvent( "on" + evType, fn );
            return r;
        } else {
            return false;
        }
    },

    fixEvent : function( e ) {
        if ( typeof e == 'undefined') e = window.event;
        if ( typeof e.target == 'undefined') e.target = e.srcElement;
        if ( !e.preventDefault ) {
            e.preventDefault = function() { e.returnValue = false; }
        }
        return e;
    }

};

chGlobalSearch.init( 'chGlobalSearch' );

/*
 * End of searchbox handler
 */


