/**
 * FMIS javaskript för klientsidan.
 * Version: CVS $Id: fornsok.js,v 1.15 2009/10/21 10:16:14 niklas Exp $
 */

//<!--

var RAA = window.RAA || {};

RAA.windowPopupBlockerAlert = function (what) {
    alert("Fel vid popup-kontroll." +
        "\n\nEtt fel intr\u00e4ffade n\u00e4r systemet skulle \u00f6ppna ett nytt f\u00f6nster f\u00f6r " + what + "." +
        "\n\nKontrollera att du inte har installerat ett sp\u00e4rrprogram som f\u00f6rhindrar popup-f\u00f6nster (t.ex. Google Toolbar)." +
        "\n(Om du anv\u00e4nder Google Toolbar kan du h\u00e5lla in Ctrl-tangenten n\u00e4r du klickar f\u00f6r att tillf\u00e4lligt g\u00e5 runt sp\u00e4rren.)");
}

RAA.openWindow = function(url,id,params,what) {
    if (!url) return null;
    var w = window.open(url,id,params);
    if (w) {
        w.focus();
    } else {
        RAA.windowPopupBlockerAlert(what);
    }
    return w;
}

RAA.disable = function(objectId) {
    var element = document.getElementById(objectId);
    if (element) element.setAttribute('disabled', 'disabled');
}

RAA.enable = function(objectId) {
    var element = document.getElementById(objectId);
    if (element) element.removeAttribute('disabled');
}

RAA.isSet = function(s) {
    return (s!=null && s!="" && s!="null" && s!="undefined");
}

RAA.getElementValue = function(id) {
    var el = document.getElementById(id);
    if (el) {
        return el.value;
    } else {
        return "";
    }
}

RAA.setElementValue = function(id, value) {
    var el = document.getElementById(id);
    if (el) {
        el.value = value;
    }
}

/**
 * Hämtar innerHTML för elementet med inskickat id.
 * @param id element-id
 * @param defaultValue defaultvärde om elementet ej hittas
 * @return innerHTML för elementet eller defaultvärdet
 */
RAA.getInnerHTML = function(id, defaultValue) {
	var result = defaultValue;
	var el = document.getElementById(id);
	if (el) {
		result = el.innerHTML;
	}
	return result;
}

/**
 * Sätter innerHTML för elementet med inskickat id.
 * @param id element-id
 * @param value värde att sätta
 */
RAA.setInnerHTML = function(id, value) {
 	var el = document.getElementById(id);
 	if (el) {
 		el.innerHTML = value;
 	}
}

/**
 * Läs om möjligt ut href för den länk som berörs av aktuellt event, tex klick.
 * Eftersom det element som är närmast sammanknippat med händelsen inte 
 * nödvändigtvis behöver vara en länk (länken kan tex ha inbäddade span-taggar)
 * vandrar denna funktion uppåt till ovanstående element. så långt det går eller 
 * en länk har hittats.
 * @param e event
 * @return String med href för länk som kan sammankopplas med event, annars 
 *  undefined. 
 */
RAA.getEventHref = function(e) {
	var targ = RAA.getEventLink(e);
	if (RAA.isSet(targ) && RAA.isSet(targ.href)) {
	   return href;
    } else {
        return null;
    }
}

RAA.getEventLink = function(e) {
    var targ;
    if (!e) var e = window.event;
    if (e.target) targ = e.target;
    else if (e.srcElement) targ = e.srcElement;
 
    if (targ.nodeType == 3) // defeat Safari bug
        targ = targ.parentNode;

    var href;
    if (targ.href) href = targ.href;
    while (!href && targ.parentNode) {
        targ = targ.parentNode;
        if (targ.href) href = targ.href;
    }
    if (href) return targ; 
    else return null;
}


/**
 * Ersätter parametrar i söksträng med nya värden samt rensar bort
 * parametrar som saknar värde.
 * 
 * Söksträng ska vara avgränsad med "&".
 * Parametersträng skall inte börja med något prefix.
 *
 * @param qs Söksträng som ska uppdateras.
 * @param params Nya parametrar och värden som ska införas i söksträngen. 
 * @return Uppdaterad söksträng, med prefix om strängen inte är tom.
 */
