/**
 * @author janko
 */

if(typeof LUM == 'undefined') var LUM={};

LUM.Common={};
LUM.Common.handler={};


LUM.Common.handler.badJSON = function()
{
	alert("BAD JSON");
};


LUM.Common.handler.ajaxError = function(xhr,status,e)
{		
	if(status=="error" && xhr.status==0)
	{
		alert("Spojenie bolo prerušené, skúste akciu opakovať.");
		return;
	}
	
	// put away next code
	
	var resptext="";
	
	if(xhr)
	{
		resptext+=xhr.responseText;
	}
	
	var rh=xhr.getAllResponseHeaders();
	// var i=r.getInterface();
			
	alert("AJAX ERROR: \n response: "+resptext+"\n status: ("+xhr.status+") "+status+"\n e: "+e+"\n \n"+rh);
};


// set default JQUERY error handler
jQuery.ajaxSetup(
	{
		error : LUM.Common.handler.ajaxError
		// timeout: 3000
	}
);


// utils
LUM.Common.Util={};



/**
 * returns handler which execute on given context, 
 * "handler" will receive arguments as it would be original handler
 *
 * @param handler {Function} function to execute
 * @param context {Object} execution context
 */
LUM.Common.Util.createHandler=function(handler,context)
{
	return function()
	{
		handler.apply(context,arguments);	
	}
}

/**
 * returns function which execute on given context, 
 * if function returns val this also return val
 *
 * @param fc {Function} function to execute
 * @param context {Object} execution context
 */
LUM.Common.Util.createDelegate=function(fc,context)
{
	return function()
	{
		return fc.apply(context,arguments);	
	}
}



/**
 * Recursively merge object "a" with "b" object, "a" object is modified, has priority and overrides same values.
 *
 * @type static
 * @param a {Object} this object has priority and overrides object b
 * @param b {Object} base object
 */
LUM.Common.Util.recurseMerge=function(a,b)
{
	for (var key in b)
	{
		// if target has such key do recurse merge
		if(typeof a[key] === "object")
		{
			LUM.Common.Util.recurseMerge(a[key],b[key]);
			
		}else//  if(a[key] === undefined)
		{
			a[key] = b[key];
		}
	}	
}



LUM.Common.Util.numberFormat = function(nStr,prefix)
{
	    var prefix = prefix || '';
	    nStr += '';
	    x = nStr.split('.');
	    x1 = x[0];
	    x2 = x.length > 1 ? ',' + x[1] : '';
	    var rgx = /(\d+)(\d{3})/;
	    while (rgx.test(x1))
	        x1 = x1.replace(rgx, '$1' + '.' + '$2');
	    return prefix + x1 + x2;
}


		
LUM.Common.Util.setElementWaitIndicator = function(id,wait)
{
	if(wait)
		$("#"+id).addClass("wait_cursor");
	else
		$("#"+id).removeClass("wait_cursor");
}


/**
 * redir in next js thread or later in miliseconds
 * @param {Object} link
 */
LUM.Common.Util.redir = function(link,timeout)
{		
	var later=timeout || 10;
	
	// redir in next thread
	window.setTimeout(
		function()
		{
			window.location.href=link;
		},later
	);		
}

LUM.Common.Util.reload = function()
{
	// alert(window.location.href);
	LUM.Common.Util.redir(window.location.href);
}

LUM.Common.Util.getLoadingPicHtml = function()
{
	return '<img src="/img/design/loading.gif" alt="" />';
}


LUM.Common.Util.removeDiakritika = function(sInput)
{
	var dia = "áäčďéíľĺňóôŕšťúýžÁČĎÉÍĽĹŇÓÔŠŤÚÝŽ";
	var nodia = "aacdeillnoorstuyzACDEILLNOOSTUYZ";
	 
	var sOutput="";
	
	for(var i=0; i<sInput.length; i++) {
		if(dia.indexOf(sInput.charAt(i))!=-1) {
			sOutput += nodia.charAt(dia.indexOf(sInput.charAt(i)));
		}
		else {
			sOutput += sInput.charAt(i);
		}
	} 
	
	return sOutput;
}

LUM.Common.Util.toBaseChars = function(sInput)
{
	var sInput=LUM.Common.Util.removeDiakritika(sInput);
	sInput=sInput.toLowerCase();
	sInput=sInput.replace(/ /g,"-");
	sInput=sInput.replace(/[^a-zA-Z0-9_\-]/g,"");
	
	return sInput;
}

LUM.Common.Util.trim = function(sInput)
{
	return sInput.replace(/^\s+|\s+$/g, '');
}

LUM.Common.Util.evalOddListRow = function(sTableId)
{
	var jTR = $('#' + sTableId + ' tr:odd');
		
		jTR.each(function(){
			var jElem = $(this);			  
			$(jElem).addClass("odd");	
		});
		
		var jTR = $('#' + sTableId + ' tr:even');
		
		jTR.each(function(){
			var jElem = $(this);			  
			$(jElem).addClass("even");
		});
}



// errors
// utils
LUM.Common.Ajax={};


