function run_scripts(el) {
	scpts = el.getElementsByTagName('script');
	for(var i = 0; i < scpts.length; i++) {
		scpt = scpts[0];
		eval(scpt.firstChild.nodeValue);
	}
}

function add_stylesheet(href) {
	if (href.substring(0, 1) != '/') {
		href = iCMS.ASSETS_URL + '/css/' + href;
	}
	
	el = tag('link', {href: href, type: 'text/css', rel: 'stylesheet'});
	
	head = document.getElementsByTagName('head')[0];
	head.appendChild(el);
}

function uploadr(container_id) {
	url = get_url('content', 'uploader', [container_id], {}, iCMS.backend);
	args = {};
	args.width = 400;
	args.height = 380;
	args.scrollbar = 0;
	wopen(url, args, 'Uploader');
}

function url_preview(path_field, bn_field) {
	if (path_field == undefined) {
		path_field = $('object_path');
	}
	
	if (bn_field == undefined) {
		bn_field = $('object_basename');
	}	
	path = path_field.value;
	bn = bn_field.value;
	
	if (path == '/') {
		path = '';
	}
	
	fp = iCMS.frontend + path + '/' + bn;
	
	prfix = location.protocol + '//' + location.host;
	fp = fp.substring(prfix.length);
	els = $$('.urlpreview span')
	for(var i = 0; i < els.length; i++) {
		els[i].innerHTML = fp;
	}
}

function object_preview(kind, form_id) {
	frm = $(form_id);
	
	n_frm = tag('form', {target: '_blank', action: iCMS.frontend + '/content/preview', method: 'post', style: 'display:none'});
	n_frm.appendChild(tag('input', {type: 'hidden', name: 'preview_kind', value: kind}));
	
	tinyMCE.triggerSave();
	
	for(var i = 0; i < frm.elements.length; i++) {
		el = frm.elements[i];
		cp = tag('input', {type: 'hidden', name: el.name, value: el.value});
		n_frm.appendChild(cp);
	}
	get_body().appendChild(n_frm);
	n_frm.submit();
	
}

function show_ajax_loading() {
	if (!(_pi = $('pi'))) {
		_pi = tag('div', {id: 'pi'}, 'Loading');
		_pi.style.position = 'fixed';
		_pi.style.top = '0';
		_pi.style.right = '0';		
		get_body().appendChild(_pi);		
	}
}

function hide_ajax_loading() {
	if (_pi = $('pi')) {
		Element.remove(_pi);
	}
}

var ajax_responders_registered = false;
function register_ajax_responders() {
	if (ajax_responders_registered) {
		return;
	}
	try {
		Ajax.Responders.register({onCreate: show_ajax_loading, onComplete: hide_ajax_loading, onFailure: on_ajax_failure});
		ajax_responders_registered = true;
	} catch(e) {}	
}

function on_ajax_failure(t) {
	str = 'Server returned HTTP Status: ' + t.status + ' ' + t.statusText;
	data = parse_json(t.responseText);
	log(data.exception.type + '(' + data.exception.code +'): ' + data.exception.message);
}

function http_get(url, callback, data) {
	register_ajax_responders();
    new Ajax.Request(url, {
		evalJS: true,
		method: 'get',
		onSuccess: function(transport) {
			if (callback != undefined) {
	    		callback({body: transport.responseText})
			}
		},
		onFailure: on_ajax_failure,
		requestHeaders: {'X-Ajax': 'Yes'},
		parameters: data
	});
}

function http_get_update(url, element_id, data, callback) {
	register_ajax_responders();
    http_get(url, function(response) {
        try {
            $(element_id).innerHTML = response.body;
            if (callback != undefined) {
                callback(element_id);
            }
        } catch(e) {
            log(e);
        }
    }, data);
    
}

function http_post(url, data, callback) {
	register_ajax_responders();
	new Ajax.Request(url, {
		evalJS: true,
		method: 'post',
		onSuccess: function(transport) {
			if (callback != undefined) {
	    		callback({body: transport.responseText})
			}
		},
		onFailure: on_ajax_failure,
		requestHeaders: {'X-Ajax': 'Yes'},
		parameters: get_query_string(data)
	});
}

