/*
ns dc				http://purl.org/dc/elements/1.1/
dc:title			SemSol JavaScript library
dc:creator			benjamin nowack, bnowack at appmosphere.com
dc:date				2006-03-09
*/

if(!window["js_libs"]){window.js_libs={};}

onload = function(){
	clean_hrefs();
	add_edit_link();
	adjust_email_links();
	activate_remote_calls();
	activate_submit_anchors();
  adjust_boxes();
  activate_mouse_tracker();
	for(i in js_libs){
		if(js_libs[i]["onload"]){
			js_libs[i].onload();
		}
	}
  track_request();
}

/*      */

/* replace query string */
function adjust_url(qs_args, url) {
	var url = (url) ? url : location.href;
	var qs = (url.indexOf('?') != -1) ? url.substring(url.indexOf('?')+1) : '';
	var url_base = (url.indexOf('?') != -1) ? url.substring(0, url.indexOf('?')) : url;
	return url_base+'?'+get_qs(qs_args, qs);
}

/* remove _container and _callback from links and forms */
function clean_hrefs(){
	var els, el;
	if (els = elsByTag("a")){
		for (var i = 0; i < els.length; i++) {
			el = els[i];
			if (el.href.indexOf('?') != -1) {
				el.href = adjust_url({"_container" : "", "_callback" :""}, el.href);
			}
		}
	}
}

/* add dblclick edit handler to first h1 heading */
function add_edit_link(){
	var els, toggle;
	if((els = elsByTag("h1")) && els.length && (toggle = elById("editToggle"))){
  	addEvent(els[0], "dblclick", function(){location.href=attrVal(toggle, "href")});
	}
}

/* create clickable email links */
function adjust_email_links(){
	var els, a_el, spans, account, server;
	if (els = elsByClass("email")) {
		for (var i=0; i < els.length; i++) {
			if ((a_el = elByTag("a", els[i])) && (spans = elsByTag("span", els[i]))){
				account = spans[0].innerHTML;
				server = spans[1].innerHTML;
        //alert("a: "+account+"\ns: "+server);
				a_el.href = "mailto:"+account+"@"+server;
			}
		}
	}
}

/* addjusts box divs for bg graphics with rounded corners etc. */
function adjust_boxes() {
  var els;
	if (els = elsByClass("box")) {
    for (var i = 0; i < els.length; i++) {
      if(!elsByClass('box-content', els[i]).length) {
        els[i].innerHTML = ''+
          '<div class="box-content">'+els[i].innerHTML+'<div class="clb"></div></div>'+
          '<div class="box-footer"><div class="box-footer-right"></div></div>'+
        '';
      }
    }
  }
}

/* activate AJAX anchors */
function activate_remote_calls(){
	var els;
  /* anchors */
	if (els = elsByClass("remote", 0, "a")) {
		for (var i=0; i < els.length; i++) {
      activate_remote_link(els[i]);
		}
	}
  /* forms */
	if (els = elsByClass("remote", 0, "form")) {
		for (var i=0; i < els.length; i++) {
      activate_remote_form(els[i]);
		}
	}
}

function activate_remote_link(el) {
  addEvent(el, "click", function(e){call_remote_link(el, e);return false});
}

function activate_remote_form(el) {
  addEvent(el, "submit", function(e){call_remote_form(el, e);return false});
  el.activated = true;
  /* add button handlers (IE doesn't send button info) */
  var button;
  var els = elsByClass('submit', el, 'input');
  for (var i = 0 ; i < els.length; i++) {
    activate_remote_form_button(el, els[i]); 
  }
}

function activate_remote_form_button(form, el) {
  var form_id = form.id;
  var button_call = el.name.substring(form_id.length+1);
  addEvent(el, 'click', function(e){form[form_id+"-call"].value = button_call});
}

function activate_submit_anchors() {
  var els;
  if (els = elsByClass('submit', 0, 'a')) {
		for (var i=0; i < els.length; i++) {
      activate_submit_anchor(els[i]);
		}
  }
}