RAA.updateQueryString = function(qs, params) {
    if (RAA.isSet(params)) {
        if (RAA.isSet(qs)) {        
            // ta bort nya parametrar från gamla söksträngen
            var paramArray = params.split("&");
            for(var i=0; i < paramArray.length; i++) {
                var paramKeyValuePair = paramArray[i].split("=");
                if (paramKeyValuePair.length == 2) {
                	var key = paramKeyValuePair[0];
                	var regex_contains_param = new RegExp('(^[?]?' + key + '=.*)|(.*&' + key + '=.*)');								

                    while(regex_contains_param.test(qs)) {  
 						var is_one_param = qs.split("=").length <= 2;  											 																			
						if (is_one_param) {
							qs = "";
						} else {
						 	var regex_first_param = new RegExp('^[?]?' + key + '=.*&');					 	
							var fromIndex = -1;
							var firstArgCompensation = 0;
							
							if (regex_first_param.test(qs)) {
								fromIndex = 0;
								firstArgCompensation = 1;
							} else {							
							    fromIndex = qs.indexOf('&' + key + '=');
						    }

						    var toIndex = qs.indexOf("&", fromIndex + 1);
						    if (toIndex == -1) toIndex = qs.length;
					    	else toIndex = toIndex + firstArgCompensation;
					    									
						    qs = qs.substring(0, fromIndex) + qs.substring(toIndex, qs.length);		
					    }
					}
                }
            }
        }
        // lägg till nya parametrar
        if (!RAA.isSet(qs)) qs = params;
        else qs = qs + "&" + params;
    }
	if (!RAA.isSet(qs)) qs = "";
	else if (qs.charAt(0) != '?') qs = '?' + qs;
	
    return qs;
}

/**
 * Läs ut URL från event (tex klickad länk) och navigera till den med nya parametervärden.
 * @param e event från lyssnare för en länk.
 * @param params String med nya parametrar och värden som ska införas.  
 */
RAA.updateRedirect = function(e, params) {
	var href = RAA.getEventHref(e);	
	if (href) {
		var url = href.split('?')[0]; 
		var searchQueryString = href.split('?')[1]; 
	    var newQueryString = RAA.updateQueryString(searchQueryString, params);
	    YAHOO.util.Event.preventDefault(e);	    
	    window.location = url + newQueryString;
	    return false;
	} else {
		return true;
	}
}

RAA.addClass = function(e, elementId, className) {
    if (!YAHOO.util.Dom.hasClass(elementId, className)) {
        YAHOO.util.Dom.addClass(elementId, className);
    }
    return false;    
}

RAA.removeClass = function(e, elementId, className) {
    if (YAHOO.util.Dom.hasClass(elementId, className)) {
        YAHOO.util.Dom.removeClass(elementId, className);
    }
    return false;
}

// visa/dölj, lägger till och tar bort klassen 'hide' på elementet och sätter klassen
// toggleHide respektive toggleShow på objektet (länk/knapp/..) som gav upphov till togglingen
RAA.showHideToggle = function(e, elementId) {
    if (YAHOO.util.Dom.hasClass(elementId, 'hide')) {
    	YAHOO.util.Dom.removeClass(elementId, 'hide');
    	if (this.id) {
    		YAHOO.util.Dom.removeClass(this.id, 'toggleHide');
    		YAHOO.util.Dom.addClass(this.id, 'toggleShow');
    	}
    } else {
        YAHOO.util.Dom.addClass(elementId, 'hide');
    	if (this.id) {
    		YAHOO.util.Dom.removeClass(this.id, 'toggleShow');
    		YAHOO.util.Dom.addClass(this.id, 'toggleHide');
    	}
    }
    return false;
}

// visar arbete pågår-dialog, tar bort klassen 'hide' på elementet
RAA.showWorkNotice = function(e) {
    YAHOO.util.Dom.removeClass("work-notice", 'hide');
}

