/*  Grape JavaScript - part of GrapeWebUI, version 2.0
 *  (c) 2006 Grape Informatika Marton Gerlei, Ákos Dobóczy
 *--------------------------------------------------------------------------*/


/// send control values of one form in one userconrtrol
/// and get response as full refreshed replacement of
/// the usercontrol (innerHTML)
/// - formControls: a dynamically created array of control names on the form
/// - userControlToRefresh: name of the userconrtrol area (div)
/// - whichForm: name of the form we are refreshing
/// - action: action to execute (like "save")
/// - differentUserControlToRender: an another UserControl name, if we want to render a different control to replace userControlToRefresh
/// - buttonID: save button ID
/// - disabledButtonID: the disabled button ID (disabled image)
/// - causesValidation (optional): is validation needed (default will validate)
/// - validationGroup (optional): validationGroup (default is '')
// MEGAHACK
// TODO
// ha a callback method meg van adva, akkor azt hivja, nem az ajaxSendComplete-t. 
function ajaxSend(formControls, userControlToRefresh, whichForm, action, customAction, differentUserControlToRender, buttonID, causesValidation, validationGroup, callbackMethod)
{
    for (var i = 0; i < formControls.length; i++)
    {
		control = $(formControls[i]);
		if (control && typeof(control.beforeSerialize) == 'function') control.beforeSerialize();
    }

   //asp.net validation on client side
    if (typeof(causesValidation) == 'undefined' || causesValidation)
    {
	    if ((typeof(validationGroup) == "undefined") || (validationGroup == null))
	        validationGroup = '';

        if (typeof(Page_ClientValidate) == 'function' && Page_ClientValidate(validationGroup) == false)
            return false;

        var hidValidationGroup = $(userControlToRefresh.replace('$', '_') + '_hidValidationGroup');
        if (hidValidationGroup) hidValidationGroup.value = validationGroup;
    }

    disabledButtonID = buttonID + "Disabled";
    if(buttonID != undefined && $(disabledButtonID) != undefined)
    {
        $(buttonID).src = $(disabledButtonID).src;
    }
    if (buttonID && $(buttonID))
    {
        if ($(buttonID).className && $(buttonID).className.length > 0)
            $(buttonID).className += " ";
        else
            $(buttonID).className += "";
        $(buttonID).className += "disabled";
        $(buttonID).disabled = true;
    }

    var formStrings = new Array(formControls.length);

    for (var i = 0; i < formControls.length; i++)
    {
		element = $(formControls[i]);
		try{ element.disabled = true; } catch(e) {}      

		if (element && element.tagName != 'undefined')
		{
			formStrings[i] = Form.Element.serialize(formControls[i]);
			if (formStrings[i].length == 0)
			{
			    formStrings[i] = encodeURIComponent(element.name) + '=';
            }
        }
    }

    // ajaxpro call, ajax proxy is rendered dynamically
    if ( callbackMethod ) {
        Grape.WebUI.GrapeUserControlBase.AjaxProcessSerializedForm(formStrings, userControlToRefresh, whichForm, action, customAction, differentUserControlToRender, callbackMethod, ajaxTimeOut);
    } else {
        Grape.WebUI.GrapeUserControlBase.AjaxProcessSerializedForm(formStrings, userControlToRefresh, whichForm, action, customAction, differentUserControlToRender, ajaxSendComplete, ajaxTimeOut);
    }

// TODO ha nem sikerül a küldés (mert pl. nem valid az oldal), akkor return false, egyébként return true

    return false; // returning false to stop .net buttons postback
}

function ajaxTimeOut(ms, req)
{
    alert('Ajax call takes too long.');
    return false;
}

