

var $ifw = new $IFW();

function $ifw_nop() {}

function $ifw_captureEvent(evtPar) {
 var evt = window.event ? window.event : evtPar;
 $ifw._captureEvent(evt);
}
function $ifw_windowFocus(evtPar) {
 var evt = window.event ? window.event : evtPar;
 $ifw._windowFocus(evt);
}
function $ifw_focus(evtPar) {
 var evt = window.event ? window.event : evtPar;
 $ifw._focus(evt);
}
function $ifw_blur(evtPar) {
 var evt = window.event ? window.event : evtPar;
 $ifw._blur(evt);
}
function $ifw_validateIfChanged(evtPar) {
 var evt = window.event ? window.event : evtPar;
 $ifw._validateIfChanged(evt);
}
function $ifw_validateOnClick(evtPar) {
 var evt = window.event ? window.event : evtPar;
 $ifw._webKitClicked(evt);  $ifw._validateIfChanged(evt);
 $ifw._webKitOnClick(evt);  return $ifw.cancelBubble(evt);
}

function $ifw_tinyMCEEvent(a, b, c) {
 $ifw._tinyMCEEvent(a, b, c);
}
function $ifw_tinyMCEChange(a, b, c) {
 $ifw._tinyMCEChange(a, b, c);
}
function $ifw_tinyMCEInit(a, b, c) {
 $ifw._tinyMCEInit(a, b, c);
}

