Etiqs = {};
Etiqs.Utils = {
     readCSV: function(file,cols){
        return Etiqs.restfull.get(
            Expenews.Config.Url.getCSV(file,cols), 
            {
                success: function(x, t){
			var returnData = {"cols": Array(), "list": Array()};
			$("column", x.responseXML).each(
				function(){
					returnData["cols"].push([$(this).attr("id"),$(this).attr("selected"),$(this).text()]);
				}
			);
			$("contact", x.responseXML).each(
				function(){
					returnData["list"].push([$(this).children("email").text(), $(this).children("name").text()]);
				}
			);
			return returnData;
                }
                ,fail: function(x, t){
			return true;
		}
            }
        );         
    },
     ckeckCode: function(code){
        return Etiqs.restfull.get(
            Expenews.Config.Url.ckeckCode(code), 
            {
                success: function(x, t){
			strDisc = $("discount", x.responseXML).text();
			return strDisc.split(",");
                }
                ,fail: function(x, t){
			return false;
		}
            }
        );         
    },
     applyFreeCode: function(code,service,expeditionId){
        return Etiqs.restfull.get(
            Expenews.Config.Url.applyCode(code,service,expeditionId), 
            {
                success: function(x, t){
			return true;
                }
                ,fail: function(x, t){
			return false;
		}
            }
        );         
    },
    responseManager: function(selector,temporal){
        var self = this;
        self.container = $(selector);
        
        var clear = function(){
            self.container.attr('style','display:none;');  
            self.container.removeClass('error');
            self.container.removeClass('success');
            self.container.removeClass('loading');
            self.container.find('.response_message').html('');  
            self.container.find('div').attr('style','');  
        };
        if(!selector){
            return {
                loading: function(){},
                ok: function(msg){},
                problem: function(msg){}
            };
        }
        return {
            clear: clear,
            loading: function(){
                self.container.removeClass('error');
                self.container.removeClass('success');
                self.container.addClass('loading');
                self.container.find('.response_message').html('');
		self.container.show();
		self.container.find('div').fadeIn(200);
            },
            ok: function(msg){
                self.container.removeClass('error');
                self.container.removeClass('loading');
                self.container.addClass('success');
                self.container.find('.response_message').html(msg);
		self.container.show();
		self.container.find('div').fadeIn(200);
		var timeOut = 1000;
		if (msg.length>20) 
			timeOut = 3000;
                if(temporal){
                    setTimeout(function(){
                        self.container.children().fadeOut(400,
                            function(){
                                clear();
                            });
                    }, timeOut);
                }
            },
            problem: function(msg){
                self.container.addClass('error');
                self.container.removeClass('success');
                self.container.removeClass('loading');
                self.container.find('.response_message').html(msg);
		self.container.show();
		self.container.find('div').fadeIn(200);
		var timeOut = 3000;
		if (msg.length>20) 
			timeOut = 5000;

                if(temporal){
                    setTimeout(function(){
                        self.container.find('div').fadeOut(400,
                            function(){
                                clear();
                            });
                    }, timeOut);
                }
            }
        };
    },
    getMailFromList: function(listValue){
        listValue = listValue.toLowerCase();
        var re = new RegExp(/[^0-9a-zA-Z!#$%&\'\*\+\-\/\=\?\^\_\`\{\|\}\~\.@]/g);
        var auxList = listValue.replace(re, " ");
        var re = new RegExp(/[\s]/g);
        auxList = auxList.replace(re, ",");
        var auxValues = auxList.split(',');
        var auxRet = {
            'valid':[],
            'invalid':[]
        };
        $(auxValues).each(
            function(){
                if(Etiqs.Utils.validateEmail(this))
                    auxRet['valid'].push(this);
                else{
                    auxRet['invalid'].push(this);
                }
            }
        );
        return auxRet;           
    },
    validateEmail: function(value){
		// Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
        return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
    },
    getAddedLength: function(selectors){
        var total = 0;
        for(i=0; i<selectors.length; i++){
		if ($(selectors[i]).attr('id')!=undefined){
			if ($(selectors[i]).attr('id')!='para')
				total = total + $(selectors[i]).val().length;
			else{
				var array_val = ($(selectors[i]).val()).split('|');
				if (array_val.length>1){
					total = total + array_val[1].length;
				}else
					total = total + $(selectors[i]).val().length;
			}
		}
        }
        return total;
    },
    limitTextAreaSeveral: function(textAreaSelector, totalSelector, limit, addSelectors) {
        var auxSelectors = addSelectors;
        auxSelectors[addSelectors.length] = textAreaSelector;
        $(totalSelector).text(limit-Etiqs.Utils.getAddedLength(auxSelectors));
        
        for(i=0; i<auxSelectors.length;i++){
            var el = $(auxSelectors[i]);
            el.keyup(
                function(){
                    if(Etiqs.Utils.getAddedLength(auxSelectors) > limit){
                        var text = el.val();
                        el.val('');
                        var left = Etiqs.Utils.getAddedLength(auxSelectors);
                        el.val(text);
                        el.val(el.val().substring(0, limit-left));
                    }
                    $(totalSelector).text(limit-Etiqs.Utils.getAddedLength(auxSelectors));
                }
            );
            el.keydown(
                function(){
                    if(Etiqs.Utils.getAddedLength(auxSelectors) > limit){
                        var text = el.val();
                        el.val('');
                        var left = Etiqs.Utils.getAddedLength(auxSelectors);
                        el.val(text);
                        el.val(el.val().substring(0, limit-left));
                    }
                    $(totalSelector).text(limit-Etiqs.Utils.getAddedLength(auxSelectors));
                }
            );
            el.change(
                function(){
                    if(Etiqs.Utils.getAddedLength(auxSelectors) > limit){
                        var text = el.val();
                        el.val('');
                        var left = Etiqs.Utils.getAddedLength(auxSelectors);
                        el.val(text);
                        el.val(el.val().substring(0, limit-left));
                    }
                    $(totalSelector).text(limit-Etiqs.Utils.getAddedLength(auxSelectors));
                }
            );

        }
    },
    limitTextAreaSimple: function(textAreaSelector, totalSelector, limit) {
	var n=$(textAreaSelector).val().length;
	if(n > limit){
		$(textAreaSelector).val($(textAreaSelector).val().substring(0,limit));
	}
	$(totalSelector).text(limit-n);
    }
    ,getLocationIndex: function(location, subIndex){
        var splitAux = location.split('/');
        return splitAux[splitAux.length-subIndex];
    }
    ,getFormValue: function(element, form){
        try{
            return $("input[name="+element+"]", form).val();
        }
        catch(exception){
            return '';
        }
    }
    
    
};

Etiqs.restfull = {
    'get': function(url, config){
        var responseManager = new Etiqs.Utils.responseManager(config.responseSel, config.temporal);
        var returnValue = false;
        $.ajax({
            type: "GET",
            url: url,
            async: false,
            cache: false,
            beforeSend: function(xhr) {
                responseManager.loading();
                if(config.before){
                    config.before(xhr);
                }
            },
            complete: function(XMLHttpRequest, textStatus){
                if(XMLHttpRequest.status == 200 || XMLHttpRequest.status == 201 || XMLHttpRequest.status == 204 || XMLHttpRequest.status == 1223){
                    responseManager.ok(config.okText);
                    returnValue = config.success(XMLHttpRequest, textStatus);
                }
                else{
                    if(XMLHttpRequest.status == 401 && !config.omitRedirect){
                        var url = ""+window.location;
                        var next = $.base64Encode(url);
                        window.location = "/";
                    }
                    else{
                        responseManager.problem(config.failText);
                        returnValue = config.fail(XMLHttpRequest, textStatus);
                    }
                }
            }
        });
        return returnValue;
    },
    'post': function(url, body, config){
        var responseManager = new Etiqs.Utils.responseManager(config.responseSel, config.temporal);
        var returnValue = false;
        $.ajax({
            type: "POST",
            url: url,
            data: body,
            contentType: config.contentType,
            async: false,
            cache: false,
            beforeSend: function(xhr) {
                responseManager.loading();
                if(config.before)
                    config.before(xhr);
            },
            complete: function(XMLHttpRequest, textStatus){
                if(XMLHttpRequest.status == 200 || XMLHttpRequest.status == 201 || XMLHttpRequest.status == 204 || XMLHttpRequest.status == 1223){
                    responseManager.ok(config.okText);
                    returnValue = config.success(XMLHttpRequest, textStatus);
                }
                else{
                    if(XMLHttpRequest.status == 401 && !config.omitRedirect){
                        var url = ""+window.location;
                        var next = $.base64Encode(url);
                        window.location = "/";
                    }
                    else{
                        responseManager.problem(config.failText);
                        returnValue = config.fail(XMLHttpRequest, textStatus);
                    }
                }
            }
        });
        return returnValue;
    },
    'put': function(url, body, config){
        var responseManager = new Etiqs.Utils.responseManager(config.responseSel, config.temporal);
        var returnValue = false;
        $.ajax({
            type: "PUT",
            url: url,
            data: body,
            contentType: config.contentType,
            async: false,
            cache: false,
            beforeSend: function(xhr) {
                responseManager.loading();
                if(config.before)
                    config.before(xhr);
            },
            complete: function(XMLHttpRequest, textStatus){
                if(XMLHttpRequest.status == 200 || XMLHttpRequest.status == 201 || XMLHttpRequest.status == 204 || XMLHttpRequest.status == 1223){
                    responseManager.ok(config.okText);
                    returnValue = config.success(XMLHttpRequest, textStatus);
                }
                else{
                    if(XMLHttpRequest.status == 401 && !config.omitRedirect){
                        var url = ""+window.location;
                        var next = $.base64Encode(url);
                        window.location = "/";
                    }
                    else{
                        responseManager.problem(config.failText);
                        returnValue = config.fail(XMLHttpRequest, textStatus);
                    }
                }
            }
        });
        return returnValue;
    }
    ,'del': function(url, config){
        var responseManager = new Etiqs.Utils.responseManager(config.responseSel, config.temporal);
        var returnValue = false;
        $.ajax({
            type: "DELETE",
            url: url,
            async: false,
            cache: false,
            beforeSend: function(xhr) {
                responseManager.loading();
                if(config.before)
                    config.before(xhr);
            },
            complete: function(XMLHttpRequest, textStatus){
                if(XMLHttpRequest.status == 200 || XMLHttpRequest.status == 201 || XMLHttpRequest.status == 204 || XMLHttpRequest.status == 1223){
                    responseManager.ok(config.okText);
                    returnValue = config.success(XMLHttpRequest, textStatus);
                }
                else{
                    if(XMLHttpRequest.status == 401 && !config.omitRedirect){
                        var url = ""+window.location;
                        var next = $.base64Encode(url);
                        window.location = "/";
                    }
                    else{
                        responseManager.problem(config.failText);
                        returnValue = config.fail(XMLHttpRequest, textStatus);
                    }
                }
            }
        });
        return returnValue;
    }
};

Etiqs.Datetime = {
    localtimeFromUTC: function(isoformatDatetime){
        var d = new Date();
        var date = new Date((isoformatDatetime || "").replace(/-/g,"/").replace(/[TZ]/g," "));            
        var offset = d.getTimezoneOffset() * 60000;
        var localtime = new Date(date - offset);
        return Etiqs.Datetime.textIsoformat(localtime);
        
    },
    textIsoformat: function(d){
        var dy = d.getFullYear();
        if ( dy < 1970 ) dy = dy + 100;
        var ys = new String(dy);
        var ms = new String(d.getMonth() + 1);
        var ds = new String(d.getDate());
        var hh = new String(d.getHours());
        var hm = new String(d.getMinutes());
        var hs = new String(d.getSeconds());

        if ( ms.length == 1 ) ms = "0" + ms;
        if ( ds.length == 1 ) ds = "0" + ds;
        if ( hh.length == 1 ) hh = "0" + hh;
        if ( hm.length == 1 ) hm = "0" + hm;
        if ( hs.length == 1 ) hs = "0" + hs;


        var iso = ys + "-" + ms + "-" + ds + " " + hh + ":" + hm + ":" + hs;
        return iso;
    }
};

Etiqs.Map = {
    convertMinToDecimal: function(deg,min,sec,dir){
        var degL = parseFloat(deg);
        var minL = parseFloat(min);
        var segL = parseFloat(sec);

        var decDegL = parseInt(degL, 10);
        decDegL = decDegL + (minL/60);
        decDegL = decDegL + (segL/3600);
        var pond = 1;

        if(dir==edit_text['South'] || dir==edit_text['West'])
            pond = -1;

        return pond*Math.round(decDegL*100000)/100000;
    },

    addPoint: function(lat, lng, icono, coordinates_name, dispatch_id){
    	var point = new GLatLng(lat, lng);
    	var marker = new GMarker(point, {title: coordinates_name, icon: icono, zIndexProcess:function(){if (icono.image=="/assets/images/page/rojo.png")return(10000);else return (-10000);} });
    	GEvent.addListener(marker, "click", function() {
            html = "<div class='html_map'><div>"+text['name']+":"+coordinates_name+"</div><div>"+text['Coordinates']+": lat: "+lat+",lng:"+lng+"</div><div><a href='dispatches?id="+dispatch_id+"'>"+text['go_to_dispatch']+"</a></div></div>";
            marker.openInfoWindowHtml(html);
        });
    	return marker;
    }
};
Etiqs.Datetime = {
    localtimeFromUTC: function(isoformatDatetime){
        var d = new Date();
        var date = new Date((isoformatDatetime || "").replace(/-/g,"/").replace(/[TZ]/g," "));            
        var offset = d.getTimezoneOffset() * 60000;
        var localtime = new Date(date - offset);
        return Etiqs.Datetime.textIsoformat(localtime);
    },
    UTCFromLocaltime: function(isoformatDatetime){
        var d = new Date();
        var date = new Date((isoformatDatetime || "").replace(/-/g,"/").replace(/[TZ]/g," "));            
        var offset = d.getTimezoneOffset() * 60000;
        var localtime = new Date(date.getTime() + offset);
        return Etiqs.Datetime.textIsoformat(localtime);
    },
    textIsoformat: function(d){
        var dy = d.getFullYear();
        if ( dy < 1970 ) dy = dy + 100;
        var ys = new String(dy);
        var ms = new String(d.getMonth() + 1);
        var ds = new String(d.getDate());
        var hh = new String(d.getHours());
        var hm = new String(d.getMinutes());
        var hs = new String(d.getSeconds());

        if ( ms.length == 1 ) ms = "0" + ms;
        if ( ds.length == 1 ) ds = "0" + ds;
        if ( hh.length == 1 ) hh = "0" + hh;
        if ( hm.length == 1 ) hm = "0" + hm;
        if ( hs.length == 1 ) hs = "0" + hs;


        var iso = ys + "-" + ms + "-" + ds + " " + hh + ":" + hm + ":" + hs;
        return iso;
    }
};
