﻿String.prototype.format = function()
{
    var pattern = /\{\d+\}/g;
    var args = arguments;
    return this.replace(pattern, function(capture){ return args[capture.match(/\d+/)]; });
}
String.prototype.trim = function() {
  return this.replace(/^\s+|\s+$/g, "");
}

String.prototype.$get = function() {
  return $get(this);
}
var $dom =new Object();
$dom.loadJsCss = function (filename, filetype){
    if (filetype=="js"){ //if filename is a external JavaScript file
        var fileref=document.createElement('script')
        fileref.setAttribute("type","text/javascript")
        fileref.setAttribute("src", filename)
    }
    else if (filetype=="css"){ //if filename is an external CSS file
        var fileref=document.createElement("link")
        fileref.setAttribute("rel", "stylesheet")
        fileref.setAttribute("type", "text/css")
        fileref.setAttribute("href", filename)
    }
    if (typeof (fileref)!="undefined")
        document.getElementsByTagName("head")[0].appendChild(fileref)
}


// JScript File


function $get(arg){
    if(typeof(arg)=='undefined'){
        return;
    }
    var elm=(typeof(arg)!='object')?document.getElementById(arg):arg;
    if(elm==null){
        return elm;
    }
    elm.toggle = function (){
                    elm.style.display=(elm.style.display=='none')?'block':'none';
                }
    elm.show=function (){
        elm.style.display='block';
    }
    elm.hide=function (){
        elm.style.display='none';
    }
    elm.getParentByTag=function(tag){    
        var relm=elm;
        while(relm.parentNode && relm.parentNode.tagName.toLowerCase()!=tag){
            relm=relm.parentNode;
        }
        return relm.parentNode ;
    }
    elm.textValue = function () {         
        var value=elm.innerText || elm.textContent
        return value || ''
    }
    elm.html=function (_value){
    
        if(typeof(_value)=='undefined'){
            return elm.innerHTML;
        }else{
            elm.innerHTML=_value;
        }
    }
	try{
    elm.clear = function (){
        elm.innerHTML='';
        return elm;
    }
	}catch(e){
	}
    return elm;
}//function

function nop(){}

