//common javscript lib
//====String Prototype===
String.prototype.trim  = function ()
{
    return this.replace(/^\s+/,'').replace(/\s+$/,'');
};
String.prototype.isEmpty = function ()
{
    return ( 0 == this.replace(/^\s+/,'').replace(/\s+$/,'').length );
};
String.prototype.isAlphaNumeric = function (){
    return /^[a-zA-Z0-9]+[a-zA-Z \-\_\.\(\)0-9]+$/i.test(this);
};
String.prototype.isEmail = function()
{
    return /^[a-z][a-z-_0-9\.]+@[a-z-_=>0-9\.]+\.[a-z]{2,3}$/i.test(this);
};
String.prototype.isNum = function()
{
    return !isNaN(this);
};
String.prototype.isURL = function (){
 	var RegExp = /^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/;
    if(RegExp.test(this)){
        return true;
    }else{
        return false;
    }
}
//====General Functions ===

function $(id){ return document.getElementById(id); }
function jscss(o,c1,a,c2)
{
    //Modify class fo robjects
    //o = object, c1=class1 c2=class2 a=swap|add|remove|check
    a  = a||'add'; // Optional , default add
    c2 = c2||'';  //Optional, default ''
    switch (a){
        case 'swap':
        o.className=!jscss(o,c1,'check')?o.className.replace(c2,c1): o.className.replace(c1,c2);
        break;
    case 'add':
        if(!jscss(o,c1,'check')){o.className+=o.className?' '+c1:c1;}
        break;
    case 'remove':
        var rep=o.className.match(' '+c1)?' '+c1:c1;
        o.className=o.className.replace(rep,'');
        break;
    case 'check':
        return new RegExp('\\b'+c1+'\\b').test(o.className)
        break;
    }
}
//==Form VALIDATION FUNCTINOS STARTS==
var Form = {_post_data_str:''};
Form.is_valid = function(frm,option,retobj)
{
    option = option || {};
    retobj = retobj || false;
    //Set Default values for options 
    var accept = option['accept'] || null;
    var reject = option['reject'] || null;
    var additional = option['additional'] || null;
    var err_msg = option['err_msg'] || 'Please fill all required fields with valid values';
    var css_class = option['css_class'] || 'errorBorder';
    var alert_err = (option['alert_err']=='undefined')?  true:option['alert_err'];
    var error_handle_each = option['error_handle_each'] || false;
    var error_handle_all = option['error_handle_all'] || false;

    //validate request 
    if(error_handle_each){
        if( 'function' != typeof(error_handle_each)){
            alert(' Invalid callback `'+option['error_handle_each']+'` given as error handler '); 
            error_handle_each = false;
        }
    }
    if(error_handle_all){
        if( 'function' != typeof(error_handle_all)){
            alert(' Invalid callback `'+option['error_handle_all']+'` given as error handler ');
            error_handle_each = false;
        }
    }
    if( 'undefined' == frm['elements'] ){
        alert('First argument must be valid form object');
        return false;
    }
    //Array of all error controll
    var arr_err_objs = Array();
    
    Form._post_data_str ='';

    var sret = '',ele,first_err_ele,i;
    var valtp='', cannull=false, err_flag=false;

    if(reject){
        reject = Form._array2obj(reject.split(','));
    }
    if(accept){
        accept = Form._array2obj(accept.split(','));
    }

    var eles = frm.elements || {};
    var elen = eles.length;
    for(i=0; i<elen; i++){
        ele = eles[i];

		var ele_par = ele['parentNode'];
        jscss(ele_par,css_class, "remove");//Remove Class

        if(ele['disabled']){
            continue;
        }
        if('none' == ele['style']['display']){
            continue;
        }

        var ename = ele['name'];
        if('' == ename){
            continue;
        }

        if(accept){
            if(!(ename in accept)){
                continue;
            }
        }else if(reject){
            if(ename in reject){
                continue;
            }
        }

        var tagtp = ele['tagName'] || 'fieldset';
        if( 'fieldset' == tagtp.toLowerCase() ){
            continue; //ignoring fieldset
        }

        cannull = false;
        valtp = '';
        if(valtp = ele.getAttribute('validatenull')){
            cannull = true;
        }else if(valtp = ele.getAttribute('validate')){
            //cannull = false;
        }
        var evalue = '';
        switch (ele.type.toLowerCase()){
            // Text fields, hidden form elements
            case 'select':
            case 'select-one':
                if(valtp){ valtp='EMPTY'};
                sret += ename + '=' + encodeURIComponent(ele.value) + '&';
                evalue = ele.value;
                //ele = Form._add_wraper(ele, ename + i);
                break;
            case 'text':
            case 'textarea':
                if(!(ele['readOnly'])){
                    ele.value = ele.value.trim();
                }
            case 'file':
            case 'hidden':
            case 'password':
                sret += ename + '=' + encodeURIComponent(ele.value) + '&';
                evalue = ele.value;
                break;
            // Multi-option select
            case 'select-multiple':
                if(valtp){ valtp='EMPTY'};
                for(var j = 0; j < ele.options.length; j++){
                    var currOpt = ele.options[j];
                    if(currOpt.selected){
                        sret += ename + '=' + encodeURIComponent(currOpt.value) + '&';
                        evalue = ele.value;
                    }
                }
                //ele = Form._add_wraper(ele, ename + i);
                break;

            case 'radio':
                var rdos = eles[ename];

                if(undefined == rdos['length'])
                {
                    rdos = Array( ele );
                }

                var len = rdos['length'] || 0;
                evalue = '';
                for( var ri=0; ri<len; ri++){
                    if( rdos[ri].checked ){
                        evalue= rdos[ri].value;
                        break;
                    }
                }
                break;
            case 'checkbox':
                if(ele.checked)
		{
                    sret += ename + '=' + encodeURIComponent(ele.value) + '&';
                    evalue = ele.value;
                }
                //ele = Form._add_wraper(ele, ename + i);
                break;
            default:
                evalue='';
                continue;   
        }
        //validate
        if(valtp){
            if(!Form._validate_ele(evalue, valtp, cannull)){
                if(error_handle_each){
                    //calling callback with (current) ele having error 
                    err_msg = error_handle_each(ele, err_msg );
                }
                if(error_handle_all){
                    //used in calling callback error_handle_all()
                    arr_err_objs.push(ele); 
                }
				var par = ele.parentElement || ele.parent
                jscss(ele_par,css_class,"add");//Add Class
                err_flag = true;
                if(!first_err_ele){
                    first_err_ele = eles[i];
                }
            }
        }
    }

    if(option['timestamp']){
        sret += '__timestamp__=' +encodeURIComponent(Date())+'&';
    }
   
    if(err_flag){
        first_err_ele.focus();
        if(error_handle_all){
           //calling callback with array of ele's have error  
            err_msg = error_handle_all( arr_err_objs, err_msg );
        }
	
       if(alert_err){
            alert(err_msg);
        }else{
            //message_hide_show(1,err_msg);//show err div
			alert(err_msg);
        }
	
    }else{
        if(additional){
            var tp = (typeof(additional)).toLowerCase();
            if('string' == tp){
                sret += additional + '&';
            }else if('object' == tp){
                for(var k in additional){
                    if('function' != (typeof(additional[k])).toLowerCase()){
                        sret += k + '=' + additional[k] + '&';
                    }
                }
            }
        }
        // Remove trailing separator
        sret = sret.substr(0, sret.length - 1);
    }
    
    ele = null;
    eles = null;
    error_handle_each = null;
    error_handle_all = null;
    delete arr_err_objs;
    
    Form._post_data_str = sret;
    if( retobj ){
        return {'is_valid':!err_flag, 'post_data':Form._post_data_str};
    }else{
        return !err_flag;
    }
}
/*
    Private function
    form validateion support function
    str = value to be validate(value of control)
    valtp = validation type {EMPTY | NUMBER | EMAIL}
    cannull = boolean (passed for checking the contoll with null )
        this parameteris optional, and default value is false
*/
Form._validate_ele = function (str, valtp, cannull)
{
    cannull = cannull || false;

    if(cannull){
        if(0 >=str.length){
            return true;
        }
    }
    switch(valtp.toUpperCase()){
        case "EMPTY":
            return (0 < str.length);
            break;
        case "NUMBER":
            return ('' == str) ? false : !isNaN(str);
            break;

        case "EMAIL":
            return str.isEmail();
            break;
		case "ALPHANUM":
	    	return ('' == str) ? false:str.isAlphaNumeric();
	    	break;
		case "URL":
	    	return ('' == str) ? false:str.isURL();
	    	break;

        default:
            alert("Validation '" + valtp + "' not defined in lib.");
            break;
    }

    return false;
}
/*
    Private function
    it converts array in to object and returns
    make object  from arary, flaping index and value
*/
Form._array2obj = function(arr){
    var oret = null;
    var len = arr.length;
    if(len){
        oret = {};
        for(var i=0; i<len; i++){
            oret[arr[i]]=i;
        }
    }
    return oret;
}