// gömmer arbete pågår-dialog, lägger klassen 'hide' på elementet
RAA.hideWorkNotice = function(e) {
    YAHOO.util.Dom.addClass("work-notice", 'hide');
}

// togglar visning av inmatning av historiktidpunkt
RAA.toggleHistory = function() {
	if (histDateTime != null) {
		RAA.setHistDateTime(null);
		RAA.doUpdateShowObjectPanel(objectId, false, true);
	} else if (histDateTime == null && !YAHOO.util.Dom.hasClass('histDateBlock', 'hide')) {
		YAHOO.util.Dom.addClass('histDateBlock', 'hide');
	} else {
		YAHOO.util.Dom.removeClass('histDateBlock', 'hide');
		var hdt;
		if (lastHistDateTime != null) {
			hdt = lastHistDateTime;
		} else {
			var d = new Date();
			hdt = d.getFullYear() + "-01-01T23:59:00Z";
		}
		RAA.setElementValue("histDateInput", RAA.histToEnterDateStr(hdt));
	}
}

// tar hand om val av historiktidpunkt
RAA.enterHistDateTime = function() {
	var inputEl = document.getElementById("histDateInput");
	if (inputEl) {
		var value = inputEl.value;
		if (RAA.enterDateIsValid(value)) {
			YAHOO.util.Dom.removeClass("histDateInput", "invalidHistDate");
			var newHistDateTime = RAA.enterDateToHistStr(value);
			if (newHistDateTime != histDateTime) {
				RAA.setHistDateTime(newHistDateTime);
				RAA.doUpdateShowObjectPanel(objectId, false, true);
			}
		} else {
			YAHOO.util.Dom.addClass("histDateInput", "invalidHistDate");
		}
	}
}

// hantera enter/retur-knappen för historik
RAA.fetchHistoryOnEnter = function(e) {
    if (e.keyCode == 13) {
        YAHOO.util.Event.preventDefault(e);        
        RAA.enterHistDateTime(e);
    }
}

// gör om tidsstämpel till visningsformat
RAA.histToDisplayDateStr = function(str) {
	return str.replace("T", " ").replace("Z", "");
}

// gör om tidsstämpel till inmatningsformat
RAA.histToEnterDateStr = function(str) {
	return str.replace("T", " ").replace("Z", "").substring(0, 16);
}

// regexp för giltig datumsträng
var histEnterDateRe = /^([0-9]{4}-[0-9]{2}-[0-9]{2})( [0-9]{2}:[0-9]{2}(:[0-9]{2}){0,1})$/;

// kontrol av om datumet är giltigt
RAA.enterDateIsValid = function(str) {
	var result = false;
	var parts = str.match(histEnterDateRe);
	if (parts) {
		var date = parts[1];
		var time = parts[2].substr(1);
		var d = date.split("-");
		var t = time.split(":");
		// radix 10 är viktigt då 08 och 09 blir fel annars (tolkas som oktalt)
		var yyyy = parseInt(d[0], 10);
		var mm = parseInt(d[1], 10) - 1;
		var dd = parseInt(d[2], 10);
		var hh = parseInt(t[0], 10);
		var mi = parseInt(t[1], 10);
		var ss = (t[2] ? parseInt(t[2], 10) : 0);
		var testDate = new Date(yyyy, mm, dd);
		if (!isNaN(testDate.getTime()) && yyyy == testDate.getFullYear() && mm == testDate.getMonth() && dd == testDate.getDate()) {
			result = (hh <= 24 && mi <= 59 && ss <= 59);
		}
	}
	return result;
}

// gör om inmatningsdatum till tidsstämpel
RAA.enterDateToHistStr = function(str) {
	if (RAA.enterDateIsValid(str)) {
		var parts = str.match(histEnterDateRe);
		var date = parts[1];
		var time = parts[2].substr(1);
		return date + "T" + (time.length == 5 ? time + ":00" : time) + "Z";
	} else {
		return histDateTime;
	}
}

//-->