var tinymce_count = 1;
function create_tinymce(ta_id, config) {
	config.elements = ta_id;
    config.mode = 'exact';
    config.theme = 'advanced';
	config.relative_urls = false;
    config.plugins = 'safari,pagebreak,style,layer,table,save,advhr,emotions,iespell,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template'
	
	if (config.theme_advanced_styles != undefined) { 
		cp = config.theme_advanced_styles;
		_items = [];
		for(var k in cp) {
			_items.push(k + '=' + cp[k]);
		}
		config.theme_advanced_styles = _items.join(', ');
	}
	
	$(ta_id).style.visibility = 'hidden';
	
	setTimeout(function() {
		tinyMCE.init(config);	
	}, 200 * tinymce_count);
	tinymce_count++;
}

function toggle_checkboxes_by_column(cnt, cb, col) {
    nn = cnt.nodeName.toString().toLowerCase();
    if (nn == 'ul' || nn == 'ol') {
        cn = 'li';
    } else {
        cn = 'tr';
    }
    
    rows = cnt.getElementsByTagName(cn);
    for(var i = 0; i < rows.length; i++) {
        row = rows[i];
        cbs = row.getElementsByTagName('input');
        cbs[col].checked = cb.checked;
    }
}

function on(el , type , callback , obj , scope) {
	Event.observe(el, type, callback);
}

function listen(el, type, callback, obj, scope) {
	Event.observe(el, type, callback);
}

function search_contents(restrict_to_path) {
    if ($('q').value.match(/^\s*$/)) {
        return;
    }
    clear_search();
	data = {}
	data.q = $('q').value;
	data.path = $('search_in').value;
	data.restrict_to_path = restrict_to_path == undefined || restrict_to_path == true?1:0;
	
    http_get(get_url('content', 'search', [], data), function(r) {
        results_pane = tag('div', {id: 'search-results'});
        search_pos = get_bounds($('search'));
		results_pane.style.top = (search_pos.height + search_pos.y) + 'px';		
		// 415 -> #subheader's padding + width of #search-results
		// as set in the style sheets
        results_pane.style.left = (search_pos.width + search_pos.x - 415) + 'px';
        results_pane.innerHTML = r.body;
        get_body().appendChild(results_pane);
        
    });
}

function clear_search() {
    try {
        $('search-results').parentNode.removeChild($('search-results'));
    } catch(e) {};
}


function get_url(action, method, args, vars, base) {
	if (base == undefined) {
		base = iCMS.base;
	}
    url = '/' + action + '/' + method;
    if (args != undefined && args.length > 0) {
        url += '/' + args.join('/');
    }
	
	url = url.replace(/\/{2,}/, '');
	url = base + url;
	
    if (vars != undefined) {
        if ((qs = get_query_string(vars)) != '') {
            url += '?' + qs;
        }
    }
    return url;
}

function get_selection(cnt) {
    sel = [];
    _inputs = cnt.getElementsByTagName('input');
    for(var i = 0; i < _inputs.length; i++) {
        ii = _inputs[i];
        if (ii.type.toLowerCase() == 'checkbox' && ii.name == 'select[]') {
            if (ii.checked) {
                sel.push(parseInt(ii.value));
            }   
        }   
    }
    return sel;
}   

function move_or_alias_selection(cnt) {
    sel = get_selection(cnt);
    if (sel.length == 0) {
        return;
    }   
    
    operation = $('operation').value;
    target_folder = $('target_folder').value;
    data = {items: sel, operation: operation, target_folder: target_folder}
    http_post(get_url('content', 'move_or_alias'), data, function(r) {
        result = parse_json(r.body);
        location.href = get_url('content', 'edit', [result.target_id]);
    });
}

function create_alias(sel) {
    if (iCMS.current_object == undefined) {
        return;
    }
    data = {id: iCMS.current_object.id, target_path: sel.path}
    
    http_post(get_url('content', 'create_alias'), data, function(r) {
        result = parse_json(r.body);
        if (result.success) {
            location.href = result.url;
        }
    });    
}

function create_duplicate(sel) {
    if (iCMS.current_object == undefined) {
        return;
    }
    data = {id: iCMS.current_object.id, target_path: sel.path}
    
    http_post(get_url('content', 'duplicate'), data, function(r) {
        result = parse_json(r.body);
        if (result.success) {
            location.href = result.url;
        }
    });
}


function toggle_moderator(user_id, cb) {
    data = {user_id: user_id, flag: cb.checked?1:0}
    
    http_post(get_url('comments', 'toggle_moderator'), data, function(r) {
        result = parse_json(r.body);
        cb.checked = parseInt(result.flag) == 1;
    });
}