function $IFW() {

 var ivLoading = true;
 var ivDefaultFocusedField = null;
 
 var ivBlurredField = null;
 var ivFocusedField = null;
 var ivOldValue = null;
 var ivForceValidation = null;
  var ivFormsStack = new Array();
 
  var ivAjaxs = 0;
  var ivAsyncAjaxWaits = 0;
  var ivWaitingQueueId = 0;

 var ivMessages = new Messages();

 var ivSubmitPending = null;
 
 var ivNotifyFocusTO = null;
 
 var ivOldPopup = null;  
 var ivRefreshSeconds = null;
 var ivRefreshTimer = null;
 var ivRefreshInfo = null;
 
 var ivNotifyResizeTO = null; 
 var ivNotifyDelayedChangeTO = setTimeout(_notifyDelayedChange, 700);
 var ivNotifyDelayedChangeTS = null;

 var ivPendingStrokeProcessorTO = null;
 var ivPendingStrokeProcessor = null;
 
 function _ltrace(msg) {
 ivMessages.trace(msg);
 }
 
 function _notifyResize() {
 if (ivAjaxs > 0) {
  ivNotifyResizeTO = setTimeout(_notifyResize, 200); 
 return;
 }
 _ajaxRefresh(true);
 ivNotifyResizeTO = null;
 }
 
 window.onresize = function() {
 ivStyles.apply();
 if (ivNotifyResizeTO)
 clearTimeout(ivNotifyResizeTO);
 ivNotifyResizeTO = setTimeout(_notifyResize, 10); 
 }
 
 window.onload = function() {
 $ifw.pageLoaded();
 window.onload = null;
 if (ivNotifyResizeTO)
 clearTimeout(ivNotifyResizeTO);
 ivNotifyResizeTO = setTimeout(_notifyResize, 10); 
 }
 
 window.onunload = function() {
  ivStyles.clearCache();
  _doPurge();
 window.onunload = null; 
 }

 
 this.cancelBubble = _cancelBubble;
 this.getPageBounds = _getPageBounds;
 
  this.hasClass = _hasClass;
 this.addClass = _addClass;
 this.removeClass = _removeClass;
 
 this.contextPath = function() {
 return '/ifw2.test02';
 }
 
 this.getFocusedField = function() {
 return ivFocusedField;
 }
 this.getBlurredField = function() {
 return ivBlurredField;
 }
 this.focusOnPrevField = function() {
 if (ivBlurredField && !ivBlurredField.disabled) {
  try {
 ivBlurredField.focus();  }
 catch (e) {
 }
 }
 }
 this.centerOnScreen = _centerOnScreen;
 this.setLocationRelativeTo = _setLocationRelativeTo;
 this.setLocationRelativeToPoint = _setLocationRelativeToPoint;
 this.setAbsolutePosition = _setAbsolutePosition;
 this.getAbsoluteBounds = _getAbsoluteBounds;
 this.getStyle = _getStyle;
 this.ajaxRefresh = _ajaxRefresh;
 this.trace = _trace;
 this.ltrace = _ltrace;
 this.wrap = _wrap;
 this.forceValidation = function() {
 ivForceValidation = new Date();
 }
 this.draggable = function(draggedId, draggableId) {
 return new Draggable(draggedId, draggableId);
 };
 this.reflow = function() {
 document.body.style.display = 'none';
 document.body.style.display = 'block'; 
 }
 
 this.togglePopup = _togglePopup;
 this.refreshPopup = _refreshPopup;

 this.registerKeyboardAction = 
 function(form, subFormName, target, enabled, keyCode, shiftKey, ctrlKey, action, actionParam) {
 return new KeyboardHandler(form, subFormName, target, enabled, keyCode, shiftKey, ctrlKey, 
 action, actionParam);
 }
 this.registerLocalKeyboardAction = 
 function(form, subFormName, target, enabled, keyCode, shiftKey, ctrlKey, csScript) {
 return new KeyboardHandler(form, subFormName, target, enabled, keyCode, shiftKey, ctrlKey, 
 null, null, csScript);
 }
 
  this.registerMouseAction = 
 function(form, subFormName, target, enabled, type, shiftKey, ctrlKey, action, actionParam) {
 return new MouseHandler(form, subFormName, target, enabled, type, shiftKey, ctrlKey, 
 action, actionParam);
 }
 this.registerLocalMouseAction = 
 function(form, subFormName, target, enabled, type, shiftKey, ctrlKey, csScript) {
 return new MouseHandler(form, subFormName, target, enabled, type, shiftKey, ctrlKey, 
 null, null, csScript);
 }

 this.registerStyles = function(sheet) {
 ivStyles.register(sheet);
 };
 
 this.isLoading = function() {
 return ivLoading;
 }
 this.pageLoaded = function() {
 if (ivLoading) {
 ivLoading = false;
  document.getElementsByTagName("body")[0].onhelp = function(e) { return false; };
 ivStyles.apply();
 if (ivDefaultFocusedField != null) {
 function _restoreFocus() {
 _ltrace("Default focus on " + ivDefaultFocusedField.name);
 try {
 _wrap(ivDefaultFocusedField).focus();
 }
 catch (e) {
 }
 ivDefaultFocusedField = null;
 }
 setTimeout(_restoreFocus, 0);
 }
 ivAfterUpdateCallbacks.apply();
 if (_browser.Gecko) {  function _fix() {
 ivStyles.apply();
 ivAfterUpdateCallbacks.apply();
 }
 setTimeout(_fix, 0);
 }
 }
 else {
 _ltrace("pageLoaded event already processed.");
 }
 }

 this.setRefreshByCopy = function(el, refreshByCopy) {
 el.$ifw_refreshByCopy = refreshByCopy;
 }
 
 this.setDefaultFocusedField = function(form, subFormName, defaultFocusedField, requiresFocus) {
 if (defaultFocusedField) {
 if (!form.$ifw_defaultFocusedFieldIdMap) {
 form.$ifw_defaultFocusedFieldIdMap = new Object();
 }
 var defaultFocusedFieldId = _wrap(defaultFocusedField).field.id;
  form.$ifw_defaultFocusedFieldIdMap[subFormName] = defaultFocusedFieldId;
 form.$ifw_defaultFocusedFieldId = defaultFocusedFieldId;
 if ($ifw.isLoading() && ivDefaultFocusedField == null) {
 ivDefaultFocusedField = defaultFocusedField;
 }
 if (requiresFocus) {
 _pushForm(form.name, subFormName, null);  }
 }
 }

 this.registerForm = function(_form) {
 _form.$ifw$touched = true;
 _form.onsubmit = function(evtPar) {
 return false;
 }
   _form.submit = function(action, actionParam, subFormName) {
 if (ivSubmitPending != null) {
   return false;
 }
 if (!action)
 action = "";
 var form = this;
 form.$ifw$action.value = action;
 form.$ifw$actionParam.value = actionParam ? actionParam : "";
 _doIt(form, subFormName);
 }
 function _doIt(pform, subFormName) {
 ivSubmitPending = new _Pending();
 function _Pending() {
 this.form = pform;  this.subFormName = subFormName;
 this.done = function() {
 this.form = null;
 this.subFormName = null;
 ivSubmitPending = null;
 }
 }
 function _callback(request) {
 if (request.readyState == 4) {
 if (ivSubmitPending != null) {
 ivSubmitPending.done();
 }
 }
 }
 _ajaxSubmit(pform, subFormName, true, _callback);
 }
 _form = null;
 };

  this.mpSubmitEnd = function(iframe) {
 if (ivSubmitPending != null)
 ivSubmitPending.done();
 };
 this.mpSubmitError = function(iframe, msg) {
 alert(msg);
 window.location = window.location;
 };
 this.registerMPForm = function(_form) {  _form.$ifw$touched = true;
 _form.onsubmit= function (evtPar) {
 return true; 
 };
  var superSubmit = _form.submit;
 _form.submit = function(action, actionParam) {
 if (ivSubmitPending != null) {
  return false;
 }
 if (!action)
 action = "";
 var form = this;
 form.$ifw$action.value = action;
 form.$ifw$actionParam.value = actionParam ? actionParam : "";
 form.$ifw_superSubmit = superSubmit; 
 form.$ifw_superSubmit(); 
 form.$ifw_superSubmit = null;   _mpSubmitStarted(form);
 };
 _form = null;
 };
 
 function _webKitClicked(evt) {
 if (!_browser.WebKit)
 return;
 ivForceValidation = "webKit";
 }
 function _webKitOnClick(evt) {
 if (!_browser.WebKit)
 return;
 var field = _isDefined(evt.srcElement) ? evt.srcElement : evt.currentTarget;
 if (field.readOnly) 
 return;
 if (ivFocusedField != field) {
  field.focus();
 }
 }

 _register = function(comp, subFormName) {
 comp.$ifw$touched = true;
 comp.$ifw$subFormName = subFormName;  comp.onfocus = $ifw_focus;
 comp.onblur = $ifw_blur;
 };

 this.registerText = function(comp, subFormName, validateOnChange, cursorAtEnd) {
 _register(comp, subFormName);
 comp.onblur = new Delegator(comp.onblur, $ifw_validateIfChanged);
 comp.$ifw$delayedValidateOnChange = validateOnChange ? true : null;
 comp.$ifw$cursorAtEnd = cursorAtEnd ? true : null;
 };
 
 this.registerTextArea = function(comp, subFormName, validateOnChange) {
 _register(comp, subFormName);
 comp.onblur = new Delegator(comp.onblur, $ifw_validateIfChanged);
 comp.$ifw$delayedValidateOnChange = validateOnChange ? true : null;
 };
 
 this.registerFile = function(comp, subFormName) {
 _register(comp, subFormName);
 };

 this.registerCheckbox = function(comp, subFormName) {
 _register(comp, subFormName);
 comp.onclick = $ifw_validateOnClick;
 }
 
 this.registerRadio = function(comp, subFormName) {
 if (!comp.length) {
 _register(comp, subFormName);
 comp.onclick = $ifw_validateOnClick;
 }
 else
 for (var i = 0; i < comp.length; i++) {
 _register(comp[i], subFormName);
 comp[i].onclick = $ifw_validateOnClick;
 }
 };

 this.registerSelect = function(comp, subFormName, validateOnChange) {
 _register(comp, subFormName);
 comp.onblur = new Delegator(comp.onblur, $ifw_validateIfChanged);
 if (validateOnChange) {
 comp.onchange = new Delegator(comp.onchange, $ifw_validateIfChanged);
 if (_browser.WebKit )
 comp.$ifw$delayedValidateOnChange = true;
 }
 };

 this.registerAction = function(comp, subFormName, action, actionParam) {
 _register(comp, subFormName);
 comp.onclick = function(evtPar) {
 var evt = window.event ? window.event : evtPar;
 _webKitOnClick(evt);
 var field = evt.srcElement ? evt.srcElement : evt.currentTarget;
 field.form.submit(action, actionParam ? actionParam : "", subFormName); 
 return _cancelBubble(evt);
 }
 comp = null;
 };

 this.registerLocalAction = function(comp, subFormName, action, csScript) {
 _register(comp, subFormName);
 comp.onclick = function(evtPar) {
 var evt = window.event ? window.event : evtPar;
 _webKitOnClick(evt);
 var field = evt.srcElement ? evt.srcElement : evt.currentTarget;
 field.form.$ifw$action.value = action;
 _script(csScript, null, field.form, field, null, subFormName);
 return _cancelBubble(evt);
 }
 function _script(script, stroke, form, target, field, subFormName) {
 eval(script);
 }
 comp = null;
 };

 this.registerActionRef = function(comp, subFormName, action, actionParam) {
 _register(comp, subFormName);
 comp.onclick = function(evtPar) {
 var evt = window.event ? window.event : evtPar;
 _webKitOnClick(evt);
  var comp = evt.currentTarget ? evt.currentTarget : this;
 comp.form.submit(action, actionParam ? actionParam : "", subFormName);
 return _cancelBubble(evt);
 }
 comp = null;
 };
 
 this.registerLocalActionRef = function(comp, subFormName, action, csScript) {
 _register(comp, subFormName);
 comp.onclick = function(evtPar) {
 var evt = window.event ? window.event : evtPar;
 _webKitOnClick(evt);
  var comp = evt.currentTarget ? evt.currentTarget : this;
 _script(csScript, null, comp.form, comp, null, subFormName);
 return _cancelBubble(evt);
 }
 function _script(script, stroke, form, target, field, subFormName) {
 eval(script);
 }
 comp = null;
 };

 this.setRefreshTimer = function(seconds, form, subFormName, field, action, actionParam) {
 function RefreshInfo(form, subFormName, field, action, actionParam) {
 this.ivForm = form;
 this.ivSubFormName = subFormName;
 this.ivField = (field && field.form) ? field : null;
 this.ivAction = action;
 this.ivActionParam = actionParam;
 }
 function _refreshTimeout() {
 ivRefreshTimer = null;
     if (ivRefreshInfo == null)
 _ajaxRefresh(true);
 else {
 if (ivRefreshInfo.ivField) 
 _ajaxFieldEvent(_wrap(ivRefreshInfo.ivField).field, true, "fieldAction", 
 null, ivRefreshInfo.ivAction, ivRefreshInfo.ivActionParam);
 else
 ivRefreshInfo.ivForm.submit(ivRefreshInfo.ivAction, 
 ivRefreshInfo.ivActionParam, ivRefreshInfo.ivSubFormName);
 }
 }
   if (!ivRefreshTimer || 
 (seconds < ivRefreshSeconds && (!ivRefreshInfo || form)) ||
 (!ivRefreshInfo && form)) {
 ivRefreshSeconds = seconds;
 if (ivRefreshTimer) {
 clearTimeout(ivRefreshTimer);
 ivRefreshTimer = null;
 }
 ivRefreshTimer = setTimeout(_refreshTimeout, 1000 * ivRefreshSeconds);
 if (form)
 ivRefreshInfo = new RefreshInfo(form, subFormName, field, action, actionParam);
 else
 ivRefreshInfo = null; 
 }
 }
 
 this.scrollBar = function(parent, scroller) {
 var scrollBar = new ScrollBar(parent, scroller);
 return scrollBar;
 }
 
 
 this.registerUpdateCallback = function(callback) {
 ivAfterUpdateCallbacks.register(callback);
 }
 
 this.fieldAction = function(field, action, param) {
 _ajaxFieldEvent(_wrap(field).field, true, "fieldAction", 
 null, action, param);
 }
 
 
  this._captureEvent = _captureEvent;
 this._windowFocus = _windowFocus;
 this._focus = _focus;
 this._blur = _blur;
 this._validateIfChanged = _validateIfChanged;
 this._webKitClicked = _webKitClicked;
 this._webKitOnClick = _webKitOnClick;
 this._tinyMCEEvent = _tinyMCEEvent;
 this._tinyMCEChange = _tinyMCEChange;
 this._tinyMCEInit = _tinyMCEInit;
 
  
 document.onkeydown = $ifw_captureEvent;
 document.onkeypress = $ifw_captureEvent;
 document.onkeyup = $ifw_captureEvent;
 document.onmousedown = $ifw_captureEvent;
 document.onmouseup = $ifw_captureEvent;
 document.onmousewheel = $ifw_captureEvent;
 document.onclick = $ifw_captureEvent;
 document.onbeforepaste = $ifw_captureEvent;
 
 function _captureEvent(e) {
 var evt = (e) ? e : window.event; 
  if (evt.keyCode && evt.keyCode == 27) { 
 return _cancelBubble(evt);
 }
 if (ivNotifyFocusTO) {
  clearTimeout(ivNotifyFocusTO);
 ivNotifyFocusTO = setTimeout(_notifyFocus, 750);
 }
 if (ivNotifyDelayedChangeTO) {
 clearTimeout(ivNotifyDelayedChangeTO);
 ivNotifyDelayedChangeTO = setTimeout(_notifyDelayedChange, 700);
 }
 if (ivSubmitPending != null) {
 return _cancelBubble(evt);
 }
 if (ivPendingStrokeProcessor != null) {
 if (evt.type != "keydown" && evt.type != "keyup" && evt.type != "keypress") { 
 ivPendingStrokeProcessor.process();
 }
 }
 }

 window.onfocus = $ifw_windowFocus;

 function _pushForm(formName, subFormName, fieldId) {
  for (var i = ivFormsStack.length - 1; i >= 0; i--) {
 if (ivFormsStack[i].formName == formName && ivFormsStack[i].subFormName == subFormName)
 ivFormsStack.splice(i, 1);
 }
 var obj = new Object();
 obj.formName = formName;
 obj.subFormName = subFormName;
 obj.fieldId = fieldId;
 ivFormsStack.push(obj);
 if (ivFormsStack.length > 20)
 ivFormsStack.shift();
 }

 
 function _windowFocus(e) {
 if (ivOldPopup)  return; 
 if (ivFocusedField && !ivFocusedField.disabled) {
  try {
 ivFocusedField.focus();  }
 catch (e) {
 }
 }
 else if (ivBlurredField && !ivBlurredField.disabled) {
  try {
 ivBlurredField.focus();  }
 catch (e) {
 }
 }
 };
 
 function _trace(msg, async) {
 async = (async != false);
 var url = window.location.pathname + window.location.search;
 var data = "&$ifw$ajax=" + (async ? "async" : "sync");
 data += "&$ifw$trace=" + escape(msg);
 _ajax(url, async, data);
 }
 
 function _focus(evt) {
 if (ivNotifyFocusTO) 
 clearTimeout(ivNotifyFocusTO);
 ivNotifyFocusTO = setTimeout(_notifyFocus, 500);
 _togglePopup();
     var field = _isDefined(evt.srcElement) ? evt.srcElement : evt.currentTarget;
 if (field.readOnly) 
 field = null;
 ivFocusedField = field;
 if (field) { 
 ivOldValue = _getValueAsUrlParameter(field);
 if (field.$ifw$cursorAtEnd && ivBlurredField != field && 
 field.value && field.value.length > 0) {
 if (field.createTextRange) {  var range = field.createTextRange();
 range.move('character', field.value.length);
 range.select();
  }
 else if (field.setSelectionRange) {  var len = field.value.length;
 field.setSelectionRange(len, len);
  }
 }
 var wfield = _wrap(field);
 wfield.addClass("focused");
 _pushForm(wfield.field.form.name, wfield.field.$ifw$subFormName, wfield.field.id);
 }
 }
 
 function _blur(evt) {
 var field = _isDefined(evt.srcElement) ? evt.srcElement : evt.currentTarget;
 ivBlurredField = field;
 ivFocusedField = null;
 _wrap(field).removeClass("focused");
 }

 function _notifyFocus() {
 if (ivAjaxs > 0) {
  ivNotifyFocusTO = setTimeout(_notifyFocus, 750);
 return;
 }
 ivNotifyFocusTO = null;
 var focused = ivFocusedField ? _wrap(ivFocusedField) : null;
   var formName = (focused ? 
 (focused.field.form ? focused.field.form.name : null) : 
 null);
 var name = focused ? focused.field.name : null;
 
 if (formName && name) {
  _ajaxFieldEvent(focused.field, true, "focusChanged");
 }
 }
 
 function _notifyDelayedChange() {
 if (ivAjaxs > 0) {
  ivNotifyDelayedChangeTO = setTimeout(_notifyDelayedChange, 700);
 return;
 }
 var focused = ivFocusedField ? _wrap(ivFocusedField) : null;
 var field = focused ? focused.field : null;
 if (field && !field.readOnly && field.$ifw$delayedValidateOnChange) {
  ivNotifyDelayedChangeTS = (new Date()).getTime();
 field.$ifw$notifyDelayedChangeTS = ivNotifyDelayedChangeTS;
 _validateIfChangedImpl(field);
 }
 ivNotifyDelayedChangeTO = setTimeout(_notifyDelayedChange, 700);
 }

 
 function _validateIfChanged(evt) {
 var field = _isDefined(evt.srcElement) ? evt.srcElement : evt.currentTarget;
 _validateIfChangedImpl(field);
 }
 
 function _validateIfChangedImpl(field) {
 if (field.readOnly) 
 return;
 var newValue = _getValueAsUrlParameter(field);
 if (ivForceValidation || ivOldValue != newValue) {
 ivForceValidation = null;
 ivOldValue = newValue;
  if (ivSubmitPending != null && ivSubmitPending.form == field.form &&
 (ivSubmitPending.subFormName == null || ivSubmitPending.subFormName == field.$ifw$subFormName)) {
 _ltrace("Submit is pending on " + field.form.name + " " + field.$ifw$subFormName);
 return;
 }
 _ajaxFieldEvent(field, true, "changed");
 }
 }

 function _wrap(field) {
 return new FieldWrapper(field);
 }
 
 
  
 function _mpSubmitStarted(pform) {
 ivMessages.showUploadMessage(true); 
 ivSubmitPending = new _Pending();
 function _Pending() {
 this.timeOutId = setTimeout(_mpSubmitWait, 500); 
 this.form = pform;  this.subFormName = null;
 this.done = function() {
 ivMessages.showUploadMessage(false); 
 clearTimeout(ivSubmitPending.timeOutId);
 this.form = null;
 this.subFormName = null;
 ivSubmitPending = null;
 _ajaxRefresh(true);
 }
 }
 pform = null;
 }

  function _mpSubmitWait() {
 var async = false;
 var url = window.location.pathname + window.location.search;
 var data = "&$ifw$ajax=" + (async ? "async" : "sync");
 data += "&$ifw$uploadStatus=check";
 _ajax(url, async, data, _readyStateChange);
 
 function _readyStateChange(request) {
 if (request.readyState == 4) {
 if (request.status == 200) {
 var contentType = request.getResponseHeader("Content-Type");
 var responseText = request.responseText;
 if (contentType.indexOf("text/javascript") >= 0) {
 var res = _eval(responseText);
 if (res != null) {
 var percentage = (100 * res[0].bytesRead) / res[0].contentLength;
 ivMessages.showUploadMessage(true, percentage); 
 if (ivSubmitPending != null)
 ivSubmitPending.timeOutId = setTimeout(_mpSubmitWait, 1000); 
 }
 else {
 if (ivSubmitPending != null)
 ivSubmitPending.done();
 }
 }
 else {
 alert("ERROR(3): " + contentType);
 window.location = window.location; 
 }
 }
 else {
 alert("ERROR(4): " + request.status + " - " + request.statusText);
 window.location = window.location;
 }
 }
 }
 }

 { 
  var url = window.location.protocol + "//" + window.location.host + window.location.pathname + "?&$ifw$internalStatus=check";
 document.write("<iframe id='IFW_UPLOADFRAME' name='$IFW$UPLOADFRAME' src='" + url + "'></iframe>");
 }

 var _doesNotAddBorder;
var _doesAddBorderForTableAndCells;
{
 var body = document.body, 
 container = document.createElement("div"), 
 innerDiv, checkDiv, td,
 html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
 with (container.style) {
 position="absolute"; top=0; left=0; margin=0; border=0; width="1px"; height="1px"; visibility="hidden"; 
 }
 container.innerHTML = html;
 body.insertBefore(container, body.firstChild);
 innerDiv = container.firstChild;
 checkDiv = innerDiv.firstChild;
 td = innerDiv.nextSibling.firstChild.firstChild;
 _doesNotAddBorder = (checkDiv.offsetTop !== 5);
 _doesAddBorderForTableAndCells = (td.offsetTop === 5);
 body.removeChild(container);
}

var _browser = {
 XE: !!(window.attachEvent && navigator.userAgent.indexOf('Opera') === -1) && 
 window.addEventListener != undefined
 ,
 IE: window.addEventListener == undefined && !!(window.attachEvent && navigator.userAgent.indexOf('Opera') === -1)
 ,
 IE8: window.addEventListener == undefined && !!(window.attachEvent && navigator.userAgent.indexOf('Opera') === -1) && 
 document.querySelector != undefined
 ,
 Opera: navigator.userAgent.indexOf('Opera') > -1
 ,
 WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1
 ,
 Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') === -1
}

function _isDefined(obj) {
 return obj != undefined;
}

function _eval(script) {
 return eval(script);
}


function _hasClass(element, clazz) {
 return (element.className.indexOf(clazz) >= 0);
}


function _addClass(element, clazz) {
 if (element.className.indexOf(clazz) >= 0)
 return;
 element.className += ' ' + clazz;
}


function _removeClass(element, clazz) {
 clazz = ' ' + clazz;
 var idx = element.className.indexOf(clazz);
 if (idx >= 0) {
 var str = element.className.substring(0, idx);
 str += element.className.substring(idx + clazz.length);
 element.className = str;
 }
}

function Delegator(ivDl1, ivDl2) {
 function _listener(p0, p1, p2, p3, p4) {
 var res1 = null;
 var res2 = null;
 if (ivDl1 != null)
 res1 = ivDl1(p0, p1, p2, p3, p4);
 if (ivDl2 != null)
 res2 = ivDl2(p0, p1, p2, p3, p4);
 return res2 ? res2 : res1;
 }
 return _listener;
}


function _getValueAsUrlParameter(element) {
 
 if (element.type == "checkbox")
 return element.checked ? "&" + element.name + "=" + escape(element.value) : null;
 if (element.type == "radio") {
 var radioGroup = element.form.elements[element.name];
 for (var i = 0; i < radioGroup.length; i++) {
 if (radioGroup[i].checked)
 return "&" + element.name + "=" + escape(radioGroup[i].value);
 }
 return null;
 }
 if (element.type == "select-multiple" || element.type == "select-one") {
 var res = null;
 for (var i = 0; i < element.options.length; i++) {
 if (element.options[i].selected) {
 if (res == null)
 res = "&" + element.name + "=" + escape(element.options[i].value);
 else
 res += "&" + element.name + "=" + escape(element.options[i].value);
 }
 }
 return res;
 }
 if (element.value == null)
 return null;
 return "&" + element.name + "=" + escape(element.value);
}


function Rectangle(x, y, w, h) {
 this.x = x;
 this.y = y;
 this.width = w;
 this.height = h;
 
 this.intersects = intersects;
 
 function intersects(rect) {
 var tw = this.width;
 var th = this.height;
 var rw = rect.width;
 var rh = rect.height;
 if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
 return false;
 }
 var tx = this.x;
 var ty = this.y;
 var rx = rect.x;
 var ry = rect.y;
 rw += rx;
 rh += ry;
 tw += tx;
 th += ty;
 return ((rw < rx || rw > tx) &&
 (rh < ry || rh > ty) &&
 (tw < tx || tw > rx) &&
 (th < ty || th > ry));
 }
}


