/*!
 * JTask Javascript Toolkit 2.0
 * Author: Arturo La Monaca <alamonaca@agortech.com>
 * Copyright(c) 2006-2010 - Agortech Software Design Srl
 * http://www.agortech.com
 */

var jtask = {
	author:	"(c) 2006-2010 Arturo La Monaca <artlam74@gmail.com>",
	version: '1.5.0',
	disclaimer: "JJT - JTask Javascript Toolkit, version " +  this.version + "\n" + this.author,
	jsUrl: 'org/jtask/jtask.js',
	contextUrl: '',
	include: function(pckg) {
		var packWithoutExt = (pckg.split(".").slice(0, -1)).join('.');
		var ext = pckg.replace(packWithoutExt, "");
		var packPath = packWithoutExt.replace(/\./g, '/') + ext;
		var url = this.contextUrl + packPath;
		if (ext.toLowerCase() == ".js" && !jt_scriptIncluded(url)) {
			jt_dhtmlLoadScript(url);
		}
		if (ext.toLowerCase() == ".css" && !jt_cssIncluded(url)) {
			jt_dhtmlLoadCss(url);
		}
	},
    namespace : function(){
        var a=arguments, o=null, i, j, d, rt;
        for (i=0; i<a.length; ++i) {
            d=a[i].split(".");
            rt = d[0];
            eval('if (typeof ' + rt + ' == "undefined"){' + rt + ' = {};} o = ' + rt + ';');
            for (j=1; j<d.length; ++j) {
                o[d[j]]=o[d[j]] || {};
                o=o[d[j]];
            }
        }
    }
}

// Browser check
ua = navigator.userAgent;
jtask.isIE = (navigator.appName == "Microsoft Internet Explorer");
jtask.isIE5 = jtask.isIE && (ua.indexOf('MSIE 5') != -1);
jtask.isIE5_0 = jtask.isIE && (ua.indexOf('MSIE 5.0') != -1);
jtask.isIE7 = jtask.isIE && (ua.indexOf('MSIE 7') != -1);
jtask.isGecko = ua.indexOf('Gecko') != -1;
jtask.isSafari = ua.indexOf('Safari') != -1;
jtask.isOpera = ua.indexOf('Opera') != -1;
jtask.isMac = ua.indexOf('Mac') != -1;
jtask.isNS7 = ua.indexOf('Netscape/7') != -1;
jtask.isNS71 = ua.indexOf('Netscape/7.1') != -1;

jt_getContextUrl();

/*------------------------------------------
*	FUNZIONI GLOBALI jt_*
* ------------------------------------------ */

/**
*	Trova la radice del path del package jtask
*/
function jt_getContextUrl() {
	var scripts = document.getElementsByTagName("script");
	for(var i = 0; i < scripts.length; i++) {
		var src = scripts[i].getAttribute("src");
		if (!src)
			src = scripts[i].getAttribute("oldSrc");		
		if(!src) { continue; }
		var m = src.indexOf(jtask.jsUrl);
		if (m != -1) {
			jtask.contextUrl = src.substring(0, m);
			break;
		}
	}
} 

/**
*	Verifica l'inclusione di uno script
*/
function jt_scriptIncluded(srcPath) {
	var scripts = document.getElementsByTagName("script");
	for(var i = 0; i < scripts.length; i++) {
		var src = scripts[i].getAttribute("src");
		if (!src)
			src = scripts[i].getAttribute("oldSrc");
		if(!src) { continue; }
		var m = src.indexOf(srcPath);
		if (m != -1) {
			return true;
		}
	}
	return false;
} 

/**
*	Verifica l'inclusione di un foglio di stile
*/
function jt_cssIncluded(srcPath) {
	var sheets = document.getElementsByTagName("link");
	for(var i = 0; i < sheets.length; i++) {
		var href = sheets[i].getAttribute("href");
		if(!href) { continue; }
		var m = href.indexOf(srcPath);
		if (m != -1) {
			return true;
		}
	}
	return false;
} 