function toggle_trash(item_id, context_folder_id, current_page) {
    http_post(get_url('content', 'toggle_trash'), {id: item_id, context_folder: context_folder_id, current_page: current_page}, function(response) {
        result = parse_json(response.body);
        if (result.success) {
            if (result.trashed == 1) {
                add_class_name($('item_' + item_id), 'trashed');
                if (result.hide == 1) {
					Effect.Fade($('item_' + item_id), {duration: 0.3});
                }
            } else {
                remove_class_name($('item_' + item_id), 'trashed');
            }
            icon = $('item_' + item_id + '_trash_icon');
            change_image(icon, (result.trashed?'restore-from-trash.png':'move-to-trash.png'));
			if ($('folder_contents_pager')) {
				$('folder_contents_pager').innerHTML = result.folder_contents_pager;
			}
        }
    });
}

function toggle_show_trashed(flag, item_id) {
    set_preference('show_trashed', flag, function() {
        browse_container(get_url('content', 'browse_container', [item_id]), 'folder_contents');
    });
}

function erase_selected() {
	sel = get_selection($('folder_contents'));
    if (sel.length == 0) {
        return;
    }
	
	if (!confirm('Sicuro? L\'operazione è irreversibile!')) {
		return;
	}
	
    http_post(get_url('content', 'erase_selected'), {items: sel}, function(response) {
		result = parse_json(response.body);
		if (result.success == 0) {
			return;
		}
		refresh_container();
    });
}

function change_image(img, nsrc) {
    nsrc_items = nsrc.split('/');
    osrc_items = img.src.split('/');
    for(var i = 0; i < nsrc_items.length; i++) {
        osrc_items.pop();
    }
    img.src = osrc_items.join('/') + '/' + nsrc_items.join('/');
}

function set_preference(n, v, callback) {
    data = {};
    data.pref_name = n;
    data.pref_value = v;
    http_post(iCMS.base + '/user/set_preference', data, callback);
}

function minibrowser(start_at_id, vars, args) {
    //$attributes['onclick'] = inline_function('wopen', $url->toString(), a('width', 300, 'height', 400));
    if (args == undefined) {
        args = {};
    }    
    
    if (args.width == undefined) {
        args.width = 300;
    }
    
    if (args.height == undefined) {
        args.height = 400;
    }    
    
    if (args.scrollbars == undefined) {
        args.scrollbars = 1;
    }
    url = get_url('content', 'minibrowser', [start_at_id], vars);
    log(url);
    return wopen(url, args, 'Minibrowser');
}

function wopen(url, args, title) {
    if (title == undefined) {
        title = 'popup';
    }
    if (args == undefined) {
        args = {};
    }
    
    if (args.left == undefined && args.width != undefined) {
        args.left = (screen.width - args.width) / 2;
    }
    
    if (args.top == undefined && args.height != undefined) {
        args.top = (screen.height - args.height) / 2;
    }    

    args_items = [];
    args_str = '';
    if (args != undefined) {
        for(var k in args) {
        	if(typeof(args[k]) == 'function') {
        		continue;
        	}
            args_items.push(k + '=' + args[k]);
        }
        args_str = args_items.join(',');
    }
    
    w = window.open(url, title, args_str);
    if (!w) {
        alert('Disattiva il blocco pop-up!');
    }

	if (w.opener == undefined) {
		w.opener = window;
	}

	if (args.onClose != undefined) {
		Event.observe(w, 'unload', args.onClose);
	}

    return w;
}

function getElementsByClassName(class_name, el_type, root) {
	r = $$('.' + class_name);
	return r;
}

function getStyle(el, prop) {
 	Element.getStyle(el, prop);
}


function get_bounds(el) {
	return getBounds(el);
}

function getBounds(el) {
    return {x: el.offsetLeft, y: el.offsetTop, width: el.offsetWidth, height: el.offsetHeight}
}


function getXY(el) {
	return {x: el.offsetLeft, y: el.offsetTop}
}

var last_browsed = false;
function browse_container(url, element_id, hilite_since) {
    data = {};
    try {
		if (hilite_since != undefined) {
			data.hilite_since = parseInt(hilite_since.getTime() / 1000);
		}
        data.sort_type = $('object_sort_type').value;
        data.sort_by = $('object_sort_by').value;
        data.q = $('qc').value
        data.store_sort_checked = $('object_store_sort').checked?1:0;
    } catch(e) {
        log(e);
    }    
    
	last_browsed = {url: url, element_id: element_id}

    http_get_update(url, element_id, data, function() { 	
        if (l = $('folder_contents_sortable')) {
			try {
            Sortable.create(l);} catch(e) {log(e)}
        }    
		run_scripts($(element_id));
    });
}

