var global_pending_events = 0;

function display_element(e, args) {
	var elem = document.getElementById(args.id);
        
	if (elem) {
            //alert("p_ad: " + document.getElementById("p_ad").checked);
            if (args.id == "estate_agent_") {
                var cat = document.getElementById("category_group");
                if ( cat.value == "2020" || cat.value == "2040" || cat.value == "2060" || cat.value == "2080" ) {
                    if ( document.getElementById("p_ad").checked ) {
	 	        elem.style.display = "none";
                    }
                    else {
                        elem.style.display = "block";     
                    }
                }
            }
            else {
                elem.style.display = args.style;
            }
        }
}

function set_html(e, args) {
	var elem = document.getElementById(args.id);

	if (elem)
		elem.innerHTML = args.html;
}

function set_focus(e, args) {
	if (args.check_focused && focused)
		return;
	for (var i in args.id) {
		var id = args.id[i];

		if (args.sel_id)
			id += this.getAttribute("sel_id");

		var element = document.getElementById(id);
		if (element && element.offsetWidth) {
			if (!args.only_if_empty || !element.value || element.value.length == 0)
				element.focus();
			break;
		}
	}
}

function show_by_feature(e, args) {
	var id = args.id;
	var feat = args.feat;
	var klfun = args.klfun;
	var style = args.style;

	var elem = document.getElementById(id);
	if (!elem)
		return;

	if (!feat)
		feat = id;
	if (!klfun)
		klfun = form_key_lookup;
	if (!style)
		style = '';
	
	var f = split_setting(get_settings(feat, klfun, category_features));
	if (f && f.show > 0) {
		elem.style.display = style;
	} else {
		elem.style.display = 'none';
	}
}

/*
 * Registers all events to objects
 * (uses root so that object searching can be narrower)
 */
function register_events(events, root) {
	for (var event_id in events) {
		var current_event = events[event_id];
		var elements = [];

		/* Get all involved elements */
		if (current_event.id) {
			var element = root.getElementById(current_event.id);
			if (element)
				elements = [element];
		} else if (current_event.name) {
			elements = root.getElementsByName(current_event.name);
		} else if (current_event.array_name) {
			var element;
			var i = 0;
			while (element = root.getElementsByName(current_event.array_name + '[' + i + ']')[0]) {
				elements[i++] = element;
			}	
		} else if (current_event.array_id) {
			var element;
			var i = 0;
			while (element = root.getElementById(current_event.array_id + i)) {
				elements[i++] = element;
			}	
		}

		/* Check if object exists to attach event to */
		for (var element_index = 0; element_index < elements.length; element_index++) { 
			var element = elements[element_index];

			/* Init event id array */
			if (!element.event_ids)
				element.event_ids = [];

			/* Check if current event already have been attached to the object */
			if (isInArray(event_id, element.event_ids))
				continue;

			/* Store current event id */
			element.event_ids[element.event_ids.length] = event_id;

			/* Hijack the element, create an event array */
			if (!element.events)
				element.events = [];

			/* Create array for each event trigger (Support for multiple events each event) */
			if (!element.events[current_event.trigger])
				element.events[current_event.trigger] = [];

			/* Store the event in the objects event array */
			element.events[current_event.trigger][element.events[current_event.trigger].length] = current_event;

			/* Load events */
			if (current_event.trigger == 'init') {
				call_event_timeout(element, 'init', 0);
			} else if (element.attachEvent) {
				/* Add an event listener to the object */
				element.attachEvent("on" +  current_event.trigger, /* The event trigger name */
						call_event /* Event callback */
						);
			} else {
				element.addEventListener(current_event.trigger, /* The event trigger name */
						call_event, /* Event callback */
						true); /* Event bubbling */
			}
		}
	}
}

/*
 * Event call back handler
 */