function _getPageBounds() {
  {
 if (document.documentElement) {  var x = document.documentElement.scrollLeft;
 var y = document.documentElement.scrollTop;
 var w = document.documentElement.clientWidth;
 var h = document.documentElement.clientHeight;
 return new Rectangle(x, y, w, h);
 }
 }
 error;
}

function _getStyle(el) {
 if (window.getComputedStyle) {
 return document.defaultView.getComputedStyle(el,null);
 }
 return el.currentStyle; 
}


function _setAbsolutePosition(el, x, y) {
 var offsetParent = el.offsetParent; 
 for (var parent = el.parentNode; 
 parent != null && parent != document.documentElement && parent != document.body; 
 parent = parent.parentNode) {
 x += parent.scrollLeft;
 y += parent.scrollTop;
 if (parent === offsetParent) {
 x -= parent.offsetLeft; 
 y -= parent.offsetTop;
 if (_doesNotAddBorder && 
 !(_doesAddBorderForTableAndCells && 
 "._TABLE_TD_TH_".indexOf("_" + parent.tagName + "_") > 0)) {
 var style = _getStyle(parent);
 var bw = parseInt(style.borderTopWidth) || 0;
 var bh = parseInt(style.borderLeftWidth) || 0;
 x -= bw;
 y -= bh; 
 }
 offsetParent = parent.offsetParent;
 }
 }
 el.style.position = "absolute";
 el.style.left = x + "px";
 el.style.top = y + "px";
}


function _getAbsoluteBounds(el) {
   var x = el.offsetLeft, y = el.offsetTop;
 {
 var offsetParent = el.offsetParent; 
 for (var parent = el.parentNode; 
 parent != null && parent != document.documentElement && parent != document.body; 
 parent = parent.parentNode) {
 x -= parent.scrollLeft;
 y -= parent.scrollTop;
 if (parent === offsetParent) {
 x += parent.offsetLeft; 
 y += parent.offsetTop;
 if (_doesNotAddBorder && 
 !(_doesAddBorderForTableAndCells && 
 "._TABLE_TD_TH_".indexOf("_" + parent.tagName + "_") > 0)) {
 var style = _getStyle(parent);
 var bw = parseInt(style.borderTopWidth) || 0;
 var bh = parseInt(style.borderLeftWidth) || 0;
 x += bw;
 y += bh; 
 }
 offsetParent = parent.offsetParent;
 }
 }
 }
 return new Rectangle(x, y, el.offsetWidth, el.offsetHeight);
}


function _centerOnScreen(el, position) {
 var rt = _getPageBounds();
 position = position ? position : "absolute";
 if (position == "fixed") {
 el.style.position = "fixed";
 el.style.top = (rt.height / 2) - (el.offsetHeight / 2) + "px"; 
 el.style.left = (rt.width / 2) - (el.offsetWidth / 2) + "px";
 }
 else {
 _setAbsolutePosition(el, rt.x + (rt.width / 2) - (el.offsetWidth / 2), 
 rt.y + (rt.height / 2) - (el.offsetHeight / 2));
 } 
}


function _cancelBubble(evt) {
 if (evt.stopPropagation) {
 evt.stopPropagation();
 evt.preventDefault();
 }
 else {
 evt.cancelBubble = true;
 evt.returnValue = false;
 try {
 evt.keyCode = 0;
 }
 catch (e) {
 }
 }
 return false;
}


function Draggable(draggedId, draggableId) {
 var ivDiv = document.getElementById(draggedId);
 var ivTitle = document.getElementById(draggableId);
 if (ivTitle == null)
 return;
 ivTitle.onmousedown = _mousedown;
 var ivX;
 var ivY;
 
 function _mousedown(evtPar) {
 var evt = window.event ? window.event : evtPar;
 ivX = evt.clientX;
 ivY = evt.clientY;
 if (window.event && !_browser.WebKit) {  ivTitle.onmouseup = _mouseup;
 ivTitle.onmousemove = _mousemove;
 ivTitle.setCapture();
 }
 else {
 document.addEventListener("mouseup", _mouseup, true);
 document.addEventListener("mousemove", _mousemove, true);
 }
 return _cancelBubble(evt);
 }
 function _mouseup(evtPar) {
 var evt = window.event ? window.event : evtPar;
 if (window.event && !_browser.WebKit) {  ivTitle.releaseCapture();
 ivTitle.onmouseup = null;
 ivTitle.onmousemove = null;
 }
 else {
 document.removeEventListener("mouseup", _mouseup, true);
 document.removeEventListener("mousemove", _mousemove, true);
 }
 return _cancelBubble(evt);
 }
 function _mousemove(evtPar) {
 var evt = window.event ? window.event : evtPar;
 var mx = evt.clientX;
 var my = evt.clientY;
 var bounds = _getPageBounds();
 mx = Math.max(0, Math.min(bounds.width, mx));
 my = Math.max(0, Math.min(bounds.height, my));
 var dx = mx - ivX;
 var dy = my - ivY;
 ivX = mx;
 ivY = my;
 var x = parseInt(ivDiv.style.left);
 var y = parseInt(ivDiv.style.top);
 if (isNaN(x)) x = 0;
 if (isNaN(y)) y = 0;
 x += dx;
 y += dy;
 ivDiv.$ifw$dragged = true;
 ivDiv.style.left = x + "px";
 ivDiv.style.top = y + "px";
 return _cancelBubble(evt);
 }
}

var ivAfterUpdateCallbacks = { 
 applying : false,
 list : new Array,

 register : function(callback){
 ivAfterUpdateCallbacks.list.push(callback);
 },
 
 apply : function() {
 if (ivAfterUpdateCallbacks.applying)
 return;
 ivAfterUpdateCallbacks.applying = true;
 var _list = ivAfterUpdateCallbacks.list;
 ivAfterUpdateCallbacks.list = new Array;
 for (var i = 0; i < _list.length; i++) {
 _list[i]();
 }
 ivAfterUpdateCallbacks.applying = false;
 }
}
 
var ivEnableUriTracking = ("true" == 'false') && _browser.Gecko;
_ltrace("Uri tracking: " + ivEnableUriTracking);
var ivCurrentHash = window.location.hash;
if (ivEnableUriTracking) {
 function _checkUri() {
 if (ivCurrentHash != window.location.hash) {
 ivCurrentHash = window.location.hash;
 _ajaxRefresh(true);
 }
 }
 setInterval(_checkUri, 500);
}


function _ajax(url, async, dataToSend, callback) {
 var ivUA = null;
 if (window.XMLHttpRequest) {
 ivUA = new XMLHttpRequest();
 } 
 else if (window.ActiveXObject) { 
 ivUA = new ActiveXObject("Microsoft.XMLHTTP");
 }
 if (ivUA == null)
 return null;
 if (!_isDefined(dataToSend) || dataToSend == null)  dataToSend = "";
 if (!_isDefined(callback))
 callback = $ifw_nop;
 var method = "POST";
 var absUrl = window.location.protocol + "//" + window.location.host + url;
 ivUA.open(method, absUrl, async);
 ivUA.setRequestHeader("Content-Type", "application/x-www-form-urlencoded-ifw");
 if (async)
 ivUA.onreadystatechange = _callback;
 var queueId = ivWaitingQueueId;
 ++ivAjaxs;
 if (async && ivAjaxs == 1) 
 setTimeout(_responseWait, 500);  ivUA.send(dataToSend);
 if (!async) {
 _callback();
 }
 else {
  _doPurge();
 } 
 
 function _callback() {
 if (ivUA.readyState == 4) {
 ivUA.onreadystatechange = $ifw_nop;
 --ivAjaxs;
 if (ivAjaxs == 0) {
 ivAsyncAjaxWaits = 0;
 ++ivWaitingQueueId;  ivMessages.showWaitMessage(false);
 }
 }
 if (callback != null)
 callback(ivUA);
 }

 function _responseWait() {
 if (ivWaitingQueueId != queueId) 
 return;
 ivAsyncAjaxWaits++;
 if (ivAsyncAjaxWaits <= 2) {
 setTimeout(_responseWait, 100); 
 if (ivAsyncAjaxWaits <= 1) {
 ivMessages.showWaitMessage(true);
 }
 }
 else {
     function _readyStateChange(request) {
 if (request.readyState == 4) {
 if (request.status == 200) {
 var contentType = request.getResponseHeader("Content-Type");
 var responseText = request.responseText;
 if (contentType && contentType.indexOf("text/javascript") >= 0) {
 var res = _eval(responseText);
 if (res[0].busy) {
  _ltrace("Server busy");
 setTimeout(_responseWait, ivAsyncAjaxWaits * 500); 
 if (ivAsyncAjaxWaits >= 4) {
 ivMessages.showWaitMessage(true, true);
 }
 }
 }
 }
 }
 }
 var url = window.location.pathname + window.location.search;
 var data = "&$ifw$ajax=sync";
 data += "&$ifw$resync=true";
 _ajax(url, false, data, _readyStateChange);
 }
 }
} 


function _ajaxRefresh(async, callback) {
 var data = "&$ifw$ajaxRefresh=refresh";
 if (ivEnableUriTracking)
 data += "&$ifw$urlHash=" + escape(window.location.hash);
 _ajaxPost(data, async, callback);
}


function _ajaxSubmit(form, subFormName, async, callback) {
 var data = "&$ifw$ajaxSubmit=" + form.name;
 form.$ifw$form.value = subFormName;
 var fields = form.elements;
 for (var i = 0; i < fields.length; i++) {
 if (fields[i].$ifw$subFormName && fields[i].$ifw$subFormName != subFormName)
 continue;
 var par = _getValueAsUrlParameter(fields[i]);
 if (par != null)
 data += par;
 }
 _ajaxPost(data, async, callback);
}


function _ajaxFieldEvent(field, async, event, callback, action, actionParam) {
 var form = field.form;
 var subFormName = field.$ifw$subFormName;
 if (!form)  return;
 if (!action)
 action = "";
 if (event == "fieldAction" && ivFocusedField == field) {
  ivOldValue = _getValueAsUrlParameter(field);
 }
 var data = "&$ifw$ajaxSubmit=" + form.name + 
 "&$ifw$field=" + field.name +
 "&$ifw$event=" + event;
 form.$ifw$form.value = subFormName;
 form.$ifw$action.value = action;
 form.$ifw$actionParam.value = actionParam ? actionParam : "";
 var fields = form.elements;
 for (var i = 0; i < fields.length; i++) {
 if (fields[i].$ifw$subFormName && fields[i].$ifw$subFormName != subFormName)
 continue;
 var par = _getValueAsUrlParameter(fields[i]);
 if (par != null)
 data += par;
 }
 _ajaxPost(data, async, callback);
}