//CUstomer Functions 
function onsearchsubmit(oform)
{  
	oform.elements.query.value = oform.elements.query.value.trim();
	oform.elements.query.focus();
	return !oform.elements.query.value.isEmpty();
}

//SX Defaults
function _debug()
{
	if(window['console'])
	{
		if( window['console'].debug )
		{
			var str ='';
			for(var i=0; i<arguments.length;i++)
			{
				str+=arguments[i].toString() + ',';
			}
			console.debug(str);
		}
	}
}
function addEvent(elm, evType, fn, useCapture)
{
	if (elm.addEventListener)
	{
		elm.addEventListener(evType, fn, useCapture);
		return true;
	}
	else if (elm.attachEvent)
	{
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	}
	else
	{
		elm['on' + evType] = fn;
	}
}
//SX Debug 
var _sx=
{
	_init:function(){},
	trackView:function(){},
	trackClick:_debug
};

function captcha_refresh(id)
{
	var domain_nm = window.location.hostname;
	var tmp = document.getElementById(id);
	var rand_nm= Date();
	var asrc = tmp.src.split('?');
	tmp.src= asrc[0] + "?show="+rand_nm;
}

var prev_page=1;
function showpage(cur_page)
{
	var ocur = document.getElementById('ad_page_'+cur_page);
	if( !ocur )
	{
		return;
	}
	
	var oprev = document.getElementById('ad_page_'+prev_page);
	if( !oprev )
	{
		oprev = document.getElementById('ad_page_1');
	}
	
	//_debug( cur_page + ":" + prev_page );
	if( oprev && ocur)
	{
		
		oprev.style.display='none';
		ocur.style.display='';

		var oplnk = document.getElementById('dvpage_'+prev_page);
		if( oplnk )
		{
			oplnk.className = 'no';
		}
		
		oplnk = document.getElementById('dvpage_'+cur_page);
		if( oplnk )
		{
			oplnk.className = 'no_active';
		}
		oplnk=null;
		prev_page = cur_page;
		document.getElementById('bottom_pagination').innerHTML =  document.getElementById('top_pagination').innerHTML;
	}
	oprev = ocur = null;
}
function showprevpage()
{
	showpage(prev_page - 1)
}
function shownextpage()
{
	showpage(prev_page + 1)
}