function textValue(elm){
    if(!elm){
        return ''
    }
    var value=elm.innerText || elm.textContent
    return value || ''
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

/**
	 * An alternative function to document.createElement() which accepts name=value pair arguments for specifying attributes
	 * 
	 * @param ele The tagname of the element you want to create
	 * @param [args] The attribute arguments in the format name=value
	 * @return returns a created element with the specified attributes
	 * @author Kyle D. Hayes (contact ~at~ kylehayes ~dot~ info)
	 * @version 0.1, July 4, 2006
	 * usage:
	 * txtbox = createElement('input','type=text','name=myTextBox','value=Enter Text Here','id=myTextBox');
	 * which yields the following element:
	 * <input type="text" name="myTextBox" value="Enter Text Here" id="myTextBox">
	 */
function createElement(ele) {
	var items = createElement.arguments.length;
	element = document.createElement(ele);
	if(items > 1) {
		for(i=1;i<items;i++) {
			attribute = createElement.arguments[i].split("=");
			element.setAttribute(attribute[0],attribute[1]);
		}
	}
	return element;
}

/*
-   debug
- debug.info = function(text)
- debug.warning = function(text)
- debug.error = function(text)
- debug.trace = function(text)
- 
*/

var debug=new Object();
debug.DEBUG=true;
debug.INFO=true;
debug.WARNING=true;
debug.ERROR=true;
debug.TRACE=true;

debug.init= function(){
    this.dbgWindow=createElement('div','id=debugWnd');   
    this.dbgWindow.className='window debugWindow';
    this.title=createElement('div','class=windowtitle');
    this.title.innerHTML='DEBUG';
    this.dbgWindow.appendChild(this.title);    
    var toolbar=createElement('div','class=windowtoolbar');    
    //toolbar.className=
    toolbar.innerHTML='<div><input type="checkbox" checked="true" onclick="javascript: debug.DEBUG=this.checked;nop();" /><a href="javascript: debug.DEBUG=!debug.DEBUG;this.previosSibling.checked=debug.DEBUG;nop();">debug</a></div>'
    toolbar.innerHTML+='<div><input type="checkbox" checked="true" onclick="javascript: debug.TRACE=this.checked;nop();" /><a href="javascript: debug.TRACE=!debug.TRACE;this.previosSibling.checked=debug.TRACE;nop();">trace</a></div>'
    toolbar.innerHTML+='<div><input type="checkbox" checked="true" onclick="javascript: debug.INFO=this.checked;nop();" /><a href="javascript: debug.TRACE=!debug.TRACE;this.previosSibling.checked=debug.INFO;nop();">info</a></div>'
    toolbar.innerHTML+='<div><input type="checkbox" checked="true" onclick="javascript: debug.WARNING=this.checked;nop();" /><a href="javascript: debug.TRACE=!debug.TRACE;this.previosSibling.checked=debug.WARNING;nop();">warning</a></div>'
    toolbar.innerHTML+='<div><input type="checkbox" checked="true" onclick="javascript: debug.ERROR=this.checked;nop();" /><a href="javascript: debug.TRACE=!debug.TRACE;this.previosSibling.checked=debug.ERROR;nop();">error</a></div>'
    this.dbgWindow.appendChild(toolbar);
    this.content=createElement('div','class=windowcontent');
    this.dbgWindow.appendChild(this.content);
    this.dbgview=$get('debug_view');
    if(this.dbgview==null){
        this.dbgview=createElement('div','class=debugViewPort', 'id=debug_view');        
        this.content.appendChild(this.dbgview);
        document.body.insertBefore(this.dbgWindow,document.body.firstChild);
    }
    this.dbgview.appendChild(createElement("div"));
}

debug.appendFirst= function (elm){
    if(typeof(this.dbgview)=='undefined'){
        //alert('debug view port is undefined');
        return ;
    }
    if(typeof(this.dbgview.firstChild)!='undefined'){
        this.dbgview.insertBefore(elm,this.dbgview.firstChild);
    }else{
        this.dbgview.appendChild(elm);
    }
}

debug.info = function(text){
    if(this.DEBUG && this.INFO){
        var elm=createElement('div','class=debug_info');
        elm.appendChild(document.createTextNode(text));
        debug.appendFirst(elm);
    }
}//function

debug.warning = function (text){
    if(this.DEBUG && this.WARNING){
        var elm=createElement('div','class=debug_warning');
        elm.appendChild(document.createTextNode(text));
        debug.appendFirst(elm);
    }
}//function

debug.error = function(text,ex){
    if(this.DEBUG && this.ERROR){
        var elm=createElement('div','class=debug_error');
        
        var msg=text;
        if(typeof(ex)!='undefined'){
            text+=" ex.Message="+ex.message
        }
        elm.appendChild(document.createTextNode(msg));
        debug.appendFirst(elm);        
    }
}//function

debug.trace = function(text){
    if(this.DEBUG && this.TRACE){
        var elm=createElement('div','class=debug_trace');
        elm.appendChild(document.createTextNode(text));
        debug.appendFirst(elm);        
    }
}//function

//addLoadEvent(debug.init);

/*
-   XmlHttp Request
- request(url,async,callback,errcallback)
- request_defaultErrorCallback(arg,ex)
*/
function request(url,async,callback,errcallback){
    
    var xmlhttp=null;
    if (window.XMLHttpRequest){// code for all new browsers
        xmlhttp=new XMLHttpRequest();
        debug.trace('request: create native xmlhttprequest');
    }else if (window.ActiveXObject){// code for IE5 and IE6
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        debug.trace('request: create ActiveX xmlhttprequest');
    }else{    
        request_defaultErrorCallback('You Browser not support for XmlHttpRequests');
        return;
    }
    try{
            
        xmlhttp.onreadystatechange=function ()
                {
                debug.trace('request: request.readystate ' + xmlhttp.readyState);
                    if (xmlhttp.readyState==4){// 4 = "loaded"                    
                        if (xmlhttp.status==200){// 200 = OK
                                callback(xmlhttp);
                        }else{
                            debug.warning("Problem retrieving. status:"+xmlhttp.status+" text:"+xmlhttp.statusText);
                            alert("Problem retrieving XML data");
                        }// if status
                    }//if readyState
                    
                }//function        
        debug.trace('request: request.open ' + url);
		if(url.indexOf("?")>0){
			url+="&_anticachrand="+Math.random();
		}else{
			url+="?_anticachrand="+Math.random();
		}
        xmlhttp.open("GET",url,async);
        debug.trace('request: request.send(null)');
        xmlhttp.send(null)
        if(BrowserDetect.browser=='Firefox' && !async){
                callback(xmlhttp); 
        }

        
    }catch(ex){
        debug.error("request: exception thrown during execution.",ex);
        request_defaultErrorCallback(ex.message);
    }
    debug.trace('request: function return');
    return;
}//function

function request_defaultErrorCallback(arg,ex){
    if(typeof(arg)=='undefined'){
        return;
    }
    if(typeof(arg)=='string'){
        alert(arg);
        return;
    }
    if(typeof(arg)=='object'){
        alert('request.status'+arg.status);
        return;
    }
    alert('Unexpected `argument` in request_defaultErrorCallback');
}//function


function enrichtable(table){
    table_colorize_row(table);    
}
function table_colorize_row(table){
  
    var tbody=table.getElementsByTagName('tbody')[0];
    var rows=tbody.getElementsByTagName('tr');
    var i=0;    
    for(trkey in rows){
        var tr=rows[trkey];
        if(typeof(tr)!='object'){
            continue;
        }
        tr.className=(i % 2)?'dataview_odd_row':'dataview_even_row';
        i++        
    }    
}


function tableSort(col){
    if(typeof(col)=='undefined'){
        debug.warning('column element undefined');
        return;
    }
    var table=$get(col).getParentByTag('table');
    var tbody=table.getElementsByTagName('tbody')[0];
    var rows=tbody.getElementsByTagName('tr');
    var rowArray = new Array();
    var length = rows.length;
    for (var i=0; i<length; i++)
    {
        rowArray[i] = rows[i].cloneNode(true);
    }
    
    if (typeof(table.lastSortCol)!='undefined' && col == table.lastSortCol)
    {
        lastsort=col;
        rowArray.reverse();
    }else{
        lastsort=table.lastSortCol=col;
        var datatype=((col.attributes['dataType'])?col.attributes['dataType'].nodeValue:'');
        
        if(datatype=='domain'){
            rowArray.sort(RowCompareDomainStyle);
        }if(datatype=='numeric'){
            rowArray.sort(RowCompareNumbers);
        }
        else{
            rowArray.sort(RowCompare);            
        }        
    }
    var newTbody = document.createElement('tbody');
    var ralength = rowArray.length;
    for (var i=0; i<ralength; i++)
    {
        newTbody.appendChild(rowArray[i]);
    }  
    table.replaceChild(newTbody, tbody);
    table_colorize_row(table)
    
}
var lastsort;
function RowCompare(a, b)
{
    //var aVal = a.getElementsByTagName('td')[lastsort.cellIndex].firstChild.nodeValue;
    //var bVal = b.getElementsByTagName('td')[lastsort.cellIndex].firstChild.nodeValue;
    //var text = x.innerText || x.textContent
    var acells=a.getElementsByTagName('td');
    var bcells=b.getElementsByTagName('td');
    if(!lastsort || lastsort.cellIndex < 0 
        || lastsort.cellIndex>acells.lenght
        || lastsort.cellIndex>bcells.lenght
        ){
        return 0;
    }
    var atd=acells[lastsort.cellIndex];
    var btd=bcells[lastsort.cellIndex];
    
    var aVal = textValue(atd).toLowerCase();
    var bVal = textValue(btd).toLowerCase();
    var rVal;
    if(aVal == bVal){
        rVal = 0;
    }else{ 
        if(aVal > bVal) {
            rVal = 1;
        } else {
            rVal = -1;
        }
    }
    return rVal;
}

function RowCompareNumbers(a, b)
{
 var acells=a.getElementsByTagName('td');
    var bcells=b.getElementsByTagName('td');
    if(!lastsort || lastsort.cellIndex < 0 
        || lastsort.cellIndex>acells.lenght
        || lastsort.cellIndex>bcells.lenght
        ){
        return 0;
    }
    var atd=acells[lastsort.cellIndex];
    var btd=bcells[lastsort.cellIndex];
    
    var aVal = textValue(atd);
    var bVal = textValue(btd);
    
    var aVal = parseInt(aVal);
    var bVal = parseInt(bVal);
    return (aVal - bVal);
}

function RowCompareDomainStyle(a, b)
{
    var acells=a.getElementsByTagName('td');
    var bcells=b.getElementsByTagName('td');
    if(!lastsort || lastsort.cellIndex < 0 
        || lastsort.cellIndex>acells.lenght
        || lastsort.cellIndex>bcells.lenght
        ){
        return 0;
    }
    var atd=acells[lastsort.cellIndex];
    var btd=bcells[lastsort.cellIndex];
    var arr;
   
    var aVal = textValue(atd);
    arr=aVal.split('');
    arr[aVal.lastIndexOf('.')]='_';
    aVal=arr.join('');
    aVal=aVal.split('.').reverse().join('.');    
    var bVal = textValue(btd);
    arr=bVal.split('');
    arr[bVal.lastIndexOf('.')]='_';
    bVal=arr.join('');
    bVal=bVal.split('.').reverse().join('.');    
    var rVal;
    if(aVal == bVal){
        rVal = 0;
        debug.trace(aVal+' = '+bVal);
    }else{ 
        if(aVal > bVal) {
            debug.trace(aVal+' > '+bVal);
            rVal = -1;
        } else {
            debug.trace(aVal+' < '+bVal);
            rVal = 1;
        }
    }
    return rVal;
}


$tableFactory = {
    pagesize: 4,
    create: function (holder,dataTable){
        if(typeof(dataTable)=='undefined' || !dataTable){
            $get(holder).html("no data");
            return;
        }
        var table=createElement('table','border=0','cellspasing=0','class=dataview');
        var thead=createElement('thead');        
        tr=createElement('tr');        
        for(var dci in dataTable.cols[0]){
            var th=this.createTH(dataTable.cols[0][dci]);                
            tr.appendChild(th);
        }        
        thead.appendChild(tr);            
        
        table.appendChild(thead);
        var tbody=createElement('tbody');
        for(var dri in dataTable.rows){
            tr=createElement('tr');
            for(var dci in dataTable.rows[dri]){
                td=createElement('td');
                td.innerHTML=dataTable.rows[dri][dci];
                tr.appendChild(td);
            }
            tbody.appendChild(tr);          
            
        }
        
        table.appendChild(tbody);
        enrichtable(table);
        $get(holder).clear().appendChild(table);
    },
    
    createTH: function(col){
        var control='<div><a href="javascript: nop();" onclick="javascript: tableSort($get(this).getParentByTag(\'th\'))" style="float:right;">az</a><label>'+col.title+'</label></div>';
        var th=createElement('th','dataType='+col.dataType);
        th.style.width=col.width;
        th.innerHTML=control;
        return th;
    }
}//object

$selectFactory={
    create: function(holder,dataTable){
        var select = createElement('select');
        $get(holder).clear().appendChild(select);
        for(var i=0;i<dataTable.rows.length;i++){
            this._addItem(select,dataTable.rows[0],dataTable.rows[1]);
        }
    },
    init:function(){},
    appendItems: function(){},
    removeItems :function(){},
    selectItems:function(){},
    
    _addItem:function(select,text,value){
        select.add(text,value);
    },
    createOption : function (title,value){
        
    
    },
    
    listToHiddenField : function (list,field,onlySelected){
        field.value='';
        for(var i=0; i<list.options.length; i++){
            var item=list.options[i]; 
            if(onlySelected && !item.selected){
                continue;
            }
            field.value+=';'+item.value+';';
        }   
    },
    BindToArray : function (list,data){
        if(typeof (list)=='undefined' || typeof (data)=='undefined' ){
            return;
        }
        list.innerHTML='';
        for(var i=0; i<data.length;i++){
            var address=data[i];           
            var addTitle=address;
            list.options.add(new Option(addTitle,address));
        }
     },
     
     BindTo2DArray : function (list,data){
        if(typeof (list)=='undefined' || typeof (data)=='undefined' ){
            return;
        }
        list.innerHTML='';
        for(var i=0; i<data.length;i++){                               
            list.options.add(new Option(address[0],address[1]));
        }
     },
     
     filter: function(select,query){        
        var visSel=select;
        visSel.innerHTML='';       
        for(var i=0;i<addressBook.length;i++){            
//            if(addressBook[i][0].indexOf(query)>-1){   
//                visSel.options.add(new Option(addressBook[i][0],addressBook[i][1]));
//            }//if
        }//for
    }//mehtod    
}//object





function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}
 
function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}
 
function eraseCookie(name) {
	createCookie(name,"",-1);
}