Enforce = new Object();
Enforce.path = '/library/javascript/enforce/';
Enforce.readyState = false;
Enforce.baseHref = null;
Enforce.libraries = ["ViewState", "DataGrid", "SortGrid", "FormBuilder", "Gallery", "Validator", "ContextHelp", "MessageBox", "ModalWindow", "Ajax"];

/* Skrocona wersja getElementById */
Enforce.Id = function(id, referer)
{
	if(!referer)
		return document.getElementById(id);
	else
		return referer.document.getElementById(id);
}

/* Funkcje pomocnicze */
Enforce.Submit = function(e)
{
	// jesli e nie jest zdarzeniem tylko elementem html
	if(e.tagName)
	{
		return Enforce.SubmitElement(e);
	}
	
	var e = e || window.event;
	
	// sprawdzenie ktory element zostal klikniety
	var sender = null;
	if(e.target) sender = e.target;
	else if (e.srcElement) sender = e.srcElement;
	if (sender.nodeType == 3) sender = sender.parentNode;
	
	// sprawdzenie typu zdarzenia
	if(e.type == "keydown")
	{
		var key = null;
		if (e.keyCode) key = e.keyCode;
		else if (e.which) key = e.which;
		
		// jesli nie ENTER to nic nie rob
		if(key != 13) return true;
	}
	
	// wyslanie formularza
	return Enforce.SubmitElement(sender);
}

Enforce.SubmitElement = function(btn)
{
	var form = btn;
	while(form.tagName.toLowerCase() != 'form' && form.parentNode)
	{
		form = form.parentNode;
	}
	if(form.tagName.toLowerCase() == 'form')
	{
		form.submit();
	}
	
	return false;
}

Enforce.Back = function()
{
	history.back(-1);
	return false;
}

Enforce.Redirect = function(url)
{
	location.href = url;
	return false;
}

// Inicjalizacja frameworka
Enforce.Init = function(params)
{
	if(params['base'])
		Enforce.baseHref = params['base'];
	
	if(params['libraries'])
		Enforce.libraries = params['libraries'];
	
	Enforce.LoadLibraries(params['path']);
}

Enforce.LoadLibraries = function(path)
{
	for(var i = 0; i < Enforce.libraries.length; i++)
	{
		var library  = Enforce.libraries[i];
		Enforce.Require(library, path)
	}
}

Enforce.Require = function(library, path)
{
	document.write('<script type="text/javascript" src="' + path + 'Enforce.' + library + '.js"></script>');
}