LUM.Common.Ajax.procesErrorXml = function(xErr)
{
	// NOT TESTED !!!
	var app_part=$(xErr).attr("app_part");
	var code=Number($(xErr).attr("code"));
	var data=$(xErr).attr("data")  || "-";;
	
	LUM.Common.Ajax.__procesError(app_part,code, data);
}


// jQuery.flash should be implemented
LUM.Common.Ajax.procesError = function(err)
{	
	var app_part=err.app_part || "-";
	var code=err.code;
	var data = err.data || "-";
	
	LUM.Common.Ajax.__procesError(app_part,code,data);
};


LUM.Common.Ajax.__procesError = function(app_part,code, data)
{
	var sMsg='Nastala neznáma chyba!';
	
	switch(app_part)
	{
		case "camil_bl_eshop" :
			
			switch(code)
			{
				case 1:
					sMsg='Kupón nie je validný!';
				break;
				
				case 2:
					sMsg='Musí byť zadaná zľava!';
				break;
								
				case 3: // tree move
					
					sMsg='Iba jedna zľava može použitá!';
				break;
				
				case 4: // tree move
					
					sMsg='Kód už bol použitý!';
				break;
				
				case 9: // tree move
					sMsg='Nepovelená operácia!';
				break;
				
				case 100: // tree move
					sMsg='Nesprávny formát filter parametra!';
				break;
				
				case 405: 
					sMsg='Vydanie uz existuje';
				break;
				
				case 407: 
					sMsg='Primary article alredy exists';
				break;

				case 500: 
					sMsg=LUM.locale.parentAccount.badLoginData;
					//sMsg='Zadali ste nesprávne prihlasovacie údaje!';
				break;
				case 501: 
					sMsg=LUM.locale.parentAccount.emailUsed;
					//sMsg='Zadaný email je už použitý!';
				break;
				case 502 : 
					sMsg=LUM.locale.parentAccount.badChildAccountLoginData;
					//sMsg='Zadali ste nesprávne prihlasovacie údaje detského účtu!';
				break;
				case 503 : 
					sMsg=LUM.locale.parentAccount.activationEmailFailure;
					//sMsg='Email s aktivačnou linkou sa nepodarilo odoslať!';
				break;
				case 504  : 
					sMsg=LUM.locale.parentAccount.activationAlreadyDoneBefore;
					//sMsg='Váš účet už bol aktivovaný, nie je možné ho aktivovať znovu!';
				break;
				case 505  : 
					sMsg=LUM.locale.parentAccount.badActivationLink;
					//sMsg='Nesprávna aktivačná linka!';
				break;
				case 506   :
					sMsg=LUM.locale.parentAccount.pwdChangeFailure;
					//sMsg='Email s novým heslom sa nepodarilo odoslať!';
				break;	
				case 507   :
					sMsg=LUM.locale.parentAccount.childAlreadyAssigned;
					//sMsg='Nemôžete si pridať používateľa do zoznamu svojich detí, už sa tam nachádza!';
				break;							
				case 508   :
					sMsg=LUM.locale.parentAccount.badPwd;
					//sMsg='Zadali ste nesprávne staré heslo!';
				break;
				case 509   :
					sMsg=LUM.locale.parentAccount.accountInnactive;
					//sMsg='Účet je neaktívny!';					
				break;
				case 510   :
					sMsg=LUM.locale.parentAccount.accountBanned;
					//sMsg='Účet je zablokovaný!';
				break;
				case 511   :
					sMsg='Nepriradené detské konto!';
				break;
				case 512   :
					sMsg=LUM.locale.parentAccount.pwdMisMatch;
					//sMsg='Heslá sa nezhodujú!';
				break;
				case 513   :
					sMsg=LUM.locale.parentAccount.childAlreadyUsedByOther + data.user_parent.name + ' ' + data.user_parent.surname + ' !';
					//sMsg='Dieťa už má priradeného rodiča ' + data.user_parent.name + ' ' + data.user_parent.surname + ' !';
				break;
				case 514   :
					sMsg=LUM.locale.parentAccount.emailUsedInCity;
					//sMsg='Nemôžete zaregistrovať emailovú adresu, ktorá je registrovaná v Jupík City!';
				break;
				case 1100   :
					sMsg='Shop has items and can not be deleted!';
				break;
				case 1101   :
					sMsg='Shop category has items and can not be deleted!';
				break;
			}
			
		break;	
		
		case "img6" :
			
			switch(code){
				case 2: // tree move
					sMsg='Minimalny rozmer obrazku je 200 x 150 px';
				break;															
			}
			
		break;	
	}
		
	if(showErrorDetails)
		sMsg+='\n\n  Chybový kód: ('+app_part+' '+code+')';
		
	if(jQuery.flash)
		jQuery.flash.error(LUM.locale.parentAccount.error, sMsg);
	else
		alert(sMsg);
}