function call_event(e) {
	/* This element */
	var element = this;
	var type = e.type;

	/* TODO srcElement is not necessarily the element we registered to. */
	if (window.event)
		element = window.event.srcElement;

	if (element.asyncs > 0) {
		/* Already running, reschedule ourselves. */
		call_event_timeout(element, type, 50);
		return;
	}

	global_pending_events++;
	element.asyncs = 1;

	/* Go through all events linked to the element event type */
	for (var ep in element.events[type]) {
		var current_event = element.events[type][ep];

		if (!current_event.bubble) {
			/* Don't do events below this object*/
			if (window.event) {
				window.event.cancelBubble = true;
			} else if (e && e.stopPropagation) {
				e.stopPropagation();
			}
		}

		/* Execute all actions in the current event */
		for (var function_index in current_event.action) {
			var function_conf = current_event.action[function_index];
			var f = eval(function_conf.name);
			var args = function_conf.args;

			/* 
			 * (element, f, args) need local binding within the higher order function. To bind them, we need to
			 * create a higher higher order function and evalutate it to force the binding.
			 */
			var run_me = (function (element, f, args) {
					return (function () {
						/* Get function reference */
						/* Execute function as if it was called by THIS, and send the event argument */
						f.call(element, [element, type], args);
					});
				})(element, f, args);

			if (function_conf.async) {
				global_pending_events++;
				element.asyncs++;
				run_me();
			} else
				queue_document_change([element, type], run_me);
			run_me = null;
		}
	}

	global_pending_events--;
	if (--element.asyncs == 0) {
		run_document_changes(element);
	}
}

function queue_document_change(e, f) {
	var element = e[0];

	if (!element.document_changes || element.document_changes === "")
		element.document_changes = [];
	element.document_changes[element.document_changes.length] = f;
}

function event_async_done(e) {
	var element = e[0];
	var type = e[1];

	global_pending_events--;
	element.asyncs--;

	if (element.asyncs == 0) {
		run_document_changes(element);
	}
}

function run_document_changes(element) {
	while (element.document_changes) {
		var to_run = element.document_changes;
		element.document_changes = "";

		/* LIFO */
		for (var i = to_run.length - 1; i >= 0; i--) {
			var f = to_run[i];

			f();
		}
	}
}

function call_event_timeout(element, type, time) {
	setTimeout(function() { call_event.call(element, {'type' : type}) }, time);
}