function _ajaxPost(data, async, callback) {
 if (ivNotifyResizeTO) {
 clearTimeout(ivNotifyResizeTO);
 ivNotifyResizeTO = null;
 }
 if (!_isDefined(callback))
 callback = null;
 var url = window.location.pathname + window.location.search;
 var pageBounds = _getPageBounds();
 data = "&$ifw$ajax=" + (async ? "async" : "sync") +
 "&$ifw$pageSize=" + pageBounds.width + ";" + pageBounds.height +
 data;
 _ajax(url, async, data, _readyStateChange);

 function _readyStateChange(request) {
 if (request.readyState == 4) {
 if (request.status == 200) {
 var contentType = request.getResponseHeader("Content-Type");
 var responseText = request.responseText;
 var resp = null;
 if (contentType.indexOf("text/javascript") >= 0) {
 resp = _eval(responseText);
 var parts = resp[0].parts;
 var hash = resp[0].hash;
 if (parts != null) 
 _updateContent(parts);
  if (ivEnableUriTracking && hash != window.location.hash) {
  ivCurrentHash = hash;
 window.location.hash = hash;
 }
 if (callback != null)
 callback(request);
 }
 else {
  var re = /<(?:span.*?IFW2_ERROR(.|\s)*?\/span)?>/gi;
 var matches = responseText.match(re);
 var refresh = true;
 if (matches) {
 var msg = matches[0].match(/(?:\>(.|\s)*?<)/gi)[0];
  refresh = msg.toUpperCase().indexOf("INVALID URL:") < 0;
 alert(msg.replace(/[<>]/g, ""));
 }
 else {
 alert("ERROR(1): " + contentType + " " + responseText);
 }
 if (refresh)
 window.location = window.location;
 }
 }
 else {
 alert("ERROR(2): " + request.status + " - " + request.statusText);
 window.location = window.location;
 }
 }
 }
 
 function _updateContent(parts) {
 ivFocusedField = null;   if (ivRefreshTimer) {
 clearTimeout(ivRefreshTimer);
 ivRefreshTimer = null;
 }
  ivStyles.clearCache();
  for (var i = 0; i < parts.length; i++) {
 var id = parts[i].uid;
 var removed = parts[i].removed;
 var el = document.getElementById(id);
 var html = unescape(parts[i].html);
  if (el != null && !(el == null && removed)) {
 var tagName = el.tagName.toUpperCase();
 if (_browser.IE &&  '._THEAD_TBODY_TR_'.indexOf("_" + tagName + "_") > 0) {
 _innerHTML(el, html);
 }
 else if (_browser.XE &&  '._THEAD_TBODY_TR_'.indexOf("_" + tagName + "_") > 0) {
 _innerHTML(el, html);
 }
 else {
 if (el.$ifw_refreshByCopy) {
  var div = document.createElement('div');
 div.innerHTML = html;
 _copyHTML(div, el);
 el = div;
 }
 else {
 if (_browser.IE && !_browser.IE8) 
 _cleanUpChilds(el);
 el.innerHTML = html;
 }
 }
  var scripts = el.getElementsByTagName('script');
 for (var j = 0; j < scripts.length; j++) {
 var script = scripts[j].text;
 _eval(script); 
 }
  }
 }
 ivStyles.apply();
 _restoreFocus();
 ivAfterUpdateCallbacks.apply();
 function _giveFocus(field) {
 if (!field) 
 return false;
 if (field.disabled)
 return false;
 if (field.readOnly) 
 return false;
 var tf = _wrap(field);
 try {
 tf.focus();
 ivFocusedField = field;
 tf.addClass("focused");
 if (_browser.XE) {
 function _gf() {
 try {
 tf.focus();
 }
 catch (e) {
 }
 }
 setTimeout(_gf, 0); 
 }
 return true;
 }
 catch (e) {
 }
 return false;
 }
 function _restoreFocus() {
 if (ivFormsStack.length > 0) {
    var i = ivFormsStack.length - 1;
 var form = document.forms[ivFormsStack[i].formName];
 if (form) {
 var fieldId = ivFormsStack[i].fieldId;
 if (fieldId && document.getElementById(fieldId)) {
  if (_giveFocus(document.getElementById(fieldId)))
 return;
 }
 }
 }
    if (!ivOldPopup) {
  for (var i = ivFormsStack.length - 1; i >= 0; i--) {
 var form = document.forms[ivFormsStack[i].formName];
 if (!form) {
 ivFormsStack.splice(i, 1);
 }
 else {
 if (form.$ifw_defaultFocusedFieldIdMap) {
 var subFormName = ivFormsStack[i].subFormName;
 var fieldId = form.$ifw_defaultFocusedFieldIdMap[subFormName];
  if (fieldId && _giveFocus(document.getElementById(fieldId)))
 return;
 }
 
 }
 }
  for (var i = 0; i < document.forms.length; i++) {
 var form = document.forms[i];
 if (form.$ifw_defaultFocusedFieldId) {
  if (_giveFocus(document.getElementById(form.$ifw_defaultFocusedFieldId)))
 return;
 }
 }
 }
 }
 }
}

 

function Messages() {
 
 var ivNMsg = 0

 this.logLevel = function() {
 return 6;
 }
 
 this.trace = function(msg) {
 if (!ivTraceDiv)
 return;
 ivTraceDiv.appendChild(document.createTextNode(msg));
 ivTraceDiv.appendChild(document.createElement("br"));
 ivNMsg++;
 if (ivNMsg > 20) {
 ivTraceDiv.removeChild(ivTraceDiv.firstChild);
 ivTraceDiv.removeChild(ivTraceDiv.firstChild);
 }
 }

 this.showWaitMessage = function(show, busy) {
 if (show) {
 ivWaitMessageDiv.innerHTML = 
 '  <table style="background-color:' + (busy? 'red' : 'orange') + '" border="0" width="100%" cellpadding="0" cellspacing="0">' +
 '    <td>' + (busy? 'WAIT...' : 'wait...') + '</td>' +
 '  </table>';
 ivWaitMessageDiv.style.visibility = 'visible';
 ivWaitMessage2Div.innerHTML = 
 '<img src="' + window.location.protocol + "//" + window.location.host + $ifw.contextPath() + 
 '/ifw2.static/images/wait.gif" width="100" height="100" border="0"/>';
 ivWaitMessage2Div.style.visibility = 'visible';
 if (busy) {
 ivBusyShadeDiv.style.visibility = 'visible';
 }
 }
 else {
 ivWaitMessageDiv.style.visibility = 'hidden';
 ivWaitMessageDiv.innerHTML = "";
 ivWaitMessage2Div.style.visibility = 'hidden';
 ivWaitMessage2Div.innerHTML = "";
 ivBusyShadeDiv.style.visibility = 'hidden';
 }
 }

 this.showUploadMessage = function(show, percentage) {
 if (show) {
 if (!percentage)
 percentage = 0;
 var html =
 '<div style="position:relative;top:0">' +
 '  <table style="background-color:orange" border="0" width="100%" cellpadding="0" cellspacing="1">' +
 '    <tr>';
 for (var i = 1; i < 11; i++)
 html += '<td style="background-color:' + 
 (((i * 10) <= percentage) ? 'blue' : 'white') + 
 '">&nbsp;</td>';
 html +=
 '    </tr>' +
 '  </table>' +
 '  <table style="position:absolute;top:0;z-index:999" border="0" width="100%" cellpadding="0" cellspacing="1">' +
 '    <td>UPLOAD...</td>' +
 '  </table>' +
 '</div>';
 ivUploadMessageDiv.innerHTML = html;
 ivUploadMessageDiv.style.visibility = 'visible';
 }
 else {
 ivUploadMessageDiv.style.visibility = 'hidden';
 ivUploadMessageDiv.innerHTML = "";
 }
 }

 var ivMessageDiv = null;
 var ivWaitMessageDiv = null;
 var ivWaitMessage2Div = null;
 var ivUploadMessageDiv = null;
 var ivBusyShadeDiv = null;
 {  var messageId = "IFW_MESSAGE"; 
 var waitMessageId = messageId + "_WAIT"; 
 var waitMessage = 
 '  <div id="' + waitMessageId + '" style="visibility:hidden">' +
 '  </div>';
 var waitMessage2 = 
 '  <div id="' + waitMessageId + '2" style="visibility:hidden">' +
 '  </div>';
 var uploadMessageId = messageId + "_UPLOAD"; 
 var uploadMessage = 
 '  <div id="' + uploadMessageId + '" style="visibility:hidden">' +
 '  </div>';

 {
 document.write('' +
 '<div id="' + messageId + '"' +
 '>'
 );
 document.write('<table width="100" border="0" cellpadding="0" cellspacing="0">');
 document.write('<tr><td>' + waitMessage + '</td></tr>');
 document.write('<tr><td>' + uploadMessage + '</td></tr>');
 document.write('</table>');
 document.write('</div>');
 document.write(waitMessage2);
 document.write('<div class="BUSY_SHADE" id="BUSY_SHADE"></div>');
 ivWaitMessageDiv = document.getElementById(waitMessageId);
 ivWaitMessage2Div = document.getElementById(waitMessageId + "2");
 ivUploadMessageDiv = document.getElementById(uploadMessageId);
 ivBusyShadeDiv = document.getElementById("BUSY_SHADE");
 }
 
   }

 var ivTraceDiv = null;
 
 if (this.logLevel() >= 7) { 
 var traceId = "IFW_LTRACE"; 

 {
 document.write('' +
 '<div id="' + traceId + '"' +
 ' tabindex="-1"' +
 '>'
 );
 document.write('</div>');
 ivTraceDiv = document.getElementById(traceId);
 }
 }
}
 
function FieldWrapper(ivField) {

 this.focus = function() {ivField.focus();};
 this.setProperty = function(enabled, readOnly) {_setProperty(ivField, enabled, readOnly);};
 this.addClass = function(clazz) {_addClass(ivField, clazz);};
 this.removeClass = function(clazz) {_removeClass(ivField, clazz);};
 
 this.field = ivField;  
 if (ivField.type && ivField.type == "radio") {
  ivField = ivField.form[ivField.name];
 }
 
 if (ivField.length && ivField.length > 0 &&
 ivField[0].type && ivField[0].type == "radio") {
 this.focus = _radioFocus;
 this.setProperty = function(enabled, readOnly) {
 for (var i = 0; i < ivField.length; i++) {
 _setProperty(ivField[i], enabled, readOnly);
 }
 };
 this.addClass = function(clazz) {
 for (var i = 0; i < ivField.length; i++) {
 _addClass(ivField[i], clazz);
 }
 };
 this.removeClass = function(clazz) {
 for (var i = 0; i < ivField.length; i++) {
 _removeClass(ivField[i], clazz);
 }
 };
 this.field = ivField[0];
 return;
 }
 
 function _setProperty(element, enabled, readOnly) {
 if (enabled != null) {
 element.disabled = !enabled;
 }
 if (readOnly != null) {
 element.readOnly = readOnly;
 }
 }

 function _radioFocus() {
 for (var i = 0; i < ivField.length; i++) {
 if (ivField[i].checked) {
 ivField[i].focus();
 return;
 }
 }
 ivField[0].focus();
 }
}

 
function _appendCliParam(parameter, cliParams) {
 if (cliParams) {
 if (!parameter)
 parameter = "";
  parameter += "$ifwclipar$" + cliParams;
 }
 return parameter;
}


function KeyStroke(targetName, keyCode, shiftKey, ctrlKey,  enabled, action, actionParam, formName, subFormName, csScript) {
 this.getTargetName = function() {
 return targetName;
 }
 this.isEnabled = function() {
 return enabled;
 }
 this.getAction = function() {
 return action;
 }
 this.getActionParam = function() {
 return actionParam;
 }
 this.getFormName = function() {
 return formName;
 }
 this.getSubFormName = function() {
 return subFormName;
 }
 this.getCSScript = function() {
 return csScript;
 }
 this.getKeyCode = function() {
 return keyCode;
 }
 this.getShiftKey = function() {
 return shiftKey;
 }
 this.getCtrlKey = function() {
 return ctrlKey;
 }
 this.equals = function(other) {
 return targetName == other.getTargetName() &&
 keyCode == other.getKeyCode() &&
 shiftKey == other.getShiftKey() &&
 ctrlKey == other.getCtrlKey();
 }
}