function jt_dhtmlLoadScript(url) {
   var e = document.createElement("script");
   e.src = url;
   e.type="text/javascript";
   var bodyElement = document.getElementsByTagName("body")[0];
   if (bodyElement) { // document already loaded
   	document.getElementsByTagName("head")[0].appendChild(e); 
   } else {
   	document.write('<script src="', url, '" type="text/JavaScript"><\/script>');
   }
}

function jt_dhtmlLoadCss(url) {
   var e = document.createElement("link");
   e.setAttribute("type", "text/css");
   e.setAttribute("rel", "stylesheet");
   e.setAttribute("href", url);
   var bodyElement = document.getElementsByTagName("body")[0];
   if (bodyElement) { // document already loaded
   	document.getElementsByTagName("head")[0].appendChild(e); 
   } else {
   	document.write('<link rel="stylesheet" href="', url, '" type="text/css">');
   }
}

/**
*	Sospende l'elaborazione per ms millisecondi. Non usare per lunghi periodi, freeza la cpu!!!
*/
function jt_delay(ms) {
	var sleeping = true;
	var startingMSeconds = new Date().getTime();
	while(sleeping){
		var alarmMSeconds = new Date().getTime();
		if(alarmMSeconds - startingMSeconds > ms) { sleeping = false; }
	}      
}
   
/**
*	Restituisce una stringa univoca da utilizzare 
*	come parametro di Url anti-cache
*/
function jt_noCacheString() {
	date = new Date;
	noCacheStr = ""+date.getDate()+date.getMonth()+date.getYear();
	noCacheStr += ""+date.getHours()+date.getMinutes()+date.getSeconds();
	return noCacheStr;
}

/**
*	Restituisce un elemento avente un certo Id 
*	od un array di elementi se viene invocato con pił parametri:
*	$("elem") ---> restituisce document.getElementById("elem");
*	$("elem1","elem2") ---> restituisce un array con 
*		                    array[0] = document.getElementById("elem1")
*						    array[1] = document.getElementById("elem1")
*/
function $() {
  var elements = new Array();
  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);
    if (arguments.length == 1)
      return element;
    elements.push(element);
  }
  return elements;
}

function $N() {
  var elements = new Array();
  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementsByName(element);
    if (arguments.length == 1)
      return element;
    elements.push(element);
  }
  return elements;
}

function $$(idOrName) {
	var el = $(idOrName);
	if (!jt_defined(el)) {
		var n = $N(el);
		if(n && n.length)
			return n[0];
	}
	return el;
}
	
// Determine if an object is an array
function jt_isArray(o) {
	return (o!=null && typeof(o)=="object" && typeof(o.length)=="number" && (o.length==0 || jt_defined(o[0])));
};

// Determine if an object is an Object
function jt_isObject(o) {
	return (o!=null && typeof(o)=="object" && jt_defined(o.constructor) && o.constructor==Object && !jt_defined(o.nodeName));
};

// Determine if a reference is defined
function jt_defined(o) {
	return (o!=null && typeof(o)!="undefined");
}; 

/*------------------------------------------
*	DOM implementations
* ------------------------------------------ */
//if (!document.getElementsByClassName) {
	document.getElementsByClassName = function(oElm, strTagName, strClassName) {
	    if(arguments.length == 1) {
			strTagName = "*";
			strClassName = arguments[0];
			oElm = document;
		}	
		var arrElements = (strTagName == "*" && document.all) ? document.all : oElm.getElementsByTagName(strTagName);
	    var arrReturnElements = new Array();
	    strClassName = strClassName.replace(/\-/g, "\\-");
	    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	    var oElement;
	    for(var i=0; i<arrElements.length; i++){
	        oElement = arrElements[i];      
	        if(oRegExp.test(oElement.className)){
	            arrReturnElements.push(oElement);
	        }   
	    }
	    return (arrReturnElements)
	}