/* Added on 03/24/2009 by Ej -- begin */
function trim(str, chars) {
	    return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
	    chars = chars || "\\s";
	        return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
	    chars = chars || "\\s";
	        return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

/* Added on 03/24/2009 by Ej -- end */
function display_store_params(e, args) {
	var cat = document.getElementById("category_group"); 
	if (cat.value != "0") {
		for (var i in store_settings['store_params']['1']) {
			if (i != "keys") {
				var params = store_settings['store_params']['1'][i]['fieldset'].split(',');
				for (var j in params) {
					var element = document.getElementById(params[j] + "_fieldset" );
					if (element != null) {
						element.style.display='none';
					}
				}

				var params = store_settings['store_params']['1'][i]['value'].split(','); 
				for (var j in params) {
					var element = document.getElementById(params[j] + "_row" );
					if (element != null) {
						element.style.display='none';
					}
				}

			}
		
		}

		if (store_settings['store_params']['1'][cat.value] != null ) {
			var params = store_settings['store_params']['1'][cat.value]['fieldset'].split(',');
			for (var j in params) {
				var element = document.getElementById(params[j] + "_fieldset" );
				if (element != null) {
					element.style.display='block';
				}
			}

			var params = store_settings['store_params']['1'][cat.value]['value'].split(','); 
			for (var j in params) {
				var element = document.getElementById(params[j] + "_row" );
				if (element != null) {
					element.style.display='block';
				}
			}
		}
		
	}
}

function display_store_label(e,args) {
	var cat = document.getElementById("category_group");
	if (cat.value != "0") {
		var elem = document.getElementById(args.id + '_label');
		var new_label =get_settings('store_labels',
									function (key) {
										if (key == "param")
											return args.id;
										if (key == "parent" && category_list[cat.value]) {
											if (category_list[cat.value]['parent'] == null)
												return cat.value;
											else
												return category_list[cat.value]['parent'];
										}
									},
                                    store_settings);
		elem.innerHTML = new_label;
	} 
}

function show_hide_elements(e,args) {
        var key = document.getElementById(e[0].id);
        var ids = args.elements.split(',');
        for (var i in ids) {
                var elem = document.getElementById(ids[i]);

                if (args.action == 'show') {
                        elem.style.display = (key.checked) ? 'block':'none';
                }
                else {
                        elem.style.display = (key.checked) ? 'none':'block';
                }
        }
}

function autofill_realtor_data_cb(result, xmlhttp, data) {
	if(result.name) {
		var nameField = document.getElementById("company_name");
		if(!nameField.value)
			nameField.value = result.name;
	}
	if(result.phone) {
		var phoneField = document.getElementById("phone");
		if(!phoneField.value)
			phoneField.value = result.phone;
	}
	if(result.fax) {
		var faxField = document.getElementById("fax");
		if(!faxField.value)
			faxField.value = result.fax;
	}
	if(result.address) {
		var addressField = document.getElementById("address");
		if(!addressField.value)
			addressField.value = result.address;
	}
}

function autofill_realtor_data(e,args) {
	var element = document.getElementById(args.id); 
	ajax_request("/templates/common/realtor_data.js?realtor_id=" + element.value, null, autofill_realtor_data_cb, args, true, null);
	return false;
}

function refresh_drafts_listing_cb(result, xmlhttp, data) {
	document.getElementById("drafts_listing").innerHTML = xmlhttp.responseText;
}

function  refresh_drafts_listing() {
	ajax_request("/store/drafts_listing", null, refresh_drafts_listing_cb, null, false, null);
	return false;
}

function update_draft_form_cb(result, xmlhttp, data) {
	var cat_select = document.getElementById("category_group");
	cat_select.value = result.category != null ? result.category : "";
	
	if (document.createEvent) {
		var evt = document.createEvent("HTMLEvents");
		evt.initEvent("change", true, true);
		cat_select.dispatchEvent(evt);
	}
	else if (document.createEventObject ) {
		cat_select.fireEvent('onchange');
	}
	var el;
	for (var param in result) {
		if ((el = document.getElementById(param)) != undefined && el != null ) {
			el.value = result[param] != null ? result[param] : ""
		}
	}
}

function  update_draft_form(ad_id) {
	ajax_request("/ai/load_draft/1?id="+ad_id, null, update_draft_form_cb, null, true, null);
	scrollTo(0,0);
	return false;
}

function gen_url_path() {
	var company_name = document.getElementById('company_name');
	var user_name = document.getElementById('user_name');
        var name = document.getElementById('name').value; 

        name = name.replace(/ AB$/, '');
        name = name.replace(/[ÅÄåä]/g, 'a');
        name = name.replace(/[Öö]/g, 'o');
        name = name.replace(/[éÉ]/g, 'e');
        name = name.replace(/ +/g, '-');
        name = name.toLowerCase();
        name = name.replace(/[^a-z0-9-]/g, '');

	if ((company_name != null) && (user_name != null)){
	var category = document.getElementById('category').value; 
	var company_name = company_name.value;
	var user_name = user_name.value;

		if (typeof(store_settings['store_name'][category]) != "undefined" &&
                store_settings['store_name'][category]['append_company'] == "1" &&
                store_settings['store_name'][category]['append_username'] == "1") {
                        user_name = user_name.replace(/ AB$/, '');
                        user_name = user_name.replace(/[????]/g, 'a');
                        user_name = user_name.replace(/[??]/g, 'o');
                        user_name = user_name.replace(/[??]/g, 'e');
                        user_name = user_name.replace(/ +/g, '-');
                        user_name = user_name.toLowerCase();
                        user_name = user_name.replace(/[^a-z0-9-]/g, '');

                        company_name = company_name.replace(/ AB$/, '');
                        company_name = company_name.replace(/[????]/g, 'a');
                        company_name = company_name.replace(/[??]/g, 'o');
                        company_name = company_name.replace(/[??]/g, 'e');
                        company_name = company_name.replace(/ +/g, '-');
                        company_name = company_name.toLowerCase();
                        company_name = company_name.replace(/[^a-z0-9-]/g, '');

			name = name + '-' + company_name;
                        name = user_name + '-' + name; 
                }

		
		else {
		if (typeof(store_settings['store_name'][category]) != "undefined" &&
                store_settings['store_name'][category]['append_company'] == "1"){
			company_name = company_name.replace(/ AB$/, '');
			company_name = company_name.replace(/[ÅÄåä]/g, 'a');
			company_name = company_name.replace(/[Öö]/g, 'o');
			company_name = company_name.replace(/[éÉ]/g, 'e');
			company_name = company_name.replace(/ +/g, '-');
			company_name = company_name.toLowerCase();
			company_name = company_name.replace(/[^a-z0-9-]/g, '');
		
			name = name + '-' + company_name; 
			}
		else {
			name = name;
			}
		}

	}
        document.getElementById('url_path').innerHTML = name;
	document.getElementById('url_path_hidden').value = name;

}

function populate_storebox_info() {
        var name = document.getElementById('name').value;
	var info_header = document.getElementById('info_header').value;
	document.getElementById('store_name').innerHTML = name;
        document.getElementById('store_tagline').innerHTML = info_header;
}

function display_type_options() {
	var element = document.getElementById('option_type'); 
	var type_label = document.getElementById('type_label');
	element.innerHTML = '';
	type_label.innerHTML = ''; 	
	if (element != null) {
		var cat = document.getElementById("category_group"); 
		if (cat.value != "0" && store_settings['store_options'][cat.value] != null) {
			var params = store_settings['store_options'][cat.value]['value'].split(','); 
			if ( params.length == 1 ) { // create a hidden input instead, if only have one option
				var _html = '<input type="hidden" name="type_option" value="' + params[0] + '">'; 
				element.innerHTML += _html;	
			}
			else {
				type_label.innerHTML = 'Type:';
				for (var j in params) { 
					if ( j == 0 ) 
						var _html = '<input type="radio" name="type_option" value="' + params[j] + '" /> ' + store_settings['option_types'][params[j]]['label'] + '&nbsp;';
					else
						var _html = '<input type="radio" name="type_option" value="' + params[j] + '" /> ' + store_settings['option_types'][params[j]]['label'] + '&nbsp;';
					element.innerHTML += _html;	
				}
			}
		}
		else { // default company
			var _html = '<input type="hidden" name="type_option" value="company" />'; 
			element.innerHTML = _html;
			type_label.innerHTML = '';	
		}
	}
}

function display_default_value(e,args) {
	var element = document.getElementById(args.id);
	if (element != null) {
		if (element.value == "") 
			element.value = args.defaultvalue;
	}
}

function clear_default_value(e,args) {
        var element = document.getElementById(args.id);
        if (element != null) {
                if (element.value == args.defaultvalue)
                        element.value = "";
        }
}

function store_submit(e,args) {
	for (var i in args.id){
		var element = document.getElementById(args.id[i]);
		if (element != null) {
			if (element.value == args.defaultvalue[i])
	                        element.value = "";
		}
	}
	document.storeregistration_form.submit();
}

function display_tenure(e,args) { 
	var element = document.getElementById(e[0].id);
        if (element != null) {
		var target_elem  = document.getElementById(args.id);
		var target_label = document.getElementById(args.label);
		var target_error = document.getElementById("err_" + args.id);
		if (element.value == args.value) {
			target_elem.style.display = 'block';
			target_label.style.display = 'block';
			target_error.style.display = 'block';
		}
		else {
			target_elem.style.display = 'none';
			target_label.style.display = 'none';
			target_error.style.display = 'none';
		}
	}

}

function model_lookup(e,args) {
        var make_elem = document.getElementById(e[0].id); 
	var model_elem  = document.getElementById(args.id); 

	if (make_elem != null && model_elem != null) { 
		model_elem.options.length = 0;
		var index = make_elem.value; 
		model_elem.options[model_elem.options.length] = new Option("«Select model»","");	
	
		for (var key in modelOrderArray[index]) { 
			var orderkey = modelOrderArray[index][key]; 
			model_elem.options[model_elem.options.length] = new Option(modelArray[index][orderkey],orderkey);	
		}
	}

}

function set_hide_phone() {
	var phone = document.getElementById("phone");
	var phone_hidden = document.getElementById("phone_hidden");
	if (phone != null && phone_hidden != null) {
		if (phone.selectedIndex == 0) {
			var hide_phone = document.getElementById("hide_phone");
			if (hide_phone != null)
				phone_hidden.checked = (hide_phone.value == "t") ? true:false;
		}
		else if (phone.selectedIndex == 1) {
			var hide_user_phone = document.getElementById("hide_user_phone");
			if (hide_user_phone != null)
				phone_hidden.checked = (hide_user_phone.value == "t") ? true:false;
		}
	}

}