/*fading effect js*/
var fade_flg = false;
function supportsOpacity( el ) 
{
	if ( el.style.opacity != undefined )
        		return true;
	if( el.style.MozOpacity != undefined )
		return true;

	if ( el.style.filter != undefined )
		return true;
    	return false;
}

function setOpacity( el, opaciLevel ) 
{
	if ( el.style.opacity != undefined ) {
		el.style.opacity = opaciLevel;
	} else if( el.style.MozOpacity != undefined ) {
		el.style.MozOpacity = opaciLevel;
	} else if ( el.style.filter != undefined ) {
		var oplvl = Math.round(opaciLevel*100);
		el.style.filter="alpha(opacity=" + oplvl + ")";

	}
}

function fadeIn( id, currentOpacity )
{
	var counterLimit = 5;
	var el = document.getElementById( id );
	if( !currentOpacity )
	{
		currentOpacity = 1;
	}
	if( currentOpacity > counterLimit )
	{
        		return;
	}
	
	if(currentOpacity/counterLimit == 0.8)
	{
		fade_flg = true;
		return;
	}
	setOpacity( el, ( currentOpacity/counterLimit ) );
	currentOpacity++;
	var func = "fadeIn( '" + id + "', " + currentOpacity + ")";
	window.setTimeout( func, 50);
}

function show( id ) {
    var elem = document.getElementById( id );
    if( supportsOpacity( elem )) {
        // first set 0% opacity to make it completely transparent
        setOpacity( elem, 0 );
        // when we set display = "block" it's still invisible
        elem.style.display = "block";
        // call the function to gradually increase opacity
        fadeIn( id );
    } else {
        // can't modify opacity, so just make it visible...
        elem.style.display = "block";
        fade_flg = true;
    }//return 1;
}

function hide( id )
{
	var elem = document.getElementById( id );
	document.body.removeChild(elem);
	if(id == "layer_0")
	{
		window['layer_0'] = "";
	}
	if(id == "layer_2")
	{
		window['layer_2'] = "";
	}
	if(id == "layer_5")
	{
		window['layer_5'] = "";
	}
}
function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
    return [ scrOfX, scrOfY ];
}
