/**
 * MODALDIALOG FUNCTIONS -
 *
 * @require ../css/ModalDialog.css
 * @require ../css/mask.png
 *
 */

function $(strDIVName) {
	return document.getElementById(strDIVName);
}

/**
 * X-browser event handler attachment and detachment
 * TH: Switched first true to false per http://www.onlinetools.org/articles/unobtrusivejavascript/chapter4.html
 *
 * @argument obj - the object to attach event to
 * @argument evType - name of the event - DONT ADD "on", pass only "mouseover", etc
 * @argument fn - function to call
 */
function addEvent(obj, evType, fn){
 if (obj.addEventListener){
    obj.addEventListener(evType, fn, false);
    return true;
 } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
 } else {
    return false;
 }
}
function removeEvent(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent){
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
}

// GLOBAL VARIABLES
var glCurrentZIndex = 0;
var garrstrTabbableTags = new Array("A", "BUTTON", "TEXTAREA", "INPUT", "IFRAME");
var garrbDisabledTags = new Array();
var garrwinParent = new Array();
var gdivCurrentModalDialog = null;
var gifrCurrentFrame = null;
var glInitialX = -1;
var glInitialY = -1;
var gW3C = (document.getElementById) ? true : false;
var gNS4 = (document.layers) ? true : false;
var gIE5 = (gW3C && document.all) ? true : false;
var gNS6 = (gW3C && !document.all) ? true: false;
var gOP7 = (window.opera && document.createComment) ? true : false;

/**
 * Code below taken from -
 * http://www.evolt.org/article/document_body_doctype_switching_and_more/17/30655/
 *
 * Modified 4/22/04 to work with Opera/Moz (by webmaster at subimage dot com)
 *
 * Gets the full width/height because it's different for most browsers.
 */
function getViewportHeight() {
    if (window.innerHeight!=window.undefined) {
	return window.innerHeight;
    }
    if (document.compatMode == 'CSS1Compat') {
        return document.documentElement.clientHeight;
    }
    if (document.body) {
        return document.body.clientHeight; 
    }
    return window.undefined; 
}

function getViewportWidth() {
    if (window.innerWidth != window.undefined) {
        return window.innerWidth; 
    }
    if (document.compatMode == 'CSS1Compat') {
        return document.documentElement.clientWidth;
    }
    if (document.body) {
        return document.body.clientWidth; 
    }
    return window.undefined; 
}

/**
 * disableElements
 */
function disableElements() {
    var docCurrentDocument = window.document;

    if (garrwinParent[glCurrentZIndex]) {
        docCurrentDocument = garrwinParent[glCurrentZIndex].document;
    }

    delete garrbDisabledTags[glCurrentZIndex];
    garrbDisabledTags[glCurrentZIndex] = new Array()

    for (var i = 0; i < garrstrTabbableTags.length; i++) {
	var arrtagElements
	        = docCurrentDocument.getElementsByTagName(garrstrTabbableTags[i]);
	for (var j = 0 ; j < arrtagElements.length; j++) {
  	    garrbDisabledTags[glCurrentZIndex][i + j] = arrtagElements[j].disabled;
      	    arrtagElements[j].disabled = true;
	}
    }
}

function enableElements() {
    var docCurrentDocument = window.document;
    
    if (garrwinParent[glCurrentZIndex]) {
        docCurrentDocument = garrwinParent[glCurrentZIndex].document;
    }

    for (var i = 0; i < garrstrTabbableTags.length; i++) {
	var arrtagElements
	        = docCurrentDocument.getElementsByTagName(garrstrTabbableTags[i]);	
	for (var j = 0 ; j < arrtagElements.length; j++) {	    
	    arrtagElements[j].disabled = garrbDisabledTags[glCurrentZIndex][i + j];
	}
    }
}

/**
 * hideMainIFrame - Ekrandaki iframe kontrollerini
 * gizler. Opera tarayicilar icin
 *
 * @return void
 */