function activate_submit_anchor(el) {
  var p = el.parentNode;
  while (p.parentNode && (p.tagName.toLowerCase() != 'form')) {
    p = p.parentNode;
  }
  var form = p;
  addEvent(el, 'click', 
    function(e){
      var button_call;
      if (form[form.id+'-call'] && (button_call = el.id.substring(form.id.length+1))) {
        form[form.id+'-call'].value = button_call;
      }
      call_remote_form(form);
      var event = window.event || e;
      cancelEvent(event);
    }
  );
}

/* activate mouse tracker */
function activate_mouse_tracker() {
	document.onmousemove = track_mouse;
}

function track_mouse(e){/* relative to doc, not win */
  var event = e || window.event;
  try {
    window.m_x = (event && event.pageX) ? event.pageX : ((event && event.x) ? event.x : 0);
    window.m_y = (event && event.pageY) ? event.pageY : ((event && event.y) ? event.y : 0);
  	var ua = navigator.userAgent.toLowerCase();
  	if(document.body && document.body.scrollTop && (ua.indexOf("msie") != -1) && (ua.indexOf("opera")==-1)){
  		window.m_y += document.body.scrollTop;
  	}
    else if(document.documentElement && document.documentElement.scrollTop && (ua.indexOf("msie") != -1) && (ua.indexOf("opera")==-1)){
  		window.m_y += document.documentElement.scrollTop;
    }
  } catch(e){}
  //var status_msg=window.m_x+","+window.m_y;
	//window.status=status_msg;
}


/* inline item refresh */
function call_remote_link(el, e){
	var re, m, sub_m, id, sub_id, href, url;
	/* look for $id-$sub_id-call in class */
	re = new RegExp("(^|\\s)([^\\s]+)-call(\\s|$)");
	if (m = el.className.match(re)){
	  href = el.href;
    url = href;
		re = new RegExp("^(.+)\-([^\-]+)$");
		if(sub_m=m[2].match(re)){
			id=sub_m[1];
			sub_id=sub_m[2];
      if(href.indexOf('$'+id+'.'+sub_id) == -1) {
  			url=(href.indexOf("?")!=-1) ? href.replace(/\?/, '$'+id+'.'+sub_id+'?') : href+'$'+id+'.'+sub_id;
      }
			call_remote({"type": "link", "url": url, "id": id+"_"+sub_id, "method": "get"});
		}
    else{
      id=m[2];
      if(href.indexOf('$'+id+'.'+sub_id) == -1) {
  			url=(href.indexOf("?")!=-1) ? href.replace(/\?/, '$'+id+'?') : href+'$'+id;
      }
			call_remote({"type": "link", "url": url, "id": id, "el": el});
    }
	}
  var event = window.event || e;
  cancelEvent(event);
}

function call_remote_form(el){
	var re, m, sub_m, id, sub_id, href, url;
	/* look for $id-$sub_id-call in class */
	re = new RegExp("(^|\\s)([^\\s]+)-call(\\s|$)");
	if(m = el.className.match(re)){
		href=(el.action) ? el.action : location.href;
    url = href;
		re = new RegExp("^(.+)\-([^\-]+)$");
		if(sub_m=m[2].match(re)){
			id=sub_m[1];
			sub_id=sub_m[2];
      if(href.indexOf('$'+id+'.'+sub_id) == -1) {
  			url=(href.indexOf("?")!=-1) ? href.replace(/\?/, '$'+id+'.'+sub_id+'?') : href+'$'+id+'.'+sub_id;
      }
			call_remote({"type": "form", "url": url, "id": id+"_"+sub_id, "el": el});
    }
    else{
      id=m[2];
      if(href.indexOf('$'+id+'.'+sub_id) == -1) {
  			url=(href.indexOf("?")!=-1) ? href.replace(/\?/, '$'+id+'?') : href+'$'+id;
      }
			call_remote({"type": "form", "url": url, "id": id, "el": el});
    }
	}
}

