//
//
// Debug framework. Make it `not work` correctly unless we're using FF with firebug.
//
//
var _debug_enabled = false;
//var _debug_enabled = true;
var out = _debug_enabled && typeof(console) != 'undefined' ? console : {
    log   : function(){},
    debug : function(){},
    info  : function(){},
    warn  : function(){},
    error : function(){},
    assert: function(){},
    dir   : function(){},
    dirxml: function(){},
    trace : function(){},
    group : function(){},
    groupEnd: function(){},
    time  : function(){},
    timeEnd : function(){},
    profile : function(){},
    profileEnd : function(){},
    count   : function(){}
};




                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
//
//
//
// Extend the native "SELECT" tag with a few convenient small functions
//
//
//
Element.addMethods('select', {
    // Remove `all` / `all but the first` element of a dropdown
    //
    truncate: function(elm, clear){
        elm = $(elm);
        var min_index = clear ? 0 : 1;
        while(elm.options.length > min_index)
            elm.options[min_index] = null;
        if(min_index != 0)
            elm.options[0].selected = true;

        return elm;
    },
    // Find and make active an element in a dropdown by it's option value
    //
    choose: function(elm, value){
    	elm = $(elm);
        for(i=0,cnt=elm.options.length; i<cnt; i++)
            if(elm.options[i].value == value)
            {
                elm.options[i].selected = true;
                //alert(elm.options[i].value + ' - ' + elm.options[i].innerHTML);
                break;
            }
	
        return elm;
    },
    build: function(elm, options, children, child_classname){
        
        // Immediately return if the options array was not provided
        if(!options)
            return elm;

        elm = $(elm);
        child_classname || (child_classname = 'child');

        // Build the main options, if they were provided
        for(var i=0, cnt=options.length; i<cnt; i++)
        {
            var option = new Option(options[i].name, options[i].value);
            elm.options[elm.options.length] = option;
        }


        // Immediately return if the children array was not provided
        if(!children)
            return elm;

        children = $H(children);
        var keys = children.keys();
        for(var i=0, cnt=keys.length; i<cnt; i++)
        {
            var parent = false;
            for(var j=0, cnt2=elm.options.length; j<cnt2; j++)
                if(elm.options[j].value == keys[i])
                {
                    parent = j;
                    parentCountryId = elm.options[j].value;
                    break;
                }

            if(!parent)
                continue;


            var children_array = children.get(keys[i]);
            var  parentDetailed = MW.ajax.data.countries.find(function(country){
                return country.value == parentCountryId
                });
            
            for(var j=0, cnt2=children_array.length; j<cnt2; j++)
            {
                if(parentDetailed.hidden == 0){
                    var padding = Prototype.Browser.IE ? '     ' : '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.unescapeHTML();
                }else{
                    var padding = '';
                }
                    var new_option = new Option(padding + children_array[j].name, children_array[j].value);
                    elm.options.add(new_option, parent+1);
                
            }
        }
        return elm;
    },

    find: function(elm, value)
    {
        if(!value)
            return;

        elm = $(elm);
        for(var i=0, cnt=elm.options.length; i<cnt; i++)
            if(elm.options[i].value == value)
                return elm.options[i];
    },
	startBlinking : function(element){
		element.previous("label").setStyle({
		   color: "red"
		});
		                                    
	},
	stopBlinking : function(element){
		element.previous("label").setStyle({
	        color: "#494945"
	    });
		                                    
	}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
});


Element.addMethods('form', {
    extend_from_json: function(elm, data){
        elm      = $(elm);
        data     = $H(data);
        var keys = data.keys();
        for(var i=0, cnt=keys.length; i<cnt; i++)
        {
            elm.appendChild(new Element('input', {
                name : keys[i],
                value: data.get(keys[i]),
                type : 'hidden'
            }));
        }

        return elm;
    },

    init_from_json: function(elm, data){
        elm       = $(elm);
        data      = $H(data);
        var keys  = data.keys();
        var field = false;
        for(var i=0, cnt=keys.length; i<cnt; i++)
        {
            var field_data = data.get(keys[i]);
            if(Object.isNumber(field_data) || Object.isString(field_data))
                if((field = elm[keys[i]]))
                    switch(field.type)
                    {
                        case 'text':        field.value = field_data;       break;
                        case 'select-one':  field.choose(field_data);       break;
                        case 'checkbox':    field.checked  = !!field_data;  break;
                        case 'radio':       fields = elm[field.name];
                            for(var j=0, cnt2=fields.length; j<cnt2; j++)
                                if(fields[j].value == field_data)
                                {
                                    fields[j].checked = true;
                                    break;
                                }
                            break;
                    }
        }

        return elm;
    },

    to_json: function(elm, exceptions){
        elm        = $(elm);
        exceptions = $A(exceptions);

        var data   = elm.getElements();
        var result = $H();
        for(var i=0, cnt=data.length; i<cnt; i++)
        {
            if(data[i].type != 'image' && exceptions.indexOf(data[i].name) == -1)
                result.set(data[i].name, data[i].value);
        }

        return result.toObject();
    }
});


Object.extend(Object, {
    flatten_json: function(data, prefix){
        data       = $H(data);
        var keys   = data.keys();
        var result = $H();

        prefix || (prefix = '');

        if(keys.length)
        {
            for(var i=0, cnt=keys.length; i<cnt; i++)
            {
                var value = data.get(keys[i]);
                switch(typeof(value))
                {
                    case 'function': break;
                    case 'object'  : result = result.merge(Object.flatten_json(value, prefix + '[' + keys[i] + ']')); break;
                    default        : result.set(prefix + '[' + keys[i] + ']', value);
                }
            }
            return result.toObject();
        }
        else
        {
            return false;
        }
    }
});




//
//
//
//
//
//
// Extend all HTML elements with two simple AJAX related functions for
//
//
//
//
//

Element.addMethods({
    show_loader: function(elm){
        document.body.appendChild(
            new Element('div', {
                'id'   : elm.identify()+'-loader',
                'class': 'loader'
            }).setStyle({
                background: '#ccc',
                textAlign : 'center',
                position  : 'absolute'
            }).update(
                '<table width="100%" height="100%">' +
                '<tr>' +
                '<td style="vertical-align: middle; text-align: center;">' +
                '<img src="/img/i/loading.gif" />' +
                '</td>' +
                '</tr>'+
                '</table>'
                ).setOpacity(0.8).clonePosition(elm)
            );
        return elm;
    },
    hide_loader: function(elm){
        if(elm.id)
        {
            var element =  $(elm.id + '-loader');
            element.parentNode.removeChild(element);
        }
        return elm;
    },

    show_overlay: function(elm){
        document.body.appendChild(
            new Element('div', {
                'id'   : elm.identify()+'-overlay',
                'class': 'overlay'
            }).setStyle({
                background: '#ccc',
                textAlign : 'center',
                position  : 'absolute'
            }).setOpacity(0.8).clonePosition(elm)
            );
        return elm;
    },
    hide_overlay: function(elm){
        if(elm.id)
        {
            var element =  $(elm.id + '-overlay');
            element.parentNode.removeChild(element);
        }
        return elm;
    }
});