function hideMainIFrame() {
    if (garrwinParent[glCurrentZIndex]
            && ("PopupFrame" + (glCurrentZIndex - 1))
	    == garrwinParent[glCurrentZIndex].name) {
         
	 ifrFrame = $(garrwinParent[glCurrentZIndex].name);
	 
	 if (ifrFrame) {
	     ifrFrame.style.display = "none";
	 }
    }
}

/**
 * showMainIFrame - Onceden gizlenmis iframe kontrollerini
 * gosterir
 *
 * @return void
 */
function showMainIFrame() {
    if (garrwinParent[glCurrentZIndex]
            && ("PopupFrame" + (glCurrentZIndex - 1))
	    == garrwinParent[glCurrentZIndex].name) {
         
	 ifrFrame = $(garrwinParent[glCurrentZIndex].name);
	 
	 if (ifrFrame) {
	     ifrFrame.style.display = "block";
	 }
    }
}

/**
 * hideSelectBoxes - Ekrandaki combobox kontrollerini
 * gizler
 *
 * @return void
 */
function hideSelectBoxes() {
    var i = 0;
    var docCurrentDocument = window.document;
    
    if (garrwinParent[glCurrentZIndex]) {
        docCurrentDocument = garrwinParent[glCurrentZIndex].document;
    }

    selControl = docCurrentDocument.getElementsByTagName('SELECT')[i];
    
    while (selControl != null) {
        i++;    
        selControl.style.visibility="hidden";
	selControl = docCurrentDocument.getElementsByTagName('SELECT')[i];
    }
}

/**
 * showSelectBoxes - Onceden gizlenmis olan combobox
 * kontrollerini gosterir
 *
 * @return void
 */
function showSelectBoxes() {
    var i = 0;
    var docCurrentDocument = window.document;
    
    if (garrwinParent[glCurrentZIndex]) {
        docCurrentDocument = garrwinParent[glCurrentZIndex].document;
    }

    selControl = docCurrentDocument.getElementsByTagName('SELECT')[i];
    
    while (selControl != null) {
        i++;    
        selControl.style.visibility="visible";
	selControl = docCurrentDocument.getElementsByTagName('SELECT')[i];
    }
}

function showScreenMask() {
    eleBody = document.getElementsByTagName('body')[0];
	divMask = $("divScreenMask" + glCurrentZIndex);
	
	if (!divMask) {
		divMask = document.createElement("div");
    	divMask.id = "divScreenMask" + glCurrentZIndex;
    	divMask.className = "divResultsScreenMask";
		divMask.style.display = "none";
		divMask.style.visibility = "hidden";
    	eleBody.appendChild(divMask);
	}
	
	resizeScreenMask();
}

/**
 * hideScreenMask - Ekran uzerine olusturulan saydam ortuyu
 * kaldirir
 *
 * @return void
 */
function hideScreenMask() {
    eleBody = document.getElementsByTagName('body')[0];
    divMask = $("divScreenMask" + glCurrentZIndex);

    if (eleBody && divMask) {
        eleBody.removeChild(divMask);
    }
}

function resizeScreenMask() {
    var eleBody = document.getElementsByTagName('body')[0];
	divMask = $("divScreenMask" + glCurrentZIndex);

	if (!divMask) {
		return;
	} // if (!divMask) {
	
    divMask.style.left = 0 + "px";
    divMask.style.top = 0 + "px";
	divMask.style.height = getPageHeightWithScroll() + "px";
	divMask.style.width = (getPageWidthWithScroll() - ((!gIE5) ? 16 : 0)) + "px";
	divMask.style.display = "block";
	divMask.style.visibility = "visible";
}

function getPageWidthWithScroll() {
	if (window.innerHeight && window.scrollMaxY) {
		// Firefox
		xWithScroll = window.innerWidth + window.scrollMaxX;
		
		if (window.scrollMaxY > window.innerHeight) {
			// Scrollbar genisligini azalt
			xWithScroll -= 17;
		} // if (window.scrollMaxY > window.innerHeight) {
	} else if (document.body.scrollHeight > document.body.offsetHeight) {
		// all but Explorer Mac
		xWithScroll = document.body.scrollWidth;
	} else {
		// works in Explorer 6 Strict, Mozilla (not FF) and Safari
		xWithScroll = document.body.offsetWidth;
	} // if (window.innerHeight && window.scrollMaxY) {
	
	return xWithScroll;
} 