function _notCharCode(char) {
 var res =
 (char < 16 ||  (char > 18 && char <= 32) ||  (char > 32 && char < 41) ||  (char >= 112 && char <= 123) ||  char == 46 || char == 45);  return res;
}


function KeyboardHandler(form, subFormName, target, enabled, keyCode, shiftKey, ctrlKey, 
 action, actionParam, csScript) {
 var targetName = target == null ? null : _wrap(target).field.name;
  var parent = (!target || target.form) ? form : target;
 var parentIsTheForm = parent == form;
 parent.$ifw$touched = true;
 parent.onkeydown = keydown;
 parent.onkeypress = keypress;
 parent.onkeyup = keyup;
 if (!shiftKey)
 shiftKey = false;
 if (!ctrlKey)
 ctrlKey = false;
 {
 var stroke = new KeyStroke(targetName, keyCode, shiftKey, ctrlKey, 
 enabled, action, actionParam, form.name, subFormName, csScript);
 var strokes = parent.$ifw$keyStrokes ? parent.$ifw$keyStrokes : new Array();
 var i;
 for (i = 0; i < strokes.length; i++) {
 if (stroke.equals(strokes[i])) 
 break;
 }
 strokes[i] = stroke;
 parent.$ifw$keyStrokes = strokes;
 }
 var nonchar = false;
 var skip = false;
 
 function getKeyStroke(parent, stroke) {
 var strokes = parent.$ifw$keyStrokes ? parent.$ifw$keyStrokes : new Array();
 var i;
 for (i = 0; i < strokes.length; i++) {
 if (stroke.equals(strokes[i]))
 return strokes[i]; 
 }
 return null;
 }
 
 parent = null;  form = null;
 target = null;

 function keydown(e) {
 var evt = (e) ? e : window.event; 
 var parent = evt.currentTarget ? evt.currentTarget : this;
 var evtTarget = evt.srcElement ? evt.srcElement : evt.target;
 if (!evtTarget)
 evtTarget = null;
 var char;
 skip = false;
 char = evt.keyCode;
 if (_notCharCode(char)) { 
  var targetName = (!parentIsTheForm) ? null : 
 (evtTarget == null ? null : _wrap(evtTarget).field.name);
 nonchar = true; 
 var stroke = getKeyStroke(parent,
 new KeyStroke(targetName, char, evt.shiftKey, evt.ctrlKey));
 if (targetName != null && stroke == null)
 stroke = getKeyStroke(parent,
 new KeyStroke(null, char, evt.shiftKey, evt.ctrlKey));
 if (stroke != null && stroke.isEnabled()) {
   skip = true;
 processStroke(stroke, evtTarget, null);
 return _cancelBubble(evt);
 }
 }
 else {
 nonchar = false; 
 }
 }

 function keypress(e) {
 var evt = (e) ? e : window.event; 
 if (skip) {
   return _cancelBubble(evt);
 }
 else if (!nonchar) {
 var parent = evt.currentTarget ? evt.currentTarget : this;
 var evtTarget = evt.srcElement ? evt.srcElement : evt.target;
 if (!evtTarget)
 evtTarget = null;
 var char = (evt.charCode) ? evt.charCode : evt.keyCode;
 var targetName = (!parentIsTheForm) ? null : 
 (evtTarget == null ? null : _wrap(evtTarget).field.name);
 var stroke = getKeyStroke(parent,
 new KeyStroke(targetName, -1, false, false));
  if (targetName != null && stroke == null)
 stroke = getKeyStroke(parent,
 new KeyStroke(null, -1, false, false));
 if (stroke != null && stroke.isEnabled()) {
 skip = true;
 function doIt() {
 ivPendingStrokeProcessor.process();
 }
 if (ivPendingStrokeProcessor == null) {
 ivPendingStrokeProcessor = new function() {
 var ivChars = String.fromCharCode(char);
 this.process = function() {
 ivPendingStrokeProcessor = null;
 clearTimeout(ivPendingStrokeProcessorTO);
 processStroke(stroke, evtTarget, "&chars=" + ivChars);
 } 
 this.append = function(char) {
 ivChars += char;
 clearTimeout(ivPendingStrokeProcessorTO);
 ivPendingStrokeProcessorTO = setTimeout(doIt, 500);
 }
 } 
 ivPendingStrokeProcessorTO = setTimeout(doIt, 700);
 }
 else {
 ivPendingStrokeProcessor.append(String.fromCharCode(char));
 }
 return _cancelBubble(evt);
 }
 }
 }

 function keyup(e) {
 var evt = (e) ? e : window.event; 
 if (skip) {
   return _cancelBubble(evt);
 }
 }

 function _script(script, stroke, form, target, field, subFormName) {
 eval(script);
 }

 function processStroke(stroke, target, cliParams) {
 if (ivPendingStrokeProcessor != null) {
 ivPendingStrokeProcessor.process();
 }
 if (stroke.isEnabled()) {
 var parameter = stroke.getActionParam();
 parameter = _appendCliParam(parameter, cliParams);
 if (stroke.getCSScript()) {
 _script(stroke.getCSScript(), stroke, 
 document.forms[stroke.getFormName()],
 parent, 
 (stroke.getTargetName() ? _wrap(target).field : null),
 stroke.getSubFormName());
 }
 else if (stroke.getTargetName()) {
 _ajaxFieldEvent(_wrap(target).field, true, "fieldAction", 
 null, stroke.getAction(), parameter);
 }
 else {
 function doSubmit() {
 document.forms[stroke.getFormName()].submit(stroke.getAction(), 
 parameter, stroke.getSubFormName());
 }
 if (ivFocusedField && ivFocusedField.$ifw$subFormName != stroke.getSubFormName()) {
  _validateIfChangedImpl(ivFocusedField);
 if (_browser.IE) {
  setTimeout(doSubmit, 0);
 }
 else {
 doSubmit();
 }
 }
 else {
 doSubmit();
 }
 }
 }
 }
} 


function MouseStroke(target, type, shiftKey, ctrlKey,  enabled, action, actionParam, formName, subFormName, csScript) {
 var targetId = !target ? null : (target.name ? target.name : target.id);
 target = null; 
 this.getTargetId = function() {
 return targetId;
 }
 this.isEnabled = function() {
 return enabled;
 }
 this.getAction = function() {
 return action;
 }
 this.getActionParam = function() {
 return actionParam;
 }
 this.getFormName = function() {
 return formName;
 }
 this.getSubFormName = function() {
 return subFormName;
 }
 this.getCSScript = function() {
 return csScript;
 }
 this.getType = function() {
 return type;
 }
 this.getShiftKey = function() {
 return shiftKey;
 }
 this.getCtrlKey = function() {
 return ctrlKey;
 }
 this.equals = function(other) {
 return targetId == other.getTargetId() &&
 type == other.getType() &&
 shiftKey == other.getShiftKey() &&
 ctrlKey == other.getCtrlKey();
 }
}


function MouseHandler(form, subFormName, target, enabled, type, shiftKey, ctrlKey, 
 action, actionParam, csScript) {
 var ivPendingClick = null;
  var parent = (!target || target.form) ? form : target;
 var parentIsTheForm = parent == form;
 if (target && target.form && "dblclick" == type) {
 target.$ifw$hasDblclick = true;
 }
 parent.$ifw$touched = true;
 parent.onclick = mouse;
 parent.ondblclick = mouse;
 parent.oncontextmenu = mouse;
 if (!window.addEventListener || _browser.WebKit || _browser.XE)
 parent.onmousewheel = mouse;
 else
 parent.addEventListener('DOMMouseScroll', mouse, false); 
 if (!shiftKey)
 shiftKey = false;
 if (!ctrlKey)
 ctrlKey = false;
 {
 var stroke = new MouseStroke(target, type, shiftKey, ctrlKey, 
 enabled, action, actionParam, form.name, subFormName, csScript);
 var strokes = parent.$ifw$mouseStrokes ? parent.$ifw$mouseStrokes : new Array();
 var i;
 for (i = 0; i < strokes.length; i++) {
 if (stroke.equals(strokes[i])) 
 break;
 }
 strokes[i] = stroke;
 parent.$ifw$mouseStrokes = strokes;
 }
 
 function getMouseStroke(parent, stroke) {
 var strokes = parent.$ifw$mouseStrokes ? parent.$ifw$mouseStrokes : new Array();
 var i;
 for (i = 0; i < strokes.length; i++) {
 if (stroke.equals(strokes[i]))
 return strokes[i]; 
 }
 return null;
 }

 parent = null;  form = null;
 target = null;

 function mouse(e) {
 var evt = (e) ? e : window.event; 
 var parent = evt.currentTarget ? evt.currentTarget : this;
 var evtTarget = evt.srcElement ? evt.srcElement : evt.target;
 var type = evt.type;
 var wheelDelta = "";
 if (type == "mousewheel" || type == "DOMMouseScroll") {
 var delta = 0;
 if (evt.wheelDelta) { 
 delta = Math.round(evt.wheelDelta/120);
 if (delta == 0) 
 delta = (evt.wheelDelta < 0) ? -1 : 1;
  if (window.opera)
 delta = -delta;
 } 
 else if (evt.detail) { 
  delta = Math.round(-evt.detail/3);
 if (delta == 0) 
 delta = (-evt.detail < 0) ? -1 : 1;
 }
 if (delta == 0)
 return;
 type = delta >= 0 ? "wheelup" : "wheeldn";
 wheelDelta = "&wheelDelta=" + escape(delta >= 0 ? delta : -delta); 
 }
   evtTarget = (parentIsTheForm || 
 evtTarget.type) ? _wrap(evtTarget).field : parent;
 if (!evtTarget)
 evtTarget = null;
 var stroke = getMouseStroke(parent, 
 new MouseStroke(evtTarget, type, evt.shiftKey, evt.ctrlKey));
 if (evtTarget != null && stroke == null) {
 if (evtTarget.type && (type == "click" || type == "dblclick")) {
  }
 else
 stroke = getMouseStroke(parent,
 new MouseStroke(null, type, evt.shiftKey, evt.ctrlKey));
 }
 if (stroke != null) {
    if (type == "click") {
  if (!ivPendingClick) {
 ivPendingClick = stroke;
 function clicked() {
 if (ivPendingClick) {
 var stroke = ivPendingClick;
 ivPendingClick = null;
 processStroke(stroke, evtTarget);
 }
 }
 setTimeout(clicked, 200);
 }
 }
 else {
  ivPendingClick = null;
 if (type == "contextmenu") {
 var coord = "&clientX=" + evt.clientX + "&clientY=" + evt.clientY; 
 processStroke(stroke, evtTarget, wheelDelta + coord);
 }
 else {
 processStroke(stroke, evtTarget, wheelDelta);
 }
 }
 return _cancelBubble(evt);
 }
 }
 
 function processStroke(stroke, target, cliParams) {
 if (stroke.isEnabled()) {
 if (document.selection && stroke.getType() == "dblclick") { 
  try {
 document.selection.empty();
 }
 catch (e) {
 }
 }
 var parameter = stroke.getActionParam();
 parameter = _appendCliParam(parameter, cliParams);
 if (stroke.getCSScript()) {
 _script(stroke.getCSScript(), stroke, 
 document.forms[stroke.getFormName()],
 target, 
 (parentIsTheForm && stroke.getTargetId() ? _wrap(target).field : null),
 stroke.getSubFormName());
 }
 else if (parentIsTheForm && stroke.getTargetId()) {
 var wfield = _wrap(target);
 _pushForm(wfield.field.form.name, wfield.field.$ifw$subFormName, wfield.field.id);
 _ajaxFieldEvent(wfield.field, true, "fieldAction", 
 null, stroke.getAction(), parameter);
 }
 else {
 function doSubmit() {
 _pushForm(stroke.getFormName(), stroke.getSubFormName(), null);
 document.forms[stroke.getFormName()].
 submit(stroke.getAction(), parameter, stroke.getSubFormName());
 }
 doSubmit();
 }
 }
 }

 function _script(script, stroke, form, target, field, subFormName) {
 eval(script);
 }
} 


 
function _innerHTML(el, html) {
 var div = document.createElement('div');
 var depth;
 switch (el.tagName.toUpperCase()) {
 case 'THEAD':
 case 'TBODY':
 div.innerHTML = '<table><tbody>' + html + '</tbody></table>';
 depth = 2;
 break;
 case 'TR':
 div.innerHTML = '<table><tbody><tr>' + html + '</tr></tbody></table>';
 depth = 3;
 break;
 case 'TD':
 div.innerHTML = '<table><tbody><tr><td>' + html + '</td></tr></tbody></table>';
 depth = 4;
 }
 for (var i = 0; i < depth; i++)
 div = div.firstChild;
 if (el.hasChildNodes()) {
 var childs = el.childNodes;
 for (var i = childs.length - 1; i >= 0; i--) {
 var child = childs[i];
 _purge(child);
 el.removeChild(child);
 }
 }
 
 if (!_browser.XE && document.createDocumentFragment) {
 var documentFragment = document.createDocumentFragment();
 while (div.hasChildNodes()) {
 documentFragment.appendChild(div.firstChild);
 }
 el.appendChild(documentFragment);
 }
 else {
 while (div.hasChildNodes()) {
 el.appendChild(div.firstChild);
 }
 }
}