/* Zamiana encji na znaki */
Enforce.CharEntity = function(entity)
{
	var CHAR_ENTITIES={'nbsp':160,'iexcl':161,'cent':162,'pound':163,'curren':164,'yen':165,'brvbar':166,'sect':167,'uml':168,'copy':169,'ordf':170,'laquo':171,'not':172,'shy':173,'reg':174,'macr':175,'deg':176,'plusmn':177,'sup2':178,'sup3':179,'acute':180,'micro':181,'para':182,'middot':183,'cedil':184,'sup1':185,'ordm':186,'raquo':187,'frac14':188,'frac12':189,'frac34':190,'iquest':191,'agrave':192,'aacute':193,'acirc':194,'atilde':195,'auml':196,'aring':197,'aelig':198,'ccedil':199,'egrave':200,'eacute':201,'ecirc':202,'euml':203,'igrave':204,'iacute':205,'icirc':206,'iuml':207,'eth':208,'ntilde':209,'ograve':210,'oacute':211,'ocirc':212,'otilde':213,'ouml':214,'times':215,'oslash':216,'ugrave':217,'uacute':218,'ucirc':219,'uuml':220,'yacute':221,'thorn':222,'szlig':223,'agrave':224,'aacute':225,'acirc':226,'atilde':227,'auml':228,'aring':229,'aelig':230,'ccedil':231,'egrave':232,'eacute':233,'ecirc':234,'euml':235,'igrave':236,'iacute':237,'icirc':238,'iuml':239,'eth':240,'ntilde':241,'ograve':242,'oacute':243,'ocirc':244,'otilde':245,'ouml':246,'divide':247,'oslash':248,'ugrave':249,'uacute':250,'ucirc':251,'uuml':252,'yacute':253,'thorn':254,'yuml':255,'lt':38,'gt':62,'amp':38,'apos':39,'quot':34,'oelig':338,'oelig':339,'scaron':352,'scaron':353,'yuml':376,'circ':710,'tilde':732,'ensp':8194,'emsp':8195,'thinsp':8201,'zwnj':8204,'zwj':8205,'lrm':8206,'rlm':8207,'ndash':8211,'mdash':8212,'lsquo':8216,'rsquo':8217,'sbquo':8218,'ldquo':8220,'rdquo':8221,'bdquo':8222,'dagger':8224,'dagger':8225,'permil':8240,'lsaquo':8249,'rsaquo':8250,'euro':8364,'fnof':402,'alpha':913,'beta':914,'gamma':915,'delta':916,'epsilon':917,'zeta':918,'eta':919,'theta':920,'iota':921,'kappa':922,'lambda':923,'mu':924,'nu':925,'xi':926,'omicron':927,'pi':928,'rho':929,'sigma':931,'tau':932,'upsilon':933,'phi':934,'chi':935,'psi':936,'omega':937,'alpha':945,'beta':946,'gamma':947,'delta':948,'epsilon':949,'zeta':950,'eta':951,'theta':952,'iota':953,'kappa':954,'lambda':955,'mu':956,'nu':957,'xi':958,'omicron':959,'pi':960,'rho':961,'sigmaf':962,'sigma':963,'tau':964,'upsilon':965,'phi':966,'chi':967,'psi':968,'omega':969,'thetasym':977,'upsih':978,'piv':982,'bull':8226,'hellip':8230,'prime':8242,'prime':8243,'oline':8254,'frasl':8260,'weierp':8472,'image':8465,'real':8476,'trade':8482,'alefsym':8501,'larr':8592,'uarr':8593,'rarr':8594,'darr':8595,'harr':8596,'crarr':8629,'larr':8656,'uarr':8657,'rarr':8658,'darr':8659,'harr':8660,'forall':8704,'part':8706,'exist':8707,'empty':8709,'nabla':8711,'isin':8712,'notin':8713,'ni':8715,'prod':8719,'sum':8721,'minus':8722,'lowast':8727,'radic':8730,'prop':8733,'infin':8734,'ang':8736,'and':8743,'or':8744,'cap':8745,'cup':8746,'int':8747,'there4':8756,'sim':8764,'cong':8773,'asymp':8776,'ne':8800,'equiv':8801,'le':8804,'ge':8805,'sub':8834,'sup':8835,'nsub':8836,'sube':8838,'supe':8839,'oplus':8853,'otimes':8855,'perp':8869,'sdot':8901,'lceil':8968,'rceil':8969,'lfloor':8970,'rfloor':8971,'lang':9001,'rang':9002,'loz':9674,'spades':9824,'clubs':9827,'hearts':9829,'diams':9830};
	
	return String.fromCharCode( CHAR_ENTITIES[ entity.toLowerCase() ] );
}

Enforce.Screen = function()
{
	if( typeof( window.innerWidth ) == 'number' )
	{
		//Non-IE
		return [window.innerWidth, window.innerHeight];
	}
	else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
	{
		//IE 6+ in 'standards compliant mode'
		return [document.documentElement.clientWidth, document.documentElement.clientHeight];
	}
	else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
	{
		//IE 4 compatible
		return [document.body.clientWidth, document.body.clientHeight];
	}
}

Enforce.Scroll = function()
{
	if( typeof( window.pageYOffset ) == 'number' )
	{
		//Netscape compliant
		return {left : window.pageXOffset, top : window.pageYOffset};
	}
	else if( document.documentElement && ( typeof(document.documentElement.scrollLeft) != 'undefined' || typeof(document.documentElement.scrollTop) != 'undefined' ) )
	{
		//IE6 standards compliant mode
		return {left : document.documentElement.scrollLeft, top : document.documentElement.scrollTop};
	}
	else if( document.body && ( typeof(document.body.scrollLeft) != 'undefined' || typeof(document.body.scrollTop) != 'undefined' ) )
	{
		//DOM compliant
		return {left : document.body.scrollLeft, top : document.body.scrollTop};
	}
}