function refresh_container(hilite_since) {
	if (last_browsed == false) {
		return;
	}
	browse_container(last_browsed.url, last_browsed.element_id, hilite_since);
}

function save_new_items_order() {
    data = Sortable.serialize('folder_contents_sortable');
    http_post(iCMS.base + '/content/set_weight', data, function(response) {
		refresh_container();
    });
}

function get_query_string(data) {
	if (typeof(data) == 'string') {
		return data;
	}
    data_str = '';
    _items = []
    for(var k in data) {
        if (typeof(data[k]) == 'object') {
            for(var j in data[k]) {
                if (typeof(data[k][j]) == 'function') {
                    continue;
                }
                _items.push(k + '[' + j + ']=' + escape(data[k][j]));
            }
        } else {
            if (typeof(data[k]) == 'function') {
                continue;
            }	
            _items.push(k + '=' + escape(data[k]));
        }
    }
    if (_items.length > 0) {
        data_str += _items.join('&')
    }
    return data_str;
}

function call_method(args) {
    if (args.confirm != undefined && args.confirm != false) {
        if (!confirm(args.confirm)) {
            return;
        }
    }
    if (args.http_method == undefined || args.http_method.toLowerCase() == 'post') {
        http_post(get_url(args.action, args.method), args.args, function(response) {
			if (args.callback != undefined) {
				if (args.callback == 'reload') {
					location.reload();
					return;
				}
			}
            func = false;
            try {
                func = eval(args.callback);
            } catch(e) {log(e);}
            if (func !== false) {
                func(response);
            }
        });
    }
   
}


function submit_form(frm, vars) {
    f = tag('input', {type: 'submit'});
    f.style.display = 'none';
    frm.appendChild(f);
    
    if (vars != undefined) {
        for(var k in vars) {
            frm.appendChild(tag('input', {type: 'hidden', value: vars[k], name: k}));
        }
    }
    
    f.click();
    
    return false;
}

function parse_json(str) {
    try {
        return eval('(' + str + ')');
    } catch(e) {
        log('Error while parsing JSON (' + e + ')');
        log(str);
    }
}

function log(msg) {
    try {
        console.log(msg);
    } catch(e) {}
}

function get_body() {
    return document.getElementsByTagName('body')[0];
}

function txt(str) {
    return document.createTextNode(str);
}

function tag(name, attributes, content) {
    el = document.createElement(name);
    if (attributes != undefined) {
    for(var k in attributes) {
        if (k == 'class' || k == 'classname' || k == 'className') {
            el.className = attributes[k];
        } else {
            el.setAttribute(k, attributes[k]);
        }
        }
    }
    if (content != undefined) {
        el.appendChild(document.createTextNode(content));
    }

    return el;
}

function tag_img(src, attributes) {
    if (attributes == undefined) {
        attributes = {};
    }
    attributes.src = iCMS.IMG_URL + '/' + src;
    return tag('img', attributes);
}


function add_class_name(el, name) {
	return Element.addClassName(el, name)
}   
function has_class_name(el, name) {
	return Element.hasClassName(el, name)

}
function remove_class_name(el, name) {
	return Element.removeClassName(el, name)
}

function in_array(needle, haystack) {
    for(var i = 0; i < haystack.length; i++) {
        if (haystack[i] == needle) {
            return true;
        }
    }
    return false;
}


function find_parent_node(el, node_type, class_name) {
    while(el = el.parentNode) {
        try {
            if (el.nodeName.toLowerCase() == node_type.toLowerCase()) {
                if (class_name) {               
                    if (has_class_name(el, class_name)) {                             
                       return el;
                    }
                } else {
                    return el;
                }
            }
        } catch(e) {
            log('Exception: ' + e);
        }
    }
    return false;
}

function get_selection_html() {
	var range;
	if (document.selection && document.selection.createRange) {
		range = document.selection.createRange();
		return range.htmlText;
	} else if(window.getSelection) {
		var selection = window.getSelection();		
		if (selection.rangeCount > 0) {
			range = selection.getRangeAt(0);
			var cloned_sel = range.cloneContents();
			var sel_wrapper = document.createElement('div');
			sel_wrapper.appendChild(cloned_sel);
			return sel_wrapper.innerHTML;
		} else {
			return '';
		}
	} else {
		return '';
	}	
}