function _copyHTML(source, el) {
 var div = source;
 if (div.childNodes.length > el.childNodes.length) {
 _trace("" + el.id + " " + div.childNodes.length + " " + el.childNodes.length);
 }
 var idx = -1;
 for (var didx = 0; didx < div.childNodes.length; didx++) {
 var divc = div.childNodes[didx];
  if (divc.nodeType == 8 || (divc.tagName && divc.tagName.toUpperCase() == "SCRIPT")) {
 continue;
 }
 var elc = null;
 for (idx = idx + 1; idx < el.childNodes.length; idx++) {
 elc = el.childNodes[idx];
 if (elc.nodeType == 8 || (elc.tagName && elc.tagName.toUpperCase() == "SCRIPT")) 
 continue;
 break;
 } 
 if (elc == null) {
 _trace("" + divc.tagName + " elc==null");
 break;
 }
 if (elc.nodeType != divc.nodeType) {
 _trace("" + el.id + " " + divc.nodeType + " " + elc.nodeType);
 }
 if (elc.nodeType == 3) {
 elc.nodeValue = divc.nodeValue;
 }
 else if (elc.nodeType == 1) {
 if (elc.tagName != divc.tagName) {
 _trace("" + el.id + " " + divc.tagName + " " + elc.tagName);
 }
   if (elc.value != divc.value) {
 if (elc.$ifw$delayedValidateOnChange && elc.$ifw$notifyDelayedChangeTS === ivNotifyDelayedChangeTS) {
   _ltrace("Skipped delayed value update");
 }
 else {
 elc.value = divc.value;
 }
 }
 if (elc.className != divc.className)
 elc.className = divc.className;
 if (elc.tabIndex != divc.tabIndex)
 elc.tabIndex = divc.tabIndex;
 if (_isDefined(elc.title) && elc.title != divc.title) 
 elc.title = divc.title; 
 if (_isDefined(elc.size) && elc.size != divc.size) 
 elc.size = divc.size; 
 if (_isDefined(elc.maxLength) && elc.maxLength != divc.maxLength)
 elc.maxLength = divc.maxLength;
 if (_isDefined(elc.checked) && elc.checked != divc.checked)
 elc.checked = divc.checked;
 if (_isDefined(elc.cols) && elc.cols != divc.cols) 
 elc.cols = divc.cols; 
 if (_isDefined(elc.rows) && elc.rows != divc.rows) 
 elc.rows = divc.rows; 
  elc.setAttribute("style", divc.getAttribute("style"));
 }
 }
}


function _cleanUpChilds(el) {
 var childs = el.childNodes;
 for (var i = 0; i < childs.length; i++) {
 _purge(childs[i]);
 }
}



var ivToBePurged = new Array();
var ivImmediatePurge = ("true" == 'false');
_ltrace("Imm. purge: " + ivImmediatePurge);


function _purge(d) {
 if (ivImmediatePurge)
 _purgeImpl(d);
 else
 ivToBePurged.push(d);
}

function _doPurge() {
 if (ivToBePurged.length <= 0)
 return;
 var toBePurged = ivToBePurged;
 ivToBePurged = new Array();
 for (var i = 0; i < toBePurged.length; i++) {
 _purgeImpl(toBePurged[i]);
 }
}

function _purgeImpl(d) {
 var a = d.childNodes; 
 if (a) { 
 l = a.length; 
 for (i = 0; i < l; i += 1) { 
 var child = d.childNodes[i]; 
 if (child.nodeType == 1) 
 _purge(child);
  
 } 
 }
 if (d.nodeType == 1) {
 d.clearAttributes(); 
 if (d.$ifw$touched) {
 var a = d.attributes, i, l, n; 
 if (a) { 
 l = a.length; 
 for (i = 0; i < l; i += 1) { 
 n = a[i].name; 
 if (typeof d[n] === 'function') { 
 d[n] = null; 
 } 
 } 
 } 
 }
 } 
}

 

function _togglePopup(refElementIdOrObj, popupId, pMaxWidth, pMaxHeight) {
 var popup = popupId ? document.getElementById(popupId) : null;
 var makeVisible = (popup != null && popup.style.visibility != 'visible');
 if (ivOldPopup != null) {
 ivOldPopup.style.visibility = 'hidden';
 ivOldPopup = null;
 }
 ivOldPopup = popup;
 if (makeVisible) {
 _refreshPopup(refElementIdOrObj, pMaxWidth, pMaxHeight);
 }
}


function _refreshPopup(refElementIdOrObj, pMaxWidth, pMaxHeight) {
 _popupRelativeTo(refElementIdOrObj, ivOldPopup, pMaxWidth, pMaxHeight);
}

function _popupRelativeTo(refElementIdOrObj, elementIdOrObj, pMaxWidth, pMaxHeight) {
 var popup = null;
 if (elementIdOrObj) {
 popup = (typeof(elementIdOrObj) === "string") ? document.getElementById(elementIdOrObj) : elementIdOrObj;
 }
 var refElement = null;
 if (refElementIdOrObj) {
 refElement = (typeof(refElementIdOrObj) === "string") ? 
 document.getElementById(refElementIdOrObj) : refElementIdOrObj;
 }
 var makeVisible = (popup != null);
 if (makeVisible) {
 var maxWidth = pMaxWidth && pMaxWidth != null ? pMaxWidth : 200;
 var maxHeight = pMaxHeight && pMaxHeight != null ? pMaxHeight : 50; 
 popup.style.zIndex = 900; 
 popup.style.overflow = 'visible';
 if (maxWidth >= 0)
 popup.style.width = maxWidth + "px";
 else
 popup.style.width = Math.min(popup.offsetWidth, Math.abs(maxWidth)) + "px";
 if (maxHeight >= 0)  popup.style.height = Math.abs(maxHeight) + "px";
 else
 popup.style.height = Math.min(popup.offsetHeight, Math.abs(maxHeight)) + "px";
  if (refElement != null) {
 
 _setLocationRelativeTo(popup, refElement);
 }
 popup.style.visibility = 'visible';
 }
}


function _setLocationRelativeToPoint(el, x, y) {
 var relElBounds = new Rectangle(x, y, 1, 1);;
 _setLocationRelativeToRect(el, relElBounds);
}


function _setLocationRelativeTo(el, relEl, preferredPos) {
 var relElBounds = _getAbsoluteBounds(relEl);
 _setLocationRelativeToRect(el, relElBounds, preferredPos);
}


function _setLocationRelativeToRect(el, relElBounds, preferredPos) {
 var elBounds = _getAbsoluteBounds(el);
 var winBounds = _getPageBounds();
 
 var x = relElBounds.x, y = relElBounds.y, w = relElBounds.width, h = relElBounds.height;
 
 var docX = winBounds.x, docY = winBounds.y, docW = winBounds.width, docH = winBounds.height;
 
 var pW = elBounds.width, pH = elBounds.height;
 var pArea = pW * pH;
 
 var coords = null;
 if (!preferredPos || preferredPos == "bottom") {
 coords = [
 [x, y+h], [x+w-pW, y+h], 
 [x, y-pH], [x+w-pW, y-pH], 
 [x+w, y], [x+w, y+h-pH], 
 [x-pW, y], [x-pW, y+h-pH] 
 ];
 }
 else if (preferredPos == "right") {
 coords = [
 [x+w, y], [x+w, y+h-pH], 
 [x-pW, y], [x-pW, y+h-pH], 
 [x, y+h], [x+w-pW, y+h], 
 [x, y-pH], [x+w-pW, y-pH] 
 ];
 }
 else if (preferredPos == "top") {
 coords = [
 [x, y-pH], [x+w-pW, y-pH], 
 [x, y+h], [x+w-pW, y+h], 
 [x+w, y], [x+w, y+h-pH], 
 [x-pW, y], [x-pW, y+h-pH] 
 ];
 }
 else if (preferredPos == "left") {
 coords = [
 [x-pW, y], [x-pW, y+h-pH], 
 [x+w, y], [x+w, y+h-pH], 
 [x, y+h], [x+w-pW, y+h], 
 [x, y-pH], [x+w-pW, y-pH] 
 ];
 }
 
 var maxArea = -1;
 var bestX = -1, bestY = -1;
 var _x, _y, _w, _h, _area;
 for (var i = 0; i < coords.length; i+=2) {
 _x = coords[i][0];
 _y = coords[i][1];
 var _xm = coords[i + 1][0], _ym = coords[i + 1][1];
 var _dx = (_x > _xm) ? -5 : 5;
 var _dy = (_y > _ym) ? -5 : 5;
  
 while (true) {
  
 if (_x >= docX)
 _w = Math.max(0, Math.min(docX + docW - _x, pW));
 else
 _w = Math.max(0, Math.min(_x + pW - docX, pW));
 if (_y >= docY)
 _h = Math.max(0, Math.min(docY + docH - _y, pH));
 else
 _h = Math.max(0, Math.min(_y + pH - docY, pH));
 _area = _w * _h;
 
 if (_area >= pArea) {
 bestX = _x;
 bestY = _y;
 maxArea = _area;
 break;
 }
 if (_area > maxArea) {
 bestX = _x;
 bestY = _y;
 maxArea = _area;
 }
  
 if (_x == _xm) {
 if (Math.abs(_y - _ym) <= Math.abs(_dy))
 break;
 _y += _dy;
 }
  
 else if (_y == _ym) {
 if (Math.abs(_x - _xm) <= Math.abs(_dx))
 break;
 _x += _dx;
 }
 else 
 break;
 }
 if (_area >= pArea) {
 break;
 }
 }
 _setAbsolutePosition(el, bestX, bestY);
}


 