function ajaxSendComplete(ret)
{
    if (ret.error && ret.error.Message) {
        // TODO send error / help / error management
        alert("Ajax or application error: " + ret.error.Message);
    }
    else if (ret.value.substring(0, 10) == "$redirect:") {
        window.location = ret.value.substring(10);
    }
    else if (ret.value.substring(0, 11) == "$controlid:") {
        firstRowEndIndex = ret.value.indexOf('\r\n') + 2;
        userControlToRefresh = ret.value.substring(11, firstRowEndIndex - 2);
        retValue = ret.value.substring(firstRowEndIndex);

        if (retValue.substring(0, 7) == "$error:") {
            $(userControlToRefresh).innerHTML = $(userControlToRefresh).innerHTML + "<a href='#error'></a><div id='error' class='error'>" + retValue.substring(7) + "</div>";
            window.location.hash = 'error';
        }
        else {
            $(userControlToRefresh).innerHTML = retValue;
            _onLoadAfterAjaxRenderPA = new Array();
            $(userControlToRefresh).innerHTML.evalScripts();
        }
    }
}

function GrapeLoadPage(pageName, parameters, target)
{
    if(typeof loadPageMode == 'undefined' || loadPageMode != "ajax")
    {
        NormalLoadpage(pageName, parameters);
    }
    else
        ajaxLoadPage(pageName, parameters, target);
}

function NormalLoadpage(pageName, parameters)
{
    // TODO get frienly page name from a definition...
    url = window.location.protocol + "//" + window.location.host + Root + "/Default.aspx?page=" + pageName;
    if (parameters != '')
        url = url + '&' + parameters;
    window.location = url;
}

function ajaxLoadPage(pageName, parameters, target)
{
    if(target == undefined)
        target = "holder"

    var ret = Grape.WebUI.GrapeUserControlCustom.ajaxLoadPage(pageName, parameters);
    
    // TODO err handling
    if(ret.value != null)
        ret.value.evalScripts();
    
    $(target).innerHTML = ret.value;
}

var _onLoadAfterAjaxRenderPA;
function OnLoadAfterAjaxRender()
{
    //if the page registered _onLoadAfterAjaxRenderPA variable,
    // call the pointers in that pointer array
    if(_onLoadAfterAjaxRenderPA.length > 0)
    {
        for (i = 0; i < _onLoadAfterAjaxRenderPA.length; i++)
        {
            _onLoadAfterAjaxRenderPA[i]();
        }
    }
}

function RegisterAfterAjaxRender(p)
{
    //alert(_onLoadAfterAjaxRenderPA.length);
    _onLoadAfterAjaxRenderPA[_onLoadAfterAjaxRenderPA.length] = p;
}

//hide/display element
function toggleDisplay(objid){
    var obj = document.getElementById(objid);
    if (obj.style.display == '' || obj.style.display == 'none'){
        obj.style.display = 'block';
    } else {
        obj.style.display = 'none';
    }
}

function disableEnterKey(e)
{
     var key;

     if(window.event)
          key = window.event.keyCode;
     else
          key = e.which;

     if(key == 13)
          return false;
     else
          return true;
}

function isEnter(e)
{
     var key;

     if(window.event)
          key = window.event.keyCode;
     else
          key = e.which;

     if(key == 13)
          return true;
     else
          return false;
}

function setSelectedItemOnDropDown(control, selectValue)
{
    valueFound = false;
    for (iOptions = 0; iOptions < control.options.length; iOptions++)
        if (control.options[iOptions].value == selectValue)
        {
            control.selectedIndex = iOptions;
            valueFound = true;
            break;
        }
    if (!valueFound) for (iOptions = 0; iOptions < control.options.length; iOptions++)
        if (control.options[iOptions].text == selectValue)
        {
            control.selectedIndex = iOptions;
            break;
        }
}

function fillUpSelect(selectObject, list, isNullable)
{
    var oldValue;
    if (selectObject.selectedIndex > -1)
        oldValue = selectObject.options[selectObject.selectedIndex].value;

    while (selectObject.length > 0)
    {
        selectObject.removeChild(selectObject.options[selectObject.length - 1]);
    }

    if (isNullable) { selectObject.options[0] = new Option('', ''); hasToAdd = 1; }
    else hasToAdd = 0;
    for (iOption = 0; iOption < list.length; iOption++)
    {
        selectObject.options[iOption + hasToAdd] = new Option(list[iOption][1], list[iOption][0]);
        if (list[iOption][0] == oldValue)
            selectObject.selectedIndex = iOption + hasToAdd;
    }

    return (list.length > 0);
}