function getPageHeightWithScroll() {
	if (window.innerHeight && window.scrollMaxY) {
		// Firefox
		yWithScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight) {
		// all but Explorer Mac
		yWithScroll = document.body.scrollHeight;
	} else {
		// works in Explorer 6 Strict, Mozilla (not FF) and Safari
		yWithScroll = document.body.offsetHeight;
	} // if (window.innerHeight && window.scrollMaxY) {
		
	return yWithScroll;
}

/**
 * initializeModalDialog - Modal formunu gostermek
 * icin gerekli temel islemleri gerceklestirir
 *
 * @param winParent [window][in]: Parent window
 *
 * @return void
 */
function initializeModalDialog(winParent) {
    glCurrentZIndex++;
    
    garrwinParent[glCurrentZIndex] = winParent;

    // Ekrani %100 kaplamis bir div goster.
    showScreenMask();
    
    hideSelectBoxes();
    
    if (gOP7) {
        hideMainIFrame();
    }
    
    disableElements();
    
    addEvent(window, "resize", resizeScreenMask);
    addEvent(window, "resize", moveModalDialog);
    addEvent(window, "scroll", resizeScreenMask);
    addEvent(window, "scroll", moveModalDialog);
}

/**
 * finalizeModalDialog - Modal formu kapatildiktan
 * sonraki islemleri gerceklestirir
 *
 * @return void
 */
function finalizeModalDialog() {
    removeEvent(window, "resize", resizeScreenMask, true);
    removeEvent(window, "scroll", resizeScreenMask, true);
    removeEvent(window, "resize", moveModalDialog, true);
    removeEvent(window, "scroll", moveModalDialog, true);

    enableElements();
    showSelectBoxes();
    
    if (gOP7) {
        showMainIFrame();
    }
    
    hideScreenMask();

    glCurrentZIndex--;
}

/**
 * createModalDialog - Modal formunda bir form yaratir.
 *
 * @param strCaption: Form basligi
 * @param strURL: Pencerenin gosterecegi adres
 * @param lLeft: Pencerenin sagdan konumu
 * @param lTop: Pencerenin ustten konumu
 * @param lWidth: Pencerenin genisligi
 * @param lHeight: Pencerenin yuksekligi
 *
 * @return Yaratilan Modal dialog div referansi
 * dondurulur
 */
function createModalDialog(strCaption, strURL, lLeft, lTop, lWidth, lHeight) {
    eleBody = document.getElementsByTagName('body')[0];
    divModalDialog = document.createElement('div');
    divModalDialog.id = "divModalDialog" + glCurrentZIndex;
    divModalDialog.className = "divModalDialog";
    
    divModalDialog.style.left = lLeft;
    divModalDialog.style.top = lTop;
    divModalDialog.style.width = lWidth;
    divModalDialog.style.height = lHeight;    

    // Baslik degeri 35 karakterden uzunsa 35 karaktere
    // ... koyarak tamamla
    if (strCaption.length > 35) {
        strCaption = strCaption.substring(0, 32) + "...";
    }

    divModalDialog.innerHTML = "<table "
            + " border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"tableModalDialogOuter\">"
            + "<tr>"
            + "<td class=\"tdModalDialogHeader\"><table width=\"100%\" border=\"0\""
            + " cellpadding=\"0\" cellspacing=\"0\" class=\"tableModalDialogTitle\">"
            + "<tr>"
            + "<td class=\"tdModalDialogTitle\">" + strCaption + "</td>"
            + "<td class=\"tdModalDialogDialogButtons\">"
	    + "<button class=\"buttonClose\" onclick=\"closeModalDialog();\"></button>"
	    + "</td>"
            + "</tr>"
            + "</table></td>"
            + "</tr>"
            + "<tr>"
            + "<td class=\"tdModalDialogContent\"><iframe class=\"iframeModalDialogContent\""
            + " src=\"" + strURL + "\" style=\"width:100%;height:100%;\""
            + " scrolling=\"auto\" frameborder=\"0\" id=\"ifrFrame"
	    + glCurrentZIndex
            + "\" name=\"PopupFrame" + glCurrentZIndex
	    + "\" width=\"100%\" height=\"100%\">&nbsp;</iframe>"
            + "</td>"
            + "</tr>"
            + "</table>";
	
    eleBody.appendChild(divModalDialog);

    return divModalDialog;    
}