function ScrollBar (o, s, ev) {
 var self = this;
 this._src = s;
 
 this.reset = function (scroller) {
  this._parent = o;
 this._src = scroller;
 this.eventHandler = ev ? ev : function () {};
  this._up = this._findComponent("scrollBarUp", this._parent);
 this._down = this._findComponent("scrollBarDown", this._parent);
 this._yTrack = this._findComponent("scrollBarTrack", this._parent);
 this._yHandle = this._findComponent("scrollBarHandle", this._yTrack);
  {
 var hh = this._yTrack.parentNode.offsetHeight;
 hh -= this._up ? this._up.offsetHeight : 0; 
 hh -= this._down ? this._down.offsetHeight: 0; 
 this._yTrack.style.height = hh + "px";
 }
 this._trackTop = findOffsetTop(this._yTrack);
 this._trackHeight = this._yTrack.offsetHeight;  with (this._yHandle.style) {
 top = "0px";
 left = "0px";
 height = Math.min(this._yTrack.offsetHeight,
 Math.max(30, this._trackHeight * this._src.getViewableHeight() / 
 Math.max(1, this._src.getTotalHeight()))) + "px";
 }
 this._handleHeight = this._yHandle.offsetHeight;
 this._x = 0;
 this._y = 0;
  this._scrollTimer = null;
 this._selectFunc = null;
 this._grabPoint = null;
 this._tempTarget = null;
 this._tempDistX = 0;
 this._tempDistY = 0;
 this._disabled = !this._src.isEnabled();
 this._ratio = (this._src.getTotalHeight() - this._src.getViewableHeight())/(this._trackHeight - this._handleHeight);
 
 this._yHandle.ondragstart = function () {return false;};
 this._yHandle.onmousedown = function () {return false;};
 this._removeEvent(this._parent, "mousedown", this._scrollbarClick);
 this._addEvent(this._parent, "mousedown", this._scrollbarClick);

 this._removeEvent(this._yHandle, "touchstart", this._scrollbarTStart); 
 this._addEvent(this._yHandle, "touchstart", this._scrollbarTStart); 
 self._removeEvent(self._yHandle, "touchmove", self._scrollbarTDrag);
 self._removeEvent(self._yHandle, "touchend", self._stopTScroll);
 self._addEvent(self._yHandle, "touchmove", this._scrollbarTDrag, false); 
 self._addEvent(self._yHandle, "touchend", self._stopTScroll, false); 
 
 
 
 if (this._src.getTotalHeight() <= this._src.getViewableHeight()) {
 this._disabled = true;
 this._yHandle.style.visibility = "hidden";
 } 
 else {
 this._disabled = this._disabled || false;
 this._yHandle.style.visibility = "visible";
 this._parent.style.visibility = "visible";
 }
 if (this._disabled) {
 _addClass(this._yTrack, "disabled");
 if (this._yHandle) _addClass(this._yHandle, "disabled");
 if (this._up) _addClass(this._up, "disabled");
 if (this._down) _addClass(this._down, "disabled");
 }
 else {
 _removeClass(this._yTrack, "disabled");
 if (this._yHandle) _removeClass(this._yHandle, "disabled");
 if (this._up) _removeClass(this._up, "disabled");
 if (this._down) _removeClass(this._down, "disabled");
 }
 
 };
 this._addEvent = function (o, t, f) {
 if (o.addEventListener) o.addEventListener(t, f, false);
 else if (o.attachEvent) o.attachEvent('on'+ t, f);
 else o['on'+ t] = f;
 };
 this._removeEvent = function (o, t, f) {
 if (o.removeEventListener) o.removeEventListener(t, f, false);
 else if (o.detachEvent) o.detachEvent('on'+ t, f);
 else o['on'+ t] = null;
 };
 this._findComponent = function (c, o) {
 var kids = o.childNodes;
 for (var i = 0; i < kids.length; i++) {
 if (kids[i].className && _hasClass(kids[i], c)) {
 return kids[i];
 }
 }
 };
  function findOffsetTop (o) {
 var t = 0;
 if (o.offsetParent) {
 while (o.offsetParent) {
 t += o.offsetTop;
 o = o.offsetParent;
 }
 }
 return t;
 };
 this._scrollbarClick = function (e) {
 if (self._disabled) return false;
 
 e = e ? e : event;
 if (!e.target) e.target = e.srcElement;
 
 if (e.target.className.indexOf("scrollBarUp") > -1) self._scrollUp(e);
 else if (e.target.className.indexOf("scrollBarDown") > -1) self._scrollDown(e);
 else if (e.target.className.indexOf("scrollBarTrack") > -1) self._scrollTrack(e);
 else if (e.target.className.indexOf("scrollBarHandle") > -1) self._scrollHandle(e);
 
 self._tempTarget = e.target;
 self._selectFunc = document.onselectstart;
 document.onselectstart = function () {return false;};
 
 self.eventHandler(e.target, "mousedown");
 self._addEvent(document, "mouseup", self._stopScroll, false);
 
 return false;
 };
 this._scrollbarDrag = function (e) {
 e = e ? e : event;
 var t = parseInt(self._yHandle.style.top);
 var v = e.clientY + document.body.scrollTop - self._trackTop;
 with (self._yHandle.style) {
 if (v >= self._trackHeight - self._handleHeight + self._grabPoint)
 top = self._trackHeight - self._handleHeight +"px";
 else if (v <= self._grabPoint) top = "0px";
 else top = v - self._grabPoint +"px";
 self._y = parseInt(top);
 }
 
 self._moveContent();
 };
 this._scrollbarWheel = function (e) {
 e = e ? e : event;
 var dir = 0;
 if (e.wheelDelta >= 120) dir = -1;
 if (e.wheelDelta <= -120) dir = 1;
 
 self.scrollBy(0, dir * 20);
 e.returnValue = false;
 };
 this._startScroll = function (x, y) {
 this._tempDistX = x;
 this._tempDistY = y;
 self.scrollBy(self._tempDistX, self._tempDistY); 
 this._scrollTimer = window.setInterval(function () {
 self.scrollBy(self._tempDistX, self._tempDistY); 
 }, 100);
 };
 this._stopScroll = function () {
 self._removeEvent(document, "mousemove", self._scrollbarDrag, false);
 self._removeEvent(document, "mouseup", self._stopScroll, false);
 
 if (self._selectFunc) document.onselectstart = self._selectFunc;
 else document.onselectstart = function () { return true; };
 
 if (self._scrollTimer) window.clearInterval(self._scrollTimer);
 self.eventHandler (self._tempTarget, "mouseup");

 self._moveContent();
 };
 this._scrollUp = function (e) {this._startScroll(0, -2);};
 this._scrollDown = function (e) {this._startScroll(0, 2);};
 this._scrollTrack = function (e) {
 var curY = e.clientY + document.body.scrollTop;
 var t = parseInt(self._yHandle.style.top);
 var yy = curY - this._trackTop - this._handleHeight/2;
  if (yy < t)
 self.scrollBy(0, -this._src.getViewableHeight()); 
 else
 self.scrollBy(0, this._src.getViewableHeight()); 
 };
 this._scrollHandle = function (e) {
 var curY = e.clientY + document.body.scrollTop;
 this._grabPoint = curY - findOffsetTop(this._yHandle);
 this._addEvent(document, "mousemove", this._scrollbarDrag, false);
 };
 this._scroll = function (x, y) {
 if (y > this._trackHeight - this._handleHeight) 
 y = this._trackHeight - this._handleHeight;
 if (y < 0) y = 0;
 
 this._yHandle.style.top = y +"px";
 this._y = y;
 
 this._moveContent();
 };
 this._moveContent = function () {
 this._src.scrollTo(0, Math.round(this._y * this._ratio));
 };
 
 this.scrollBy = function (x, y) {
 this._scroll(0, (Math.round(this._y * this._ratio)+ y)/this._ratio);
 };
 this.scrollTo = function (x, y) {
 if (this._src.getTotalHeight() <= this._src.getViewableHeight())
 return;
 this._scroll(0, y/this._ratio);
 };
 
 this._scrollbarTStart = function (e) {
 if (self._disabled) return false;
 
 e = e ? e : event;
 if (!e.target) e.target = e.srcElement;
 
 if (e.target.className.indexOf("scrollBarUp") > -1) return true;
 else if (e.target.className.indexOf("scrollBarDown") > -1) return true;
 else if (e.target.className.indexOf("scrollBarTrack") > -1) return true;
 else if (e.target.className.indexOf("scrollBarHandle") > -1) self._scrollTHandle(e);
 
 e.preventDefault();
 return false;
 };
 this._scrollbarTDrag = function (e) {
 e = e ? e : event;
 var t = parseInt(self._yHandle.style.top);
 var v = e.touches[0].clientY + document.body.scrollTop - self._trackTop;
 with (self._yHandle.style) {
 if (v >= self._trackHeight - self._handleHeight + self._grabPoint)
 top = self._trackHeight - self._handleHeight +"px";
 else if (v <= self._grabPoint) top = "0px";
 else top = v - self._grabPoint +"px";
 self._y = parseInt(top);
 }
 
 self._moveContent();
 e.preventDefault();
 return false;
 }
 this._stopTScroll = function (e) {
 e = e ? e : event;

 self._moveContent();
 e.preventDefault();
 return false;
 };
 this._scrollTHandle = function (e) {
 var curY = e.touches[0].clientY + document.body.scrollTop;
 this._grabPoint = curY - findOffsetTop(this._yHandle);
 };

 this.reset(s);
};


 
function _tinyMCEEvent(evt, ae) {
 return true;
}

function _tinyMCEChange(ae, b) {
 return true;
}

function _tinyMCEInit(ed) {
 if (tinyMCE.isGecko) {
 ed.getWin().addEventListener("blur", 
 function() {
 var ae = tinyMCE.activeEditor;
 ae.save();
 var id = ae.id;
 var ta = document.getElementById(id);
  
 var evt = { currentTarget : ta }; 
 _blur(evt);
 _validateIfChanged(evt);
 }, 
 false); 
 ed.getWin().addEventListener("focus", 
 function() {
 var ae = tinyMCE.activeEditor;
 var id = ae.id;
 var ta = document.getElementById(id);
 
 _focus({ currentTarget : ta });
 }, 
 false); 
 }
 else {
 ed.getWin().onblur = 
 function() {
 var ae = tinyMCE.activeEditor;
 ae.save();
 var id = ae.id;
 var ta = document.getElementById(id);
 
 var evt = { currentTarget : ta }; 
 _blur(evt);
 _validateIfChanged(evt);
 };
 ed.getWin().onfocus = 
 function() {
 var ae = tinyMCE.activeEditor;
 var id = ae.id;
 var ta = document.getElementById(id);
 
 _focus({ currentTarget : ta }); 
 };
 }
 return true;
}

 
var ivStyles;