//}

// Get a parent tag with a given nodename
if (!document.getParentByTagName) {
	document.getParentByTagName = function(o,tagName) {
		if(o==null) { return null; }
		tagName = tagName.toUpperCase();
		while (o=o.parentNode) {
			if (o.nodeName && tagName==o.nodeName) {
				return o;
			}
		}
		return null;
	}
};

// Remove a node from its parent
document.removeNode = function(o) {
	if (o!=null && o.parentNode && o.parentNode.removeChild) {
		o.parentNode.removeChild(o);
		return true;
	}
	return false;
};

document.createElementWithName = function (type, name) {
   var element = null;
   // Try the IE way; this fails on standards-compliant browsers
   try {
      element = document.createElement('<'+type+' name="'+name+'">');
   } catch (e) {
   }
   if (!element || element.nodeName != type.toUpperCase()) {
      // Non-IE browser; use canonical method to create named element
      element = document.createElement(type);
      element.name = name;
   }
   return element;
};

function jt_httpPost(url, params) {    
    var form = document.createElement("form");     
    form.setAttribute("method", "POST");     
    form.setAttribute("action", url);      
    for(var key in params) {   
    	if (params.hasOwnProperty(key)) {
	    	var hiddenField = document.createElementWithName("input", key);         
	    	hiddenField.setAttribute("type", "hidden");               
	    	hiddenField.setAttribute("value", params[key]);          
	    	form.appendChild(hiddenField);     
    	}
    }      
    document.body.appendChild(form);    // Not entirely sure if this is necessary     
    form.submit();
}

/**
*	HTML Model Gecko emulation
*/
if( typeof HTMLElement != "undefined" && !HTMLElement.prototype.insertAdjacentElement ) {
	HTMLElement.prototype.insertAdjacentElement = function( where, parsedNode ) {
		switch ( where ) {	
			case 'beforeBegin':
				this.parentNode.insertBefore( parsedNode ,this )
				break;
			case 'afterBegin':
				this.insertBefore( parsedNode , this.firstChild );
				break;
			case 'beforeEnd':
				this.appendChild( parsedNode );
				break;
			case 'afterEnd':
				if ( this.nextSibling ) 
					this.parentNode.insertBefore( parsedNode , this.nextSibling );
				else this.parentNode.appendChild( parsedNode );
				break;
		}
	};
	
	HTMLElement.prototype.insertAdjacentHTML = function (sWhere, sHTML) {
		var df;	// : DocumentFragment
		var r = this.ownerDocument.createRange();

		switch (String(sWhere).toLowerCase()) {
			case "beforebegin":
				r.setStartBefore(this);
				df = r.createContextualFragment(sHTML);
				this.parentNode.insertBefore(df, this);
				break;

			case "afterbegin":
				r.selectNodeContents(this);
				r.collapse(true);
				df = r.createContextualFragment(sHTML);
				this.insertBefore(df, this.firstChild);
				break;

			case "beforeend":
				r.selectNodeContents(this);
				r.collapse(false);
				df = r.createContextualFragment(sHTML);
				this.appendChild(df);
				break;

			case "afterend":
				r.setStartAfter(this);
				df = r.createContextualFragment(sHTML);
				this.parentNode.insertBefore(df, this.nextSibling);
				break;
		}
	};

	HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML) {
	   var r = this.ownerDocument.createRange();
	   r.setStartBefore(this);
	   var df = r.createContextualFragment(sHTML);
	   this.parentNode.replaceChild(df, this);

	   return sHTML;
	});

	HTMLElement.prototype.__defineGetter__("outerHTML", function () {
		var attr, attrs = this.attributes;
		var str = "<" + this.tagName;
		for (var i = 0; i < attrs.length; i++) {
			attr = attrs[i];
			if (attr.specified)
				str += " " + attr.name + '="' + attr.value + '"';
		}
		if (!this.canHaveChildren)
			return str + ">";

		return str + ">" + this.innerHTML + "</" + this.tagName + ">";
	});
};