// ------------------------- Validator helper functions -------------------------
function Validator_Disable(validator)
{
    validator.enabled = false;
    validator.isvalid = true;
    if (typeof(myValidatorUpdateDisplay) == 'function') myValidatorUpdateDisplay(validator);
    ValidatorUpdateDisplay(validator);
    ValidatorUpdateIsValid();
}

function Validator_Enable(validator)
{
    validator.enabled = true;
    var result;
    if (typeof(validator.oldFunction) == 'function') result = validator.oldFunction(validator);
    else result = validator.evaluationfunction(validator);
    validator.isvalid = result;
    ValidatorUpdateIsValid();
}

function RegularExpressionValidateControl(controlidtovalidate, pattern, validateempty)
{
    validateempty = (typeof(RegularExpressionValidateControl.arguments[2])=='undefined')
                        ? false : RegularExpressionValidateControl.arguments[2];
    var value = ValidatorGetValue(controlidtovalidate);
    if (!validateempty && ValidatorTrim(value).length == 0)
        return true;
    var rx = new RegExp(pattern);
    var matches = rx.exec(value);
    return (matches != null && value == matches[0]);
}

function RequiredFieldValidateControl(controlidtovalidate, initialvalue)
{
    initialvalue = (typeof(RequiredFieldValidateControl.arguments[1])=='undefined')
                        ? '' : RequiredFieldValidateControl.arguments[1];
    return (ValidatorTrim(ValidatorGetValue(controlidtovalidate)) != ValidatorTrim(initialvalue));
}

function executeValidatorsOfControl(control)
{
    var vals;
    try { vals=control.Validators; if (vals.length < 1) return; } catch (e) { return; }
    var i;

    for (i = 0; i < vals.length; i++)
    {
        ValidatorValidate(vals[i]);
    }
    ValidatorUpdateIsValid();
}

function blockValidatorsOfControl(control)
{
    var vals;
    try { vals=control.Validators; if (vals.length < 1) return; } catch (e) { return; }
    var i;

    for (i = 0; i < vals.length; i++)
    {
        Validator_Disable(vals[i]);
    }
}
function unblockValidatorsOfControl(control)
{
    var vals;
    try { vals=control.Validators; if (vals.length < 1) return; } catch (e) { return; }
    var i;

    for (i = 0; i < vals.length; i++)
    {
        Validator_Enable(vals[i]);
    }
}
// -------------------------- Validator custom display --------------------------
function AddValidatingEvents()
{
    try { if (!Page_Validators) return; } catch (e) { return; }

    for (iValidators=0; iValidators<Page_Validators.length; iValidators++)
    {
        Page_Validators[iValidators].oldFunction = Page_Validators[iValidators].evaluationfunction;
        Page_Validators[iValidators].evaluationfunction = function (validator)
            {
                var result = validator.oldFunction(validator);
                validator.isvalid = result;
                if (!validator.isvalid && typeof(validator.focusOnError) == 'string' && validator.focusOnError == 't'
                      && document.getElementById(validator.controltovalidate).nodeName.toLowerCase() == 'span')
                {
                    var radioButtons = document.getElementById(validator.controltovalidate).getElementsByTagName('input');
                    if (radioButtons.length > 0) { radioButtons[0].focus(); radioButtons[0].blur(); }
                }
                myValidatorUpdateDisplay(validator);
                return result;
            }
    }
}