Enforce.MousePosition = function(e)
{
	var posx = 0;
	var posy = 0;
	
	if (e.pageX || e.pageY)
	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
	}
	
	return {left : posx, top : posy};
}

Enforce.ElementPosition = function(element)
{
	var posx = 0;
	var posy = 0;
	
	do
	{
		posx += element.offsetLeft;
		posy += element.offsetTop;
		element = element.offsetParent;
	}
	while(element.offsetParent)
	
	return {left : posx, top : posy};
}


/* Obsluga zdarzen */
Enforce.Events = new Object();

Enforce.Events.add = function(element, eventName, callback)
{
	if(typeof(element) == "string")
	{
		element = Enforce.Id(element);
	}
	
	if(element.addEventListener)
		element.addEventListener(eventName, callback, false);
	else if(element.attachEvent)
		element.attachEvent("on" + eventName, callback);
}

Enforce.Events.remove = function(element, eventName, callback)
{
	if(typeof(element) == "string")
	{
		element = Enforce.Id(element);
	}
	
	if(element.removeEventListener)
		element.removeEventListener(eventName, callback, false);
	else if(element.detachEvent)
		element.detachEvent("on" + eventName, callback);
}


/* Ustawienie statusu doczytania dokumentu */
Enforce.Events.ReadyStateChange = function()
{
	Enforce.readyState = true;
}

Enforce.Events.add(window, "load", Enforce.Events.ReadyStateChange);


/* Zarzadzanie ciasteczkami */
Enforce.Cookies = new Object();

/**
 * Ustawia wartosc ciasteczka
 * 
 * name       Nazwa ciasteczka
 * value      Wartosc
 * [expires]  Data wygasniecia (default: zakonczenie biezacej sesji)
 * [path]     Sciezka w ktorej ciasteczko jest dostepne
 * [domain]   Domena w ktorej ciasteczko jest dostepne
 * [secure]   Wartosc logiczna wskazujaca czy ciasteczko wymaga bezpiecznego polaczenia
 */
Enforce.Cookies.set = function(name, value, days, path, domain, secure)
{
	if(days)
	{
		var expires = new Date();
		var theDay = expires.getDate();
		theDay = theDay + days;
		expires.setDate(theDay);
	}
	else
		var expires = null;
	
    document.cookie = name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

/**
 * Zwraca string z wartoscia ciasteczka lub null gdy ciasteczko nie istnieje
 * 
 * name  Nazwa ciasteczka
 */
Enforce.Cookies.get = function(name)
{
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1)
    {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    }
    else
    {
        begin += 2;
    }
    var end = document.cookie.indexOf(";", begin);
    if (end == -1)
    {
        end = dc.length;
    }
    return unescape(dc.substring(begin + prefix.length, end));
}

/**
 * Usuwa ciasteczko
 *
 * name       Nazwa ciastecza
 * [path]     Sciezka w ktorej ciasteczko jest dostepne (musi byc taka sama jak podczas zakladania ciasteczka)
 * [domain]   Domena w ktorej ciasteczko jest dostepne (musi byc taka sama jak podczas zakladania ciasteczka)
 */