if (document.querySelectorAll) {
 _ltrace("Using querySelectorAll()");
 ivStyles = {
 applying : false,
 list : new Array,

 register : function(sheet){
 ivStyles.list.push(sheet);
 },

 apply : function(from) {
 if (ivStyles.applying)
 return;
 ivStyles.applying = true;
 if (!from)
 from = document;
  for (var h = 0; sheet = ivStyles.list[h]; h++) {
 for (selector in sheet) {
 list = from.querySelectorAll(selector);
 if (!list) {
 continue;
 }
 for (i=0; element = list[i]; i++){
 sheet[selector](element);
 }
 }
 }
   ivStyles.applying = false;
  },
 
 clearCache : function() {
 }
 }

 this.cssQuery = function(selector, el) {
 if (!el)
 el = document;
 return el.querySelectorAll(selector);
 };
}
else {  _ltrace("Using cssQuery");
 ivStyles = {
 applying : false,
 list : new Array,

 register : function(sheet){
 ivStyles.list.push(sheet);
 },

 apply : function(from) {
 if (ivStyles.applying)
 return;
 ivStyles.applying = true;
  for (var h = 0; sheet = ivStyles.list[h]; h++) {
 for (selector in sheet) {
 list = cssQuery(selector, from);
 if (!list) {
 continue;
 }
 for (i=0; element = list[i]; i++){
 sheet[selector](element);
 }
 }
 }
   ivStyles.applying = false;
  },
 
 clearCache : function() {
 cssQuery.clearCache();
 }
 }

  

var cssQuery = function() {
var version = "2.0.2";


var $COMMA = /\s*,\s*/;
var cssQuery = function($selector, $$from) {
try {
	var $match = [];
	var $useCache = arguments.callee.caching && !$$from;
	var $base = ($$from) ? ($$from.constructor == Array) ? $$from : [$$from] : [document];
		var $$selectors = parseSelector($selector).split($COMMA), i;
	for (i = 0; i < $$selectors.length; i++) {
		$selector = _toStream($$selectors[i]);
		if (isMSIE && $selector.slice(0, 3).join("") == " *#") {
	$selector = $selector.slice(2);
	$$from = _msie_selectById([], $base, $selector[1]);
	} else $$from = $base;
		var j = 0, $token, $filter, $arguments, $cacheSelector = "";
	while (j < $selector.length) {
	$token = $selector[j++];
	$filter = $selector[j++];
	$cacheSelector += $token + $filter;
			$arguments = "";
	if ($selector[j] == "(") {
	while ($selector[j++] != ")" && j < $selector.length) {
	$arguments += $selector[j];
	}
	$arguments = $arguments.slice(0, -1);
	$cacheSelector += "(" + $arguments + ")";
	}
		$$from = ($useCache && cache[$cacheSelector]) ?
	cache[$cacheSelector] : select($$from, $token, $filter, $arguments);
	if ($useCache) cache[$cacheSelector] = $$from;
	}
	$match = $match.concat($$from);
	}
	delete cssQuery.error;
	return $match;
} catch ($error) {
	cssQuery.error = $error;
	return [];
}};


cssQuery.toString = function() {
	return "function cssQuery() {\n  [version " + version + "]\n}";
};

var cache = {};
cssQuery.caching = false;
cssQuery.clearCache = function($selector) {
	if ($selector) {
	$selector = _toStream($selector).join("");
	delete cache[$selector];
	} else cache = {};
};

var modules = {};
var loaded = false;
cssQuery.addModule = function($name, $script) {
	if (loaded) eval("$script=" + String($script));
	modules[$name] = new $script();;
};

cssQuery.valueOf = function($code) {
	return $code ? eval($code) : this;
};


var selectors = {};
var pseudoClasses = {};
var AttributeSelector = {match: /\[([\w-]+(\|[\w-]+)?)\s*(\W?=)?\s*([^\]]*)\]/};
var attributeSelectors = [];


selectors[" "] = function($results, $from, $tagName, $namespace) {
		var $element, i, j;
	for (i = 0; i < $from.length; i++) {
		var $subset = getElementsByTagName($from[i], $tagName, $namespace);
		for (j = 0; ($element = $subset[j]); j++) {
	if (thisElement($element) && compareNamespace($element, $namespace))
	$results.push($element);
	}
	}
};

selectors["#"] = function($results, $from, $id) {
		var $element, j;
	for (j = 0; ($element = $from[j]); j++) if ($element.id == $id) $results.push($element);
};

selectors["."] = function($results, $from, $className) {
		$className = new RegExp("(^|\\s)" + $className + "(\\s|$)");
		var $element, i;
	for (i = 0; ($element = $from[i]); i++)
	if ($className.test($element.className)) $results.push($element);
};

selectors[":"] = function($results, $from, $pseudoClass, $arguments) {
		var $test = pseudoClasses[$pseudoClass], $element, i;
		if ($test) for (i = 0; ($element = $from[i]); i++)
		if ($test($element, $arguments)) $results.push($element);
};


pseudoClasses["link"] = function($element) {
	var $document = getDocument($element);
	if ($document.links) for (var i = 0; i < $document.links.length; i++) {
	if ($document.links[i] == $element) return true;
	}
};

pseudoClasses["visited"] = function($element) {
	};


var thisElement = function($element) {
	return ($element && $element.nodeType == 1 && $element.tagName != "!") ? $element : null;
};

var previousElementSibling = function($element) {
	while ($element && ($element = $element.previousSibling) && !thisElement($element)) continue;
	return $element;
};

var nextElementSibling = function($element) {
	while ($element && ($element = $element.nextSibling) && !thisElement($element)) continue;
	return $element;
};

var firstElementChild = function($element) {
	return thisElement($element.firstChild) || nextElementSibling($element.firstChild);
};

var lastElementChild = function($element) {
	return thisElement($element.lastChild) || previousElementSibling($element.lastChild);
};

var childElements = function($element) {
	var $childElements = [];
	$element = firstElementChild($element);
	while ($element) {
	$childElements.push($element);
	$element = nextElementSibling($element);
	}
	return $childElements;
};



var isMSIE = true;

var isXML = function($element) {
	var $document = getDocument($element);
	return (typeof $document.mimeType == "unknown") ?
	/\.xml$/i.test($document.URL) :
	Boolean($document.mimeType == "XML Document");
};

var getDocument = function($element) {
	return $element.ownerDocument || $element.document;
};

var getElementsByTagName = function($element, $tagName) {
	return ($tagName == "*" && $element.all) ? $element.all : $element.getElementsByTagName($tagName);
};

var compareTagName = function($element, $tagName, $namespace) {
	if ($tagName == "*") return thisElement($element);
	if (!compareNamespace($element, $namespace)) return false;
	if (!isXML($element)) $tagName = $tagName.toUpperCase();
	return $element.tagName == $tagName;
};

var compareNamespace = function($element, $namespace) {
	return !$namespace || ($namespace == "*") || ($element.scopeName == $namespace);
};

var getTextContent = function($element) {
	return $element.innerText;
};

function _msie_selectById($results, $from, id) {
	var $match, i, j;
	for (i = 0; i < $from.length; i++) {
	if ($match = $from[i].all.item(id)) {
	if ($match.id == id) $results.push($match);
	else if ($match.length != null) {
	for (j = 0; j < $match.length; j++) {
	if ($match[j].id == id) $results.push($match[j]);
	}
	}
	}
	}
	return $results;
};

if (![].push) Array.prototype.push = function() {
	for (var i = 0; i < arguments.length; i++) {
	this[this.length] = arguments[i];
	}
	return this.length;
};


var $NAMESPACE = /\|/;
function select($$from, $token, $filter, $arguments) {
	if ($NAMESPACE.test($filter)) {
	$filter = $filter.split($NAMESPACE);
	$arguments = $filter[0];
	$filter = $filter[1];
	}
	var $results = [];
	if (selectors[$token]) {
	selectors[$token]($results, $$from, $filter, $arguments);
	}
	return $results;
};


var $STANDARD_SELECT = /^[^\s>+~]/;
var $$STREAM = /[\s#.:>+~()@]|[^\s#.:>+~()@]+/g;
function _toStream($selector) {
	if ($STANDARD_SELECT.test($selector)) $selector = " " + $selector;
	return $selector.match($$STREAM) || [];
};

var $WHITESPACE = /\s*([\s>+~(),]|^|$)\s*/g;
var $IMPLIED_ALL = /([\s>+~,]|[^(]\+|^)([#.:@])/g;
var parseSelector = function($selector) {
	return $selector
		.replace($WHITESPACE, "$1")
		.replace($IMPLIED_ALL, "$1*$2");
};

var Quote = {
	toString: function() {return "'"},
	match: /^('[^']*')|("[^"]*")$/,
	test: function($string) {
	return this.match.test($string);
	},
	add: function($string) {
	return this.test($string) ? $string : this + $string + this;
	},
	remove: function($string) {
	return this.test($string) ? $string.slice(1, -1) : $string;
	}
};

var getText = function($text) {
	return Quote.remove($text);
};

var $ESCAPE = /([\/()[\]?{}|*+-])/g;
function regEscape($string) {
	return $string.replace($ESCAPE, "\\$1");
};



loaded = true;


return cssQuery;

}(); 
 {
 

cssQuery.addModule("css-standard", function() { 


isMSIE = eval("false;/*@cc_on@if(@\x5fwin32)isMSIE=true@end@*/");

if (!isMSIE) {
	getElementsByTagName = function($element, $tagName, $namespace) {
	return $namespace ? $element.getElementsByTagNameNS("*", $tagName) :
	$element.getElementsByTagName($tagName);
	};

	compareNamespace = function($element, $namespace) {
	return !$namespace || ($namespace == "*") || ($element.prefix == $namespace);
	};

	isXML = document.contentType ? function($element) {
	return /xml/i.test(getDocument($element).contentType);
	} : function($element) {
	return getDocument($element).documentElement.tagName != "HTML";
	};

	getTextContent = function($element) {
		return $element.textContent || $element.innerText || _getTextContent($element);
	};

	function _getTextContent($element) {
	var $textContent = "", $node, i;
	for (i = 0; ($node = $element.childNodes[i]); i++) {
	switch ($node.nodeType) {
	case 11: 	case 1: $textContent += _getTextContent($node); break;
	case 3: $textContent += $node.nodeValue; break;
	}
	}
	return $textContent;
	};
}
}); 
 

cssQuery.addModule("css-level2", function() {


selectors[">"] = function($results, $from, $tagName, $namespace) {
	var $element, i, j;
	for (i = 0; i < $from.length; i++) {
	var $subset = childElements($from[i]);
	for (j = 0; ($element = $subset[j]); j++)
	if (compareTagName($element, $tagName, $namespace))
	$results.push($element);
	}
};

selectors["+"] = function($results, $from, $tagName, $namespace) {
	for (var i = 0; i < $from.length; i++) {
	var $element = nextElementSibling($from[i]);
	if ($element && compareTagName($element, $tagName, $namespace))
	$results.push($element);
	}
};

selectors["@"] = function($results, $from, $attributeSelectorID) {
	var $test = attributeSelectors[$attributeSelectorID].test;
	var $element, i;
	for (i = 0; ($element = $from[i]); i++)
	if ($test($element)) $results.push($element);
};


pseudoClasses["first-child"] = function($element) {
	return !previousElementSibling($element);
};

pseudoClasses["lang"] = function($element, $code) {
	$code = new RegExp("^" + $code, "i");
	while ($element && !$element.getAttribute("lang")) $element = $element.parentNode;
	return $element && $code.test($element.getAttribute("lang"));
};


AttributeSelector.NS_IE = /\\:/g;
AttributeSelector.PREFIX = "@";
AttributeSelector.tests = {};
AttributeSelector.replace = function($match, $attribute, $namespace, $compare, $value) {
	var $key = this.PREFIX + $match;
	if (!attributeSelectors[$key]) {
	$attribute = this.create($attribute, $compare || "", $value || "");
		attributeSelectors[$key] = $attribute;
	attributeSelectors.push($attribute);
	}
	return attributeSelectors[$key].id;
};
AttributeSelector.parse = function($selector) {
	$selector = $selector.replace(this.NS_IE, "|");
	var $match;
	while ($match = $selector.match(this.match)) {
	var $replace = this.replace($match[0], $match[1], $match[2], $match[3], $match[4]);
	$selector = $selector.replace(this.match, $replace);
	}
	return $selector;
};
AttributeSelector.create = function($propertyName, $test, $value) {
	var $attributeSelector = {};
	$attributeSelector.id = this.PREFIX + attributeSelectors.length;
	$attributeSelector.name = $propertyName;
	$test = this.tests[$test];
	$test = $test ? $test(this.getAttribute($propertyName), getText($value)) : false;
	$attributeSelector.test = new Function("e", "return " + $test);
	return $attributeSelector;
};
AttributeSelector.getAttribute = function($name) {
	switch ($name.toLowerCase()) {
	case "id":
	return "e.id";
	case "class":
	return "e.className";
	case "for":
	return "e.htmlFor";
	case "href":
	if (isMSIE) {
				return "String((e.outerHTML.match(/href=\\x22?([^\\s\\x22]*)\\x22?/)||[])[1]||'')";
	}
	}
	return "e.getAttribute('" + $name.replace($NAMESPACE, ":") + "')";
};


AttributeSelector.tests[""] = function($attribute) {
	return $attribute;
};

AttributeSelector.tests["="] = function($attribute, $value) {
	return $attribute + "==" + Quote.add($value);
};

AttributeSelector.tests["~="] = function($attribute, $value) {
	return "/(^| )" + regEscape($value) + "( |$)/.test(" + $attribute + ")";
};

AttributeSelector.tests["|="] = function($attribute, $value) {
	return "/^" + regEscape($value) + "(-|$)/.test(" + $attribute + ")";
};


var _parseSelector = parseSelector;
parseSelector = function($selector) {
	return _parseSelector(AttributeSelector.parse($selector));
};

}); 
 



cssQuery.addModule("css-level3", function() {


selectors["~"] = function($results, $from, $tagName, $namespace) {
	var $element, i;
	for (i = 0; ($element = $from[i]); i++) {
	while ($element = nextElementSibling($element)) {
	if (compareTagName($element, $tagName, $namespace))
	$results.push($element);
	}
	}
};



pseudoClasses["contains"] = function($element, $text) {
	$text = new RegExp(regEscape(getText($text)));
	return $text.test(getTextContent($element));
};

pseudoClasses["root"] = function($element) {
	return $element == getDocument($element).documentElement;
};

pseudoClasses["empty"] = function($element) {
	var $node, i;
	for (i = 0; ($node = $element.childNodes[i]); i++) {
	if (thisElement($node) || $node.nodeType == 3) return false;
	}
	return true;
};

pseudoClasses["last-child"] = function($element) {
	return !nextElementSibling($element);
};

pseudoClasses["only-child"] = function($element) {
	$element = $element.parentNode;
	return firstElementChild($element) == lastElementChild($element);
};

pseudoClasses["not"] = function($element, $selector) {
	var $negated = cssQuery($selector, getDocument($element));
	for (var i = 0; i < $negated.length; i++) {
	if ($negated[i] == $element) return false;
	}
	return true;
};

pseudoClasses["nth-child"] = function($element, $arguments) {
	return nthChild($element, $arguments, previousElementSibling);
};

pseudoClasses["nth-last-child"] = function($element, $arguments) {
	return nthChild($element, $arguments, nextElementSibling);
};

pseudoClasses["target"] = function($element) {
	return $element.id == location.hash.slice(1);
};


pseudoClasses["checked"] = function($element) {
	return $element.checked;
};

pseudoClasses["enabled"] = function($element) {
	return $element.disabled === false;
};

pseudoClasses["disabled"] = function($element) {
	return $element.disabled;
};

pseudoClasses["indeterminate"] = function($element) {
	return $element.indeterminate;
};


AttributeSelector.tests["^="] = function($attribute, $value) {
	return "/^" + regEscape($value) + "/.test(" + $attribute + ")";
};

AttributeSelector.tests["$="] = function($attribute, $value) {
	return "/" + regEscape($value) + "$/.test(" + $attribute + ")";
};

AttributeSelector.tests["*="] = function($attribute, $value) {
	return "/" + regEscape($value) + "/.test(" + $attribute + ")";
};


function nthChild($element, $arguments, $traverse) {
	switch ($arguments) {
	case "n": return true;
	case "even": $arguments = "2n"; break;
	case "odd": $arguments = "2n+1";
	}

	var $$children = childElements($element.parentNode);
	function _checkIndex($index) {
	var $index = ($traverse == nextElementSibling) ? $$children.length - $index : $index - 1;
	return $$children[$index] == $element;
	};

		if (!isNaN($arguments)) return _checkIndex($arguments);

	$arguments = $arguments.split("n");
	var $multiplier = parseInt($arguments[0]);
	var $step = parseInt($arguments[1]);

	if ((isNaN($multiplier) || $multiplier == 1) && $step == 0) return true;
	if ($multiplier == 0 && !isNaN($step)) return _checkIndex($step);
	if (isNaN($step)) $step = 0;

	var $count = 1;
	while ($element = $traverse($element)) $count++;

	if (isNaN($multiplier) || $multiplier == 1)
	return ($traverse == nextElementSibling) ? ($count <= $step) : ($step >= $count);

	return ($count % $multiplier) == $step;
};

}); 
 }

 cssQuery.caching = true;
 this.cssQuery = cssQuery;
}



}

