var oService = {}
document.oService = oService;
$(document).ready(function(){
    oService.dtCh = ".";
    oService.remote_url = '/doRemote/'
    oService.digits = "0123456789";
    // non-digit characters which are allowed in phone numbers
    oService.phoneNumberDelimiters = "()- ";
    // characters which are allowed in international phone numbers
    // (a leading + is OK)
    oService.validWorldPhoneChars = oService.phoneNumberDelimiters + "+";
    // Minimum no of digits in an international phone no.
    oService.minDigitsInIPhoneNumber = 7;

    oService.messageType = 'showMessage'



    oService.remote = function (sAction, aParam, fCallback, fCallbackParam, bModal, error_calback ){
        try{
            aParam[ '__action__' ] = sAction
            aParam[ aParam.length ] = {name : '__action__', value : sAction }
            if ( bModal ){
                $.blockUI( { css: { padding:10, border : '2px solid green'}, message: '<strong>Работаем....</strong>' })
            }
            $.ajax({
                 type: "POST"
                ,url: oService.remote_url
                ,dataType: "json"
                ,data: aParam
                //,success:
                //,error:
            })
	    .done( function(oData, sTextStatus, oRequest){
                    if (oData.success){
                        //alert(oData.result.success)
                        try{
			    if (oData.result.focus){
				var element = $(oData.result.focus)
				if (element.length > 0){
				    element.focus()
				    element.select()
				}
			    }
                            if (oData.result.success){
                                fCallback( oData, fCallbackParam )
                            }else{
				//console.log(sAction)
				if (error_calback){
				    error_calback( oData, fCallbackParam )
				}else{
				    oService.message('' + oData.result.message, 'red')
				}
				//oService.formDisableEnable( $(this), true)
                            }
                        }catch( oError){
                            alert( oError )
                        }finally{
                            if ( bModal ){
                                $.unblockUI( )
                            }
                        }
                    }else{

			if (error_calback){

			    error_calback( oData, fCallbackParam )
			}else{
			    oService.message('' + oData.message, 'red')
			}

                        if ( bModal ){
                            $.unblockUI( )
                        }
                    }
                })
		.fail( function( oRequest, sTextStatus, oError ){
		    if (error_calback){
			    //alert( oRequest )
			    error_calback( oRequest, fCallbackParam )
		    }else{
			oService.message('При отправке на сервер произошла ошибка - мы немедленно решаем эту проблему', 'red')
		    }

                    if ( bModal ){
                        $.unblockUI( )
                    }
                })
        }catch(oError){
                alert( oError )
        }finally{

        }
    }

    oService.message = function ( sMessage, sColor ){
	if ( sColor == 'undefined' || !sColor ){
	    sColor = '#ff6666'
	}
	switch( oService.messageType ){
	    case 'showMessage':
		break
	    case 'message':
		message.show(sMessage, {'backgroundColor' : sColor})
		break
	    default:
		$.jGrowl( sMessage, { position : 'center', color : sColor  });
		break
	}



    }
    oService.emailCheck = function(str) {
        try{
            var at = "@"
            var dot = "."
            var lat = str.indexOf(at)
            var lstr = str.length
            var ldot = str.indexOf(dot)

            if  (
                 ( str.indexOf( at ) == -1 ) ||
                 ( str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr)||
                 ( str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr)||
                 ( str.indexOf(at,(lat+1))!=-1)||
                 ( str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot)||
                 ( str.indexOf(dot,(lat+2))==-1)||
                 ( str.indexOf(" ")!=-1)
                ){
                return false
            }else{
                return true
            }
        }catch( oError ){
            alert( oError )
            return false
        }
    }
    oService.telephoneCheck = function ( strPhone ){
        try{
            var bracket = 3
            strPhone= oService.trim( strPhone )
            if( strPhone.indexOf("+") > 1 ){
                return false
            }
            if(strPhone.indexOf("-")!=-1){
                bracket = bracket + 1
            }
            if( strPhone.indexOf("(")!= -1 && strPhone.indexOf("(") > bracket ){
                return false
            }
            var brchr = strPhone.indexOf("(")
            if( strPhone.indexOf("(")!=-1 && strPhone.charAt(brchr+2)!=")"){
                return false
            }
            if( strPhone.indexOf("(")==-1 && strPhone.indexOf(")")!=-1 ){
                return false
            }
            s = oService.stripCharsInBag( strPhone, oService.validWorldPhoneChars )
            return ( oService.IsNumeric( s ) && s.length >= oService.minDigitsInIPhoneNumber )
        }catch(oError ){
            alert( oError )
            return false
        }
    }
    oService.stripCharsInBag = function( s, bag ){
        var i
        var returnString = ""
        // Search through string's characters one by one.
        // If character is not in bag, append to returnString.
        for (i = 0; i < s.length; i++)
        {
            // Check that current character isn't whitespace.
            var c = s.charAt(i);
            if (bag.indexOf(c) == -1) returnString += c;
        }
        return returnString;
    }
    oService.trim = function( s ){
        var i;
        var returnString = "";
        // Search through string's characters one by one.
        // If character is not a whitespace, append to returnString.
        for (i = 0; i < s.length; i++)
        {
            // Check that current character isn't whitespace.
            var c = s.charAt(i);
            if (c != " ") returnString += c;
        }
        return returnString;
    }
    oService.IsNumeric = function (sValue ){
        return (sValue != '' && (sValue - 0) == sValue && sValue.length > 0)
    }
    oService.formDisableEnable = function( form, disable ){

	var input = form.find( 'input[type=submit]' )
	input.attr("disabled", disable)





	//var input = oForm.find( 'input,textarea,select' )
    }
    oService.form2array= function ( oForm ){
	var aInput = oForm.find( 'input,textarea,select' )
	var oParam = {}
	//console.log( aInput.length )
	for ( var iIndex = 0; iIndex < aInput.length; iIndex++){
	    //alert( aInput[ iIndex ].value )
	    var oObj = $(aInput[ iIndex ])
	    //alert( oObj.val())

	    if( !oObj.is(':disabled') && oObj.attr('name')){
		if (oObj.attr("checked")){
		    oParam[ oObj.attr('name') ] = oObj.is(':checked')
		}else{
		    if (oObj.attr('class_type') == 'autocomplete'   ){
			if (oObj.attr('selected_value')){
			    oParam[ oObj.attr('name') ] = oObj.attr('selected_value')
			}else{
			    //oParam[ oObj.attr('name') ] = oObj.attr('selected_value')
			}
		    }else{
			oParam[ oObj.attr('name') ] = oObj.val( )
		    }

		}
		//console.log(oObj.attr('name') + ':' + oObj.val( ))

	    }
	}
	return oParam
    }
    oService.focus = function( selector ){
	try{
	    if (selector){
		var input = $(selector).find( 'input,textarea,select' )
	    }else{
		var input = $("body").find( 'input,textarea,select' )
	    }

	    //alert( input.length)
	    var input_val = []
	    for ( var index = 0; index < input.length; index++){
		//alert( input[ index ].type )
		if (input[ index ].type != 'image' && input[ index ].type != 'submit' && input[ index ].type != 'hidden'){
		    var input_object = $(input[ index ])
		    if (!input_object.is(':disabled')  ){
			//alert(input_object.val( ) )
			if (input_object.val( ) == ''){
			    //alert(2)
			    input_object.focus()
			    return true
			}
			input_val[ input_val.length ] = index
		    }
		}
	    }
	    if (input_val.length > 0){
		input[ input_val[0] ].focus( )
		return true
	    }
	}catch( error ){
	    alert( error )
	}
	return false
    }
    oService.checkForm= function ( oForm ){
    	try{
	    var aInput = oForm.find( 'input,textarea,select' )
	    //alert( aInput.length )
	    for ( var iIndex = 0; iIndex < aInput.length; iIndex++){

		var oObj = $(aInput[ iIndex ])
		//alert(oObj.attr('name') + ':' + oObj.attr('class_type')+ ':' +oObj.attr('selected_value'))
		var sReq = oObj.attr('requiredDescr')
		var sType = oObj.attr('subtype')
		if ( sReq && oObj.val()== '' || ( oObj.val()!= '' && oObj.attr('title') && oObj.val() === oObj.attr('title') )){
		    oService.message( sReq, 'red')
		    oObj.focus()
		    return false
		}

		if (oObj.val() != '' && sType == 'tel' && !oService.telephoneCheck( oObj.val() ) ){
		    oService.message( 'Неправильный телефон, пример : 1234567', 'red')
		    oObj.focus()
		    return false
		}
		if (oObj.val() != '' && sType == 'email' && !oService.emailCheck( oObj.val() ) ){
		    oService.message( 'Неправильный электронный адрес, пример : info@gmail.com', 'red')
		    oObj.focus()
		    return false
		}
		if (sReq && oObj.attr('class_type') == 'autocomplete' && !oObj.attr('selected_value') ){
		    oService.message( sReq, 'red')
		    oObj.focus()
		    return false
		}
	    }
	    //alert('1')
	    return true
	}catch( oError ){
	    alert( oError )
	    return false
	}
    }
    oService.validateDate = function( sDay, sMnt, sYear ){
        try{
            sDate =sDay + '.' + sMnt +'.'+ sYear
            //alert(sDate)
            return oService.isDate( sDate )
        }catch( oError ){
            alert( oError )
            return false
        }
    }
    oService.daysInFebruary = function(year){
        // February has 29 days in any year evenly divisible by four,
        // EXCEPT for centurial years which are not also divisible by 400.
        return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
    }
    oService.DaysArray = function(n) {
            for (var i = 1; i <= n; i++) {
                    this[i] = 31
                    if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
                    if (i==2) {this[i] = 29}
       }
       return this
    }
    oService.isDate = function(dtStr){
	var daysInMonth = oService.DaysArray(12)
	var pos1=dtStr.indexOf(oService.dtCh)
	var pos2=dtStr.indexOf(oService.dtCh,pos1+1)
        var strDay=dtStr.substring(0,pos1)
	var strMonth=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
            oService.message( 'Формат даты : ДД/ММ/ГГГГ', 'red')
	    return false
	}
	if (strMonth.length<1 || month<1 || month>12){
            oService.message( 'Ошибка в месяце', 'red')
	    return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>oService.daysInFebruary(year)) || day > daysInMonth[month]){
            oService.message( 'Ошибка в дне', 'red')
	    return false
	}
	if (dtStr.indexOf(oService.dtCh,pos2+1)!=-1 || oService.IsNumeric(oService.stripCharsInBag(dtStr, oService.dtCh))==false){
            oService.message( 'Неправильная дата', 'red')
	    return false
	}
        return true
    }
    oService.form_ex = function( form ){
	try{
	    if ( form.length > 0){
		var input_list = form.find('input,textarea')
		for (var index=0;index < input_list.length ;index++){
		    input_once = $(input_list[ index ])
		    if (input_once.attr( 'title' )){
			if (input_once.val( ) == ''){
			    input_once.val(input_once.attr('title'));
			}
			input_once.bind('focus', function( event ){
			    if($(this).val() === $(this).attr('title')) {
				$(this).val('')
				$(this).closest('div').addClass('focused')

			    }
			})
			input_once.bind('blur', function() {
			    if($(this).val() === '') {
				$(this).val($(this).attr('title'))
				$(this).closest('div').removeClass('focused')
			    }
			})

		    }


		}
	    }
	}catch( error ){
	    alert( error )
	}

    }
})