Enforce.Cookies.remove = function(name, path, domain)
{
    if (Enforce.Cookies.get(name))
    {
        document.cookie = name + "=" + 
            ((path) ? "; path=" + path : "") +
            ((domain) ? "; domain=" + domain : "") +
            "; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
}


/* Zarzadzanie okienkami modalnymi */
Enforce.ModalWindow = null;
Enforce.ShowWindow = function(url, resizable)
{
	resizable = (resizable) ? 'yes' : 'no';
	
	var wndWidth = 760;
	var wndHeight = 520;
	
	var scrWidth = 640;
	var scrHeight = 450;
	
	if(window.screen)
	{
		scrWidth = screen.availWidth;
		scrHeight = screen.availHeight;
	}
	
	var wndParams =  "dependent=yes,"
				+"left=" + (scrWidth - wndWidth)/2 + ","
				+"top=" + (scrHeight - wndHeight)/2 + ","
				+"screenX=" + (scrWidth - wndWidth)/2 + ","
				+"screenY=" + (scrHeight - wndHeight)/2 + ","
				+"width=" + wndWidth + ","
				+"height=" + wndHeight + ","
				+"scrollbars=yes,"
				+"resizable=" + resizable;
	
	Enforce.ModalWindow = window.open(url, "ModalChild", wndParams)
	Enforce.ModalWindow.focus();
	
	return Enforce.ModalWindow;
}

Enforce.ShowImage = function(src)
{
	var popup = Enforce.ShowWindow('');
	
	popup.document.clear();
	popup.document.open();
	Enforce.Events.add(popup, "load", function () { Enforce.ShowImage_Resize(popup); });
	
	var html = ''
	+ '<html>'
	+ '<body style="margin:0px;">'
	+ '<img src="' + src + '" alt="" style="cursor:pointer;" onclick="window.close()" />'
	+ '</body>'
	+ '</html>';
	
	popup.document.write(html);
	popup.document.close();
	
	return false;
}

Enforce.ShowImage_Resize = function(popup)
{
	// pobranie rozmiarow ekranu
	if(window.screen)
	{
		var sWidth = screen.availWidth;
		var sHeight = screen.availHeight;
	}
	else
	{
		var sWidth = 640;
		var sHeight = 450;
	}
	
	// pobranie rozmiarow okna
	if(popup.innerHeight)
	{
		var wWidth = popup.innerWidth;
		var wHeight = popup.innerHeight;
	}
	else
	{
		var wWidth = popup.document.body.clientWidth;
		var wHeight = popup.document.body.clientHeight;
	}
	
	// pobranie rozmiarow zdjecia
	var iWidth = popup.document.images[0].width;
	var iHeight = popup.document.images[0].height;
	
	// jesli rozmiary wieksze od rozmiarow ekranu to zmniejszyc
	var factor = 0.85;
	if(iWidth > parseInt(sWidth * factor)) iWidth = parseInt(sWidth * factor);
	if(iHeight > parseInt(sHeight * factor)) iHeight = parseInt(sHeight * factor);
	
	// wyznaczenie roznicy pomiedzy rozmiarem zdjecia i rozmiarem okna
	var iWidth = iWidth - wWidth;
	var iHeight = iHeight - wHeight;
	
	// wyznaczenie nowego polozenia okna
	var wLeft = (sWidth - (iWidth + wWidth))/2;
	var wTop = (sHeight - (iHeight + wHeight))/2;
	
	// zmiana rozmiarow i przesuniecie okna
	popup.moveTo(wLeft, wTop);
	popup.resizeBy(iWidth, iHeight);
	popup.focus();
}

// FCKEditor
Enforce.FCKEditorListener = new Object();
Enforce.FCKEditorListener.Add = function(instanceName, callback)
{
	Enforce.FCKEditorListener[instanceName] = callback;
}
function FCKeditor_OnComplete(editorInstance)
{
	if(Enforce.FCKEditorListener[editorInstance.Name])
	{
		Enforce.FCKEditorListener[editorInstance.Name](editorInstance);
	}
}

/* wywolanie kalendarza */
Enforce.showCalendar = function(obj, field, btn)
{
    Calendar.setup({
        inputField		:	field,
        ifFormat		:	"%Y-%m-%d",
        button			:	btn,
        singleClick		:	true,
		align			:	"Bl"
    });
	obj.onclick();
	
	return false;
}

Enforce.clearCalendar = function(e, obj)
{
	var key = null;
	if (!e) var e = window.event;
	
	if (e.keyCode) key = e.keyCode;
	else if (e.which) key = e.which;
	
	// END, HOME, Strzalki : 35,36,37,38,39,40
	if(key == 35 || key == 36 || key == 37 || key == 38 || key == 39 || key == 40)
	{
		return true;
	}
	// Klawisze DEL i BACKSPACE : 46,8
	if(key == 46 || key == 8)
	{
		obj.value = '';
	}
	
	return false;
}