function call_remote(args){
	var id=args["id"];
	var url=args["url"];
	var type=args["type"];
	var method=args["method"] ? args["method"] : "get";
  var callback_id = id.replace(/\-/g, '_');
	
	var div_id=id+"Div";
	var form_id=id+"Form";
	var win_id=id+"Win";
	var div=elById(div_id);
	if(!div){
		div=document.createElement("div");
		div.id=div_id;
		div.className="hidden";
		elById("ajaxArea").appendChild(div);
		div=elById(div_id);
		/* iframe, form */
		div.innerHTML=''+
			'<iframe id="'+win_id+'" name="'+win_id+'" src="javascript;"></iframe>'+
			'<form id="'+form_id+'" target="'+win_id+'" method="post" enctype="application/x-www-form-urlencoded"></form>'+
		'';
		/* callback */
		window[callback_id+"_item_callback"] = function(val){
			if(!val){
				alert("no val");
				return false;
			}
			var container = document.createElement("div");
			container.innerHTML = val.replace(/^\s+/, '');
			var item_id = container.firstChild.id;
			var el;
			if(el = elById(item_id)){
				el.innerHTML = container.firstChild.innerHTML;
			}
			window.onload();
		}
	}
	url = adjust_url({"_container" : "iframe", "_callback" : "parent."+callback_id+"_item_callback"}, url);
  if(url.charAt(0) == '$') {
		re = new RegExp("^([^?]+)");
		if (m = location.href.match(re)) {
      url = m[1]+url;
    }
  }
  //window.open(url, "debug");
  if(type == "link"){
  	if(method == "get"){
  		var win = elById(win_id);
  		win.src = "javascript:;";
  		win.src = url;
  	}
  	else if(method == "post"){
  		var form = elById(form_id);
      form.action = "javascript:;";
  		form.action = url;
  		form.method = method;
  		//form.target="debug";
  		form.submit();
  	}
  }
  if(type == "form"){
    var form = args["el"];
    form.target = win_id;
    form.action = "javascript:;";
    form.action = url;
    //form.target = "debug";
    form.submit();
  }
}

/*      */

function track_request() {
  if (window['root_path'] && !window['request_tracked']) {
    window.request_tracked = true; /* don't track ajax requests */
    var href = location.href;
    var rf = document['referrer'] ? document.referrer : '';
    var url = window.root_path+'track?url='+escape(href)+'&rf='+escape(rf)+'&title='+escape(document.title);
    call_remote({'type': 'link', 'url': url, 'id': 'track', 'method': 'get'});
  }
}
/*      */
/*      */



/* GET argument */

function $GET(arg, qs){
	var qs = (qs) ? qs.match(/(\?.*)$/)[1] : location.search;
	var re, matches;
	qs = qs.replace(/\?/, '&');
	re = '/\&'+arg+'=([^\&]*)/';
	if(matches = qs.match(eval(re))){
		return matches[1];
	}
	return false;
}

function get_qs(args, qs){
	var qs=(qs) ? qs : location.search;
	qs=(qs.indexOf("?")!=-1) ? qs.substring(qs.indexOf("?")+1) : qs;
	var re;
	for(var i in args){
		re="/(^|\\?|\\&)("+i+"=)([^\\&]*)/";
		/* remove old args */
		qs=qs.replace(eval(re), "");
		/* add new */
		if(args[i]){
			qs+=(qs.length) ? "&" : "";
			qs+=i+"="+args[i];
		}
		
		//if(m = qs.match(eval(re))){
		//	qs=qs.replace(/\?/, '$'+item_id+'?')
		/*
				if(preg_match($re, $qs)){
					$qs=preg_replace($re, '${1}${2}'.$v, $qs);
				}
				else{
					$qs.=(strlen($qs)) ? '&' : '';
					$qs.=$k.'='.$v;
				}
			*/
	}
	return qs;
}






/* preload images */
function preloadImages(imgs) {
	for(var i = 0; i < imgs.length; i++) {
		var img = new Image();
		img.src = imgs[i];
	}
}