LUM.Common.Util.serialize = function(inp)
{
    var type = LUM.Common.Util.serializeGetType(inp);
    var val;
    switch (type) {
		// by jan
		case "null" :
			val="N";
			break;
		break;
        case "boolean":
            val = "b:" + (inp ? "1" : "0");
            break;
        case "number":
            val = (Math.round(inp) == inp ? "i" : "d") + ":" + inp;
            break;
        case "string":
            val = "s:" + inp.length + ":\"" + inp + "\"";
            break;
        case "array":
            val = "a";
        case "object":
            if (type == "object") {
                var objname = inp.constructor.toString().match(/(\w+)\(\)/);
                if (objname == undefined) {
                    return;
                }
                val = "O" + JPK.Common.Util.serialize(objname[1]).substring(1);
            }
            var count = 0;
            var vals = "";
            for (key in inp) {
                vals += JPK.Common.Util.serialize(key) + ";" + JPK.Common.Util.serialize(inp[key]);
                if (vals.charAt(vals.length - 1) != "}") {
                    vals += ";";
                }
                count++;
            }
            val += ":" + count + ":{" + vals + "}";
            break;
    }
    return val;
}

/**
 *  Reconstructs a serialized variable
 *
 *  @param      inp
 *    the string to reconstruct
 *  @return     mixed
 *    the variable represented by the input string
 *  @author
 *    Arpad Ray <arpad@rajeczy.com>
 *  @version
 *    2005/9/29
 */
LUM.Common.Util.unserialize = function(inp)
{
    if (!inp || inp.length < 3) {
        return;
    }
    var val, kret, vret, cval;
    var type = inp.charAt(0);
    var cont = inp.substring(2);
    var size = 0;
    var divpos = 0;
    var endcont = 0;
    var rest = "";

    switch (type) {
		// by jan
		case "N" :
			val = null;
            rest = cont.substring(1);
			break;
        case "b": // boolean
            val = (cont.charAt(0) == "1");
            rest = cont.substring(1);
            break;
        case "s": // string
            val = "";
            divpos = cont.indexOf(":");
            if (divpos == -1) {
                return;
            }
            size = parseInt(cont.substring(0, divpos));
            if (size == 0) {
                rest = cont.substring(divpos + 4);
                break;
            }
            val = cont.substring(divpos + 2, divpos + 2 + size);
            rest = cont.substring(divpos + 4 + size);
            break;
        case "i": // integer
        case "d": // float
            endcont = cont.length;
            for (var i = 0; i < cont.length; i++) {
                cval = (type == "i" ? parseInt(cont.charAt(i)) : parseFloat(cont.substring(0, i + 1)));
                if (isNaN(cval)) {
                    endcont = i;
                    break;
                }
            }
            if (!endcont) {
                return;
            }
            val = cont.substring(0, endcont);
            val = (type == "i" ? parseInt(val) : parseFloat(val));
            rest = cont.substring(endcont + 1);
            break;
        case "a": // array
        if (cont.length < 4) {
                return;
            }
            divpos = cont.indexOf(":", 1);
        if (divpos == -1) {
                return;
            }
            size = parseInt(cont.substring(1, divpos - 1));
            cont = cont.substring(divpos + 2);
            val = new Array();
            if (cont.length < 1) {
                break;
            }
            for (var i = 0; i + 1 < size * 2; i += 2) {
                kret = JPK.Common.Util.unserialize(cont, 1);
        if (kret == undefined || kret[0] == undefined || kret[1] == "") {
                    break;
                }
                vret = JPK.Common.Util.unserialize(kret[1], 1);
        if (vret == undefined || vret[0] == undefined) {
                    break;
                }
                val[kret[0]] = vret[0];
                cont = vret[1];
            }
            rest = (vret ? vret[1].substring(1) : "");
            break;
        case "O": // object
            divpos = cont.indexOf(":");
            if (divpos == -1) {
                return;
            }
            size = parseInt(cont.substring(0, divpos));
            var objname = cont.substring(divpos + 2, divpos + 2 + size);
            var objprops = JPK.Common.Util.unserialize("a:" + cont.substring(divpos + 4 + size));
            if (objprops == undefined) {
                return;
            }
            var objout = "function " + objname + "(){";
            for (key in objprops) {
                objout += "this." + key + "=objprops[key];";
            }
            objout += "}val=new " + objname + "();";
            eval(objout);  
    }
    return (arguments.length == 1 ? val : [val, rest]);
}

/**
 *  Returns the type of a variable or its primitive equivalent
 *
 *  @param      inp
 *    the input variable
 *  @return     mixed
 *    a string as returned by typeof
 *  @author
 *    Arpad Ray <arpad@rajeczy.com>
 *  @version
 *    2005/9/29
 */
LUM.Common.Util.serializeGetType = function(inp)
{
	// by jan
	if(inp===null)
		return "null";
	
    var type = typeof inp;
    if (type == "object") {
        var cons = inp.constructor.toString().toLowerCase();
        var types = ["boolean", "number", "string", "array"];
        for (key in types) {
            if (cons.indexOf(types[key]) != -1) {
                type = types[key];
                break;
            }
        }
    }
    return type;
}



// add JS functionality
if(typeof Array.prototype.indexOf != "function")
{
	Array.prototype.indexOf = function(v, n){
     n = (n == null) ? 0 : n;
     var m = this.length;
     for (var i=n; i<m; i++)
         if (this[i] == v)
             return i;
     return -1;
	}	
}