/**
 * destroyModalDialog - Son yaratilmis olan formu yok eder.
 *
 * @return void
 */
function destroyModalDialog() {
    eleBody = document.getElementsByTagName('body')[0];
    divModalDialog = $("divModalDialog" + glCurrentZIndex);
    
    if (eleBody && divModalDialog) {    
        eleBody.removeChild(divModalDialog);
    }
}

/**
 * showModalDialog - Modal formunda bir form gosterir.
 *
 * @param winParent [window][in]: Parent window
 * @param strCaption [String][in]: Form basligi
 * @param strURL [String][in]: Pencerenin gosterecegi adres
 * @param lLeft [long][in]: Pencerenin sagdan konumu
 * @param lTop [long][in]: Pencerenin ustten konumu
 * @param lWidth [long][in]: Pencerenin genisligi
 * @param lHeight [long][in]: Pencerenin yuksekligi
 *
 * @return void
 */
 
 
function getScrollTop() {
	return (window.pageYOffset
			|| (document.documentElement && document.documentElement.scrollTop)
			|| document.body.scrollTop || 0);
}
 
function getScrollLeft() {
	return (window.pageXOffset
			|| (document.documentElement && document.documentElement.scrollLeft)
			|| document.body.scrollLeft || 0);
}

function moveModalDialog() {	
	if (gdivCurrentModalDialog) {
		lLeft = ((getViewportWidth() - gdivCurrentModalDialog.offsetWidth) / 2) + getScrollLeft();
		lTop = ((getViewportHeight() - gdivCurrentModalDialog.offsetHeight) / 2) + getScrollTop();

		gdivCurrentModalDialog.style.left = lLeft + "px";
		gdivCurrentModalDialog.style.top = lTop + "px";
	}
}

function showModalDialog(winParent, strCaption, strURL, lLeft, lTop, lWidth, lHeight) {
    initializeModalDialog(winParent);
	
	lLeft = ((getViewportWidth() - lWidth) / 2) + getScrollLeft();
	lTop = ((getViewportHeight() - lHeight) / 2) + getScrollTop();
	
    divModalDialog = createModalDialog(strCaption, strURL, lLeft, lTop, lWidth, lHeight);
    
    divModalDialog.style.display = "block";
	divModalDialog.focus();
	gdivCurrentModalDialog = divModalDialog;
}

/**
 * showModalDialog - Modal formunda bir form gosterir.
 *
 * @param strURL: Pencerenin gosterecegi adres
 * @param lLeft: Pencerenin sagdan konumu
 * @param lTop: Pencerenin ustten konumu
 * @param lWidth: Pencerenin genisligi
 * @param lHeight: Pencerenin yuksekligi
 *
 * @return void
 */
function closeModalDialog() {
    destroyModalDialog();
    finalizeModalDialog();
}

/**
 * refreshCurrentModalDialog - Mevcut modal
 * dialog u yeniler
 *
 * @return void
 */
function refreshCurrentModalDialog(strCallbackFunctionName) {
	// Mevcut formu yenile
    ifrModalFrame
			= $("ifrFrame" + glCurrentZIndex);

	if (ifrModalFrame) {
		if (strCallbackFunctionName != "") {
			eval("ifrModalFrame.contentWindow."
					+ strCallbackFunctionName);
		} else {
			ifrModalFrame.contentWindow.history.go(0);
			ifrModalFrame.contentWindow.focus();
		}
	} else {
		if (strCallbackFunctionName != "") {
			eval("window." + strCallbackFunctionName);
		} else {
			window.history.go(0);
			window.focus();
		}
	}
}