/************
* Object
************/

Object.extend = function(obj, source) {
  for (property in source) {
    obj[property] = source[property];
  }
}

/**
* Clona un oggetto anche in caso di autoreferenza !!
*/
Object.clone = function(obj) {
	function TempClass() {};
	TempClass.prototype = obj;
	return new TempClass();
}

Object.toArray = function(obj) {
  if (!obj) return [];
  if (obj.toArray) {
    return obj.toArray();
  } else {
    var results = [];
    for (var i = 0; i < obj.length; i++)
      results.push(obj[i]);
    return results;
  }
}

Object.debug = function(obj, hideFunctContent) {
	if (obj) {
		var debug = "Discovering... \n";
		for (var i in obj) {
			debug += i + " -> " 
			if (typeof(obj[i])=="function" && hideFunctContent)
				debug += "[function]\n";
			else
				debug += obj[i] +"\n";
		}
		return debug;
	} else {
		return ("Object is: " + obj);
	}
}		

/************
* Function
************/

Function.prototype.scopeToObject = function() {
  var __method = this, args = Object.toArray(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat(Object.toArray(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object, params) {
  var __method = this;
  return function(event) {
    return __method.apply(object, [(event || window.event), params]);
  }
}

/************
* Window
************/
if (!window.showModalDialog) {
	Object.extend(window,
		{ showModalDialog: 
			function(sURL,oArguments,sFeatures,fnCallback) {
				if (!sFeatures) sFeatures = "";
				sFeatures = sFeatures.trim();
				var featureList = sFeatures.split(";");
				sFeatures = ""; 
				var s = "";
				var bCenter = bNoCenter = false;
				var w=h=0;
				for (var i=0;i<featureList.length;i++) {
					var feature = featureList[i].split(":");
					var k = feature[0].toLowerCase();
					var v = feature[1];
					switch (k) {
						case "dialogheight": s+="height=" + v; h=v;break;
						case "dialogwidth": s+="width=" + v; w=v;break;
						case "dialogtop": s+="top=" + v; bNoCenter = true; break;
						case "dialogleft": s+="left=" + v; bNoCenter = true; break;
						case "resizable": s+="resizable=" + v; break;
						case "status": s+="status=" + v; break;
						case "center": bCenter = true; break;
						case "scroll": s+="scrollbars=" + v; break;
					}
					if (k!="center") s+=",";
				}
				if (bCenter && (!bNoCenter)) {
					if (w!=0) w = parseInt(w); else w=300;
					if (h!=0) h = parseInt(h); else h=300;
					if (w!="" || h!="") {
						s+="top=" + ((screen.availHeight-h)/2) + ",";
						s+="left=" + ((screen.availWidth-w)/2);
					}
				}
	
				var jtButton = document.createElement("INPUT")
				jtButton.setAttribute("type", "button");
				jtButton.setAttribute("id", "jt_Button");
				jtButton.style.display = "none";
				jtButton.onclick = function() {
					//fnCallback(this.value);
					fnCallback(this.returnObj);
				};
				document.getElementsByTagName("body")[0].appendChild(jtButton);
				
				var mWin = window.open(sURL,"","modal=1," + s);
				mWin.dialogArguments = oArguments;
				mWin.returnValue = null;
				
				if (fnCallback) {
					mWin.addEventListener("unload", 
						function() {
							var jtB = mWin.opener.document.getElementById("jt_Button");
							if (jtB && mWin.returnValue != null) {
								jtB.returnObj = mWin.returnValue;
								//jtB.value = mWin.returnValue;
								jtB.click();
							}
						}				
					,true);
				}
				/*
				resetModal = function(ev) {
					if (mWin && !mWin.closed) {
						//ev.stopPropagation();
						mWin.focus()
					}
				}
				window.addEventListener("focus",resetModal,true);
				*/
				return null;
			}
		});
}