function myValidatorUpdateDisplay(validatorToUpdate)
{
    if (!validatorToUpdate.parentNode) return;
    var divIsValid = true;
    var validators = validatorToUpdate.parentNode.getElementsByTagName("span");
    for (iVal=0; iVal<validators.length; iVal++)
    {
        if ((typeof(validators[iVal].enabled) == 'undefined' || validators[iVal].enabled))
        {
            if (!validators[iVal].isvalid) { divIsValid = false; break; }
        }
    }

    if (!divIsValid)
        showError(validatorToUpdate.id);
    else
        hideError(validatorToUpdate.id);
}


function getObjCoords(obj) 
{   
    var newObj = new Object();
    newObj.y = 0;
    newObj.x = 0;
    if ( obj ) {
      newObj.x = obj.offsetLeft;
      newObj.y = obj.offsetTop;
      theParent = obj.offsetParent;
      while(theParent != null)
      {
        newObj.y += theParent.offsetTop;
        newObj.x += theParent.offsetLeft;
        theParent = theParent.offsetParent;
      }
    }  
    return newObj;
}

//http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html

function addEvent( obj, type, fn )
{
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else if (obj.attachEvent)
	{
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}

function removeEvent( obj, type, fn )
{
	if (obj.removeEventListener)
		obj.removeEventListener( type, fn, false );
	else if (obj.detachEvent)
	{
		obj.detachEvent( "on"+type, obj[type+fn] );
		obj[type+fn] = null;
		obj["e"+type+fn] = null;
	}
}

//GrapeNumericTextBoxFunctions
function enableNumberOnlyAndFormat(control, displayControl, groupLength, separator) {
    numberRegExp = new RegExp('[0-9]');

    var prefix = '';
    var startIndex = 0;
    if (displayControl.value.substring(0, 1) == '-') {
        prefix = '-';
        startIndex = 1;
    }
    value = '';
    realValue = '';
    for (iNTChar = displayControl.value.length - 1; iNTChar >= startIndex; iNTChar--) {
        if (value.length % (groupLength + separator.length) == groupLength) value = separator + value;
        currentChar = displayControl.value.substring(iNTChar, iNTChar + 1);
        if (numberRegExp.exec(currentChar)) {
            value = currentChar + value;
            realValue = currentChar + realValue;
        }
    }
    value = prefix + value;
    realValue = prefix + realValue;
    control.value = realValue;
    displayControl.value = value;
}
function onKeyPressBlockNonNumbers(e) {
    var key = window.event ? e.keyCode : e.which;
    var keychar = String.fromCharCode(key);
    if (key == 0 || key == 8)
        return true;
    reg = /[\-0-9]/;
    return reg.test(keychar);
}
function triggerValiadatorsForControl(controlName) {
    var arr = new Array();
    for (var v in Page_Validators)
        if (typeof (Page_Validators[v].controltovalidate) != 'undefined' && Page_Validators[v].controltovalidate == controlName)
        ValidatorValidate(Page_Validators[v]);
}

//GrapeAJAXFileUpload Functions
//TODO: Refactor this function to accomodate localization
function hookUpAJAXUpload(button, uploadURL, uploadStartCallback, uploadDoneCallback, urlReplaceCallback) {
    new AjaxUpload(button, {

        action: uploadURL,
        name: 'myfile',
        urlRewriter: urlReplaceCallback, 
        onSubmit: function(file, ext) {
            // change button text, when user selects file			
            //            button.text('Uploading');


            // If you want to allow uploading only 1 file at time,
        // you can disable upload button
        if (!uploadStartCallback(file)) {
            return;
        }
            this.disable();
            
            // Uploding -> Uploading. -> Uploading...
            //            interval = window.setInterval(function() {
            //                var text = button.text();
            //                if (text.length < 13) {
            //                    button.text(text + '.');
            //                } else {
            //                    button.text('Uploading');
            //                }
            //            }, 200);
        },
        onComplete: function(file, response) {
            //            button.text('Upload');

            //            window.clearInterval(interval);
            responseParts = response.split(';', 2);
            // enable upload button
            this.enable();

            uploadDoneCallback(responseParts[0], responseParts[1]);
            // add file to the list
        }
    });
}