//
//
// Debug framework. Make it `not work` correctly unless we're using FF with firebug.
//
//
var _debug_enabled = true;
//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;
    }
});





var consolidatedEventHandler = Class.create({
	initialize: function(elm, event_name, event_zones){
		this.elm         = $(elm);
		this.event_name  = event_name;
		this.event_zones = event_zones;

		this.elm.observe(this.event_name, this.event_handler.bindAsEventListener(this, this.elm));
	},


	event_handler: function(evt, container){
		var container = $(container);
		var elm = evt.element();
        

		for(var i=0, cnt=this.event_zones.length; i<cnt; i++)
		{
        
			var match_found = false;


				// Perform the comparison using the [tagName|className] combination rather then a fully fledged CSS3 selector.
				//
                
				if(elm.tagName.toLowerCase() == this.event_zones[i].tag.toLowerCase() && (!this.event_zones[i]['class']  || elm.hasClassName(this.event_zones[i]['class'])))
					match_found = true;
        
			if(match_found)
			{
				this.event_zones[i].callback(evt, container);
				break;
			}
            
		}
        
	}
});


function createCookie(name,value,days) {                                                                                                                                                                       
    if (days) {                                                                                                                                                                                                
        var date = new Date();                                                                                                                                                                                 
        date.setTime(date.getTime()+(days*24*60*60*1000));                                                                                                                                                     
        var expires = "; expires="+date.toGMTString();                                                                                                                                                         
    }                                                                                                                                                                                                          
    else var expires = "";                                                                                                                                                                                     
    document.cookie = name+"="+value+expires+"; path=/";                                                                                                                                                       
}                                                                                                                                                                                                              
                                                                                                                                                                                                               
function readCookie(name) {                                                                                                                                                                                    
    var nameEQ = name + "=";                                                                                                                                                                                   
    var ca = document.cookie.split(";");                                                                                                                                                                       
    for(var i=0;i < ca.length;i++) {                                                                                                                                                                           
        var c = ca[i];                                                                                                                                                                                         
        while (c.charAt(0)==" ") c = c.substring(1,c.length);                                                                                                                                                  
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);                                                                                                                                
    }                                                                                                                                                                                                          
    return null;                                                                                                                                                                                               
}                                                                                                                                                                                                              
                                                                                                                                                                                                               
function eraseCookie(name) {                                                                                                                                                                                   
    createCookie(name,"",-1);                                                                                                                                                                                  
}                                                                                                                                                                                                              



